From 3d2860107522cb7769d085192d3b0e5b957d3e07 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Fri, 27 Sep 2024 11:28:46 +0200 Subject: [PATCH] Delete (#3079) Signed-off-by: Marino Faggiana --------- Signed-off-by: Marino Faggiana --- .../UIAlertController+Extension.swift | 15 +- iOSClient/Files/NCFiles.swift | 2 +- .../NCCollectionViewCommon+SelectTabBar.swift | 15 +- .../NCCollectionViewCommon.swift | 6 +- .../NCMedia+CollectionViewDataSource.swift | 4 +- ...+CollectionViewDataSourcePrefetching.swift | 2 +- .../NCMedia+CollectionViewDelegate.swift | 4 +- iOSClient/Media/NCMedia+Command.swift | 65 +++++---- iOSClient/Media/NCMedia+DragDrop.swift | 2 +- iOSClient/Media/NCMedia+MediaLayout.swift | 4 +- iOSClient/Media/NCMedia.swift | 52 +++---- iOSClient/Media/NCMediaDataSource.swift | 6 +- iOSClient/Media/NCMediaPinchGesture.swift | 2 +- iOSClient/Menu/NCContextMenu.swift | 12 +- iOSClient/More/NCMore.swift | 2 +- iOSClient/NCGlobal.swift | 6 +- iOSClient/NCImageCache.swift | 33 +++-- iOSClient/Networking/NCNetworking+Task.swift | 31 +++- .../Networking/NCNetworking+WebDAV.swift | 133 ++++++++---------- iOSClient/Networking/NCNetworking.swift | 1 + .../Networking/NCNetworkingProcess.swift | 11 ++ iOSClient/Select/NCSelect.swift | 4 +- .../en.lproj/Localizable.strings | 3 +- iOSClient/Transfers/NCTransfers.swift | 6 +- 24 files changed, 221 insertions(+), 200 deletions(-) diff --git a/iOSClient/Extensions/UIAlertController+Extension.swift b/iOSClient/Extensions/UIAlertController+Extension.swift index fb31898d86..1c25c587bc 100644 --- a/iOSClient/Extensions/UIAlertController+Extension.swift +++ b/iOSClient/Extensions/UIAlertController+Extension.swift @@ -117,17 +117,10 @@ extension UIAlertController { preferredStyle: .alert) if canDeleteServer { alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_", comment: ""), style: .destructive) { (_: UIAlertAction) in - Task { - var error = NKError() - var ocId: [String] = [] - for metadata in selectedMetadatas where error == .success { - error = await NCNetworking.shared.deleteMetadata(metadata) - if error == .success { - ocId.append(metadata.ocId) - } - } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": false, "error": error]) + for metadata in selectedMetadatas { + NCNetworking.shared.deleteMetadata(metadata) } + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource) completion(false) }) } @@ -142,7 +135,7 @@ extension UIAlertController { ocId.append(metadata.ocId) } } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": true, "error": error]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "error": error]) } completion(false) }) diff --git a/iOSClient/Files/NCFiles.swift b/iOSClient/Files/NCFiles.swift index 42b088d298..8f3245972b 100644 --- a/iOSClient/Files/NCFiles.swift +++ b/iOSClient/Files/NCFiles.swift @@ -123,7 +123,7 @@ class NCFiles: NCCollectionViewCommon { let predicateDirectory = NSPredicate(format: "account == %@ AND serverUrl == %@", session.account, self.serverUrl) if NCKeychain().getPersonalFilesOnly(account: session.account) { - predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND (ownerId == %@ || ownerId == '') AND mountType == '' AND NOT (status IN %@)", session.account, self.serverUrl, session.userId, global.metadataStatusFileUp) + predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND (ownerId == %@ || ownerId == '') AND mountType == '' AND NOT (status IN %@)", session.account, self.serverUrl, session.userId, global.metadataStatusHideInView) } self.metadataFolder = database.getMetadataFolder(session: session, serverUrl: self.serverUrl) diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift index 439575d6ee..7605d7f82c 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift @@ -46,17 +46,10 @@ extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { if canDeleteServer { let copyMetadatas = metadatas alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_", comment: ""), style: .destructive) { _ in - Task { - var error = NKError() - var ocId: [String] = [] - for metadata in copyMetadatas where error == .success { - error = await NCNetworking.shared.deleteMetadata(metadata) - if error == .success { - ocId.append(metadata.ocId) - } - } - NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": false, "error": error]) + for metadata in copyMetadatas { + NCNetworking.shared.deleteMetadata(metadata) } + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource) self.setEditMode(false) }) } @@ -73,7 +66,7 @@ extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { ocId.append(metadata.ocId) } } - NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": true, "error": error]) + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "error": error]) } self.setEditMode(false) }) diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift index f84faabfa5..db9c980663 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift @@ -124,7 +124,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS } var defaultPredicate: NSPredicate { - let predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND NOT (status IN %@) AND NOT (livePhotoFile != '' AND classFile == %@)", session.account, self.serverUrl, NCGlobal.shared.metadataStatusFileUp, NKCommon.TypeClassFile.video.rawValue) + let predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND NOT (status IN %@) AND NOT (livePhotoFile != '' AND classFile == %@)", session.account, self.serverUrl, NCGlobal.shared.metadataStatusHideInView, NKCommon.TypeClassFile.video.rawValue) return predicate } @@ -194,6 +194,8 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS self.navigationController?.navigationItem.leftBarButtonItems?.first?.customView?.addInteraction(dropInteraction) NotificationCenter.default.addObserver(self, selector: #selector(changeTheming(_:)), name: NSNotification.Name(rawValue: global.notificationCenterChangeTheming), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) + } override func viewWillAppear(_ animated: Bool) { @@ -236,7 +238,6 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS NotificationCenter.default.addObserver(self, selector: #selector(changeStatusFolderE2EE(_:)), name: NSNotification.Name(rawValue: global.notificationCenterChangeStatusFolderE2EE), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(reloadAvatar(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadAvatar), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSourceNetwork(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSourceNetwork), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(deleteFile(_:)), name: NSNotification.Name(rawValue: global.notificationCenterDeleteFile), object: nil) @@ -278,7 +279,6 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterChangeStatusFolderE2EE), object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterReloadAvatar), object: nil) - NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSourceNetwork), object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterDeleteFile), object: nil) diff --git a/iOSClient/Media/NCMedia+CollectionViewDataSource.swift b/iOSClient/Media/NCMedia+CollectionViewDataSource.swift index c00b19c6c5..b5853d647a 100644 --- a/iOSClient/Media/NCMedia+CollectionViewDataSource.swift +++ b/iOSClient/Media/NCMedia+CollectionViewDataSource.swift @@ -101,7 +101,7 @@ extension NCMedia: UICollectionViewDataSource { } guard let metadata = dataSource.getMetadata(indexPath: indexPath) else { return cell } - let ext = NCGlobal.shared.getSizeExtension(column: self.numberOfColumns) + let ext = global.getSizeExtension(column: self.numberOfColumns) let imageCache = imageCache.getImageCache(ocId: metadata.ocId, etag: metadata.etag, ext: ext) cell.backgroundColor = .secondarySystemBackground @@ -125,7 +125,7 @@ extension NCMedia: UICollectionViewDataSource { } if cell.imageItem.image == nil { - if isPinchGestureActive || ext == NCGlobal.shared.previewExt512 || ext == NCGlobal.shared.previewExt1024 { + if isPinchGestureActive || ext == global.previewExt512 || ext == global.previewExt1024 { cell.imageItem.image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: ext) } else { DispatchQueue.global(qos: .userInteractive).async { diff --git a/iOSClient/Media/NCMedia+CollectionViewDataSourcePrefetching.swift b/iOSClient/Media/NCMedia+CollectionViewDataSourcePrefetching.swift index 994bc2496c..4cb1295c32 100644 --- a/iOSClient/Media/NCMedia+CollectionViewDataSourcePrefetching.swift +++ b/iOSClient/Media/NCMedia+CollectionViewDataSourcePrefetching.swift @@ -30,7 +30,7 @@ extension NCMedia: UICollectionViewDataSourcePrefetching { let cost = indexPaths.first?.row ?? 0 let metadatas = self.dataSource.getMetadatas(indexPaths: indexPaths) - let ext = NCGlobal.shared.getSizeExtension(column: self.numberOfColumns) + let ext = global.getSizeExtension(column: self.numberOfColumns) let percentageCache = (Double(self.imageCache.cache.count) / Double(self.imageCache.countLimit - 1)) * 100 if cost > self.imageCache.countLimit, percentageCache > 75 { diff --git a/iOSClient/Media/NCMedia+CollectionViewDelegate.swift b/iOSClient/Media/NCMedia+CollectionViewDelegate.swift index 62e5b2d205..ee18697a04 100644 --- a/iOSClient/Media/NCMedia+CollectionViewDelegate.swift +++ b/iOSClient/Media/NCMedia+CollectionViewDelegate.swift @@ -40,7 +40,7 @@ extension NCMedia: UICollectionViewDelegate { } tabBarSelect.selectCount = fileSelect.count } else if let metadata = database.getMetadataFromOcId(metadata.ocId) { - let image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: NCGlobal.shared.previewExt1024) + let image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: global.previewExt1024) let ocIds = dataSource.metadatas.map { $0.ocId } NCViewer().view(viewController: self, metadata: metadata, ocIds: ocIds, image: image) @@ -52,7 +52,7 @@ extension NCMedia: UICollectionViewDelegate { let metadata = database.getMetadataFromOcId(ocId) else { return nil } let identifier = indexPath as NSCopying - let image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: NCGlobal.shared.previewExt1024) + let image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: global.previewExt1024) return UIContextMenuConfiguration(identifier: identifier, previewProvider: { return NCViewerProviderContextMenu(metadata: metadata, image: image) diff --git a/iOSClient/Media/NCMedia+Command.swift b/iOSClient/Media/NCMedia+Command.swift index 9eb339223e..5a9eb9a6d8 100644 --- a/iOSClient/Media/NCMedia+Command.swift +++ b/iOSClient/Media/NCMedia+Command.swift @@ -98,13 +98,13 @@ extension NCMedia { } func createMenu() { - let layoutForView = database.getLayoutForView(account: session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "") - var layout = layoutForView?.layout ?? NCGlobal.shared.mediaLayoutRatio + let layoutForView = database.getLayoutForView(account: session.account, key: global.layoutViewMedia, serverUrl: "") + var layout = layoutForView?.layout ?? global.mediaLayoutRatio /// Overwrite default value - if layout == NCGlobal.shared.layoutList { layout = NCGlobal.shared.mediaLayoutRatio } + if layout == global.layoutList { layout = global.mediaLayoutRatio } /// - let layoutTitle = (layout == NCGlobal.shared.mediaLayoutRatio) ? NSLocalizedString("_media_square_", comment: "") : NSLocalizedString("_media_ratio_", comment: "") - let layoutImage = (layout == NCGlobal.shared.mediaLayoutRatio) ? utility.loadImage(named: "square.grid.3x3") : utility.loadImage(named: "rectangle.grid.3x2") + let layoutTitle = (layout == global.mediaLayoutRatio) ? NSLocalizedString("_media_square_", comment: "") : NSLocalizedString("_media_ratio_", comment: "") + let layoutImage = (layout == global.mediaLayoutRatio) ? utility.loadImage(named: "square.grid.3x3") : utility.loadImage(named: "rectangle.grid.3x2") let viewFilterMenu = UIMenu(title: "", options: .displayInline, children: [ UIAction(title: NSLocalizedString("_media_viewimage_show_", comment: ""), image: utility.loadImage(named: "photo")) { _ in @@ -129,12 +129,12 @@ extension NCMedia { let viewLayoutMenu = UIMenu(title: "", options: .displayInline, children: [ UIAction(title: layoutTitle, image: layoutImage) { _ in - if layout == NCGlobal.shared.mediaLayoutRatio { - self.database.setLayoutForView(account: self.session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "", layout: NCGlobal.shared.mediaLayoutSquare) - self.layoutType = NCGlobal.shared.mediaLayoutSquare + if layout == self.global.mediaLayoutRatio { + self.database.setLayoutForView(account: self.session.account, key: self.global.layoutViewMedia, serverUrl: "", layout: self.global.mediaLayoutSquare) + self.layoutType = self.global.mediaLayoutSquare } else { - self.database.setLayoutForView(account: self.session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "", layout: NCGlobal.shared.mediaLayoutRatio) - self.layoutType = NCGlobal.shared.mediaLayoutRatio + self.database.setLayoutForView(account: self.session.account, key: self.global.layoutViewMedia, serverUrl: "", layout: self.global.mediaLayoutRatio) + self.layoutType = self.global.mediaLayoutRatio } self.createMenu() self.collectionViewReloadData() @@ -187,29 +187,44 @@ extension NCMedia { extension NCMedia: NCMediaSelectTabBarDelegate { func delete() { - let fileSelect = self.fileSelect.map { $0 } + let ocIds = self.fileSelect.map { $0 } var alertStyle = UIAlertController.Style.actionSheet + var indexPaths: [IndexPath] = [] + if UIDevice.current.userInterfaceIdiom == .pad { alertStyle = .alert } - if !fileSelect.isEmpty { + + if !ocIds.isEmpty { + let indices = dataSource.metadatas.enumerated().filter { ocIds.contains($0.element.ocId) }.map { $0.offset } let alertController = UIAlertController(title: nil, message: nil, preferredStyle: alertStyle) + alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_selected_photos_", comment: ""), style: .destructive) { (_: UIAlertAction) in - Task { - var error = NKError() - var ocIds: [String] = [] - for ocId in fileSelect where error == .success { - if let metadata = self.database.getMetadataFromOcId(ocId) { - error = await NCNetworking.shared.deleteMetadata(metadata) - if error == .success { - ocIds.append(metadata.ocId) - } - } - } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocIds, "onlyLocalCache": false, "error": error]) - } self.isEditMode = false self.setSelectcancelButton() + + for ocId in ocIds { + if let metadata = self.database.getMetadataFromOcId(ocId) { + NCNetworking.shared.deleteMetadata(metadata) + } + } + + for index in indices { + let indexPath = IndexPath(row: index, section: 0) + if let cell = self.collectionView.cellForItem(at: indexPath) as? NCMediaCell, + self.dataSource.metadatas[index].ocId == cell.ocId { + indexPaths.append(indexPath) + } + } + + self.dataSource.removeMetadata(ocIds) + if indexPaths.count == ocIds.count { + self.collectionView.deleteItems(at: indexPaths) + } else { + self.collectionViewReloadData() + } }) + alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { (_: UIAlertAction) in }) + present(alertController, animated: true, completion: { }) } } diff --git a/iOSClient/Media/NCMedia+DragDrop.swift b/iOSClient/Media/NCMedia+DragDrop.swift index 94a70d9799..58aff8fe4c 100644 --- a/iOSClient/Media/NCMedia+DragDrop.swift +++ b/iOSClient/Media/NCMedia+DragDrop.swift @@ -43,7 +43,7 @@ extension NCMedia: UICollectionViewDragDelegate { extension NCMedia: UICollectionViewDropDelegate { func collectionView(_ collectionView: UICollectionView, canHandle session: UIDropSession) -> Bool { - return session.canLoadObjects(ofClass: UIImage.self) || session.hasItemsConforming(toTypeIdentifiers: [UTType.movie.identifier, NCGlobal.shared.metadataOcIdDataRepresentation]) + return session.canLoadObjects(ofClass: UIImage.self) || session.hasItemsConforming(toTypeIdentifiers: [UTType.movie.identifier, global.metadataOcIdDataRepresentation]) } func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) { diff --git a/iOSClient/Media/NCMedia+MediaLayout.swift b/iOSClient/Media/NCMedia+MediaLayout.swift index eec118200e..7f7c469641 100644 --- a/iOSClient/Media/NCMedia+MediaLayout.swift +++ b/iOSClient/Media/NCMedia+MediaLayout.swift @@ -34,7 +34,7 @@ import RealmSwift extension NCMedia: NCMediaLayoutDelegate { func getColumnCount() -> Int { if self.numberOfColumns == 0, - let layoutForView = database.getLayoutForView(account: session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "") { + let layoutForView = database.getLayoutForView(account: session.account, key: global.layoutViewMedia, serverUrl: "") { if layoutForView.columnPhoto > 0 { self.numberOfColumns = layoutForView.columnPhoto } else { @@ -81,7 +81,7 @@ extension NCMedia: NCMediaLayoutDelegate { } func collectionView(_ collectionView: UICollectionView, layout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath, columnCount: Int, typeLayout: String) -> CGSize { - if typeLayout == NCGlobal.shared.mediaLayoutSquare { + if typeLayout == global.mediaLayoutSquare { return CGSize(width: collectionView.frame.width / CGFloat(columnCount), height: collectionView.frame.width / CGFloat(columnCount)) } else { guard let metadata = dataSource.getMetadata(indexPath: indexPath) else { return .zero } diff --git a/iOSClient/Media/NCMedia.swift b/iOSClient/Media/NCMedia.swift index fbe14e7486..82aaa80874 100644 --- a/iOSClient/Media/NCMedia.swift +++ b/iOSClient/Media/NCMedia.swift @@ -44,6 +44,7 @@ class NCMedia: UIViewController { var documentPickerViewController: NCDocumentPickerViewController? var tabBarSelect: NCMediaSelectTabBar! let utilityFileSystem = NCUtilityFileSystem() + let global = NCGlobal.shared let utility = NCUtility() let database = NCManageDatabase.shared let imageCache = NCImageCache.shared @@ -118,7 +119,7 @@ class NCMedia: UIViewController { layout.sectionInset = UIEdgeInsets(top: 0, left: 2, bottom: 0, right: 2) collectionView.collectionViewLayout = layout - layoutType = database.getLayoutForView(account: session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "")?.layout ?? NCGlobal.shared.mediaLayoutRatio + layoutType = database.getLayoutForView(account: session.account, key: global.layoutViewMedia, serverUrl: "")?.layout ?? global.mediaLayoutRatio tabBarSelect = NCMediaSelectTabBar(tabBarController: self.tabBarController, delegate: self) @@ -153,22 +154,24 @@ class NCMedia: UIViewController { pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture(_:))) collectionView.addGestureRecognizer(pinchGesture) - NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterChangeUser), object: nil, queue: nil) { _ in - self.layoutType = self.database.getLayoutForView(account: self.session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "")?.layout ?? NCGlobal.shared.mediaLayoutRatio + NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: global.notificationCenterChangeUser), object: nil, queue: nil) { _ in + self.layoutType = self.database.getLayoutForView(account: self.session.account, key: self.global.layoutViewMedia, serverUrl: "")?.layout ?? self.global.mediaLayoutRatio self.imageCache.removeAll() self.loadDataSource() self.searchMediaUI(true) } - NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterClearCache), object: nil, queue: nil) { _ in + NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: global.notificationCenterClearCache), object: nil, queue: nil) { _ in self.dataSource.metadatas.removeAll() self.imageCache.removeAll() self.searchMediaUI(true) } - NotificationCenter.default.addObserver(self, selector: #selector(fileExists(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterFileExists), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(fileExists(_:)), name: NSNotification.Name(rawValue: global.notificationCenterFileExists), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(deleteFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterDeleteFile), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(deleteFile(_:)), name: NSNotification.Name(rawValue: global.notificationCenterDeleteFile), object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(networkRemoveAll), name: UIApplication.didEnterBackgroundNotification, object: nil) } @@ -185,9 +188,9 @@ class NCMedia: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - NotificationCenter.default.addObserver(self, selector: #selector(moveFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterMoveFile), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(moveFile(_:)), name: NSNotification.Name(rawValue: global.notificationCenterMoveFile), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(copyFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterCopyFile), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(copyFile(_:)), name: NSNotification.Name(rawValue: global.notificationCenterCopyFile), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(enterForeground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil) @@ -198,9 +201,9 @@ class NCMedia: UIViewController { override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) - NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterCopyFile), object: nil) + NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterCopyFile), object: nil) - NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterMoveFile), object: nil) + NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: global.notificationCenterMoveFile), object: nil) NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil) @@ -249,40 +252,23 @@ class NCMedia: UIViewController { Task { let tasks = await NCNetworking.shared.getAllDataTask() - for task in tasks.filter({ $0.taskDescription == NCGlobal.shared.taskDescriptionRetrievesProperties }) { + for task in tasks.filter({ $0.taskDescription == global.taskDescriptionRetrievesProperties }) { task.cancel() } } } + @objc func reloadDataSource(_ notification: NSNotification) { + self.loadDataSource() + } + @objc func deleteFile(_ notification: NSNotification) { guard let userInfo = notification.userInfo as NSDictionary?, - let ocIds = userInfo["ocId"] as? [String], let error = userInfo["error"] as? NKError else { return } - fileDeleted = fileDeleted + ocIds - - var indexPaths: [IndexPath] = [] - let indices = dataSource.metadatas.enumerated().filter { ocIds.contains($0.element.ocId) }.map { $0.offset } - - for index in indices { - let indexPath = IndexPath(row: index, section: 0) - if let cell = collectionView.cellForItem(at: indexPath) as? NCMediaCell, - dataSource.metadatas[index].ocId == cell.ocId { - indexPaths.append(indexPath) - } - } - - dataSource.removeMetadata(ocIds) - - if indexPaths.count == ocIds.count { - collectionView.deleteItems(at: indexPaths) - } else { - collectionViewReloadData() - } - if error != .success { NCContentPresenter().showError(error: error) + self.loadDataSource() } } diff --git a/iOSClient/Media/NCMediaDataSource.swift b/iOSClient/Media/NCMediaDataSource.swift index 25aca0d9ee..c90d19139d 100644 --- a/iOSClient/Media/NCMediaDataSource.swift +++ b/iOSClient/Media/NCMediaDataSource.swift @@ -65,7 +65,7 @@ extension NCMedia { var lessDate = Date.distantFuture var greaterDate = Date.distantPast let countMetadatas = self.dataSource.metadatas.count - let options = NKRequestOptions(timeout: 120, taskDescription: NCGlobal.shared.taskDescriptionRetrievesProperties, queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue) + let options = NKRequestOptions(timeout: 120, taskDescription: global.taskDescriptionRetrievesProperties, queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue) var firstCellDate: Date? var lastCellDate: Date? @@ -128,6 +128,10 @@ extension NCMedia { DispatchQueue.global(qos: .userInteractive).async { self.database.convertFilesToMetadatas(files, useFirstAsMetadataFolder: false) { _, metadatas in + let metadatas = metadatas.filter { metadata in + let tableMetadata = self.database.getMetadataFromOcId(metadata.ocId) + return tableMetadata?.status == self.global.metadataStatusNormal + } self.database.addMetadatas(metadatas) if self.dataSource.addMetadatas(metadatas) { diff --git a/iOSClient/Media/NCMediaPinchGesture.swift b/iOSClient/Media/NCMediaPinchGesture.swift index cbf71a9d57..8c1abc1d9b 100644 --- a/iOSClient/Media/NCMediaPinchGesture.swift +++ b/iOSClient/Media/NCMediaPinchGesture.swift @@ -46,7 +46,7 @@ extension NCMedia { } completion: { _ in self.setTitleDate() - if let layoutForView = self.database.getLayoutForView(account: self.session.account, key: NCGlobal.shared.layoutViewMedia, serverUrl: "") { + if let layoutForView = self.database.getLayoutForView(account: self.session.account, key: self.global.layoutViewMedia, serverUrl: "") { layoutForView.columnPhoto = self.numberOfColumns self.database.setLayoutForView(layoutForView: layoutForView) } diff --git a/iOSClient/Menu/NCContextMenu.swift b/iOSClient/Menu/NCContextMenu.swift index 06d02b63eb..f2e9ef1153 100644 --- a/iOSClient/Menu/NCContextMenu.swift +++ b/iOSClient/Menu/NCContextMenu.swift @@ -157,14 +157,8 @@ class NCContextMenu: NSObject { } let alertController = UIAlertController(title: nil, message: nil, preferredStyle: alertStyle) alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_file_", comment: ""), style: .destructive) { _ in - Task { - var ocId: [String] = [] - let error = await NCNetworking.shared.deleteMetadata(metadata) - if error == .success { - ocId.append(metadata.ocId) - } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": false, "error": error]) - } + NCNetworking.shared.deleteMetadata(metadata) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource) }) alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { _ in }) viewController.present(alertController, animated: true, completion: nil) @@ -178,7 +172,7 @@ class NCContextMenu: NSObject { if error == .success { ocId.append(metadata.ocId) } - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "onlyLocalCache": true, "error": error]) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": ocId, "error": error]) } } diff --git a/iOSClient/More/NCMore.swift b/iOSClient/More/NCMore.swift index df8c5d4dd4..7446084838 100644 --- a/iOSClient/More/NCMore.swift +++ b/iOSClient/More/NCMore.swift @@ -112,7 +112,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { // ITEM : Transfer item = NKExternalSite() item.name = "_transfers_" - item.icon = "arrow.left.arrow.right" + item.icon = "arrow.left.arrow.right.circle" item.url = "segueTransfers" item.order = 10 functionMenu.append(item) diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index eab80a900e..b420e0a8e8 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -271,11 +271,11 @@ class NCGlobal: NSObject { let metadataStatusUploadError: Int = 3 let metadataStatusWaitCreateFolder: Int = 10 + let metadataStatusWaitDelete: Int = 11 let metadataStatusInTransfer = [-1, -2, 1, 2] let metadataStatusFileDown = [-1, -2, -3] - let metadataStatusFileUp = [1, 2, 3] - let metadataStatusAllUp = [1, 2, 3, 10] + let metadataStatusHideInView = [1, 2, 3, 11] // Auto upload subfolder granularity // @@ -312,7 +312,7 @@ class NCGlobal: NSObject { let notificationCenterUpdateBadgeNumber = "updateBadgeNumber" // userInfo: counterDownload, counterUpload let notificationCenterCreateFolder = "createFolder" // userInfo: ocId, serverUrl, account, withPush, sceneIdentifier - let notificationCenterDeleteFile = "deleteFile" // userInfo: [ocId], onlyLocalCache, error + let notificationCenterDeleteFile = "deleteFile" // userInfo: [ocId], error let notificationCenterMoveFile = "moveFile" // userInfo: [ocId], error, dragdrop let notificationCenterCopyFile = "copyFile" // userInfo: [ocId], error, dragdrop let notificationCenterRenameFile = "renameFile" // userInfo: ocId, account diff --git a/iOSClient/NCImageCache.swift b/iOSClient/NCImageCache.swift index eea29260c5..32cd5096b7 100644 --- a/iOSClient/NCImageCache.swift +++ b/iOSClient/NCImageCache.swift @@ -111,25 +111,28 @@ class NCImageCache: NSObject { } func getMediaPredicate(filterLivePhotoFile: Bool, session: NCSession.Session, showOnlyImages: Bool, showOnlyVideos: Bool) -> NSPredicate { - guard let tableAccount = NCManageDatabase.shared.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)) else { return NSPredicate() } - let startServerUrl = NCUtilityFileSystem().getHomeServer(session: session) + tableAccount.mediaPath + guard let tableAccount = NCManageDatabase.shared.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)) else { return NSPredicate() } + var predicate = NSPredicate() + let startServerUrl = NCUtilityFileSystem().getHomeServer(session: session) + tableAccount.mediaPath - var showBothPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND hasPreview == true AND (classFile == '\(NKCommon.TypeClassFile.image.rawValue)' OR classFile == '\(NKCommon.TypeClassFile.video.rawValue)') AND NOT (session CONTAINS[c] 'upload')" - var showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND hasPreview == true AND classFile == %@ AND NOT (session CONTAINS[c] 'upload')" + var showBothPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND hasPreview == true AND (classFile == '\(NKCommon.TypeClassFile.image.rawValue)' OR classFile == '\(NKCommon.TypeClassFile.video.rawValue)') AND NOT (status IN %@)" + var showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND hasPreview == true AND classFile == %@ AND NOT (status IN %@)" - if filterLivePhotoFile { - showBothPredicateMediaString = showBothPredicateMediaString + " AND NOT (livePhotoFile != '' AND classFile == '\(NKCommon.TypeClassFile.video.rawValue)')" - showOnlyPredicateMediaString = showOnlyPredicateMediaString + " AND NOT (livePhotoFile != '' AND classFile == '\(NKCommon.TypeClassFile.video.rawValue)')" - } + if filterLivePhotoFile { + showBothPredicateMediaString = showBothPredicateMediaString + " AND NOT (livePhotoFile != '' AND classFile == '\(NKCommon.TypeClassFile.video.rawValue)')" + showOnlyPredicateMediaString = showOnlyPredicateMediaString + " AND NOT (livePhotoFile != '' AND classFile == '\(NKCommon.TypeClassFile.video.rawValue)')" + } - if showOnlyImages { - return NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKCommon.TypeClassFile.image.rawValue) - } else if showOnlyVideos { - return NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKCommon.TypeClassFile.video.rawValue) - } else { - return NSPredicate(format: showBothPredicateMediaString, session.account, startServerUrl) + if showOnlyImages { + predicate = NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKCommon.TypeClassFile.image.rawValue, global.metadataStatusHideInView) + } else if showOnlyVideos { + predicate = NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKCommon.TypeClassFile.video.rawValue, global.metadataStatusHideInView) + } else { + predicate = NSPredicate(format: showBothPredicateMediaString, session.account, startServerUrl, global.metadataStatusHideInView) + } + + return predicate } - } // MARK: - diff --git a/iOSClient/Networking/NCNetworking+Task.swift b/iOSClient/Networking/NCNetworking+Task.swift index efdd91c802..aabdb1c289 100644 --- a/iOSClient/Networking/NCNetworking+Task.swift +++ b/iOSClient/Networking/NCNetworking+Task.swift @@ -31,6 +31,7 @@ extension NCNetworking { func cancelAllTask() { cancelAllQueue() cancelAllDataTask() + cancelAllWaitTask() cancelAllDownloadUploadTask() } @@ -52,7 +53,14 @@ extension NCNetworking { // MARK: - func cancelTask(metadata: tableMetadata) { - utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) + + /// DELETE + /// + if metadata.status == global.metadataStatusWaitDelete { + database.setMetadataStatus(ocId: metadata.ocId, status: global.metadataStatusNormal) + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterReloadDataSource) + return + } /// DIRECTORY /// @@ -62,12 +70,15 @@ extension NCNetworking { database.deleteMetadataOcId(metadata.ocId) utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) } + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterReloadDataSource) + return } /// NO SESSION /// if metadata.session.isEmpty { self.database.deleteMetadataOcId(metadata.ocId) + utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterReloadDataSource) return } @@ -95,12 +106,12 @@ extension NCNetworking { /// UPLOAD /// if metadata.session.contains("upload") { - if metadata.session == NextcloudKit.shared.nkCommonInstance.identifierSessionUpload { cancelUploadTasks(metadata: metadata) } else { cancelUploadBackgroundTask(metadata: metadata) } + utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterUploadCancelFile, object: nil, @@ -113,6 +124,22 @@ extension NCNetworking { } } + func cancelAllWaitTask() { + let metadatas = database.getMetadatas(predicate: NSPredicate(format: "status IN %@", [global.metadataStatusWaitCreateFolder, global.metadataStatusWaitDelete])) + for metadata in metadatas { + if metadata.status == global.metadataStatusWaitDelete { + database.setMetadataStatus(ocId: metadata.ocId, status: global.metadataStatusNormal) + } else if metadata.status == global.metadataStatusWaitCreateFolder { + let metadatas = database.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl BEGINSWITH %@ AND status != 0", metadata.account, metadata.serverUrl)) + for metadata in metadatas { + database.deleteMetadataOcId(metadata.ocId) + utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) + } + } + } + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterReloadDataSource) + } + func cancelAllDataTask() { NextcloudKit.shared.nkCommonInstance.nksessions.forEach { session in session.sessionData.session.getTasksWithCompletionHandler { dataTasks, _, _ in diff --git a/iOSClient/Networking/NCNetworking+WebDAV.swift b/iOSClient/Networking/NCNetworking+WebDAV.swift index 1add36d349..b81175e7fe 100644 --- a/iOSClient/Networking/NCNetworking+WebDAV.swift +++ b/iOSClient/Networking/NCNetworking+WebDAV.swift @@ -379,84 +379,22 @@ extension NCNetworking { return .success } - func deleteMetadata(_ metadata: tableMetadata) async -> (NKError) { + func deleteMetadata(_ metadata: tableMetadata) { + let permission = NCUtility().permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanDelete) + if !metadata.permissions.isEmpty && permission == false { + NCContentPresenter().showInfo(error: NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_delete_file_")) + return + } + if metadata.status == global.metadataStatusWaitCreateFolder { - let metadatas = database.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl BEGINSWITH %@ AND status IN %@", metadata.account, metadata.serverUrl, global.metadataStatusAllUp)) + let metadatas = database.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl BEGINSWITH %@", metadata.account, metadata.serverUrl)) for metadata in metadatas { database.deleteMetadataOcId(metadata.ocId) utilityFileSystem.removeFile(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) } + return } - - if metadata.status == NCGlobal.shared.metadataStatusWaitCreateFolder { - self.database.deleteMetadataOcId(metadata.ocId) - return .success - } else if metadata.isDirectoryE2EE { -#if !EXTENSION - if let metadataLive = self.database.getMetadataLivePhoto(metadata: metadata) { - let error = await NCNetworkingE2EEDelete().delete(metadata: metadataLive) - if error == .success { - return await NCNetworkingE2EEDelete().delete(metadata: metadata) - } else { - return error - } - } else { - return await NCNetworkingE2EEDelete().delete(metadata: metadata) - } -#else - return .success -#endif - } else { - if let metadataLive = self.database.getMetadataLivePhoto(metadata: metadata), metadata.isNotFlaggedAsLivePhotoByServer { - let error = await deleteMetadataPlain(metadataLive) - if error == .success { - return await deleteMetadataPlain(metadata) - } else { - return error - } - } else { - return await deleteMetadataPlain(metadata) - } - } - } - - func deleteMetadataPlain(_ metadata: tableMetadata, customHeader: [String: String]? = nil) async -> NKError { - // verify permission - let permission = utility.permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanDelete) - if !metadata.permissions.isEmpty && permission == false { - return NKError(errorCode: self.global.errorInternalError, errorDescription: "_no_permission_delete_file_") - } - let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName - let options = NKRequestOptions(customHeader: customHeader, taskDescription: NCGlobal.shared.taskDescriptionDeleteFileOrFolder) - let result = await deleteFileOrFolder(serverUrlFileName: serverUrlFileName, account: metadata.account, options: options) - - if result.error == .success || result.error.errorCode == self.global.errorResourceNotFound { - do { - try FileManager.default.removeItem(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadata.ocId)) - } catch { } - #if !EXTENSION - NCImageCache.shared.removeImageCache(ocIdPlusEtag: metadata.ocId + metadata.etag) - #endif - - self.database.deleteVideo(metadata: metadata) - self.database.deleteMetadataOcId(metadata.ocId) - self.database.deleteLocalFileOcId(metadata.ocId) - // LIVE PHOTO SERVER - if let metadataLive = self.database.getMetadataLivePhoto(metadata: metadata), metadataLive.isFlaggedAsLivePhotoByServer { - do { - try FileManager.default.removeItem(atPath: utilityFileSystem.getDirectoryProviderStorageOcId(metadataLive.ocId)) - } catch { } - - self.database.deleteVideo(metadata: metadataLive) - self.database.deleteMetadataOcId(metadataLive.ocId) - self.database.deleteLocalFileOcId(metadataLive.ocId) - } - - if metadata.directory { - self.database.deleteDirectoryAndSubDirectory(serverUrl: utilityFileSystem.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName), account: metadata.account) - } - } - return result.error + self.database.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusWaitDelete) } // MARK: - Rename @@ -1007,3 +945,54 @@ class NCOperationFileExists: ConcurrentOperation, @unchecked Sendable { } } } + +class NCOperationDeleteFileOrFolder: ConcurrentOperation, @unchecked Sendable { + let database = NCManageDatabase.shared + let global = NCGlobal.shared + let utility = NCUtility() + let utilityFileSystem = NCUtilityFileSystem() + + var metadata: tableMetadata + var ocId: String + + init(metadata: tableMetadata) { + self.metadata = metadata + self.ocId = metadata.ocId + } + + override func start() { + guard !isCancelled else { return self.finish() } + + let options = NKRequestOptions(taskDescription: global.taskDescriptionDeleteFileOrFolder, + queue: NextcloudKit.shared.nkCommonInstance.backgroundQueue) + + NextcloudKit.shared.deleteFileOrFolder(serverUrlFileName: self.metadata.serverUrl + "/" + self.metadata.fileName, + account: self.metadata.account, + options: options) { _, error in + + if error == .success || error.errorCode == NCGlobal.shared.errorResourceNotFound { + do { + try FileManager.default.removeItem(atPath: self.utilityFileSystem.getDirectoryProviderStorageOcId(self.metadata.ocId)) + } catch { } + +#if !EXTENSION + NCImageCache.shared.removeImageCache(ocIdPlusEtag: self.metadata.ocId + self.metadata.etag) +#endif + + self.database.deleteVideo(metadata: self.metadata) + self.database.deleteMetadataOcId(self.metadata.ocId) + self.database.deleteLocalFileOcId(self.metadata.ocId) + + if self.metadata.directory { + self.database.deleteDirectoryAndSubDirectory(serverUrl: NCUtilityFileSystem().stringAppendServerUrl(self.metadata.serverUrl, addFileName: self.metadata.fileName), account: self.metadata.account) + } + } else { + self.database.setMetadataStatus(ocId: self.ocId, status: self.global.metadataStatusNormal ) + } + + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDeleteFile, userInfo: ["ocId": [self.ocId], "error": error]) + + self.finish() + } + } +} diff --git a/iOSClient/Networking/NCNetworking.swift b/iOSClient/Networking/NCNetworking.swift index 55af47cfbd..dd1feb7735 100644 --- a/iOSClient/Networking/NCNetworking.swift +++ b/iOSClient/Networking/NCNetworking.swift @@ -93,6 +93,7 @@ class NCNetworking: NSObject, NextcloudKitDelegate { let downloadQueue = Queuer(name: "downloadQueue", maxConcurrentOperationCount: NCBrandOptions.shared.maxConcurrentOperationDownload, qualityOfService: .default) let downloadAvatarQueue = Queuer(name: "downloadAvatarQueue", maxConcurrentOperationCount: 10, qualityOfService: .default) let fileExistsQueue = Queuer(name: "fileExistsQueue", maxConcurrentOperationCount: 10, qualityOfService: .default) + let deleteFileOrFolderQueue = Queuer(name: "deleteFileOrFolderQueue", maxConcurrentOperationCount: 10, qualityOfService: .default) // MARK: - init diff --git a/iOSClient/Networking/NCNetworkingProcess.swift b/iOSClient/Networking/NCNetworkingProcess.swift index 1ce775a4a3..d75cba46dc 100644 --- a/iOSClient/Networking/NCNetworkingProcess.swift +++ b/iOSClient/Networking/NCNetworkingProcess.swift @@ -140,6 +140,17 @@ class NCNetworkingProcess { var counterDownloading = metadatasDownloading.count var counterUploading = metadatasUploading.count + /// ------------------------ DELETE + /// + if let metadatasDelete = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusWaitDelete), sortedByKeyPath: "serverUrl", ascending: true) { + for metadata in metadatasDelete { + if NCNetworking.shared.deleteFileOrFolderQueue.operations.filter({ ($0 as? NCOperationDeleteFileOrFolder)?.ocId == metadata.ocId }).isEmpty { + NCNetworking.shared.deleteFileOrFolderQueue.addOperation(NCOperationDeleteFileOrFolder(metadata: metadata)) + } + return (counterDownloading, counterUploading) + } + } + /// ------------------------ FOLDER /// if let metadatasWaitCreateFolder = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusWaitCreateFolder), sortedByKeyPath: "serverUrl", ascending: true) { diff --git a/iOSClient/Select/NCSelect.swift b/iOSClient/Select/NCSelect.swift index 3af9fafdeb..80c266be3a 100644 --- a/iOSClient/Select/NCSelect.swift +++ b/iOSClient/Select/NCSelect.swift @@ -476,9 +476,9 @@ extension NCSelect { } } else { if includeImages { - predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND e2eEncrypted == false AND (directory == true OR classFile == 'image') AND NOT (status IN %@)", session.account, serverUrl, NCGlobal.shared.metadataStatusFileUp) + predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND e2eEncrypted == false AND (directory == true OR classFile == 'image') AND NOT (status IN %@)", session.account, serverUrl, NCGlobal.shared.metadataStatusHideInView) } else if enableSelectFile { - predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND e2eEncrypted == false AND NOT (status IN %@)", session.account, serverUrl, NCGlobal.shared.metadataStatusFileUp) + predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND e2eEncrypted == false AND NOT (status IN %@)", session.account, serverUrl, NCGlobal.shared.metadataStatusHideInView) } else { predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND e2eEncrypted == false AND directory == true", session.account, serverUrl) } diff --git a/iOSClient/Supporting Files/en.lproj/Localizable.strings b/iOSClient/Supporting Files/en.lproj/Localizable.strings index a8edd52381..8ff05c33c4 100644 --- a/iOSClient/Supporting Files/en.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/en.lproj/Localizable.strings @@ -606,7 +606,8 @@ "_status_in_download_" = "In download"; "_status_downloading_" = "Downloading"; "_status_wait_upload_" = "Waiting for upload"; -"_status_wait_create_folder_" = "Waiting online to create the folder"; +"_status_wait_create_folder_" = "Waiting to create the folder"; +"_status_wait_delete_" = "Waiting to delete"; "_status_in_upload_" = "In upload"; "_status_uploading_" = "Uploading"; "_status_upload_error_" = "Error, waiting for upload"; diff --git a/iOSClient/Transfers/NCTransfers.swift b/iOSClient/Transfers/NCTransfers.swift index 196c3b8042..0d67724be1 100644 --- a/iOSClient/Transfers/NCTransfers.swift +++ b/iOSClient/Transfers/NCTransfers.swift @@ -35,7 +35,7 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { enableSearchBar = false headerRichWorkspaceDisable = true headerMenuTransferView = false - emptyImageName = "arrow.left.arrow.right" + emptyImageName = "arrow.left.arrow.right.circle" emptyTitle = "_no_transfer_" emptyDescription = "_no_transfer_sub_" } @@ -230,6 +230,10 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { cell.fileStatusImage?.image = utility.loadImage(named: "exclamationmark.arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) cell.labelStatus.text = NSLocalizedString("_status_wait_create_folder_", comment: "") + user cell.labelInfo.text = "" + case NCGlobal.shared.metadataStatusWaitDelete: + cell.fileStatusImage?.image = utility.loadImage(named: "trash.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.labelStatus.text = NSLocalizedString("_status_wait_delete_", comment: "") + user + cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusDownloading: if #available(iOS 17.0, *) { cell.fileStatusImage?.image = utility.loadImage(named: "arrowshape.down.circle", colors: NCBrandColor.shared.iconImageMultiColors)