From f72360b27b25379e1220acffc338c2309dbf80e6 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Thu, 14 Dec 2023 10:06:56 +0100 Subject: [PATCH] Version 4.9.6 (#2706) Signed-off-by: Nextcloud bot Signed-off-by: Marino Faggiana Co-authored-by: Nextcloud bot --- Nextcloud.xcodeproj/project.pbxproj | 10 +- iOSClient/Data/NCDataSource.swift | 4 +- .../NCCollectionViewCommon.swift | 17 +- .../NCCreateFormUploadConflict.swift | 3 +- iOSClient/Main/NCActionCenter.swift | 10 +- iOSClient/Media/NCMedia.swift | 7 +- iOSClient/Menu/NCContextMenu.swift | 8 +- iOSClient/Menu/NCMenuAction.swift | 8 +- iOSClient/NCGlobal.swift | 6 +- iOSClient/Networking/NCNetworking.swift | 147 ++++++++---------- .../NCNetworkingProcessUpload.swift | 2 +- iOSClient/Settings/CCManageAutoUpload.m | 2 +- iOSClient/Transfers/NCTransfers.swift | 5 +- iOSClient/Utility/NCCameraRoll.swift | 31 +--- iOSClient/Utility/NCContentPresenter.swift | 8 +- .../Viewer/NCViewerMedia/NCViewerMedia.swift | 9 +- .../NCViewerMedia/NCViewerMediaPage.swift | 17 +- .../Viewer/NCViewerPDF/NCViewerPDF.swift | 8 - 18 files changed, 108 insertions(+), 194 deletions(-) diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index f213d1e7c9..ac58db313f 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -4873,7 +4873,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = NKUJUXUJ3B; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -4899,7 +4899,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 4.9.5; + MARKETING_VERSION = 4.9.6; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; @@ -4938,7 +4938,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = NKUJUXUJ3B; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -4961,7 +4961,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 4.9.5; + MARKETING_VERSION = 4.9.6; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; @@ -5253,7 +5253,7 @@ repositoryURL = "https://github.com/nextcloud/NextcloudKit"; requirement = { kind = exactVersion; - version = 2.9.3; + version = 2.9.4; }; }; F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */ = { diff --git a/iOSClient/Data/NCDataSource.swift b/iOSClient/Data/NCDataSource.swift index 2db57d49a5..571be838ab 100644 --- a/iOSClient/Data/NCDataSource.swift +++ b/iOSClient/Data/NCDataSource.swift @@ -108,7 +108,7 @@ class NCDataSource: NSObject { // get all Section for metadata in self.metadatas { // skipped livePhoto VIDEO part - if metadata.isLivePhoto && metadata.classFile == NKCommon.TypeClassFile.video.rawValue { + if metadata.isLivePhoto && metadata.classFile == NKCommon.TypeClassFile.video.rawValue && metadata.status <= NCGlobal.shared.metadataStatusNormal { continue } let section = NSLocalizedString(self.getSectionValue(metadata: metadata), comment: "") @@ -424,7 +424,7 @@ class NCMetadataForSection: NSObject { } // skipped livePhoto - if metadata.isLivePhoto && metadata.classFile == NKCommon.TypeClassFile.video.rawValue { + if metadata.isLivePhoto && metadata.classFile == NKCommon.TypeClassFile.video.rawValue && metadata.status <= NCGlobal.shared.metadataStatusNormal { continue } diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift index bc99c59a11..851265c26b 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift @@ -327,10 +327,6 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS if error != .success { NCContentPresenter().showError(error: error) } - - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() - } } @objc func moveFile(_ notification: NSNotification) { @@ -339,10 +335,11 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS @objc func copyFile(_ notification: NSNotification) { - guard let userInfo = notification.userInfo as NSDictionary? else { return } + guard let userInfo = notification.userInfo as NSDictionary?, + let error = userInfo["error"] as? NKError else { return } - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() + if error != .success { + NCContentPresenter().showError(error: error) } } @@ -353,11 +350,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS account == appDelegate.account else { return } - if isSearchingMode { - reloadDataSourceNetwork() - } else { - reloadDataSource() - } + reloadDataSourceNetwork(isForced: true) } @objc func createFolder(_ notification: NSNotification) { diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift b/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift index 5defcc2da9..a0b51b4aa2 100644 --- a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift +++ b/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift @@ -25,7 +25,6 @@ import UIKit import SwiftUI import NextcloudKit import Photos -import JGProgressHUD protocol NCCreateFormUploadConflictDelegate: AnyObject { func dismissCreateFormUploadConflict(metadatas: [tableMetadata]?) @@ -391,7 +390,7 @@ extension NCCreateFormUploadConflict: UITableViewDataSource { // PREVIEW let cameraRoll = NCCameraRoll() - cameraRoll.extractImageVideoFromAssetLocalIdentifier(metadata: metadataNewFile, modifyMetadataForUpload: false, viewController: self, hud: JGProgressHUD()) { _, fileNamePath, error in + cameraRoll.extractImageVideoFromAssetLocalIdentifier(metadata: metadataNewFile, modifyMetadataForUpload: false) { _, fileNamePath, error in if !error { self.fileNamesPath[metadataNewFile.fileNameView] = fileNamePath! do { diff --git a/iOSClient/Main/NCActionCenter.swift b/iOSClient/Main/NCActionCenter.swift index 562dd0f3f8..80115130e6 100644 --- a/iOSClient/Main/NCActionCenter.swift +++ b/iOSClient/Main/NCActionCenter.swift @@ -598,12 +598,6 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec func dismissSelect(serverUrl: String?, metadata: tableMetadata?, type: String, items: [Any], indexPath: [IndexPath], overwrite: Bool, copy: Bool, move: Bool) { if let serverUrl, !items.isEmpty { - let hud = JGProgressHUD() - hud.textLabel.text = copy ? NSLocalizedString("_copying_progess_", comment: "") : NSLocalizedString("_moving_progess_", comment: "") - if let appDelegate = UIApplication.shared.delegate as? AppDelegate, - let view = appDelegate.window?.rootViewController?.view { - hud.show(in: view) - } if copy { Task { var error = NKError() @@ -617,7 +611,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec if error != .success { NCContentPresenter().showError(error: error) } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterCopyFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "error": error, "hud": hud]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterCopyFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "error": error]) } } else { Task { @@ -632,7 +626,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec if error != .success { NCContentPresenter().showError(error: error) } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterMoveFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "error": error, "hud": hud]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterMoveFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "error": error]) } } } diff --git a/iOSClient/Media/NCMedia.swift b/iOSClient/Media/NCMedia.swift index ba031e2f12..ec0da8fa85 100644 --- a/iOSClient/Media/NCMedia.swift +++ b/iOSClient/Media/NCMedia.swift @@ -160,13 +160,10 @@ class NCMedia: UIViewController, NCEmptyDataSetDelegate, NCSelectDelegate { guard let userInfo = notification.userInfo as NSDictionary?, let error = userInfo["error"] as? NKError else { return } - if error != .success { - NCContentPresenter().showError(error: error) - } self.reloadDataSource() - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() + if error != .success { + NCContentPresenter().showError(error: error) } } diff --git a/iOSClient/Menu/NCContextMenu.swift b/iOSClient/Menu/NCContextMenu.swift index e3828e4db8..620dfecd9c 100644 --- a/iOSClient/Menu/NCContextMenu.swift +++ b/iOSClient/Menu/NCContextMenu.swift @@ -155,12 +155,6 @@ class NCContextMenu: NSObject { } let alertController = UIAlertController(title: nil, message: nil, preferredStyle: alertStyle) alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_file_", comment: ""), style: .destructive) { _ in - let hud = JGProgressHUD() - hud.textLabel.text = NSLocalizedString("_deletion_progess_", comment: "") - if let appDelegate = UIApplication.shared.delegate as? AppDelegate, - let view = appDelegate.window?.rootViewController?.view { - hud.show(in: view) - } Task { var ocId: [String] = [] let error = await NCNetworking.shared.deleteMetadata(metadata, onlyLocalCache: false) @@ -169,7 +163,7 @@ class NCContextMenu: NSObject { } else { NCContentPresenter().showError(error: error) } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "indexPath": [indexPath], "onlyLocalCache": false, "error": error, "hud": hud]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "indexPath": [indexPath], "onlyLocalCache": false, "error": error]) } }) alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { _ in }) diff --git a/iOSClient/Menu/NCMenuAction.swift b/iOSClient/Menu/NCMenuAction.swift index f6a0fe34bc..981723ce11 100644 --- a/iOSClient/Menu/NCMenuAction.swift +++ b/iOSClient/Menu/NCMenuAction.swift @@ -146,12 +146,6 @@ extension NCMenuAction { preferredStyle: .alert) if canDeleteServer { alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_delete_", comment: ""), style: .default) { (_: UIAlertAction) in - let hud = JGProgressHUD() - hud.textLabel.text = NSLocalizedString("_deletion_progess_", comment: "") - if let appDelegate = UIApplication.shared.delegate as? AppDelegate, - let view = appDelegate.window?.rootViewController?.view { - hud.show(in: view) - } Task { var error = NKError() var ocId: [String] = [] @@ -161,7 +155,7 @@ extension NCMenuAction { ocId.append(metadata.ocId) } } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "onlyLocalCache": false, "error": error, "hud": hud]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "indexPath": indexPath, "onlyLocalCache": false, "error": error]) } completion?() }) diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index 82fe2f08a6..829a039907 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -376,9 +376,9 @@ class NCGlobal: NSObject { let notificationCenterProgressTask = "progressTask" // userInfo: account, ocId, serverUrl, status, chunk, e2eEncrypted, progress, totalBytes, totalBytesExpected let notificationCenterCreateFolder = "createFolder" // userInfo: ocId, serverUrl, account, withPush - let notificationCenterDeleteFile = "deleteFile" // userInfo: [ocId], [indexPath], onlyLocalCache, error, hud? - let notificationCenterMoveFile = "moveFile" // userInfo: [ocId], [indexPath], error, hud? - let notificationCenterCopyFile = "copyFile" // userInfo: [ocId], [indexPath], error, hud? + let notificationCenterDeleteFile = "deleteFile" // userInfo: [ocId], [indexPath], onlyLocalCache, error + let notificationCenterMoveFile = "moveFile" // userInfo: [ocId], [indexPath], error + let notificationCenterCopyFile = "copyFile" // userInfo: [ocId], [indexPath], error let notificationCenterRenameFile = "renameFile" // userInfo: ocId, account, indexPath let notificationCenterFavoriteFile = "favoriteFile" // userInfo: ocId, serverUrl diff --git a/iOSClient/Networking/NCNetworking.swift b/iOSClient/Networking/NCNetworking.swift index 1be65d0980..1c21b04281 100644 --- a/iOSClient/Networking/NCNetworking.swift +++ b/iOSClient/Networking/NCNetworking.swift @@ -435,8 +435,27 @@ class NCNetworking: NSObject, NKCommonDelegate { DispatchQueue.main.async { hud?.progress = Float(counter) / Float(numChunks) } } start: { DispatchQueue.main.async { hud?.dismiss() } - } completion: { _, _, _, error in + } completion: { account, _, afError, error in DispatchQueue.main.async { hud?.dismiss() } + var sessionTaskFailedCode = 0 + let directory = self.utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId) + if let error = NextcloudKit.shared.nkCommonInstance.getSessionErrorFromAFError(afError) { + sessionTaskFailedCode = error.code + } + switch error.errorCode { + case NKError.chunkNoEnoughMemory, NKError.chunkCreateFolder, NKError.chunkFilesNull, NKError.chunkFileNull: + NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) + NCContentPresenter().messageNotification("_error_files_upload_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error, afterDelay: 0.5) + case NKError.chunkFileUpload: + if let afError, (afError.isExplicitlyCancelledError || sessionTaskFailedCode == NCGlobal.shared.errorExplicitlyCancelled ) { + NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) + } + case NKError.chunkMoveFile: + NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) + NCContentPresenter().messageNotification("_chunk_move_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error, afterDelay: 0.5) + default: break + } completion(error) } } else if metadata.session == NextcloudKit.shared.nkCommonInstance.sessionIdentifierUpload { @@ -570,47 +589,13 @@ class NCNetworking: NSObject, NKCommonDelegate { } completion: { account, _, file, afError, error in - var sessionTaskFailedCode = 0 self.uploadRequest.removeValue(forKey: fileNameLocalPath) - if error == .success { NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) } - if let error = NextcloudKit.shared.nkCommonInstance.getSessionErrorFromAFError(afError) { - sessionTaskFailedCode = error.code - } - - switch error.errorCode { - case NKError.chunkNoEnoughMemory: - NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - NCContentPresenter().messageNotification("_chunk_enough_memory_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - case NKError.chunkCreateFolder: - NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - NCContentPresenter().messageNotification("_chunk_create_folder_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - case NKError.chunkFilesNull: - NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - NCContentPresenter().messageNotification("_chunk_files_null_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - case NKError.chunkFileNull: - NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - NCContentPresenter().messageNotification("_chunk_file_null_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - case NKError.chunkFileUpload: - if let afError, (afError.isExplicitlyCancelledError || sessionTaskFailedCode == NCGlobal.shared.errorExplicitlyCancelled ) { - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - } - case NKError.chunkMoveFile: - NCManageDatabase.shared.deleteChunks(account: account, ocId: metadata.ocId, directory: directory) - NCContentPresenter().messageNotification("_chunk_move_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - default: break - } - if withUploadComplete, let uploadTask { self.uploadComplete(fileName: metadata.fileName, serverUrl: metadata.serverUrl, ocId: file?.ocId, etag: file?.etag, date: file?.date, size: file?.size ?? 0, description: metadata.ocId, task: uploadTask, error: error) } - completion(account, file, afError, error) } } @@ -702,11 +687,14 @@ class NCNetworking: NSObject, NKCommonDelegate { utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(ocIdTemp)) } - uploadLivePhoto(metadata: metadata) - NextcloudKit.shared.nkCommonInstance.writeLog("[SUCCESS] Upload complete " + serverUrl + "/" + fileName + ", result: success(\(size) bytes)") - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "fileName": metadata.fileName, "ocIdTemp": ocIdTemp, "error": error]) + let userInfo: [AnyHashable: Any] = ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "fileName": metadata.fileName, "ocIdTemp": ocIdTemp, "error": error] + if metadata.isLivePhoto, NCGlobal.shared.isLivePhotoServerAvailable { + uploadLivePhoto(metadata: metadata, userInfo: userInfo) + } else { + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: userInfo) + } } else { if error.errorCode == NSURLErrorCancelled || error.errorCode == NCGlobal.shared.errorRequestExplicityCancelled { @@ -803,28 +791,31 @@ class NCNetworking: NSObject, NKCommonDelegate { // MARK: - Live Photo - func uploadLivePhoto(metadata: tableMetadata) { + func uploadLivePhoto(metadata: tableMetadata, userInfo aUserInfo: [AnyHashable: Any]) { - guard NCGlobal.shared.isLivePhotoServerAvailable, - metadata.isLivePhoto, - let metadata1 = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND urlBase == %@ AND path == %@ AND fileName == %@ AND status == %d", metadata.account, metadata.urlBase, metadata.path, metadata.livePhotoFile, NCGlobal.shared.metadataStatusNormal)) else { + guard let metadata1 = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND urlBase == %@ AND path == %@ AND fileName == %@ AND status == %d", metadata.account, metadata.urlBase, metadata.path, metadata.livePhotoFile, NCGlobal.shared.metadataStatusNormal)) else { return } Task { let serverUrlfileNamePath = metadata.urlBase + metadata.path + metadata.fileName var livePhotoFile = metadata1.fileId - var results = await NextcloudKit.shared.setLivephoto(serverUrlfileNamePath: serverUrlfileNamePath, livePhotoFile: livePhotoFile) + let results = await NextcloudKit.shared.setLivephoto(serverUrlfileNamePath: serverUrlfileNamePath, livePhotoFile: livePhotoFile) if results.error == .success { NCManageDatabase.shared.setMetadataLivePhotoByServer(account: metadata.account, ocId: metadata.ocId, livePhotoFile: livePhotoFile) + } else { + NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Uplod set LivePhoto with error \(results.error.errorCode)") } let serverUrlfileNamePath1 = metadata1.urlBase + metadata1.path + metadata1.fileName livePhotoFile = metadata.fileId - results = await NextcloudKit.shared.setLivephoto(serverUrlfileNamePath: serverUrlfileNamePath1, livePhotoFile: livePhotoFile) - if results.error == .success { + let results1 = await NextcloudKit.shared.setLivephoto(serverUrlfileNamePath: serverUrlfileNamePath1, livePhotoFile: livePhotoFile) + if results1.error == .success { NCManageDatabase.shared.setMetadataLivePhotoByServer(account: metadata1.account, ocId: metadata1.ocId, livePhotoFile: livePhotoFile) + } else { + NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Upload set LivePhoto with error \(results.error.errorCode)") } + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadedFile, userInfo: aUserInfo) } } @@ -1496,12 +1487,10 @@ class NCNetworking: NSObject, NKCommonDelegate { if !metadata.permissions.isEmpty && permission == false { return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_delete_file_") } - let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName let options = NKRequestOptions(customHeader: customHeader) let result = await NextcloudKit.shared.deleteFileOrFolder(serverUrlFileName: serverUrlFileName, options: options) - if result.error == .success || result.error.errorCode == NCGlobal.shared.errorResourceNotFound { do { @@ -1511,8 +1500,8 @@ class NCNetworking: NSObject, NKCommonDelegate { NCManageDatabase.shared.deleteVideo(metadata: metadata) NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - - if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata) { + // LIVE PHOTO SERVER + if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata), metadataLive.isFlaggedAsLivePhotoByServer { do { try FileManager.default.removeItem(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadataLive.ocId)) } catch { } @@ -1526,7 +1515,6 @@ class NCNetworking: NSObject, NKCommonDelegate { NCManageDatabase.shared.deleteDirectoryAndSubDirectory(serverUrl: utilityFileSystem.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName), account: metadata.account) } } - return result.error } @@ -1640,53 +1628,36 @@ class NCNetworking: NSObject, NKCommonDelegate { if fileNameNew.isEmpty || fileNameNew == metadata.fileNameView { return completion(NKError()) } - let fileNamePath = metadata.serverUrl + "/" + metadata.fileName let fileNameToPath = metadata.serverUrl + "/" + fileNameNew - let ocId = metadata.ocId NextcloudKit.shared.moveFileOrFolder(serverUrlFileNameSource: fileNamePath, serverUrlFileNameDestination: fileNameToPath, overwrite: false) { _, error in - if error == .success { - - NCManageDatabase.shared.renameMetadata(fileNameTo: fileNameNew, ocId: ocId) - if metadata.directory { - let serverUrl = self.utilityFileSystem.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName) let serverUrlTo = self.utilityFileSystem.stringAppendServerUrl(metadata.serverUrl, addFileName: fileNameNew) if let directory = NCManageDatabase.shared.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", metadata.account, metadata.serverUrl)) { - NCManageDatabase.shared.setDirectory(serverUrl: serverUrl, serverUrlTo: serverUrlTo, etag: "", ocId: nil, fileId: nil, encrypted: directory.e2eEncrypted, richWorkspace: nil, account: metadata.account) } - } else { - - let ext = (metadata.fileName as NSString).pathExtension - let extNew = (fileNameNew as NSString).pathExtension - - if ext != extNew { - - self.utilityFileSystem.removeFile(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(ocId)) - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced) - - } else { - - NCManageDatabase.shared.setLocalFile(ocId: ocId, fileName: fileNameNew, etag: nil) - // Move file system - let atPath = self.utilityFileSystem.getDirectoryProviderStorageOcId(ocId) + "/" + metadata.fileName - let toPath = self.utilityFileSystem.getDirectoryProviderStorageOcId(ocId) + "/" + fileNameNew + do { + try FileManager.default.removeItem(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) + } catch { } + NCManageDatabase.shared.deleteVideo(metadata: metadata) + NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + // LIVE PHOTO SERVER + if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata), metadataLive.isFlaggedAsLivePhotoByServer { do { - try FileManager.default.moveItem(atPath: atPath, toPath: toPath) + try FileManager.default.removeItem(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(metadataLive.ocId)) } catch { } + NCManageDatabase.shared.deleteVideo(metadata: metadataLive) + NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadataLive.ocId)) + NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadataLive.ocId)) } } - - if let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocId) { - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterRenameFile, userInfo: ["ocId": metadata.ocId, "account": metadata.account, "indexPath": indexPath]) - } + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterRenameFile, userInfo: ["ocId": metadata.ocId, "account": metadata.account, "indexPath": indexPath]) } - completion(error) } } @@ -1712,7 +1683,6 @@ class NCNetworking: NSObject, NKCommonDelegate { if !metadata.permissions.isEmpty && !permission { return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_modify_file_") } - let serverUrlFileNameSource = metadata.serverUrl + "/" + metadata.fileName let serverUrlFileNameDestination = serverUrlTo + "/" + metadata.fileName @@ -1721,13 +1691,23 @@ class NCNetworking: NSObject, NKCommonDelegate { if metadata.directory { NCManageDatabase.shared.deleteDirectoryAndSubDirectory(serverUrl: utilityFileSystem.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName), account: result.account) } else { + do { + try FileManager.default.removeItem(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) + } catch { } + NCManageDatabase.shared.deleteVideo(metadata: metadata) NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) - if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata) { + NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + // LIVE PHOTO SERVER + if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata), metadataLive.isFlaggedAsLivePhotoByServer { + do { + try FileManager.default.removeItem(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(metadataLive.ocId)) + } catch { } + NCManageDatabase.shared.deleteVideo(metadata: metadataLive) NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadataLive.ocId)) + NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadataLive.ocId)) } } } - return result.error } @@ -1752,7 +1732,6 @@ class NCNetworking: NSObject, NKCommonDelegate { if !metadata.permissions.isEmpty && !permission { return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_modify_file_") } - let serverUrlFileNameSource = metadata.serverUrl + "/" + metadata.fileName let serverUrlFileNameDestination = serverUrlTo + "/" + metadata.fileName diff --git a/iOSClient/Networking/NCNetworkingProcessUpload.swift b/iOSClient/Networking/NCNetworkingProcessUpload.swift index 2247dc252d..79d845bc65 100644 --- a/iOSClient/Networking/NCNetworkingProcessUpload.swift +++ b/iOSClient/Networking/NCNetworkingProcessUpload.swift @@ -160,7 +160,7 @@ class NCNetworkingProcessUpload: NSObject { let semaphore = DispatchSemaphore(value: 0) let cameraRoll = NCCameraRoll() - cameraRoll.extractCameraRoll(from: metadata, viewController: self.rootViewController, hud: self.hud) { metadatas in + cameraRoll.extractCameraRoll(from: metadata) { metadatas in if metadatas.isEmpty { NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) } diff --git a/iOSClient/Settings/CCManageAutoUpload.m b/iOSClient/Settings/CCManageAutoUpload.m index dc39d0b14e..269379039f 100644 --- a/iOSClient/Settings/CCManageAutoUpload.m +++ b/iOSClient/Settings/CCManageAutoUpload.m @@ -425,7 +425,7 @@ - (void)dismissSelectWithServerUrl:(NSString * _Nullable)serverUrl metadata:(tab NSString* home = [[[NCUtilityFileSystem alloc] init] getHomeServerWithUrlBase:appDelegate.urlBase userId:appDelegate.userId]; if ([serverUrl isEqualToString:home]) { NKError *error = [[NKError alloc] initWithErrorCode:NCGlobal.shared.errorInternalError errorDescription:@"_autoupload_error_select_folder_" responseData:nil]; - [[[NCContentPresenter alloc] init] messageNotification:@"_error_" error:error delay:[[NCGlobal shared] dismissAfterSecond] type:messageTypeError]; + [[[NCContentPresenter alloc] init] messageNotification:@"_error_" error:error delay:[[NCGlobal shared] dismissAfterSecond] type:messageTypeError afterDelay:0]; return; } diff --git a/iOSClient/Transfers/NCTransfers.swift b/iOSClient/Transfers/NCTransfers.swift index fa001d27e2..dfb773abec 100644 --- a/iOSClient/Transfers/NCTransfers.swift +++ b/iOSClient/Transfers/NCTransfers.swift @@ -139,11 +139,10 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { guard appDelegate.account == metadata.account else { return } let cameraRoll = NCCameraRoll() - let hud = JGProgressHUD() - cameraRoll.extractCameraRoll(from: metadata, viewController: self, hud: hud) { metadatas in + cameraRoll.extractCameraRoll(from: metadata) { metadatas in for metadata in metadatas { if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) { - NCNetworking.shared.upload(metadata: metadata, hudView: self.appDelegate.window?.rootViewController?.view, hud: hud) + NCNetworking.shared.upload(metadata: metadata, hudView: self.appDelegate.window?.rootViewController?.view, hud: JGProgressHUD()) } } } diff --git a/iOSClient/Utility/NCCameraRoll.swift b/iOSClient/Utility/NCCameraRoll.swift index 926784e8f1..3a9330c002 100644 --- a/iOSClient/Utility/NCCameraRoll.swift +++ b/iOSClient/Utility/NCCameraRoll.swift @@ -23,13 +23,13 @@ import Foundation import NextcloudKit -import JGProgressHUD +//import JGProgressHUD class NCCameraRoll: NSObject { let utilityFileSystem = NCUtilityFileSystem() - func extractCameraRoll(from metadata: tableMetadata, viewController: UIViewController?, hud: JGProgressHUD?, completition: @escaping (_ metadatas: [tableMetadata]) -> Void) { + func extractCameraRoll(from metadata: tableMetadata, completition: @escaping (_ metadatas: [tableMetadata]) -> Void) { var chunkSize = NCGlobal.shared.chunkSizeMBCellular if NCNetworking.shared.networkReachability == NKCommon.TypeReachability.reachableEthernetOrWiFi { @@ -68,7 +68,7 @@ class NCCameraRoll: NSObject { return completition(metadatas) } - extractImageVideoFromAssetLocalIdentifier(metadata: metadataSource, modifyMetadataForUpload: true, viewController: viewController, hud: hud) { metadata, fileNamePath, error in + extractImageVideoFromAssetLocalIdentifier(metadata: metadataSource, modifyMetadataForUpload: true) { metadata, fileNamePath, error in if let metadata = metadata, let fileNamePath = fileNamePath, !error { metadatas.append(metadata) let toPath = self.utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView) @@ -94,8 +94,6 @@ class NCCameraRoll: NSObject { func extractImageVideoFromAssetLocalIdentifier(metadata: tableMetadata, modifyMetadataForUpload: Bool, - viewController: UIViewController?, - hud: JGProgressHUD?, completion: @escaping (_ metadata: tableMetadata?, _ fileNamePath: String?, _ error: Bool) -> Void) { var fileNamePath: String? @@ -210,27 +208,11 @@ class NCCameraRoll: NSObject { metadata.size = self.utilityFileSystem.getFileSize(filePath: fileNamePath) return callCompletionWithError(false) } catch { return callCompletionWithError() } - } else if let asset = asset as? AVComposition, asset.tracks.count > 1, let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality), let viewController = viewController { - DispatchQueue.main.async { - if let hud { - hud.indicatorView = JGProgressHUDRingIndicatorView() - if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView { - indicatorView.ringWidth = 1.5 - } - hud.textLabel.text = NSLocalizedString("_exporting_video_", comment: "") - hud.show(in: viewController.view) - hud.tapOnHUDViewBlock = { _ in - exporter.cancelExport() - } - } - } + } else if let asset = asset as? AVComposition, asset.tracks.count > 1, let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) { exporter.outputURL = URL(fileURLWithPath: fileNamePath) exporter.outputFileType = AVFileType.mp4 exporter.shouldOptimizeForNetworkUse = true exporter.exportAsynchronously { - DispatchQueue.main.async { - hud?.dismiss() - } if exporter.status == .completed { metadata.creationDate = creationDate as NSDate metadata.date = modificationDate as NSDate @@ -238,11 +220,6 @@ class NCCameraRoll: NSObject { return callCompletionWithError(false) } else { return callCompletionWithError() } } - while exporter.status == AVAssetExportSession.Status.exporting || exporter.status == AVAssetExportSession.Status.waiting { - DispatchQueue.main.async { - hud?.progress = exporter.progress - } - } } else { return callCompletionWithError() } diff --git a/iOSClient/Utility/NCContentPresenter.swift b/iOSClient/Utility/NCContentPresenter.swift index 9ed8572391..a07ed07f41 100644 --- a/iOSClient/Utility/NCContentPresenter.swift +++ b/iOSClient/Utility/NCContentPresenter.swift @@ -90,11 +90,11 @@ class NCContentPresenter: NSObject { priority: priority) } - @objc func messageNotification(_ title: String, error: NKError, delay: TimeInterval, type: messageType) { - messageNotification(title, error: error, delay: delay, type: type, priority: .normal, dropEnqueuedEntries: false) + @objc func messageNotification(_ title: String, error: NKError, delay: TimeInterval, type: messageType, afterDelay: TimeInterval = 0) { + messageNotification(title, error: error, delay: delay, type: type, priority: .normal, dropEnqueuedEntries: false, afterDelay: afterDelay) } - func messageNotification(_ title: String, error: NKError, delay: TimeInterval, type: messageType, priority: EKAttributes.Precedence.Priority = .normal, dropEnqueuedEntries: Bool = false) { + func messageNotification(_ title: String, error: NKError, delay: TimeInterval, type: messageType, priority: EKAttributes.Precedence.Priority = .normal, dropEnqueuedEntries: Bool = false, afterDelay: TimeInterval = 0) { // No notification message for: if error.errorCode == NSURLErrorCancelled || error.errorCode == NCGlobal.shared.errorRequestExplicityCancelled { return } else if error == .success && type == messageType.error { return } @@ -105,7 +105,7 @@ class NCContentPresenter: NSObject { type = .info } - DispatchQueue.main.async { + DispatchQueue.main.asyncAfter(deadline: .now() + afterDelay) { switch error.errorCode { case Int(CFNetworkErrors.cfurlErrorNotConnectedToInternet.rawValue): let image = UIImage(named: "networkInProgress")!.image(color: .white, size: 20) diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift index e715d0d2be..b0569170a9 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift @@ -279,11 +279,10 @@ class NCViewerMedia: UIViewController { guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(metadata.ocId) else { return } self.metadata = metadata - if metadata.isLivePhoto { - let fileNameMOV = (metadata.fileNameView as NSString).deletingPathExtension + ".mov" - if let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView LIKE[c] %@", metadata.account, metadata.serverUrl, fileNameMOV)), !utilityFileSystem.fileProviderStorageExists(metadata) { - NCNetworking.shared.download(metadata: metadata, selector: "") { _, _ in } - } + if metadata.isLivePhoto, + let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata), + !utilityFileSystem.fileProviderStorageExists(metadataLive) { + NCNetworking.shared.download(metadata: metadataLive, selector: "") { _, _ in } } if metadata.isImage, (metadata.fileExtension.lowercased() == "gif" || metadata.fileExtension.lowercased() == "svg"), !utilityFileSystem.fileProviderStorageExists(metadata) { diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift index 9fa1d7ecd8..e76ebfa8d5 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift @@ -407,10 +407,6 @@ class NCViewerMediaPage: UIViewController { shiftCurrentPage() } } - - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() - } } @objc func moveFile(_ notification: NSNotification) { @@ -419,10 +415,11 @@ class NCViewerMediaPage: UIViewController { @objc func copyFile(_ notification: NSNotification) { - guard let userInfo = notification.userInfo as NSDictionary? else { return } + guard let userInfo = notification.userInfo as NSDictionary?, + let error = userInfo["error"] as? NKError else { return } - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() + if error != .success { + NCContentPresenter().showError(error: error) } } @@ -679,10 +676,10 @@ extension NCViewerMediaPage: UIGestureRecognizerDelegate { if !currentViewController.metadata.isLivePhoto || currentViewController.detailView.isShown { return } if gestureRecognizer.state == .began { - let fileName = (currentViewController.metadata.fileNameView as NSString).deletingPathExtension + ".mov" - if let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView LIKE[c] %@", currentViewController.metadata.account, currentViewController.metadata.serverUrl, fileName)), utilityFileSystem.fileProviderStorageExists(metadata) { + if let metadataLive = NCManageDatabase.shared.getMetadataLivePhoto(metadata: currentViewController.metadata), + utilityFileSystem.fileProviderStorageExists(metadataLive) { AudioServicesPlaySystemSound(1519) // peek feedback - currentViewController.playLivePhoto(filePath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)) + currentViewController.playLivePhoto(filePath: utilityFileSystem.getDirectoryProviderStorageOcId(metadataLive.ocId, fileNameView: metadataLive.fileName)) } } else if gestureRecognizer.state == .ended { currentViewController.stopLivePhoto() diff --git a/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift b/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift index 7102f9578a..e0f9f6e1a1 100644 --- a/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift +++ b/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift @@ -363,10 +363,6 @@ class NCViewerPDF: UIViewController, NCViewerPDFSearchDelegate { metadata?.ocId == ocId { viewUnload() } - - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() - } } @objc func moveFile(_ notification: NSNotification) { @@ -378,10 +374,6 @@ class NCViewerPDF: UIViewController, NCViewerPDFSearchDelegate { let metadataNew = NCManageDatabase.shared.getMetadataFromOcId(ocId) { self.metadata = metadataNew } - - if let hud = userInfo["hud"] as? JGProgressHUD { - hud.dismiss() - } } @objc func renameFile(_ notification: NSNotification) {