Browse Source

Merge pull request #2176 from nextcloud/Improvements

Improvements
Marino Faggiana 2 years ago
parent
commit
ec6826a95a

+ 0 - 32
Nextcloud.xcodeproj/project.pbxproj

@@ -333,7 +333,6 @@
 		F783030528B4C50600B84583 /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = F783030428B4C50600B84583 /* SVGKit */; };
 		F783030628B4C51E00B84583 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extensions.swift */; };
 		F783030728B4C52800B84583 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70CEF5523E9C7E50007035B /* UIColor+Extensions.swift */; };
-		F783030B28B4C58600B84583 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F783030A28B4C58600B84583 /* Queuer */; };
 		F783030D28B4C59A00B84583 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = F783030C28B4C59A00B84583 /* SwiftEntryKit */; };
 		F783031228B4C8EC00B84583 /* CCUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = F7053E3D1C639DF500741EA5 /* CCUtility.m */; };
 		F783034428B5142B00B84583 /* NextcloudKit in Frameworks */ = {isa = PBXBuildFile; productRef = F783034328B5142B00B84583 /* NextcloudKit */; };
@@ -439,9 +438,6 @@
 		F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */; };
 		F7EBCDD1277B820D00A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD0277B820D00A4EF67 /* UICKeyChainStore */; };
 		F7EBCDD3277B821700A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD2277B821700A4EF67 /* UICKeyChainStore */; };
-		F7EBCDD5277B82DE00A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD4277B82DE00A4EF67 /* Queuer */; };
-		F7EBCDD7277B834400A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD6277B834400A4EF67 /* Queuer */; };
-		F7EBCDD9277B834F00A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD8277B834F00A4EF67 /* Queuer */; };
 		F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */ = {isa = PBXBuildFile; productRef = F7ED547B25EEA65400956C55 /* QRCodeReader */; };
 		F7EDE4CC262D7B6F00414FE6 /* NCEmptyDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7239870253D86B600257F49 /* NCEmptyDataSet.swift */; };
 		F7EDE4D1262D7B8400414FE6 /* NCDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7C1EEA425053A9C00866ACC /* NCDataSource.swift */; };
@@ -1092,7 +1088,6 @@
 			files = (
 				F72AD71128C24BBB006CB92D /* NextcloudKit in Frameworks */,
 				F710FC88277B7D3F00AA9FBF /* RealmSwift in Frameworks */,
-				F7EBCDD9277B834F00A4EF67 /* Queuer in Frameworks */,
 				F710FC86277B7D3F00AA9FBF /* Realm in Frameworks */,
 				F7EBCDD3277B821700A4EF67 /* UICKeyChainStore in Frameworks */,
 				F75E57C325BF0ED2002B72C2 /* SVGKit in Frameworks */,
@@ -1118,7 +1113,6 @@
 				F73ADD2126554F8E0069EA0D /* SwiftEntryKit in Frameworks */,
 				F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */,
 				F75E57BF25BF0EC8002B72C2 /* SVGKit in Frameworks */,
-				F7EBCDD5277B82DE00A4EF67 /* Queuer in Frameworks */,
 				F72D7EB7263B1207000B3DFC /* MarkdownKit in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1134,7 +1128,6 @@
 				F7346E2728B0FFF2006CE2D2 /* Realm in Frameworks */,
 				F7346E2928B0FFF2006CE2D2 /* RealmSwift in Frameworks */,
 				F783030D28B4C59A00B84583 /* SwiftEntryKit in Frameworks */,
-				F783030B28B4C58600B84583 /* Queuer in Frameworks */,
 				F7346E1228B0EF5B006CE2D2 /* WidgetKit.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1145,7 +1138,6 @@
 			files = (
 				F7EBCDD1277B820D00A4EF67 /* UICKeyChainStore in Frameworks */,
 				F75E57C125BF0ECD002B72C2 /* SVGKit in Frameworks */,
-				F7EBCDD7277B834400A4EF67 /* Queuer in Frameworks */,
 				F73ADD2426554FE20069EA0D /* SwiftEntryKit in Frameworks */,
 				F710FC82277B7D3500AA9FBF /* Realm in Frameworks */,
 				F710FC84277B7D3500AA9FBF /* RealmSwift in Frameworks */,
@@ -2164,7 +2156,6 @@
 				F710FC85277B7D3F00AA9FBF /* Realm */,
 				F710FC87277B7D3F00AA9FBF /* RealmSwift */,
 				F7EBCDD2277B821700A4EF67 /* UICKeyChainStore */,
-				F7EBCDD8277B834F00A4EF67 /* Queuer */,
 				F72AD71028C24BBB006CB92D /* NextcloudKit */,
 			);
 			productName = "Notification Service Extension";
@@ -2209,7 +2200,6 @@
 				F710FC7D277B7D2600AA9FBF /* Realm */,
 				F710FC7F277B7D2700AA9FBF /* RealmSwift */,
 				F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */,
-				F7EBCDD4277B82DE00A4EF67 /* Queuer */,
 				F72CD01127A7E92400E59476 /* JGProgressHUD */,
 				F72AD70E28C24BA1006CB92D /* NextcloudKit */,
 			);
@@ -2235,7 +2225,6 @@
 				F7346E2628B0FFF2006CE2D2 /* Realm */,
 				F7346E2828B0FFF2006CE2D2 /* RealmSwift */,
 				F783030428B4C50600B84583 /* SVGKit */,
