瀏覽代碼

Merge pull request #2212 from nextcloud/RefreshTask

Refresh task
Marino Faggiana 2 年之前
父節點
當前提交
885492fed0

+ 4 - 4
Nextcloud.xcodeproj/project.pbxproj

@@ -3607,7 +3607,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;
@@ -3631,7 +3631,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.5.3;
+				MARKETING_VERSION = 4.5.4;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
@@ -3670,7 +3670,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;
@@ -3692,7 +3692,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.5.3;
+				MARKETING_VERSION = 4.5.4;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;

+ 19 - 21
iOSClient/AppDelegate.swift

@@ -56,10 +56,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     var disableSharesView: Bool = false
     var documentPickerViewController: NCDocumentPickerViewController?
-    var networkingProcessUpload: NCNetworkingProcessUpload?
     var shares: [tableShare] = []
     var timerErrorNetworking: Timer?
-    var timerProcess: Timer?
 
     private var privacyProtectionWindow: UIWindow?
 
@@ -201,15 +199,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         NCSettingsBundleHelper.setVersionAndBuildNumber()
 
         if !account.isEmpty {
-            networkingProcessUpload?.verifyUploadZombie()
+            NCNetworkingProcessUpload.shared.verifyUploadZombie()
         }
 
         // Start Auto Upload
         NCAutoUpload.shared.initAutoUpload(viewController: nil) { items in
             NKCommon.shared.writeLog("[INFO] Initialize Auto upload with \(items) uploads")
-            DispatchQueue.main.async { self.networkingProcessUpload = NCNetworkingProcessUpload() }
         }
 
+        // START UPLOAD PROCESS
+        NCNetworkingProcessUpload.shared.startTimer()
+
         NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterApplicationDidBecomeActive)
     }
 
@@ -249,6 +249,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
             showPrivacyProtectionWindow()
         }
 
+        // STOP UPLOAD PROCESS
+        NCNetworkingProcessUpload.shared.stopTimer()
+
         // Reload Widget
         WidgetCenter.shared.reloadAllTimelines()
 
@@ -272,9 +275,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
         NKCommon.shared.writeLog("[INFO] Application did enter in background")
 
-        // STOP UPLOAD PROCESS
-        networkingProcessUpload?.stopTimer()
-
         scheduleAppRefresh()
         scheduleAppProcessing()
 
@@ -369,11 +369,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         }
 
         NKCommon.shared.setup(delegate: NCNetworking.shared)
-        NKCommon.shared.writeLog("[INFO] Start handler refresh task [Auto upload]")
-        
+
         NCAutoUpload.shared.initAutoUpload(viewController: nil) { items in
-            NKCommon.shared.writeLog("[INFO] Completition handler refresh task [Auto upload] with \(items) uploads")
-            task.setTaskCompleted(success: true)
+            NKCommon.shared.writeLog("[INFO] Refresh task auto upload with \(items) uploads")
+            NCNetworkingProcessUpload.shared.process { items in
+                NKCommon.shared.writeLog("[INFO] Refresh task upload process with \(items) uploads")
+                task.setTaskCompleted(success: true)
+            }
         }
     }
 
@@ -385,11 +387,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
             return
         }
 
-        NKCommon.shared.setup(delegate: NCNetworking.shared)
-        NKCommon.shared.writeLog("[INFO] Start handler processing task [Reload widget]")
-
-        WidgetCenter.shared.reloadAllTimelines()
-
+        NKCommon.shared.writeLog("[INFO] Processing task")
         task.setTaskCompleted(success: true)
     }
 
@@ -406,7 +404,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     // MARK: - Push Notifications
 
     func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
-        completionHandler(UNNotificationPresentationOptions.alert)
+        completionHandler([.list, .banner, .sound])
     }
 
     func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
@@ -564,8 +562,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     @objc func settingAccount(_ account: String, urlBase: String, user: String, userId: String, password: String) {
 
-        let accountBackup = self.account
-        let userIdBackup = self.userId
+        let accountTestBackup = self.account + "/" + self.userId
+        let accountTest = account +  "/" + userId
 
         self.account = account
         self.urlBase = urlBase
@@ -583,7 +581,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         NCKTVHTTPCache.shared.restartProxy(user: user, password: password)
 
         DispatchQueue.main.async {
-            if UIApplication.shared.applicationState != .background && (accountBackup != account || userIdBackup != userId) {
+            if UIApplication.shared.applicationState != .background && accountTestBackup != accountTest {
                 NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterInitialize, second: 0.2)
             }
         }
@@ -936,6 +934,6 @@ extension AppDelegate: NCAudioRecorderViewControllerDelegate {
 extension AppDelegate: NCCreateFormUploadConflictDelegate {
     func dismissCreateFormUploadConflict(metadatas: [tableMetadata]?) {
         guard let metadatas = metadatas, !metadatas.isEmpty else { return }
-        networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: { _ in })
+        NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: metadatas) { _ in }
     }
 }

+ 3 - 5
iOSClient/Extensions/Array+Extensions.swift

@@ -29,11 +29,9 @@ extension Array {
     func unique<T: Hashable>(map: ((Element) -> (T))) -> [Element] {
         var set = Set<T>() // the unique list kept in a Set for fast retrieval
         var arrayOrdered = [Element]() // keeping the unique list of elements but ordered
-        for value in self {
-            if !set.contains(map(value)) {
-                set.insert(map(value))
-                arrayOrdered.append(value)
-            }
+        for value in self where !set.contains(map(value)) {
+            set.insert(map(value))
+            arrayOrdered.append(value)
         }
 
         return arrayOrdered

+ 3 - 7
iOSClient/Favorites/NCFavorite.swift

@@ -103,13 +103,9 @@ class NCFavorite: NCCollectionViewCommon {
         } else {
 
             networkReadFolder(forced: forced) { tableDirectory, metadatas, metadatasUpdate, metadatasDelete, error in
-                if error == .success {
-                    for metadata in metadatas ?? [] {
-                        if !metadata.directory {
-                            if NCManageDatabase.shared.isDownloadMetadata(metadata, download: false) {
-                                NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
-                            }
-                        }
+                if error == .success, let metadatas = metadatas {
+                    for metadata in metadatas where (!metadata.directory && NCManageDatabase.shared.isDownloadMetadata(metadata, download: false)) {
+                        NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
                     }
                 }
 

+ 1 - 2
iOSClient/Main/Create cloud/NCCreateFormUploadAssets.swift

@@ -401,8 +401,7 @@ class NCCreateFormUploadAssets: XLFormViewController, NCSelectDelegate {
                 }
 
             } else {
-
-                self.appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: metadatasNOConflict, completion: { _ in })
+                NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: metadatasNOConflict, completion: { _ in })
             }
 
             DispatchQueue.main.async {self.dismiss(animated: true, completion: nil)  }

+ 1 - 1
iOSClient/Main/Create cloud/NCCreateFormUploadScanDocument.swift

@@ -582,7 +582,7 @@ class NCCreateFormUploadScanDocument: XLFormViewController, NCSelectDelegate, NC
 
         NCActivityIndicator.shared.stop()
 
-        appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: [metadata], completion: { _ in })
+        NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadata], completion: { _ in })
 
         // Request delete all image scanned
         let alertController = UIAlertController(title: "", message: NSLocalizedString("_delete_all_scanned_images_", comment: ""), preferredStyle: .alert)

+ 1 - 1
iOSClient/Main/Create cloud/NCCreateFormUploadVoiceNote.swift

@@ -263,7 +263,7 @@ class NCCreateFormUploadVoiceNote: XLFormViewController, NCSelectDelegate, AVAud
 
         CCUtility.copyFile(atPath: self.fileNamePath, toPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
 
-        appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: [metadata], completion: { _ in })
+        NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadata], completion: { _ in })
 
         self.dismiss(animated: true, completion: nil)
     }