-				F783030A28B4C58600B84583 /* Queuer */,
 				F783030C28B4C59A00B84583 /* SwiftEntryKit */,
 				F783034328B5142B00B84583 /* NextcloudKit */,
 			);
@@ -2262,7 +2251,6 @@
 				F710FC81277B7D3500AA9FBF /* Realm */,
 				F710FC83277B7D3500AA9FBF /* RealmSwift */,
 				F7EBCDD0277B820D00A4EF67 /* UICKeyChainStore */,
-				F7EBCDD6277B834400A4EF67 /* Queuer */,
 				F72AD71228C24BCC006CB92D /* NextcloudKit */,
 			);
 			productName = "File Provider Extension";
@@ -3893,11 +3881,6 @@
 			package = F75E57A725BF0D61002B72C2 /* XCRemoteSwiftPackageReference "SVGKit" */;
 			productName = SVGKit;
 		};
-		F783030A28B4C58600B84583 /* Queuer */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */;
-			productName = Queuer;
-		};
 		F783030C28B4C59A00B84583 /* SwiftEntryKit */ = {
 			isa = XCSwiftPackageProductDependency;
 			package = F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */;
@@ -3933,21 +3916,6 @@
 			package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */;
 			productName = UICKeyChainStore;
 		};
-		F7EBCDD4277B82DE00A4EF67 /* Queuer */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */;
-			productName = Queuer;
-		};
-		F7EBCDD6277B834400A4EF67 /* Queuer */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */;
-			productName = Queuer;
-		};
-		F7EBCDD8277B834F00A4EF67 /* Queuer */ = {
-			isa = XCSwiftPackageProductDependency;
-			package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */;
-			productName = Queuer;
-		};
 		F7ED547B25EEA65400956C55 /* QRCodeReader */ = {
 			isa = XCSwiftPackageProductDependency;
 			package = F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */;

+ 2 - 3
Widget/Dashboard/DashboardData.swift

@@ -23,7 +23,6 @@
 
 import WidgetKit
 import NextcloudKit
-import Queuer
 import RealmSwift
 
 struct DashboardDataEntry: TimelineEntry {
@@ -179,12 +178,12 @@ func getDashboardDataEntry(intent: Applications, isPreview: Bool, displaySize: C
                                     iconFileName = ((path.lastPathComponent) as NSString).deletingPathExtension
                                 }
                             }
-                            let semaphore = Semaphore()
+                            let semaphore = DispatchSemaphore(value: 0)
                             NCUtility.shared.getImageUserData(url: url, fileName: iconFileName , size: 128) { image in
                                 if let image = image {
                                     icon = image
                                 }
-                                semaphore.continue()
+                                semaphore.signal()
                             }
                             semaphore.wait()
                         }

+ 1 - 1
iOSClient/Activity/NCActivity.swift

@@ -360,7 +360,7 @@ extension NCActivity {
         if let mainTabBar = self.tabBarController?.tabBar as? NCMainTabBar {
             bottom = -mainTabBar.getHight()
         }
-        NCActivityIndicator.shared.start(backgroundView: self.view, bottom: bottom-5, style: .gray)
+        NCActivityIndicator.shared.start(backgroundView: self.view, bottom: bottom-5, style: .medium)
 
         let dispatchGroup = DispatchGroup()
         loadComments(disptachGroup: dispatchGroup)

+ 24 - 35
iOSClient/AppDelegate.swift

@@ -60,8 +60,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     var shares: [tableShare] = []
     var timerErrorNetworking: Timer?
 
-    var errorITMS90076: Bool = false
-
     private var privacyProtectionWindow: UIWindow?
 
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
@@ -99,11 +97,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
             levelLog = CCUtility.getLogLevel()
             NKCommon.shared.levelLog = levelLog
             NKCommon.shared.copyLogToDocumentDirectory = true
-            if isSimulatorOrTestFlight {
-                NKCommon.shared.writeLog("[INFO] Start session with level \(levelLog) " + versionNextcloudiOS + " (Simulator / TestFlight) in \(UIApplication.shared.applicationState)")
-            } else {
-                NKCommon.shared.writeLog("[INFO] Start session with level \(levelLog) " + versionNextcloudiOS + " in \(UIApplication.shared.applicationState)")
-            }
+            NKCommon.shared.writeLog("[INFO] Start session with level \(levelLog) " + versionNextcloudiOS + " in state \(UIApplication.shared.applicationState.rawValue) where (0 active, 1 inactive, 2 background).")
         }
 
         // LOG Account
@@ -114,11 +108,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
             }
         }
 
-        // ITMS-90076: Potential Loss of Keychain Access
-        if let account = NCManageDatabase.shared.getActiveAccount(), CCUtility.getPassword(account.account).isEmpty, NCUtility.shared.getVersionApp(withBuild: false).starts(with: "4.4") {
-            errorITMS90076 = true
-        }
-
         // Activate user account
         if let activeAccount = NCManageDatabase.shared.getActiveAccount() {
 
@@ -151,9 +140,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         NotificationCenter.default.addObserver(self, selector: #selector(initialize), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterInitialize), object: nil)
 
         // Start process Upload, Initialize
-        if UIApplication.shared.applicationState == .background {
-            NKCommon.shared.writeLog("[INFO] Process in background, denied process upload and Inizialize main")
-        } else {
+        if UIApplication.shared.applicationState != .background {
             NKCommon.shared.writeLog("[INFO] Starting process upload and Inizialize main")
             networkingProcessUpload = NCNetworkingProcessUpload()
             NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterInitialize, userInfo:["atStart":1])
@@ -207,30 +194,31 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     // MARK: - Life Cycle
 
-    // L' applicazione entrerà in primo piano (attivo sempre)
+    // L' applicazione entrerà in attivo (sempre)
     func applicationDidBecomeActive(_ application: UIApplication) {
 
+        NKCommon.shared.writeLog("[INFO] Application did become active")
+
         self.deletePasswordSession = false
 
         if !NCAskAuthorization.shared.isRequesting {
-            // Privacy
             hidePrivacyProtectionWindow()
         }
 
         NCSettingsBundleHelper.setVersionAndBuildNumber()
 
-        if account == "" { return }
-
-        networkingProcessUpload?.verifyUploadZombie()
+        if !account.isEmpty {
+            networkingProcessUpload?.verifyUploadZombie()
+        }
 
         NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterApplicationDidBecomeActive)
     }
 
-    // L' applicazione entrerà in primo piano (attivo solo dopo il background)
+    // L' applicazione entrerà in primo piano (dopo il background)
     func applicationWillEnterForeground(_ application: UIApplication) {
+        guard !account.isEmpty, let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
 
-        if account == "" { return }
-        guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
+        NKCommon.shared.writeLog("[INFO] Application will enter in foreground")
 
         // Account changed ??
         if activeAccount.account != account {
@@ -239,10 +227,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
             NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterInitialize)
         }
 
-        NKCommon.shared.writeLog("[INFO] Application will enter in foreground")
-
-        // START TIMER UPLOAD PROCESS
-        networkingProcessUpload?.startTimer()
+        // START UPLOAD PROCESS
+        networkingProcessUpload = NCNetworkingProcessUpload()
 
         // Initialize Auto upload
         NCAutoUpload.shared.initAutoUpload(viewController: nil) { items in
@@ -265,8 +251,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     // L' applicazione si dimetterà dallo stato di attivo
     func applicationWillResignActive(_ application: UIApplication) {
+        guard !account.isEmpty else { return }
 
-        if account == "" { return }
+        NKCommon.shared.writeLog("[INFO] Application will resign active")
 
         if CCUtility.getPrivacyScreenEnabled() {
             // Privacy
@@ -294,10 +281,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     // L' applicazione è entrata nello sfondo
     func applicationDidEnterBackground(_ application: UIApplication) {
+        guard !account.isEmpty else { return }
 
-        if account == "" { return }
+        NKCommon.shared.writeLog("[INFO] Application did enter in background")
 
-        // STOP TIMER UPLOAD PROCESS
+        // STOP UPLOAD PROCESS
         networkingProcessUpload?.stopTimer()
 
         scheduleAppRefresh()
@@ -352,14 +340,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     /*
     @discussion Schedule a refresh task request to ask that the system launch your app briefly so that you can download data and keep your app's contents up-to-date. The system will fulfill this request intelligently based on system conditions and app usage.
+     < MAX 30 seconds >
      */
     func scheduleAppRefresh() {
 
         let request = BGAppRefreshTaskRequest(identifier: NCGlobal.shared.refreshTask)
-        request.earliestBeginDate = Date(timeIntervalSinceNow: 6 * 60) // Refresh after 6 minutes.
+        request.earliestBeginDate = Date(timeIntervalSinceNow: 60) // Refresh after 60 seconds.
         do {
             try BGTaskScheduler.shared.submit(request)
-            NKCommon.shared.writeLog("[SUCCESS] Refresh task success submit request 6 minutes \(request)")
+            NKCommon.shared.writeLog("[SUCCESS] Refresh task success submit request 60 seconds \(request)")
         } catch {
             NKCommon.shared.writeLog("[ERROR] Refresh task failed to submit request: \(error)")
         }
@@ -367,6 +356,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     /*
      @discussion Schedule a processing task request to ask that the system launch your app when conditions are favorable for battery life to handle deferrable, longer-running processing, such as syncing, database maintenance, or similar tasks. The system will attempt to fulfill this request to the best of its ability within the next two days as long as the user has used your app within the past week.
+     < MAX over 1 minute >
      */
     func scheduleAppProcessing() {
 
@@ -792,8 +782,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     // MARK: - Open URL
 
     func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
-
-        if account == "" { return false }
+        guard !account.isEmpty else { return false }
 
         let scheme = url.scheme
         let action = url.host
@@ -954,6 +943,6 @@ extension AppDelegate: NCAudioRecorderViewControllerDelegate {
 extension AppDelegate: NCCreateFormUploadConflictDelegate {
     func dismissCreateFormUploadConflict(metadatas: [tableMetadata]?) {
         guard let metadatas = metadatas, !metadatas.isEmpty else { return }
-        networkingProcessUpload?.createProcessUploads(metadatas: metadatas)
+        networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: { _ in })
     }
 }

+ 1 - 0
iOSClient/Brand/iOSClient.plist

@@ -98,6 +98,7 @@
 	<key>UIBackgroundModes</key>
 	<array>
 		<string>audio</string>
+		<string>fetch</string>
 		<string>processing</string>
 		<string>remote-notification</string>
 	</array>

+ 1 - 10
iOSClient/Login/NCLoginWeb.swift

@@ -144,16 +144,7 @@ class NCLoginWeb: UIViewController {
         // Stop timer error network
         appDelegate.timerErrorNetworking?.invalidate()
 
-        // ITMS-90076: Potential Loss of Keychain Access
-        if appDelegate.errorITMS90076, !CCUtility.getPresentErrorITMS90076() {
-
-            let message = "\n" + NSLocalizedString("_ITMS-90076_", comment: "")
-            let alertController = UIAlertController(title: titleView, message: message, preferredStyle: .alert)
-            alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in }))
-            present(alertController, animated: true, completion: {
-                CCUtility.setPresentErrorITMS90076(true)
-            })
-        } else if let account = NCManageDatabase.shared.getActiveAccount(), CCUtility.getPassword(account.account).isEmpty {
+        if let account = NCManageDatabase.shared.getActiveAccount(), CCUtility.getPassword(account.account).isEmpty {
 
             let message = "\n" + NSLocalizedString("_password_not_present_", comment: "")
             let alertController = UIAlertController(title: titleView, message: message, preferredStyle: .alert)

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

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

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

@@ -580,7 +580,7 @@ class NCCreateFormUploadScanDocument: XLFormViewController, NCSelectDelegate, NC
 
         NCActivityIndicator.shared.stop()
 
-        appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: [metadata])
+        appDelegate.networkingProcessUpload?.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

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

+ 1 - 1
iOSClient/Main/NCPickerViewController.swift

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

+ 105 - 124
iOSClient/Networking/NCAutoUpload.swift

@@ -25,7 +25,6 @@ import UIKit
 import CoreLocation
 import NextcloudKit
 import Photos
-import Queuer
 
 class NCAutoUpload: NSObject {
     @objc static let shared: NCAutoUpload = {
@@ -34,6 +33,8 @@ class NCAutoUpload: NSObject {
     }()
 
     private var endForAssetToUpload: Bool = false
+    private let appDelegate = UIApplication.shared.delegate as? AppDelegate
+    private let applicationState = UIApplication.shared.applicationState
 
     // MARK: -
 
@@ -49,9 +50,10 @@ class NCAutoUpload: NSObject {
                 completion(0)
                 return
             }
-
-            self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUpload, log: "Init Auto Upload") { items in
-                completion(items)
+            DispatchQueue.global().async {
+                self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUpload, log: "Init Auto Upload") { items in
+                    completion(items)
+                }
             }
         }
     }
@@ -60,15 +62,13 @@ class NCAutoUpload: NSObject {
 
         NCAskAuthorization.shared.askAuthorizationPhotoLibrary(viewController: viewController) { hasPermission in
             guard hasPermission else { return }
-            #if !EXTENSION
             let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_create_full_upload_")
             NCContentPresenter.shared.showWarning(error: error, priority: .max)
             NCActivityIndicator.shared.start()
-            #endif
-            self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUploadAll, log: log) { _ in
-                #if !EXTENSION
-                NCActivityIndicator.shared.stop()
-                #endif
+            DispatchQueue.global().async {
+                self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUploadAll, log: log) { _ in
+                    NCActivityIndicator.shared.stop()
+                }
             }
         }
     }
@@ -79,109 +79,102 @@ class NCAutoUpload: NSObject {
             return
         }
 
-        DispatchQueue.global().async {
-
-            let autoUploadPath = NCManageDatabase.shared.getAccountAutoUploadPath(urlBase: account.urlBase, account: account.account)
-            var metadatas: [tableMetadata] = []
+        let autoUploadPath = NCManageDatabase.shared.getAccountAutoUploadPath(urlBase: account.urlBase, account: account.account)
+        var metadatas: [tableMetadata] = []
 
-            self.getCameraRollAssets(viewController: viewController, account: account, selector: selector, alignPhotoLibrary: false) { assets in
-                guard let assets = assets, !assets.isEmpty else {
-                    NKCommon.shared.writeLog("[INFO] Automatic upload, no new assets found [" + log + "]")
-                    completion(0)
-                    return
-                }
-                NKCommon.shared.writeLog("[INFO] Automatic upload, new \(assets.count) assets found [" + log + "]")
-                // Create the folder for auto upload & if request the subfolders
-                if !NCNetworking.shared.createFolder(assets: assets, selector: selector, useSubFolder: account.autoUploadCreateSubfolder, account: account.account, urlBase: account.urlBase) {
-                    #if !EXTENSION
-                    if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
-                        let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_error_createsubfolders_upload_")
-                        NCContentPresenter.shared.showError(error: error, priority: .max)
-                    }
-                    #endif
-                    return completion(0)
+        self.getCameraRollAssets(viewController: viewController, account: account, selector: selector, alignPhotoLibrary: false) { assets in
+            guard let assets = assets, !assets.isEmpty else {
+                NKCommon.shared.writeLog("[INFO] Automatic upload, no new assets found [" + log + "]")
+                completion(0)
+                return
+            }
+            NKCommon.shared.writeLog("[INFO] Automatic upload, new \(assets.count) assets found [" + log + "]")
+            // Create the folder for auto upload & if request the subfolders
+            if !NCNetworking.shared.createFolder(assets: assets, selector: selector, useSubFolder: account.autoUploadCreateSubfolder, account: account.account, urlBase: account.urlBase) {
+                if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
+                    let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_error_createsubfolders_upload_")
+                    NCContentPresenter.shared.showError(error: error, priority: .max)
                 }
+                return completion(0)
+            }
 
-                self.endForAssetToUpload = false
+            self.endForAssetToUpload = false
 
-                for asset in assets {
+            for asset in assets {
 
-                    var livePhoto = false
-                    var session: String = ""
-                    guard let assetDate = asset.creationDate else { continue }
-                    let assetMediaType = asset.mediaType
-                    var serverUrl: String = ""
-                    let fileName = CCUtility.createFileName(asset.value(forKey: "filename") as? String, fileDate: assetDate, fileType: assetMediaType, keyFileName: NCGlobal.shared.keyFileNameAutoUploadMask, keyFileNameType: NCGlobal.shared.keyFileNameAutoUploadType, keyFileNameOriginal: NCGlobal.shared.keyFileNameOriginalAutoUpload, forcedNewFileName: false)!
-                    let formatter = DateFormatter()
-                    formatter.dateFormat = "yyyy"
-                    let yearString = formatter.string(from: assetDate)
-                    formatter.dateFormat = "MM"
-                    let monthString = formatter.string(from: assetDate)
+                var livePhoto = false
+                var session: String = ""
+                guard let assetDate = asset.creationDate else { continue }
+                let assetMediaType = asset.mediaType
+                var serverUrl: String = ""
+                let fileName = CCUtility.createFileName(asset.value(forKey: "filename") as? String, fileDate: assetDate, fileType: assetMediaType, keyFileName: NCGlobal.shared.keyFileNameAutoUploadMask, keyFileNameType: NCGlobal.shared.keyFileNameAutoUploadType, keyFileNameOriginal: NCGlobal.shared.keyFileNameOriginalAutoUpload, forcedNewFileName: false)!
+                let formatter = DateFormatter()
+                formatter.dateFormat = "yyyy"
+                let yearString = formatter.string(from: assetDate)
+                formatter.dateFormat = "MM"
+                let monthString = formatter.string(from: assetDate)
 
-                    if asset.mediaSubtypes.contains(.photoLive) && CCUtility.getLivePhoto() {
-                        livePhoto = true
-                    }
+                if asset.mediaSubtypes.contains(.photoLive) && CCUtility.getLivePhoto() {
+                    livePhoto = true
+                }
 
-                    if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
-                        session = NKCommon.shared.sessionIdentifierUpload
-                    } else {
-                        if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto == false {
-                            session = NCNetworking.shared.sessionIdentifierBackground
-                        } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo == false {
-                            session = NCNetworking.shared.sessionIdentifierBackground
-                        } else if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto {
-                            session = NCNetworking.shared.sessionIdentifierBackgroundWWan
-                        } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo {
-                            session = NCNetworking.shared.sessionIdentifierBackgroundWWan
-                        } else { session = NCNetworking.shared.sessionIdentifierBackground }
-                    }
+                if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
+                    session = NKCommon.shared.sessionIdentifierUpload
+                } else {
+                    if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto == false {
+                        session = NCNetworking.shared.sessionIdentifierBackground
+                    } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo == false {
+                        session = NCNetworking.shared.sessionIdentifierBackground
+                    } else if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto {
+                        session = NCNetworking.shared.sessionIdentifierBackgroundWWan
+                    } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo {
+                        session = NCNetworking.shared.sessionIdentifierBackgroundWWan
+                    } else { session = NCNetworking.shared.sessionIdentifierBackground }
+                }
 
-                    if account.autoUploadCreateSubfolder {
-                        serverUrl = autoUploadPath + "/" + yearString + "/" + monthString
-                    } else {
-                        serverUrl = autoUploadPath
-                    }
+                if account.autoUploadCreateSubfolder {
+                    serverUrl = autoUploadPath + "/" + yearString + "/" + monthString
+                } else {
+                    serverUrl = autoUploadPath
+                }
 
-                    // MOST COMPATIBLE SEARCH --> HEIC --> JPG
-                    var fileNameSearchMetadata = fileName
-                    let ext = (fileNameSearchMetadata as NSString).pathExtension.uppercased()
-                    if ext == "HEIC" && CCUtility.getFormatCompatibility() {
-                        fileNameSearchMetadata = (fileNameSearchMetadata as NSString).deletingPathExtension + ".jpg"
+                // MOST COMPATIBLE SEARCH --> HEIC --> JPG
+                var fileNameSearchMetadata = fileName
+                let ext = (fileNameSearchMetadata as NSString).pathExtension.uppercased()
+                if ext == "HEIC" && CCUtility.getFormatCompatibility() {
+                    fileNameSearchMetadata = (fileNameSearchMetadata as NSString).deletingPathExtension + ".jpg"
+                }
+                if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account.account, serverUrl, fileNameSearchMetadata)) != nil {
+                    if selector == NCGlobal.shared.selectorUploadAutoUpload {
+                        NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
                     }
-                    if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account.account, serverUrl, fileNameSearchMetadata)) != nil {
-                        if selector == NCGlobal.shared.selectorUploadAutoUpload {
-                            NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
-                        }
-                    } else {
-                        let metadata = NCManageDatabase.shared.createMetadata(account: account.account, user: account.user, userId: account.userId, fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, serverUrl: serverUrl, urlBase: account.urlBase, url: "", contentType: "", isLivePhoto: livePhoto)
-                        metadata.assetLocalIdentifier = asset.localIdentifier
-                        metadata.session = session
-                        metadata.sessionSelector = selector
-                        metadata.status = NCGlobal.shared.metadataStatusWaitUpload
-                        if assetMediaType == PHAssetMediaType.video {
-                            metadata.classFile = NKCommon.typeClassFile.video.rawValue
-                        } else if assetMediaType == PHAssetMediaType.image {
-                            metadata.classFile = NKCommon.typeClassFile.image.rawValue
-                        }
-                        if selector == NCGlobal.shared.selectorUploadAutoUpload {
-                            NKCommon.shared.writeLog("[INFO] Automatic upload added \(metadata.fileNameView) with Identifier \(metadata.assetLocalIdentifier)")
-                            NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
-                        }
-                        metadatas.append(metadata)
+                } else {
+                    let metadata = NCManageDatabase.shared.createMetadata(account: account.account, user: account.user, userId: account.userId, fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, serverUrl: serverUrl, urlBase: account.urlBase, url: "", contentType: "", isLivePhoto: livePhoto)
+                    metadata.assetLocalIdentifier = asset.localIdentifier
+                    metadata.session = session
+                    metadata.sessionSelector = selector
+                    metadata.status = NCGlobal.shared.metadataStatusWaitUpload
+                    if assetMediaType == PHAssetMediaType.video {
+                        metadata.classFile = NKCommon.typeClassFile.video.rawValue
+                    } else if assetMediaType == PHAssetMediaType.image {
+                        metadata.classFile = NKCommon.typeClassFile.image.rawValue
                     }
+                    if selector == NCGlobal.shared.selectorUploadAutoUpload {
+                        NKCommon.shared.writeLog("[INFO] Automatic upload added \(metadata.fileNameView) with Identifier \(metadata.assetLocalIdentifier)")
+                        NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
+                    }
+                    metadatas.append(metadata)
                 }
+            }
 
-                self.endForAssetToUpload = true
-
-                if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
-                    NKCommon.shared.writeLog("[INFO] Start Upload All")
-                    #if !EXTENSION
-                    (UIApplication.shared.delegate as! AppDelegate).networkingProcessUpload?.createProcessUploads(metadatas: metadatas)
-                    completion(metadatas.count)
-                    #endif
-                } else if selector == NCGlobal.shared.selectorUploadAutoUpload {
-                    NKCommon.shared.writeLog("[INFO] Start Upload")
-                    self.createProcessUploads(metadatas: metadatas, completion: completion)
+            self.endForAssetToUpload = true
+            if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
+                self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
+            } else {
+                if self.applicationState == .background {
+                    self.createBackgroundProcessAutoUpload(metadatas: metadatas, completion: completion)
+                } else {
+                    self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
                 }
             }
         }
@@ -189,63 +182,51 @@ class NCAutoUpload: NSObject {
 
     // MARK: -
 
-    func createProcessUploads(metadatas: [tableMetadata], completion: @escaping (_ items: Int) -> Void) {
+    func createBackgroundProcessAutoUpload(metadatas: [tableMetadata], completion: @escaping (_ items: Int) -> Void) {
 
         var metadatasForUpload: [tableMetadata] = []
         var numStartUpload: Int = 0
+        let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
 
         for metadata in metadatas {
-            if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && serverUrl == %@ && fileName == %@ && session != ''", metadata.account, metadata.serverUrl, metadata.fileName)) != nil {
-                continue
-            }
+            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)
 
         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)
-        }
+        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 = Semaphore()
+            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 !EXTENSION
-                    if (metadata.e2eEncrypted || metadata.chunk) && UIApplication.shared.applicationState != .active {  continue }
-                    #else
-                    if (metadata.e2eEncrypted || metadata.chunk) { continue }
-                    #endif
-                    let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
-                    if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
+                    if (metadata.e2eEncrypted || metadata.chunk) {  continue }
+                    if (metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi) { continue }
                     guard let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) else { continue }
-                    // Upload 
-                    let semaphoreUpload = Semaphore()
+                    // Upload
+                    let semaphoreUpload = DispatchSemaphore(value: 1)
                     NCNetworking.shared.upload(metadata: metadata) {
                         numStartUpload += 1
                     } completion: { error in
-                        semaphoreUpload.continue()
+                        semaphoreUpload.signal()
                     }
                     semaphoreUpload.wait()
                 }
-                semaphore.continue()
+                semaphore.signal()
             }
             semaphore.wait()
         }
-        DispatchQueue.main.async {
-            completion(numStartUpload)
-        }
+        completion(numStartUpload)
     }
 
     // MARK: -

+ 18 - 34
iOSClient/Networking/NCNetworking.swift

@@ -25,7 +25,6 @@ import UIKit
 import OpenSSL
 import NextcloudKit
 import Alamofire
-import Queuer
 import Photos
 
 @objc public protocol NCNetworkingDelegate {
@@ -405,37 +404,20 @@ import Photos
         if metadata.e2eEncrypted {
             #if !EXTENSION_FILE_PROVIDER_EXTENSION && !EXTENSION_WIDGET
             NCNetworkingE2EE.shared.upload(metadata: metadata, start: start) { error in
-                DispatchQueue.main.async {
-                    completion(error)
-                }
+                completion(error)
             }
             #endif
         } else if metadata.chunk {
             uploadChunkedFile(metadata: metadata, start: start) { error in
-                DispatchQueue.main.async {
-                    completion(error)
-                }
+                completion(error)
             }
         } else if metadata.session == NKCommon.shared.sessionIdentifierUpload {
             uploadFile(metadata: metadata, start: start) { error in
-                DispatchQueue.main.async {
-                    completion(error)
-                }
+                completion(error)
             }
         } else {
-            isInTaskUploadBackground(fileName: metadata.fileName) { exists in
-                if exists {
-                    NKCommon.shared.writeLog("[INFO] Upload already in progress.")
-                    DispatchQueue.main.async {
-                        completion(NKError(errorCode: 0, errorDescription: ""))
-                    }
-                } else {
-                    self.uploadFileInBackground(metadata: metadata, start: start) { error in
-                        DispatchQueue.main.async {
-                            completion(error)
-                        }
-                    }
-                }
+            self.uploadFileInBackground(metadata: metadata, start: start) { error in
+                completion(error)
             }
         }
     }
@@ -507,6 +489,8 @@ import Photos
 
             if let task = NKBackground.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, dateCreationFile: metadata.creationDate as Date, dateModificationFile: metadata.date as Date, description: metadata.ocId, session: session!) {
 
+                NKCommon.shared.writeLog("[INFO] Upload file \(metadata.fileNameView) with task with taskIdentifier \(task.taskIdentifier)")
+
                 NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, sessionError: "", sessionTaskIdentifier: task.taskIdentifier, status: NCGlobal.shared.metadataStatusUploading)
                 NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterUploadStartFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "fileName": metadata.fileName, "sessionSelector": metadata.sessionSelector])
                 completion(NKError())
@@ -853,10 +837,10 @@ import Photos
                        let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && fileId == %@", userBaseUrl.userAccount, String(fileId))) {
                         metadatas.append(metadata)
                     } else if let filePath = entry.filePath {
-                        let semaphore = Semaphore()
+                        let semaphore = DispatchSemaphore(value: 0)
                         self.loadMetadata(userBaseUrl: userBaseUrl, filePath: filePath, dispatchGroup: dispatchGroup) { account, metadata, error in
                             metadatas.append(metadata)
-                            semaphore.continue()
+                            semaphore.signal()
                         }
                         semaphore.wait()
                     } else { print(#function, "[ERROR]: File search entry has no path: \(entry)") }
@@ -875,10 +859,10 @@ import Photos
                               filename)) {
                         metadatas.append(metadata)
                     } else {
-                        let semaphore = Semaphore()
+                        let semaphore = DispatchSemaphore(value: 0)
                         self.loadMetadata(userBaseUrl: userBaseUrl, filePath: dir + filename, dispatchGroup: dispatchGroup) { account, metadata, error in
                             metadatas.append(metadata)
-                            semaphore.continue()
+                            semaphore.signal()
                         }
                         semaphore.wait()
                     }
@@ -912,10 +896,10 @@ import Photos
                     if let fileId = entry.fileId, let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && fileId == %@", userBaseUrl.userAccount, String(fileId))) {
                         metadatas.append(metadata)
                     } else if let filePath = entry.filePath {
-                        let semaphore = Semaphore()
+                        let semaphore = DispatchSemaphore(value: 0)
                         self.loadMetadata(userBaseUrl: userBaseUrl, filePath: filePath, dispatchGroup: nil) { account, metadata, error in
                             metadatas.append(metadata)
-                            semaphore.continue()
+                            semaphore.signal()
                         }
                         semaphore.wait()
                     } else { print(#function, "[ERROR]: File search entry has no path: \(entry)") }
@@ -930,10 +914,10 @@ import Photos
                     if let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && path == %@ && fileName == %@", userBaseUrl.userAccount, "/remote.php/dav/files/" + userBaseUrl.user + dir, filename)) {
                         metadatas.append(metadata)
                     } else {
-                        let semaphore = Semaphore()
+                        let semaphore = DispatchSemaphore(value: 0)
                         self.loadMetadata(userBaseUrl: userBaseUrl, filePath: dir + filename, dispatchGroup: nil) { account, metadata, error in
                             metadatas.append(metadata)
-                            semaphore.continue()
+                            semaphore.signal()
                         }
                         semaphore.wait()
                     }
@@ -1047,14 +1031,14 @@ import Photos
     private func createFolderWithSemaphore(fileName: String, serverUrl: String, account: String, urlBase: String) -> Bool {
 
         var result: Bool = false
-        let semaphore = Semaphore()
+        let semaphore = DispatchSemaphore(value: 0)
 
         NCNetworking.shared.createFolder(fileName: fileName, serverUrl: serverUrl, account: account, urlBase: urlBase, overwrite: true) { error in
             if error == .success { result = true }
-            semaphore.continue()
+            semaphore.signal()
         }
+        semaphore.wait()
 
-        if semaphore.wait() == .success { result = true }
         return result
     }
 

+ 2 - 3
iOSClient/Networking/NCNetworkingChunkedUpload.swift

@@ -22,7 +22,6 @@
 //
 
 import UIKit
-import Queuer
 import NextcloudKit
 
 extension NCNetworking {
@@ -79,7 +78,7 @@ extension NCNetworking {
                     size = tableChunk.size - NCUtilityFileSystem.shared.getFileSize(filePath: fileNameChunkLocalPath)
                 }
 
-                let semaphore = Semaphore()
+                let semaphore = DispatchSemaphore(value: 0)
 
                 NextcloudKit.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameChunkLocalPath, requestHandler: { request in
 
@@ -115,7 +114,7 @@ extension NCNetworking {
 
                     self.uploadRequest.removeValue(forKey: fileNameLocalPath)
                     uploadError = error
-                    semaphore.continue()
+                    semaphore.signal()
                 }
 
                 semaphore.wait()

+ 10 - 22
iOSClient/Networking/NCNetworkingProcessUpload.swift

@@ -24,7 +24,6 @@
 import UIKit
 import NextcloudKit
 import Photos
-import Queuer
 
 class NCNetworkingProcessUpload: NSObject {
 
@@ -35,25 +34,23 @@ class NCNetworkingProcessUpload: NSObject {
         startTimer()
     }
 
-    private func startProcess() {
+    private func startProcess(completion: @escaping (_ items: Int) -> Void) {
         if timerProcess?.isValid ?? false {
-            DispatchQueue.main.async { self.process() }
+            DispatchQueue.main.async { self.processForeground() }
         }
     }
 
     func startTimer() {
         timerProcess?.invalidate()
-        timerProcess = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(process), userInfo: nil, repeats: true)
+        timerProcess = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(processForeground), userInfo: nil, repeats: true)
     }
 
     func stopTimer() {
         timerProcess?.invalidate()
     }
 
-    @objc private func process() {
-        guard let account = NCManageDatabase.shared.getActiveAccount(), UIApplication.shared.applicationState == .active else {
-            return
-        }
+    @objc private func processForeground() {
+        guard let account = NCManageDatabase.shared.getActiveAccount(), UIApplication.shared.applicationState == .active else { return }
 
         stopTimer()
 
@@ -106,17 +103,12 @@ class NCNetworkingProcessUpload: NSObject {
                             }
                         }
 
-                        let semaphore = Semaphore()
+                        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 !EXTENSION
-                                if (metadata.e2eEncrypted || metadata.chunk) && UIApplication.shared.applicationState != .active {  continue }
-                                #else
-                                if (metadata.e2eEncrypted || metadata.chunk) { continue }
-                                #endif
                                 let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
                                 if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
                                 if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
@@ -128,7 +120,7 @@ class NCNetworkingProcessUpload: NSObject {
                                     counterUpload += 1
                                 }
                             }
-                            semaphore.continue()
+                            semaphore.signal()
                         }
                         semaphore.wait()
                     }
@@ -144,9 +136,8 @@ class NCNetworkingProcessUpload: NSObject {
             }
              
             // verify delete Asset Local Identifiers in auto upload (DELETE Photos album)
-            #if !EXTENSION
             DispatchQueue.main.async {
-                if (counterUpload == 0 && !(UIApplication.shared.delegate as! AppDelegate).isPasscodePresented()) {
+                if UIApplication.shared.applicationState == .active && counterUpload == 0 && !(UIApplication.shared.delegate as! AppDelegate).isPasscodePresented() {
                     self.deleteAssetLocalIdentifiers(account: account.account) {
                         self.startTimer()
                     }
@@ -154,11 +145,9 @@ class NCNetworkingProcessUpload: NSObject {
                     self.startTimer()
                 }
             }
-            #endif
         })
     }
 
-    #if !EXTENSION
     private func deleteAssetLocalIdentifiers(account: String, completition: @escaping () -> Void) {
 
         if UIApplication.shared.applicationState != .active {
@@ -186,11 +175,10 @@ class NCNetworkingProcessUpload: NSObject {
             }
         })
     }
-    #endif
 
     // MARK: -
 
-    @objc func createProcessUploads(metadatas: [tableMetadata], verifyAlreadyExists: Bool = false) {
+    @objc func createProcessUploads(metadatas: [tableMetadata], verifyAlreadyExists: Bool = false, completion: @escaping (_ items: Int) -> Void) {
 
         var metadatasForUpload: [tableMetadata] = []
         for metadata in metadatas {
@@ -202,7 +190,7 @@ class NCNetworkingProcessUpload: NSObject {
             metadatasForUpload.append(metadata)
         }
         NCManageDatabase.shared.addMetadatas(metadatasForUpload)
-        startProcess()
+        startProcess(completion: completion)
     }
 
     // MARK: -

+ 0 - 3
iOSClient/Utility/CCUtility.h

@@ -180,9 +180,6 @@
 + (BOOL)getRemovePhotoCameraRoll;
 + (void)setRemovePhotoCameraRoll:(BOOL)set;
 
-+ (BOOL)getPresentErrorITMS90076;
-+ (void)setPresentErrorITMS90076:(BOOL)set;
-
 + (BOOL)getPlayerPlay;
 + (void)setPlayerPlay:(BOOL)set;
 

+ 0 - 11
iOSClient/Utility/CCUtility.m

@@ -723,17 +723,6 @@
     [UICKeyChainStore setString:sSet forKey:@"removePhotoCameraRoll" service:NCGlobal.shared.serviceShareKeyChain];
 }
 
-+ (BOOL)getPresentErrorITMS90076
-{
-    return [[UICKeyChainStore stringForKey:@"errorITMS90076" service:NCGlobal.shared.serviceShareKeyChain] boolValue];
-}
-
-+ (void)setPresentErrorITMS90076:(BOOL)set
-{
-    NSString *sSet = (set) ? @"true" : @"false";
-    [UICKeyChainStore setString:sSet forKey:@"errorITMS90076" service:NCGlobal.shared.serviceShareKeyChain];
-}
-
 + (BOOL)getPlayerPlay
 {
     return [[UICKeyChainStore stringForKey:@"playerPlay" service:NCGlobal.shared.serviceShareKeyChain] boolValue];

+ 18 - 0
iOSClient/Utility/NCAskAuthorization.swift

@@ -111,4 +111,22 @@ class NCAskAuthorization: NSObject {
             break
         }
     }
+
+    #if !EXTENSION
+    func checkBackgroundRefreshStatus() {
+        switch UIApplication.shared.backgroundRefreshStatus {
+        case .available:
+            print("Background fetch is enabled")
+        case .denied:
+            print("Background fetch is explicitly disabled")
+            // Redirect user to Settings page only once; Respect user's choice is important
+            UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
+        case .restricted:
+            // Should not redirect user to Settings since he / she cannot toggle the settings
+            print("Background fetch is restricted, e.g. under parental control")
+        default:
+            print("Unknown property")
+        }
+    }
+    #endif
 }

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

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