+ 1 - 1
iOSClient/Main/NCPickerViewController.swift

@@ -175,7 +175,7 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
                     }
 
                 } else {
-                    appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
+                    NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
                 }
 
             } else {

+ 1 - 1
iOSClient/Menu/UIViewController+Menu.swift

@@ -65,7 +65,7 @@ extension UIViewController {
         let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: appDelegate.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
         guard serverVersionMajor >= NCGlobal.shared.nextcloudVersion23 else { return }
 
-        NextcloudKit.shared.getHovercard(for: userId) { account, card, data, _ in
+        NextcloudKit.shared.getHovercard(for: userId) { account, card, _, _ in
             guard let card = card, account == appDelegate.account else { return }
 
             let personHeader = NCMenuAction(

+ 0 - 4
iOSClient/NCGlobal.swift

@@ -323,10 +323,6 @@ class NCGlobal: NSObject {
     let metadataStatusUploading: Int                = 3
     let metadataStatusUploadError: Int              = 4
 
-    // Upload Operation Background
-    //
-    let maxConcurrentOperationUpload                = 10
-
     // Notification Center
     //
     @objc let notificationCenterApplicationDidEnterBackground   = "applicationDidEnterBackground"

+ 3 - 13
iOSClient/Networking/NCAutoUpload.swift

@@ -171,19 +171,9 @@ class NCAutoUpload: NSObject {
             }
 
             self.endForAssetToUpload = true
-            if selector == NCGlobal.shared.selectorUploadAutoUploadAll || self.applicationState == .active {
-                NKCommon.shared.writeLog("[INFO] Start createProcessUploads")
-                self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
-            } else {
-                NKCommon.shared.writeLog("[INFO] Start createUploadProcessAutoUploadInBackground")
-                var metadatasForUpload: [tableMetadata] = []
-                for metadata in metadatas {
-                    if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && serverUrl == %@ && fileName == %@ && session != ''", metadata.account, metadata.serverUrl, metadata.fileName)) != nil { continue }
-                    metadatasForUpload.append(metadata)
-                }
-                NCManageDatabase.shared.addMetadatas(metadatasForUpload)
-                NCNetworking.shared.createUploadProcessAutoUploadInBackground(completion: completion)
-            }
+
+            NKCommon.shared.writeLog("[INFO] Start createProcessUploads")
+            NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: metadatas, completion: completion)
         }
     }
 

+ 4 - 49
iOSClient/Networking/NCNetworking.swift

@@ -558,6 +558,10 @@ import Photos
                 }
             }
 
+            // Update Badge
+            let counterBadge = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d OR status == %d", NCGlobal.shared.metadataStatusWaitUpload, NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUpdateBadgeNumber, userInfo: ["counter":counterBadge.count])
+
             self.uploadMetadataInBackground.removeValue(forKey: fileName + serverUrl)
             self.delegate?.uploadComplete?(fileName: fileName, serverUrl: serverUrl, ocId: ocId, etag: etag, date: date, size: size, description: description, task: task, error: error)
         }
@@ -593,55 +597,6 @@ import Photos
         }
     }
 
-    func createUploadProcessAutoUploadInBackground(completion: @escaping (_ items: Int) -> Void) {
-
-        var numStartUpload: Int = 0
-        let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
-
-        let metadatasInUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
-        let counterUpload = NCGlobal.shared.maxConcurrentOperationUpload - metadatasInUpload.count
-        if counterUpload <= 0 { return completion(0) }
-
-        // Extract file
-        let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.metadataStatusWaitUpload), page: 0, limit: counterUpload, sorted: "date", ascending: true)
-        for metadata in metadatas {
-
-            let metadata = tableMetadata.init(value: metadata)
-            let semaphore = DispatchSemaphore(value: 0)
-
-            NCUtility.shared.extractFiles(from: metadata) { metadatas in
-                if metadatas.isEmpty {
-                    NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-                }
-                for metadata in metadatas {
-                    if (metadata.e2eEncrypted || metadata.chunk) {
-                        NKCommon.shared.writeLog("[INFO] Autoupload file skipped, E2E:\(metadata.e2eEncrypted) - CHUNK:\(metadata.chunk)")
-                        continue
-                    }
-                    if (metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi) {
-                        NKCommon.shared.writeLog("[INFO] Autoupload file skipped, required WiFi")
-                        continue
-                    }
-                    guard let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) else {
-                        NKCommon.shared.writeLog("[INFO] Autoupload file skipped, file status in upload error")
-                        continue
-                    }
-                    // Upload
-                    let semaphoreUpload = DispatchSemaphore(value: 1)
-                    NCNetworking.shared.upload(metadata: metadata) {
-                        numStartUpload += 1
-                    } completion: { error in
-                        semaphoreUpload.signal()
-                    }
-                    semaphoreUpload.wait()
-                }
-                semaphore.signal()
-            }
-            semaphore.wait()
-        }
-        completion(numStartUpload)
-    }
-    
     func getOcIdInBackgroundSession(queue: DispatchQueue = .main, completion: @escaping (_ listOcId: [String]) -> Void) {
 
         var listOcId: [String] = []

+ 118 - 106
iOSClient/Networking/NCNetworkingProcessUpload.swift

@@ -26,159 +26,171 @@ import NextcloudKit
 import Photos
 
 class NCNetworkingProcessUpload: NSObject {
+    public static let shared: NCNetworkingProcessUpload = {
+        let instance = NCNetworkingProcessUpload()
+        return instance
+    }()
 
-    let appDelegate = UIApplication.shared.delegate as? AppDelegate
+    var timerProcess: Timer?
 
-    override init() {
-        super.init()
-        startTimer()
+    func startTimer() {
+        DispatchQueue.main.async {
+            self.timerProcess?.invalidate()
+            self.timerProcess = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.processTimer), userInfo: nil, repeats: true)
+        }
     }
 
-    private func startProcess() {
-        if appDelegate?.timerProcess?.isValid ?? false {
-            DispatchQueue.main.async { self.process() }
+    func stopTimer() {
+        DispatchQueue.main.async {
+            self.timerProcess?.invalidate()
         }
     }
 
-    func startTimer() {
-        appDelegate?.timerProcess?.invalidate()
-        appDelegate?.timerProcess = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(process), userInfo: nil, repeats: true)
+    @objc func processTimer() {
+        process { _ in }
     }
 
-    func stopTimer() {
-        appDelegate?.timerProcess?.invalidate()
-    }
+    func process(completition: @escaping (_ items: Int) -> Void) {
 
-    @objc private func process() {
-        
-        guard let account = NCManageDatabase.shared.getActiveAccount(), UIApplication.shared.applicationState == .active else { return }
-        let metadatasUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
-        if metadatasUpload.filter({ $0.chunk || $0.e2eEncrypted }).count > 0 { return }
-        let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
+        guard let account = NCManageDatabase.shared.getActiveAccount() else { return }
 
         stopTimer()
 
-        var counterUpload: Int = 0
-        let sessionSelectors = [NCGlobal.shared.selectorUploadFileNODelete, NCGlobal.shared.selectorUploadFile, NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.selectorUploadAutoUploadAll]
+        let appDelegate = UIApplication.shared.delegate as! AppDelegate
+        let applicationState = UIApplication.shared.applicationState
+        let queue = DispatchQueue.global()
+        var maxConcurrentOperationUpload = 10
 
-        counterUpload = metadatasUpload.count
+        queue.async {
 
-        print("[LOG] PROCESS-UPLOAD \(counterUpload)")
+            let metadatasUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+            let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
+            var counterUpload: Int = 0
+            let sessionSelectors = [NCGlobal.shared.selectorUploadFileNODelete, NCGlobal.shared.selectorUploadFile, NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.selectorUploadAutoUploadAll]
 
-        // Update Badge
-        let counterBadge = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d OR status == %d", NCGlobal.shared.metadataStatusWaitUpload, NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
-        NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUpdateBadgeNumber, userInfo: ["counter":counterBadge.count])
+            counterUpload = metadatasUpload.count
 
-        NCNetworking.shared.getOcIdInBackgroundSession(queue: DispatchQueue.global(), completion: { listOcId in
+            print("[LOG] PROCESS-UPLOAD \(counterUpload)")
 
-            for sessionSelector in sessionSelectors where counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
+            // Update Badge
+            let counterBadge = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d OR status == %d", NCGlobal.shared.metadataStatusWaitUpload, NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUpdateBadgeNumber, userInfo: ["counter":counterBadge.count])
 
-                let limit = NCGlobal.shared.maxConcurrentOperationUpload - counterUpload
-                let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, NCGlobal.shared.metadataStatusWaitUpload), page: 1, limit: limit, sorted: "date", ascending: true)
-                if metadatas.count > 0 {
-                    NKCommon.shared.writeLog("[INFO] PROCESS-UPLOAD find \(metadatas.count) items")
-                }
+            NCNetworking.shared.getOcIdInBackgroundSession(queue: queue, completion: { listOcId in
 
-                for metadata in metadatas where counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
+                for sessionSelector in sessionSelectors where counterUpload < maxConcurrentOperationUpload {
 
-                    // Different account
-                    if account.account != metadata.account {
-                        NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView) on account: \(metadata.account), because the actual account is \(account.account).")
-                        continue
+                    let limit = maxConcurrentOperationUpload - counterUpload
+                    let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, NCGlobal.shared.metadataStatusWaitUpload), page: 1, limit: limit, sorted: "date", ascending: true)
+                    if metadatas.count > 0 {
+                        NKCommon.shared.writeLog("[INFO] PROCESS-UPLOAD find \(metadatas.count) items")
                     }
 
-                    // Is already in upload background? skipped
-                    if listOcId.contains(metadata.ocId) {
-                        NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView), because is already in session.")
-                        continue
-                    }
+                    for metadata in metadatas where counterUpload < maxConcurrentOperationUpload {
 
-                    // Session Extension ? skipped
-                    if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundExtension {
-                        continue
-                    }
+                        // Different account
+                        if account.account != metadata.account {
+                            NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView) on account: \(metadata.account), because the actual account is \(account.account).")
+                            continue
+                        }
 
-                    let semaphore = DispatchSemaphore(value: 0)
-                    NCUtility.shared.extractFiles(from: metadata) { metadatas in
-                        if metadatas.isEmpty {
-                            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+                        // Is already in upload background? skipped
+                        if listOcId.contains(metadata.ocId) {
+                            NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView), because is already in session.")
+                            continue
                         }
-                        for metadata in metadatas {
 
-                            if !isWiFi && metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan {
-                                continue
-                            }
+                        // Chunk or E2EE ... only one ? skipped
+                        if metadatasUpload.filter({ $0.chunk || $0.e2eEncrypted }).count > 0 {
+                            continue
+                        }
 
-                            if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
-                                NCNetworking.shared.upload(metadata: metadata)
-                            }
+                        // Session Extension ? skipped
+                        if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundExtension {
+                            continue
+                        }
 
-                            if metadata.e2eEncrypted || metadata.chunk {
-                                // Only one
-                                counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
-                                break
-                            } else {
-                                counterUpload += 1
+                        let semaphore = DispatchSemaphore(value: 0)
+                        NCUtility.shared.extractFiles(from: metadata) { metadatas in
+                            if metadatas.isEmpty {
+                                NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+                            }
+                            for metadata in metadatas where counterUpload < maxConcurrentOperationUpload {
+
+                                // NO WiFi
+                                if !isWiFi && metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan {
+                                    continue
+                                }
+
+                                // NO E2EE, CHUCK in background
+                                if applicationState != .active && (metadata.e2eEncrypted || metadata.chunk) {
+                                    continue
+                                }
+
+                                if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
+                                    NCNetworking.shared.upload(metadata: metadata)
+                                    if metadata.e2eEncrypted || metadata.chunk {
+                                        maxConcurrentOperationUpload = 1
+                                    }
+                                    counterUpload += 1
+                                }
                             }
+                            semaphore.signal()
                         }
-                        semaphore.signal()
+                        semaphore.wait()
                     }
-                    semaphore.wait()
                 }
-            }
 
-            // No upload available ? --> Retry Upload in Error
-            if counterUpload == 0 {
-                let metadatas = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d", NCGlobal.shared.metadataStatusUploadError))
-                for metadata in metadatas {
-                    NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: NCNetworking.shared.sessionIdentifierBackground, sessionError: "", sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusWaitUpload)
+                // No upload available ? --> Retry Upload in Error
+                if counterUpload == 0 {
+                    let metadatas = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d", NCGlobal.shared.metadataStatusUploadError))
+                    for metadata in metadatas {
+                        NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: NCNetworking.shared.sessionIdentifierBackground, sessionError: "", sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusWaitUpload)
+                    }
                 }
-            }
-             
-            // verify delete Asset Local Identifiers in auto upload (DELETE Photos album)
-            DispatchQueue.main.async {
-                if counterUpload == 0 && !(UIApplication.shared.delegate as! AppDelegate).isPasscodePresented() {
+
+                // verify delete Asset Local Identifiers in auto upload (DELETE Photos album)
+                if applicationState == .active && counterUpload == 0 && !appDelegate.isPasscodePresented() {
                     self.deleteAssetLocalIdentifiers(account: account.account) {
                         self.startTimer()
                     }
-                } else {
+                } else if applicationState == .active {
                     self.startTimer()
                 }
-            }
-        })
+                completition(counterUpload)
+            })
+        }
     }
 
     private func deleteAssetLocalIdentifiers(account: String, completition: @escaping () -> Void) {
 
-        if UIApplication.shared.applicationState != .active {
-            completition()
-            return
-        }
-        let metadatasSessionUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND session CONTAINS[cd] %@", account, "upload"))
-        if !metadatasSessionUpload.isEmpty {
-            completition()
-            return
-        }
-        let localIdentifiers = NCManageDatabase.shared.getAssetLocalIdentifiersUploaded(account: account)
-        if localIdentifiers.isEmpty {
-            completition()
-            return
-        }
-        let assets = PHAsset.fetchAssets(withLocalIdentifiers: localIdentifiers, options: nil)
-
-        PHPhotoLibrary.shared().performChanges({
-            PHAssetChangeRequest.deleteAssets(assets as NSFastEnumeration)
-        }, completionHandler: { _, _ in
-            DispatchQueue.main.async {
-                NCManageDatabase.shared.clearAssetLocalIdentifiers(localIdentifiers, account: account)
+        DispatchQueue.main.async {
+            let metadatasSessionUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND session CONTAINS[cd] %@", account, "upload"))
+            if !metadatasSessionUpload.isEmpty {
+                completition()
+                return
+            }
+            let localIdentifiers = NCManageDatabase.shared.getAssetLocalIdentifiersUploaded(account: account)
+            if localIdentifiers.isEmpty {
                 completition()
+                return
             }
-        })
+            let assets = PHAsset.fetchAssets(withLocalIdentifiers: localIdentifiers, options: nil)
+
+            PHPhotoLibrary.shared().performChanges({
+                PHAssetChangeRequest.deleteAssets(assets as NSFastEnumeration)
+            }, completionHandler: { _, _ in
+                DispatchQueue.main.async {
+                    NCManageDatabase.shared.clearAssetLocalIdentifiers(localIdentifiers, account: account)
+                    completition()
+                }
+            })
+        }
     }
 
     // MARK: -
 
-    @objc func createProcessUploads(metadatas: [tableMetadata], verifyAlreadyExists: Bool = false, completion: @escaping (_ items: Int) -> Void) {
+    func createProcessUploads(metadatas: [tableMetadata], verifyAlreadyExists: Bool = false, completion: @escaping (_ items: Int) -> Void) {
 
         var metadatasForUpload: [tableMetadata] = []
         for metadata in metadatas {
@@ -190,13 +202,12 @@ class NCNetworkingProcessUpload: NSObject {
             metadatasForUpload.append(metadata)
         }
         NCManageDatabase.shared.addMetadatas(metadatasForUpload)
-        startProcess()
         completion(metadatasForUpload.count)
     }
 
     // MARK: -
 
-    @objc func verifyUploadZombie() {
+    func verifyUploadZombie() {
 
         var session: URLSession?
 
@@ -208,7 +219,7 @@ class NCNetworkingProcessUpload: NSObject {
             NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId)
             NCUtilityFileSystem.shared.deleteFile(filePath: path)
         }
-        
+
         // verify metadataStatusInUpload (BACKGROUND)
         let metadatasInUploadBackground = NCManageDatabase.shared.getMetadatas(
             predicate: NSPredicate(
@@ -268,3 +279,4 @@ class NCNetworkingProcessUpload: NSObject {
         }
     }
 }
+

+ 3 - 7
iOSClient/Offline/NCOffline.swift

@@ -103,13 +103,9 @@ class NCOffline: NCCollectionViewCommon {
         collectionView?.reloadData()
 
         networkReadFolder(forced: forced) { tableDirectory, metadatas, metadatasUpdate, metadatasDelete, error in
-            if error == .success {
-                for metadata in metadatas ?? [] {
-                    if !metadata.directory {
-                        if NCManageDatabase.shared.isDownloadMetadata(metadata, download: true) {
-                            NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
-                        }
-                    }
+            if error == .success, let metadatas = metadatas {
+                for metadata in metadatas where (!metadata.directory && NCManageDatabase.shared.isDownloadMetadata(metadata, download: true)) {
+                    NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
                 }
             }
 

+ 5 - 9
iOSClient/ScanDocument/NCScan.swift

@@ -186,17 +186,13 @@ class NCScan: UIViewController, NCScanCellCellDelegate {
 
     @IBAction func transferDown(sender: UIButton) {
 
-        for fileName in itemsSource {
+        for fileName in itemsSource where !itemsDestination.contains(fileName) {
 
-            if !itemsDestination.contains(fileName) {
+            let fileNamePathAt = CCUtility.getDirectoryScan() + "/" + fileName
+            guard let data = try? Data(contentsOf: URL(fileURLWithPath: fileNamePathAt)), let image = UIImage(data: data) else { return }
 
-                let fileNamePathAt = CCUtility.getDirectoryScan() + "/" + fileName
-
-                guard let data = try? Data(contentsOf: URL(fileURLWithPath: fileNamePathAt)), let image = UIImage(data: data) else { return }
-
-                imagesDestination.append(image)
-                itemsDestination.append(fileName)
-            }
+            imagesDestination.append(image)
+            itemsDestination.append(fileName)
         }
 
         // Save button

+ 1 - 1
iOSClient/Trash/NCTrash.swift

@@ -278,7 +278,7 @@ extension NCTrash {
 
         let options = NKRequestOptions(queue: NKCommon.shared.backgroundQueue)
 
-        NextcloudKit.shared.listingTrash(showHiddenFiles: false, options: options) { account, items, data, error in
+        NextcloudKit.shared.listingTrash(showHiddenFiles: false, options: options) { account, items, _, error in
 
             DispatchQueue.main.async { self.refreshControl.endRefreshing() }
 

+ 2 - 1
iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift

@@ -153,7 +153,8 @@ extension NCViewerQuickLook: QLPreviewControllerDataSource, QLPreviewControllerD
         }
         metadataForUpload.size = size
         metadataForUpload.status = NCGlobal.shared.metadataStatusWaitUpload
-        (UIApplication.shared.delegate as? AppDelegate)?.networkingProcessUpload?.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
+
+        NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadataForUpload]) { _ in }
     }
 
     func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {