Browse Source

Merge branch 'develop' into secureFileDrop

Marino Faggiana 2 years ago
parent
commit
5bcf2660de
30 changed files with 736 additions and 539 deletions
  1. 4 2
      .swiftlint.yml
  2. 34 6
      Nextcloud.xcodeproj/project.pbxproj
  3. 2 2
      iOSClient/AppDelegate.swift
  4. 0 60
      iOSClient/Data/NCDatabase.swift
  5. 6 6
      iOSClient/Data/NCManageDatabase+Activity.swift
  6. 134 0
      iOSClient/Data/NCManageDatabase+Avatar.swift
  7. 9 9
      iOSClient/Data/NCManageDatabase+Directory.swift
  8. 36 40
      iOSClient/Data/NCManageDatabase+Metadata.swift
  9. 233 0
      iOSClient/Data/NCManageDatabase+Share.swift
  10. 32 282
      iOSClient/Data/NCManageDatabase.swift
  11. 2 2
      iOSClient/Main/Collection Common/NCCollectionViewCommon.swift
  12. 70 64
      iOSClient/Main/NCActionCenter.swift
  13. 13 5
      iOSClient/Menu/NCCollectionViewCommon+Menu.swift
  14. 117 39
      iOSClient/Menu/NCContextMenu.swift
  15. 13 8
      iOSClient/Menu/NCMenuAction.swift
  16. 19 7
      iOSClient/Menu/NCViewer+Menu.swift
  17. 8 3
      iOSClient/Networking/NCNetworking.swift
  18. 1 1
      iOSClient/RichWorkspace/NCViewerRichWorkspaceWebView.swift
  19. BIN
      iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings
  20. BIN
      iOSClient/Supporting Files/de.lproj/Localizable.strings
  21. BIN
      iOSClient/Supporting Files/fr.lproj/Localizable.strings
  22. BIN
      iOSClient/Supporting Files/hu.lproj/Localizable.strings
  23. BIN
      iOSClient/Supporting Files/it.lproj/Localizable.strings
  24. BIN
      iOSClient/Supporting Files/th_TH.lproj/Localizable.strings
  25. BIN
      iOSClient/Supporting Files/tr.lproj/Localizable.strings
  26. BIN
      iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings
  27. BIN
      iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings
  28. 1 1
      iOSClient/Viewer/NCViewer.swift
  29. 1 1
      iOSClient/Viewer/NCViewerNextcloudText/NCViewerNextcloudText.swift
  30. 1 1
      iOSClient/Viewer/NCViewerRichdocument/NCViewerRichdocument.swift

+ 4 - 2
.swiftlint.yml

@@ -20,8 +20,8 @@ function_body_length:
    warning: 200
 
 type_body_length:
-  warning: 350
-  error: 500
+  warning: 500
+  error: 700
   
 file_length:
   warning: 1000
@@ -76,9 +76,11 @@ excluded:
   - iOSClient/Data/NCElementsJSON.swift
   - iOSClient/Data/NCManageDatabase+Account.swift
   - iOSClient/Data/NCManageDatabase+Activity.swift
+  - iOSClient/Data/NCManageDatabase+Avatar.swift
   - iOSClient/Data/NCManageDatabase.swift
   - iOSClient/Data/NCManageDatabase+Metadata.swift
   - iOSClient/Data/NCManageDatabase+Directory.swift
+  - iOSClient/Data/NCManageDatabase+Share.swift
   - iOSClient/Data/NCManageDatabase+Video.swift
   - iOSClient/Data/NCManageDatabase+LayoutForView.swift
   - iOSClient/Data/NCManageDatabase+DashboardWidget.swift

+ 34 - 6
Nextcloud.xcodeproj/project.pbxproj

@@ -213,6 +213,18 @@
 		F746EC52273906C40052598D /* NCViewCertificateDetails.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */; };
 		F746EC53273906C50052598D /* NCViewCertificateDetails.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */; };
 		F747BA1F22354D2000971601 /* NCCreateFormUploadVoiceNote.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F747BA1E22354D2000971601 /* NCCreateFormUploadVoiceNote.storyboard */; };
+		F749B64A297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B64B297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B64C297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B64D297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B64E297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B64F297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */; };
+		F749B651297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
+		F749B652297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
+		F749B653297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
+		F749B654297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
+		F749B655297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
+		F749B656297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */; };
 		F749C10B23C4A5340027D966 /* NCIntroCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749C10723C4A5330027D966 /* NCIntroCollectionViewCell.swift */; };
 		F749C10C23C4A5340027D966 /* NCIntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F749C10823C4A5330027D966 /* NCIntroViewController.swift */; };
 		F749C10D23C4A5340027D966 /* NCIntro.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F749C10923C4A5330027D966 /* NCIntro.storyboard */; };
@@ -239,7 +251,7 @@
 		F75A9EE623796C6F0044CFCE /* NCNetworking.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75A9EE523796C6F0044CFCE /* NCNetworking.swift */; };
 		F75A9EE723796C6F0044CFCE /* NCNetworking.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75A9EE523796C6F0044CFCE /* NCNetworking.swift */; };
 		F75AC2431F1F62450073EC19 /* NCManageAutoUploadFileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75AC2421F1F62450073EC19 /* NCManageAutoUploadFileName.swift */; };
-		F75B0ABD244C4DBB00E58DCA /* NCFunctionCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75B0ABC244C4DBB00E58DCA /* NCFunctionCenter.swift */; };
+		F75B0ABD244C4DBB00E58DCA /* NCActionCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75B0ABC244C4DBB00E58DCA /* NCActionCenter.swift */; };
 		F75C0C4823D1FAE300163CC8 /* NCRichWorkspaceCommon.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75C0C4723D1FAE300163CC8 /* NCRichWorkspaceCommon.swift */; };
 		F75CA1472962F13700B01130 /* HUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75CA1462962F13700B01130 /* HUDView.swift */; };
 		F75CA1482962F13700B01130 /* HUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75CA1462962F13700B01130 /* HUDView.swift */; };
@@ -836,6 +848,8 @@
 		F747BA1E22354D2000971601 /* NCCreateFormUploadVoiceNote.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCCreateFormUploadVoiceNote.storyboard; sourceTree = "<group>"; };
 		F7496B81208F5651004B299C /* iOSClient.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = iOSClient.plist; sourceTree = "<group>"; };
 		F7496B83208F5652004B299C /* Share.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Share.plist; sourceTree = "<group>"; };
+		F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Share.swift"; sourceTree = "<group>"; };
+		F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Avatar.swift"; sourceTree = "<group>"; };
 		F749C10723C4A5330027D966 /* NCIntroCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroCollectionViewCell.swift; sourceTree = "<group>"; };
 		F749C10823C4A5330027D966 /* NCIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCIntroViewController.swift; sourceTree = "<group>"; };
 		F749C10923C4A5330027D966 /* NCIntro.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCIntro.storyboard; sourceTree = "<group>"; };
@@ -861,7 +875,7 @@
 		F758B45F212C56A400515F55 /* NCScan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCScan.swift; sourceTree = "<group>"; };
 		F75A9EE523796C6F0044CFCE /* NCNetworking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCNetworking.swift; sourceTree = "<group>"; };
 		F75AC2421F1F62450073EC19 /* NCManageAutoUploadFileName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCManageAutoUploadFileName.swift; sourceTree = "<group>"; };
-		F75B0ABC244C4DBB00E58DCA /* NCFunctionCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCFunctionCenter.swift; sourceTree = "<group>"; };
+		F75B0ABC244C4DBB00E58DCA /* NCActionCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCActionCenter.swift; sourceTree = "<group>"; };
 		F75B91E21ECAE17800199C96 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F75B91F71ECAE26300199C96 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		F75B923D1ECAE55E00199C96 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -1372,7 +1386,7 @@
 				370D26AE248A3D7A00121797 /* NCCellProtocol.swift */,
 				F7226EDB1EE4089300EBECB1 /* Main.storyboard */,
 				F7682FDF23C36B0500983A04 /* NCMainTabBar.swift */,
-				F75B0ABC244C4DBB00E58DCA /* NCFunctionCenter.swift */,
+				F75B0ABC244C4DBB00E58DCA /* NCActionCenter.swift */,
 				F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */,
 			);
 			path = Main;
@@ -1886,7 +1900,9 @@
 				F7C1EEA425053A9C00866ACC /* NCDataSource.swift */,
 				F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */,
 				F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */,
+				F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */,
 				AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */,
+				F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */,
 				AF4BF613275629E20081CEEF /* NCManageDatabase+Account.swift */,
 				F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */,
 				F78A10BE29322E8A008499B8 /* NCManageDatabase+Directory.swift */,
@@ -2870,6 +2886,7 @@
 				2C33C48223E2C475005F963B /* NotificationService.swift in Sources */,
 				AF4BF617275629E20081CEEF /* NCManageDatabase+Account.swift in Sources */,
 				F7BF9D872934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */,
+				F749B64F297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				D575039F27146F93008DC9DC /* String+Extension.swift in Sources */,
 				F769CA1A2966EA3C00039397 /* ComponentView.swift in Sources */,
 				F73D5E4A246DE09200DF6467 /* NCElementsJSON.swift in Sources */,
@@ -2879,6 +2896,7 @@
 				AF4BF61C27562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */,
 				AF817EF4274BC781009ED85B /* NCUserBaseUrl.swift in Sources */,
 				F798F0EC2588060A000DAFFD /* UIColor+Extension.swift in Sources */,
+				F749B656297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				2CB7D1CA23E2EDCB00376EF9 /* NCPushNotificationEncryption.m in Sources */,
 				F782FDC424E6933900666099 /* NCUtility.swift in Sources */,
 			);
@@ -2938,6 +2956,7 @@
 				F71459D21D12E3B700CAFEEC /* CCUtility.m in Sources */,
 				F75A9EE723796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				AF730AFA27843E4C00B7520E /* NCShareExtension+NCDelegate.swift in Sources */,
+				F749B64D297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extension.swift in Sources */,
 				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
@@ -2948,6 +2967,7 @@
 				F7D68FCE28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */,
 				AF22B217277D196700DAB0CC /* NCShareExtension+DataSource.swift in Sources */,
 				F76D364728A4F8BF00214537 /* NCActivityIndicator.swift in Sources */,
+				F749B654297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F780710A1EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m in Sources */,
 				F79EC77F26316193004E59D6 /* NCRenameFile.swift in Sources */,
 				AF22B208277B4E4C00DAB0CC /* NCCreateFormUploadConflictCell.swift in Sources */,
@@ -2977,6 +2997,7 @@
 				F72EA95A28B7BD0D00C88F0C /* FilesWidgetView.swift in Sources */,
 				F78302FE28B4C44700B84583 /* NCBrand.swift in Sources */,
 				F793E5A028B7651B005E4B02 /* NCViewCertificateDetails.swift in Sources */,
+				F749B64B297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				F793E59F28B764F6005E4B02 /* NCContentPresenter.swift in Sources */,
 				F76DEE9828F808AF0041B1C9 /* LockscreenWidgetProvider.swift in Sources */,
 				F78A10C029322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */,
@@ -2986,6 +3007,7 @@
 				F793E59D28B761E7005E4B02 /* NCNetworking.swift in Sources */,
 				F78302FC28B4C3F300B84583 /* NCElementsJSON.swift in Sources */,
 				F7BF9D832934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */,
+				F749B652297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F783030628B4C51E00B84583 /* String+Extension.swift in Sources */,
 				F77ED59328C9CEA000E24ED0 /* ToolbarWidgetProvider.swift in Sources */,
 				F72A17D828B221E300F3F159 /* DashboardWidgetView.swift in Sources */,
@@ -3018,6 +3040,7 @@
 				F7434B3820E2400600417916 /* NCBrand.swift in Sources */,
 				F785EE9E2461A09900B3F945 /* NCNetworking.swift in Sources */,
 				F746EC4F273906B90052598D /* NCViewCertificateDetails.swift in Sources */,
+				F749B655297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F771E3D320E2392D00AFB62D /* FileProviderExtension.swift in Sources */,
 				F73D5E49246DE09200DF6467 /* NCElementsJSON.swift in Sources */,
 				F771E3D520E2392D00AFB62D /* FileProviderItem.swift in Sources */,
@@ -3032,6 +3055,7 @@
 				F7E98C1827E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */,
 				F785EEA42461A4A600B3F945 /* NCUtility.swift in Sources */,
 				F79B646226CA661600838ACA /* UIControl+Extension.swift in Sources */,
+				F749B64E297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				AF817EF3274BC781009ED85B /* NCUserBaseUrl.swift in Sources */,
 				F771E3F320E239A600AFB62D /* FileProviderData.swift in Sources */,
 				F7B8CD9B261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
@@ -3064,7 +3088,7 @@
 				F71CD6CA2930D7B1006C95C1 /* NCApplicationHandle.swift in Sources */,
 				F790110E21415BF600D7B136 /* NCViewerRichdocument.swift in Sources */,
 				F78ACD4021903CC20088454D /* NCGridCell.swift in Sources */,
-				F75B0ABD244C4DBB00E58DCA /* NCFunctionCenter.swift in Sources */,
+				F75B0ABD244C4DBB00E58DCA /* NCActionCenter.swift in Sources */,
 				AF935067276B84E700BD078F /* NCMenu+FloatingPanel.swift in Sources */,
 				F702F2CD25EE5B4F008F8E80 /* AppDelegate.swift in Sources */,
 				F769454022E9F077000A798A /* NCSharePaging.swift in Sources */,
@@ -3191,6 +3215,7 @@
 				AF93471B27E2361E002537EE /* NCShareAdvancePermission.swift in Sources */,
 				F77BC3ED293E528A005F2B08 /* NCConfigServer.swift in Sources */,
 				F70753EB2542A99800972D44 /* NCViewerMediaPage.swift in Sources */,
+				F749B651297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F7FAFD3A28BFA948000777FE /* NCNotification+Menu.swift in Sources */,
 				F74C0436253F1CDC009762AB /* NCShares.swift in Sources */,
 				F7AC1CB028AB94490032D99F /* Array+Extension.swift in Sources */,
@@ -3206,6 +3231,7 @@
 				F745B253222D88AE00346520 /* NCLoginQRCode.swift in Sources */,
 				F7CBC31C24F78E79004D3812 /* NCSortMenu.swift in Sources */,
 				F769454822E9F20D000A798A /* NCShareNetworking.swift in Sources */,
+				F749B64A297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				F7C9555521F0C5470024296E /* NCActivity.swift in Sources */,
 				F7725A60251F33BB00D125E0 /* NCFiles.swift in Sources */,
 				F704B5E52430AA8000632F5F /* NCCreateFormUploadConflict.swift in Sources */,
@@ -3245,7 +3271,9 @@
 				F7A8D73D28F181D3008BBE1C /* NCUtilityFileSystem.swift in Sources */,
 				F7A8D74528F1828E008BBE1C /* CCUtility.m in Sources */,
 				F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */,
+				F749B64C297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
 				F7A8D73F28F181EF008BBE1C /* NCGlobal.swift in Sources */,
+				F749B653297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */,
 				F7A8D74328F1826F008BBE1C /* String+Extension.swift in Sources */,
 				F7A8D73728F17E1E008BBE1C /* NCManageDatabase+Account.swift in Sources */,
 				F7A8D73B28F17E2C008BBE1C /* NCElementsJSON.swift in Sources */,
@@ -3762,7 +3790,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 7;
+				CURRENT_PROJECT_VERSION = 8;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3825,7 +3853,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 7;
+				CURRENT_PROJECT_VERSION = 8;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;

+ 2 - 2
iOSClient/AppDelegate.swift

@@ -571,7 +571,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         self.userId = userId
         self.password = password
 
-        _ = NCFunctionCenter.shared
+        _ = NCActionCenter.shared
 
         NextcloudKit.shared.setup(account: account, user: user, userId: userId, password: password, urlBase: urlBase)
         let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
@@ -917,7 +917,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
                 }
 
                 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
-                    NCFunctionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName)
+                    NCActionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName)
                 }
             }
             return true

+ 0 - 60
iOSClient/Data/NCDatabase.swift

@@ -30,18 +30,6 @@ protocol DateCompareable {
     var dateKey: Date { get }
 }
 
-class tableAvatar: Object {
-
-    @objc dynamic var date = NSDate()
-    @objc dynamic var etag = ""
-    @objc dynamic var fileName = ""
-    @objc dynamic var loaded: Bool = false
-
-    override static func primaryKey() -> String {
-        return "fileName"
-    }
-}
-
 class tableCapabilities: Object {
 
     @objc dynamic var account = ""
@@ -196,54 +184,6 @@ class tablePhotoLibrary: Object {
     }
 }
 
-typealias tableShare = tableShareV2
-class tableShareV2: Object {
-
-    @objc dynamic var account = ""
-    @objc dynamic var canEdit: Bool = false
-    @objc dynamic var canDelete: Bool = false
-    @objc dynamic var date: NSDate?
-    @objc dynamic var displaynameFileOwner = ""
-    @objc dynamic var displaynameOwner = ""
-    @objc dynamic var expirationDate: NSDate?
-    @objc dynamic var fileName = ""
-    @objc dynamic var fileParent: Int = 0
-    @objc dynamic var fileSource: Int = 0
-    @objc dynamic var fileTarget = ""
-    @objc dynamic var hideDownload: Bool = false
-    @objc dynamic var idShare: Int = 0
-    @objc dynamic var itemSource: Int = 0
-    @objc dynamic var itemType = ""
-    @objc dynamic var label = ""
-    @objc dynamic var mailSend: Bool = false
-    @objc dynamic var mimeType = ""
-    @objc dynamic var note = ""
-    @objc dynamic var parent: String = ""
-    @objc dynamic var password: String = ""
-    @objc dynamic var path = ""
-    @objc dynamic var permissions: Int = 0
-    @objc dynamic var primaryKey = ""
-    @objc dynamic var sendPasswordByTalk: Bool = false
-    @objc dynamic var serverUrl = ""
-    @objc dynamic var shareType: Int = 0
-    @objc dynamic var shareWith = ""
-    @objc dynamic var shareWithDisplayname = ""
-    @objc dynamic var storage: Int = 0
-    @objc dynamic var storageId = ""
-    @objc dynamic var token = ""
-    @objc dynamic var uidFileOwner = ""
-    @objc dynamic var uidOwner = ""
-    @objc dynamic var url = ""
-    @objc dynamic var userClearAt: NSDate?
-    @objc dynamic var userIcon = ""
-    @objc dynamic var userMessage = ""
-    @objc dynamic var userStatus = ""
-
-    override static func primaryKey() -> String {
-        return "primaryKey"
-    }
-}
-
 class tableTag: Object {
 
     @objc dynamic var account = ""

+ 6 - 6
iOSClient/Data/NCManageDatabase+Activity.swift

@@ -103,7 +103,7 @@ class tableActivitySubjectRich: Object {
 
 extension NCManageDatabase {
     
-    @objc func addActivity(_ activities: [NKActivity], account: String) {
+    func addActivity(_ activities: [NKActivity], account: String) {
 
         let realm = try! Realm()
 
@@ -208,7 +208,7 @@ extension NCManageDatabase {
         return (all: allActivity, filter: filtered)
     }
 
-    @objc func getActivitySubjectRich(account: String, idActivity: Int, key: String) -> tableActivitySubjectRich? {
+    func getActivitySubjectRich(account: String, idActivity: Int, key: String) -> tableActivitySubjectRich? {
 
         let realm = try! Realm()
 
@@ -217,7 +217,7 @@ extension NCManageDatabase {
         return results.map { tableActivitySubjectRich.init(value: $0) }
     }
 
-    @objc func getActivitySubjectRich(account: String, idActivity: Int, id: String) -> tableActivitySubjectRich? {
+    func getActivitySubjectRich(account: String, idActivity: Int, id: String) -> tableActivitySubjectRich? {
 
         let realm = try! Realm()
 
@@ -234,7 +234,7 @@ extension NCManageDatabase {
         return activitySubjectRich.map { tableActivitySubjectRich.init(value: $0) }
     }
 
-    @objc func getActivityPreview(account: String, idActivity: Int, orderKeysId: [String]) -> [tableActivityPreview] {
+    func getActivityPreview(account: String, idActivity: Int, orderKeysId: [String]) -> [tableActivityPreview] {
 
         let realm = try! Realm()
 
@@ -274,7 +274,7 @@ extension NCManageDatabase {
     // MARK: -
     // MARK: Table Comments
 
-    @objc func addComments(_ comments: [NKComments], account: String, objectId: String) {
+    func addComments(_ comments: [NKComments], account: String, objectId: String) {
 
         let realm = try! Realm()
 
@@ -309,7 +309,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getComments(account: String, objectId: String) -> [tableComments] {
+    func getComments(account: String, objectId: String) -> [tableComments] {
 
         let realm = try! Realm()
 

+ 134 - 0
iOSClient/Data/NCManageDatabase+Avatar.swift

@@ -0,0 +1,134 @@
+//
+//  NCManageDatabase+Avatar.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 20/01/23.
+//  Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import Foundation
+import RealmSwift
+import NextcloudKit
+
+class tableAvatar: Object {
+
+    @objc dynamic var date = NSDate()
+    @objc dynamic var etag = ""
+    @objc dynamic var fileName = ""
+    @objc dynamic var loaded: Bool = false
+
+    override static func primaryKey() -> String {
+        return "fileName"
+    }
+}
+
+extension NCManageDatabase {
+
+    func addAvatar(fileName: String, etag: String) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+
+                // Add new
+                let addObject = tableAvatar()
+
+                addObject.date = NSDate()
+                addObject.etag = etag
+                addObject.fileName = fileName
+                addObject.loaded = true
+
+                realm.add(addObject, update: .all)
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    func getTableAvatar(fileName: String) -> tableAvatar? {
+
+        let realm = try! Realm()
+
+        guard let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first else {
+            return nil
+        }
+
+        return tableAvatar.init(value: result)
+    }
+
+    func clearAllAvatarLoaded() {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+
+                let results = realm.objects(tableAvatar.self)
+                for result in results {
+                    result.loaded = false
+                    realm.add(result, update: .all)
+                }
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    @discardableResult
+    func setAvatarLoaded(fileName: String) -> UIImage? {
+
+        let realm = try! Realm()
+        let fileNameLocalPath = String(CCUtility.getDirectoryUserData()) + "/" + fileName
+        var image: UIImage?
+
+        do {
+            try realm.write {
+                if let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first {
+                    if let imageAvatar = UIImage(contentsOfFile: fileNameLocalPath) {
+                        result.loaded = true
+                        image = imageAvatar
+                    } else {
+                        realm.delete(result)
+                    }
+                }
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+
+        return image
+    }
+
+    func getImageAvatarLoaded(fileName: String) -> UIImage? {
+
+        let realm = try! Realm()
+        let fileNameLocalPath = String(CCUtility.getDirectoryUserData()) + "/" + fileName
+
+        let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first
+        if result == nil {
+            NCUtilityFileSystem.shared.deleteFile(filePath: fileNameLocalPath)
+            return nil
+        } else if result?.loaded == false {
+            return nil
+        }
+
+        return UIImage(contentsOfFile: fileNameLocalPath)
+    }
+
+}

+ 9 - 9
iOSClient/Data/NCManageDatabase+Directory.swift

@@ -46,7 +46,7 @@ class tableDirectory: Object {
 
 extension NCManageDatabase {
 
-    @objc func addDirectory(encrypted: Bool, favorite: Bool, ocId: String, fileId: String, etag: String? = nil, permissions: String? = nil, serverUrl: String, account: String) {
+    func addDirectory(encrypted: Bool, favorite: Bool, ocId: String, fileId: String, etag: String? = nil, permissions: String? = nil, serverUrl: String, account: String) {
 
         let realm = try! Realm()
 
@@ -80,7 +80,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func deleteDirectoryAndSubDirectory(serverUrl: String, account: String) {
+    func deleteDirectoryAndSubDirectory(serverUrl: String, account: String) {
 
         let realm = try! Realm()
 
@@ -103,7 +103,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func setDirectory(serverUrl: String, serverUrlTo: String? = nil, etag: String? = nil, ocId: String? = nil, fileId: String? = nil, encrypted: Bool, richWorkspace: String? = nil, account: String) {
+    func setDirectory(serverUrl: String, serverUrlTo: String? = nil, etag: String? = nil, ocId: String? = nil, fileId: String? = nil, encrypted: Bool, richWorkspace: String? = nil, account: String) {
 
         let realm = try! Realm()
 
@@ -142,7 +142,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getTableDirectory(predicate: NSPredicate) -> tableDirectory? {
+    func getTableDirectory(predicate: NSPredicate) -> tableDirectory? {
 
         let realm = try! Realm()
 
@@ -153,7 +153,7 @@ extension NCManageDatabase {
         return tableDirectory.init(value: result)
     }
 
-    @objc func getTablesDirectory(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableDirectory]? {
+    func getTablesDirectory(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableDirectory]? {
 
         let realm = try! Realm()
 
@@ -166,7 +166,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func renameDirectory(ocId: String, serverUrl: String) {
+    func renameDirectory(ocId: String, serverUrl: String) {
 
         let realm = try! Realm()
 
@@ -180,7 +180,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func setDirectory(serverUrl: String, offline: Bool, account: String) {
+    func setDirectory(serverUrl: String, offline: Bool, account: String) {
 
         let realm = try! Realm()
 
@@ -195,7 +195,7 @@ extension NCManageDatabase {
     }
 
     @discardableResult
-    @objc func setDirectory(serverUrl: String, richWorkspace: String?, account: String) -> tableDirectory? {
+    func setDirectory(serverUrl: String, richWorkspace: String?, account: String) -> tableDirectory? {
 
         let realm = try! Realm()
         var result: tableDirectory?
@@ -217,7 +217,7 @@ extension NCManageDatabase {
     }
 
     @discardableResult
-    @objc func setDirectory(serverUrl: String, colorFolder: String?, account: String) -> tableDirectory? {
+    func setDirectory(serverUrl: String, colorFolder: String?, account: String) -> tableDirectory? {
 
         let realm = try! Realm()
         var result: tableDirectory?

+ 36 - 40
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -112,7 +112,7 @@ extension tableMetadata {
     var fileNoExtension: String { (fileNameView as NSString).deletingPathExtension }
 
     var isRenameable: Bool {
-        if lock || isViewOnly {
+        if lock || isViewableOnly {
             return false
         }
         if !isDirectoryE2EE && e2eEncrypted {
@@ -125,7 +125,7 @@ extension tableMetadata {
         if classFile == NKCommon.typeClassFile.image.rawValue {
             return true
         }
-        if isViewOnly {
+        if isViewableOnly {
             return false
         }
         if ["application/pdf", "com.adobe.pdf"].contains(contentType) || contentType.hasPrefix("text/") {
@@ -134,28 +134,28 @@ extension tableMetadata {
         return false
     }
 
-    var isSaveInCameraRoll: Bool {
+    var isSavebleInCameraRoll: Bool {
         return (classFile == NKCommon.typeClassFile.image.rawValue && contentType != "image/svg+xml") || classFile == NKCommon.typeClassFile.video.rawValue
     }
 
-    var isViewOnly: Bool {
+    var isViewableOnly: Bool {
         sharePermissionsCollaborationServices == NCGlobal.shared.permissionReadShare && classFile == NKCommon.typeClassFile.document.rawValue
     }
 
-    var isSaveAsScan: Bool {
+    var isSavebleAsScan: Bool {
         classFile == NKCommon.typeClassFile.image.rawValue && contentType != "image/svg+xml"
     }
 
     var isCopyableInPasteboard: Bool {
-        !isViewOnly && !directory
+        !isViewableOnly && !directory
     }
 
     var isCopyableMovable: Bool {
-        !isViewOnly && !isDirectoryE2EE && !e2eEncrypted
+        !isViewableOnly && !isDirectoryE2EE && !e2eEncrypted
     }
 
     var isModifiableWithQuickLook: Bool {
-        if directory || isViewOnly || isDirectoryE2EE {
+        if directory || isViewableOnly || isDirectoryE2EE {
             return false
         }
         return contentType == "com.adobe.pdf" || contentType == "application/pdf" || classFile == NKCommon.typeClassFile.image.rawValue
@@ -169,11 +169,11 @@ extension tableMetadata {
     }
 
     var isSettableOnOffline: Bool {
-        return session.isEmpty && !isViewOnly
+        return session.isEmpty && !isViewableOnly
     }
 
     var canOpenIn: Bool {
-        return session.isEmpty && !isViewOnly && !directory && !NCBrandOptions.shared.disable_openin_file
+        return session.isEmpty && !isViewableOnly && !directory && !NCBrandOptions.shared.disable_openin_file
     }
 
     var isDirectoySettableE2EE: Bool {
@@ -185,7 +185,7 @@ extension tableMetadata {
     }
 
     var canOpenExternalEditor: Bool {
-        if isViewOnly {
+        if isViewableOnly {
             return false
         }
 
@@ -219,11 +219,7 @@ extension tableMetadata {
 
 extension NCManageDatabase {
 
-    @objc func copyObject(metadata: tableMetadata) -> tableMetadata {
-        return tableMetadata.init(value: metadata)
-    }
-
-    @objc func convertFileToMetadata(_ file: NKFile, isDirectoryE2EE: Bool) -> tableMetadata {
+    func convertFileToMetadata(_ file: NKFile, isDirectoryE2EE: Bool) -> tableMetadata {
 
         let metadata = tableMetadata()
 
@@ -304,7 +300,7 @@ extension NCManageDatabase {
         return metadata
     }
 
-    @objc func convertFilesToMetadatas(_ files: [NKFile], useMetadataFolder: Bool, completion: @escaping (_ metadataFolder: tableMetadata, _ metadatasFolder: [tableMetadata], _ metadatas: [tableMetadata]) -> Void) {
+    func convertFilesToMetadatas(_ files: [NKFile], useMetadataFolder: Bool, completion: @escaping (_ metadataFolder: tableMetadata, _ metadatasFolder: [tableMetadata], _ metadatas: [tableMetadata]) -> Void) {
 
         var counter: Int = 0
         var isDirectoryE2EE: Bool = false
@@ -357,7 +353,7 @@ extension NCManageDatabase {
         completion(metadataFolder, metadataFolders, metadataOutput)
     }
 
-    @objc func createMetadata(account: String, user: String, userId: String, fileName: String, fileNameView: String, ocId: String, serverUrl: String, urlBase: String, url: String, contentType: String, isLivePhoto: Bool = false, isUrl: Bool = false, name: String = NCGlobal.shared.appName, subline: String? = nil, iconName: String? = nil, iconUrl: String? = nil) -> tableMetadata {
+    func createMetadata(account: String, user: String, userId: String, fileName: String, fileNameView: String, ocId: String, serverUrl: String, urlBase: String, url: String, contentType: String, isLivePhoto: Bool = false, isUrl: Bool = false, name: String = NCGlobal.shared.appName, subline: String? = nil, iconName: String? = nil, iconUrl: String? = nil) -> tableMetadata {
 
         let metadata = tableMetadata()
         if isUrl {
@@ -413,7 +409,7 @@ extension NCManageDatabase {
     }
 
     @discardableResult
-    @objc func addMetadata(_ metadata: tableMetadata) -> tableMetadata? {
+    func addMetadata(_ metadata: tableMetadata) -> tableMetadata? {
 
         let realm = try! Realm()
         let result = tableMetadata.init(value: metadata)
@@ -429,7 +425,7 @@ extension NCManageDatabase {
         return tableMetadata.init(value: result)
     }
 
-    @objc func addMetadatas(_ metadatas: [tableMetadata]) {
+    func addMetadatas(_ metadatas: [tableMetadata]) {
 
         let realm = try! Realm()
 
@@ -444,7 +440,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func deleteMetadata(predicate: NSPredicate) {
+    func deleteMetadata(predicate: NSPredicate) {
 
         let realm = try! Realm()
 
@@ -458,7 +454,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func moveMetadata(ocId: String, serverUrlTo: String) {
+    func moveMetadata(ocId: String, serverUrlTo: String) {
 
         let realm = try! Realm()
 
@@ -473,7 +469,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func renameMetadata(fileNameTo: String, ocId: String) {
+    func renameMetadata(fileNameTo: String, ocId: String) {
 
         let realm = try! Realm()
 
@@ -647,7 +643,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func setMetadataFavorite(ocId: String, favorite: Bool) {
+    func setMetadataFavorite(ocId: String, favorite: Bool) {
 
         let realm = try! Realm()
 
@@ -661,7 +657,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func updateMetadatasFavorite(account: String, metadatas: [tableMetadata]) {
+    func updateMetadatasFavorite(account: String, metadatas: [tableMetadata]) {
 
         let realm = try! Realm()
 
@@ -680,7 +676,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func setMetadataEncrypted(ocId: String, encrypted: Bool) {
+    func setMetadataEncrypted(ocId: String, encrypted: Bool) {
 
         let realm = try! Realm()
 
@@ -694,7 +690,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func setMetadataFileNameView(serverUrl: String, fileName: String, newFileNameView: String, account: String) {
+    func setMetadataFileNameView(serverUrl: String, fileName: String, newFileNameView: String, account: String) {
 
         let realm = try! Realm()
 
@@ -708,7 +704,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getMetadata(predicate: NSPredicate) -> tableMetadata? {
+    func getMetadata(predicate: NSPredicate) -> tableMetadata? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -720,7 +716,7 @@ extension NCManageDatabase {
         return tableMetadata.init(value: result)
     }
 
-    @objc func getMetadata(predicate: NSPredicate, sorted: String, ascending: Bool) -> tableMetadata? {
+    func getMetadata(predicate: NSPredicate, sorted: String, ascending: Bool) -> tableMetadata? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -732,7 +728,7 @@ extension NCManageDatabase {
         return tableMetadata.init(value: result)
     }
 
-    @objc func getMetadatasViewer(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableMetadata]? {
+    func getMetadatasViewer(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableMetadata]? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -771,7 +767,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getMetadatas(predicate: NSPredicate) -> [tableMetadata] {
+    func getMetadatas(predicate: NSPredicate) -> [tableMetadata] {
 
         let realm = try! Realm()
         realm.refresh()
@@ -781,7 +777,7 @@ extension NCManageDatabase {
         return Array(results.map { tableMetadata.init(value: $0) })
     }
 
-    @objc func getAdvancedMetadatas(predicate: NSPredicate, page: Int = 0, limit: Int = 0, sorted: String, ascending: Bool) -> [tableMetadata] {
+    func getAdvancedMetadatas(predicate: NSPredicate, page: Int = 0, limit: Int = 0, sorted: String, ascending: Bool) -> [tableMetadata] {
 
         let realm = try! Realm()
         realm.refresh()
@@ -808,7 +804,7 @@ extension NCManageDatabase {
         return metadatas
     }
 
-    @objc func getMetadataAtIndex(predicate: NSPredicate, sorted: String, ascending: Bool, index: Int) -> tableMetadata? {
+    func getMetadataAtIndex(predicate: NSPredicate, sorted: String, ascending: Bool, index: Int) -> tableMetadata? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -822,7 +818,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getMetadataFromOcId(_ ocId: String?) -> tableMetadata? {
+    func getMetadataFromOcId(_ ocId: String?) -> tableMetadata? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -833,7 +829,7 @@ extension NCManageDatabase {
         return tableMetadata.init(value: result)
     }
 
-    @objc func getMetadataFolder(account: String, urlBase: String, userId: String, serverUrl: String) -> tableMetadata? {
+    func getMetadataFolder(account: String, urlBase: String, userId: String, serverUrl: String) -> tableMetadata? {
 
         let realm = try! Realm()
         realm.refresh()
@@ -856,7 +852,7 @@ extension NCManageDatabase {
         return tableMetadata.init(value: result)
     }
 
-    @objc func getTableMetadatasDirectoryFavoriteIdentifierRank(account: String) -> [String: NSNumber] {
+    func getTableMetadatasDirectoryFavoriteIdentifierRank(account: String) -> [String: NSNumber] {
 
         var listIdentifierRank: [String: NSNumber] = [:]
         let realm = try! Realm()
@@ -888,7 +884,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func readMarkerMetadata(account: String, fileId: String) {
+    func readMarkerMetadata(account: String, fileId: String) {
 
         let realm = try! Realm()
 
@@ -904,7 +900,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getAssetLocalIdentifiersUploaded(account: String) -> [String] {
+    func getAssetLocalIdentifiersUploaded(account: String) -> [String] {
 
         let realm = try! Realm()
         realm.refresh()
@@ -919,7 +915,7 @@ extension NCManageDatabase {
         return assetLocalIdentifiers
     }
 
-    @objc func clearAssetLocalIdentifiers(_ assetLocalIdentifiers: [String], account: String) {
+    func clearAssetLocalIdentifiers(_ assetLocalIdentifiers: [String], account: String) {
 
         let realm = try! Realm()
 
@@ -936,7 +932,7 @@ extension NCManageDatabase {
         }
     }
 
-    @objc func getMetadataLivePhoto(metadata: tableMetadata) -> tableMetadata? {
+    func getMetadataLivePhoto(metadata: tableMetadata) -> tableMetadata? {
 
         let realm = try! Realm()
         var classFile = metadata.classFile

+ 233 - 0
iOSClient/Data/NCManageDatabase+Share.swift

@@ -0,0 +1,233 @@
+//
+//  NCManageDatabase+Share.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 20/01/23.
+//  Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import Foundation
+import RealmSwift
+import NextcloudKit
+
+typealias tableShare = tableShareV2
+class tableShareV2: Object {
+
+    @objc dynamic var account = ""
+    @objc dynamic var canEdit: Bool = false
+    @objc dynamic var canDelete: Bool = false
+    @objc dynamic var date: NSDate?
+    @objc dynamic var displaynameFileOwner = ""
+    @objc dynamic var displaynameOwner = ""
+    @objc dynamic var expirationDate: NSDate?
+    @objc dynamic var fileName = ""
+    @objc dynamic var fileParent: Int = 0
+    @objc dynamic var fileSource: Int = 0
+    @objc dynamic var fileTarget = ""
+    @objc dynamic var hideDownload: Bool = false
+    @objc dynamic var idShare: Int = 0
+    @objc dynamic var itemSource: Int = 0
+    @objc dynamic var itemType = ""
+    @objc dynamic var label = ""
+    @objc dynamic var mailSend: Bool = false
+    @objc dynamic var mimeType = ""
+    @objc dynamic var note = ""
+    @objc dynamic var parent: String = ""
+    @objc dynamic var password: String = ""
+    @objc dynamic var path = ""
+    @objc dynamic var permissions: Int = 0
+    @objc dynamic var primaryKey = ""
+    @objc dynamic var sendPasswordByTalk: Bool = false
+    @objc dynamic var serverUrl = ""
+    @objc dynamic var shareType: Int = 0
+    @objc dynamic var shareWith = ""
+    @objc dynamic var shareWithDisplayname = ""
+    @objc dynamic var storage: Int = 0
+    @objc dynamic var storageId = ""
+    @objc dynamic var token = ""
+    @objc dynamic var uidFileOwner = ""
+    @objc dynamic var uidOwner = ""
+    @objc dynamic var url = ""
+    @objc dynamic var userClearAt: NSDate?
+    @objc dynamic var userIcon = ""
+    @objc dynamic var userMessage = ""
+    @objc dynamic var userStatus = ""
+
+    override static func primaryKey() -> String {
+        return "primaryKey"
+    }
+}
+
+extension NCManageDatabase {
+
+    func addShare(account: String, home: String, shares: [NKShare]) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+
+                for share in shares {
+
+                    let serverUrlPath = home + share.path
+                    guard let serverUrl = NCUtilityFileSystem.shared.deleteLastPath(serverUrlPath: serverUrlPath, home: home) else {
+                        continue
+                    }
+
+                    let object = tableShare()
+
+                    object.account = account
+                    if let fileName = share.path.components(separatedBy: "/").last {
+                        object.fileName = fileName
+                    }
+                    object.serverUrl = serverUrl
+
+                    object.canEdit = share.canEdit
+                    object.canDelete = share.canDelete
+                    object.date = share.date
+                    object.displaynameFileOwner = share.displaynameFileOwner
+                    object.displaynameOwner = share.displaynameOwner
+                    object.expirationDate = share.expirationDate
+                    object.fileParent = share.fileParent
+                    object.fileSource = share.fileSource
+                    object.fileTarget = share.fileTarget
+                    object.hideDownload = share.hideDownload
+                    object.idShare = share.idShare
+                    object.itemSource = share.itemSource
+                    object.itemType = share.itemType
+                    object.label = share.label
+                    object.mailSend = share.mailSend
+                    object.mimeType = share.mimeType
+                    object.note = share.note
+                    object.parent = share.parent
+                    object.password = share.password
+                    object.path = share.path
+                    object.permissions = share.permissions
+                    object.primaryKey = account + " " + String(share.idShare)
+                    object.sendPasswordByTalk = share.sendPasswordByTalk
+                    object.shareType = share.shareType
+                    object.shareWith = share.shareWith
+                    object.shareWithDisplayname = share.shareWithDisplayname
+                    object.storage = share.storage
+                    object.storageId = share.storageId
+                    object.token = share.token
+                    object.uidOwner = share.uidOwner
+                    object.uidFileOwner = share.uidFileOwner
+                    object.url = share.url
+                    object.userClearAt = share.userClearAt
+                    object.userIcon = share.userIcon
+                    object.userMessage = share.userMessage
+                    object.userStatus = share.userStatus
+
+                    realm.add(object, update: .all)
+                }
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    func getTableShares(account: String) -> [tableShare] {
+
+        let realm = try! Realm()
+
+        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
+        let results = realm.objects(tableShare.self).filter("account == %@", account).sorted(by: sortProperties)
+
+        return Array(results.map { tableShare.init(value: $0) })
+    }
+
+    func getTableShares(metadata: tableMetadata) -> (firstShareLink: tableShare?, share: [tableShare]?) {
+
+        let realm = try! Realm()
+
+        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
+        let firstShareLink = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@ AND shareType == 3", metadata.account, metadata.serverUrl, metadata.fileName).first
+
+        if let firstShareLink = firstShareLink {
+            let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@ AND idShare != %d", metadata.account, metadata.serverUrl, metadata.fileName, firstShareLink.idShare).sorted(by: sortProperties)
+            return(firstShareLink: tableShare.init(value: firstShareLink), share: Array(results.map { tableShare.init(value: $0) }))
+        } else {
+            let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@", metadata.account, metadata.serverUrl, metadata.fileName).sorted(by: sortProperties)
+            return(firstShareLink: firstShareLink, share: Array(results.map { tableShare.init(value: $0) }))
+        }
+    }
+
+    func getTableShare(account: String, idShare: Int) -> tableShare? {
+
+        let realm = try! Realm()
+
+        guard let result = realm.objects(tableShare.self).filter("account = %@ AND idShare = %d", account, idShare).first else {
+            return nil
+        }
+
+        return tableShare.init(value: result)
+    }
+
+    func getTableShares(account: String, serverUrl: String) -> [tableShare] {
+
+        let realm = try! Realm()
+
+        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
+        let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).sorted(by: sortProperties)
+
+        return Array(results.map { tableShare.init(value: $0) })
+    }
+
+    func getTableShares(account: String, serverUrl: String, fileName: String) -> [tableShare] {
+
+        let realm = try! Realm()
+
+        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
+        let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@", account, serverUrl, fileName).sorted(by: sortProperties)
+
+        return Array(results.map { tableShare.init(value: $0) })
+    }
+
+    func deleteTableShare(account: String, idShare: Int) {
+
+        let realm = try! Realm()
+
+        realm.beginWrite()
+
+        let result = realm.objects(tableShare.self).filter("account == %@ AND idShare == %d", account, idShare)
+        realm.delete(result)
+
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    func deleteTableShare(account: String) {
+
+        let realm = try! Realm()
+
+        realm.beginWrite()
+
+        let result = realm.objects(tableShare.self).filter("account == %@", account)
+        realm.delete(result)
+
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+}

+ 32 - 282
iOSClient/Data/NCManageDatabase.swift

@@ -247,102 +247,11 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table Avatar
 
-    @objc func addAvatar(fileName: String, etag: String) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-
-                // Add new
-                let addObject = tableAvatar()
-
-                addObject.date = NSDate()
-                addObject.etag = etag
-                addObject.fileName = fileName
-                addObject.loaded = true
-
-                realm.add(addObject, update: .all)
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    func getTableAvatar(fileName: String) -> tableAvatar? {
-
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first else {
-            return nil
-        }
-
-        return tableAvatar.init(value: result)
-    }
-
-    func clearAllAvatarLoaded() {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-
-                let results = realm.objects(tableAvatar.self)
-                for result in results {
-                    result.loaded = false
-                    realm.add(result, update: .all)
-                }
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @discardableResult
-    func setAvatarLoaded(fileName: String) -> UIImage? {
-
-        let realm = try! Realm()
-        let fileNameLocalPath = String(CCUtility.getDirectoryUserData()) + "/" + fileName
-        var image: UIImage?
-
-        do {
-            try realm.write {
-                if let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first {
-                    if let imageAvatar = UIImage(contentsOfFile: fileNameLocalPath) {
-                        result.loaded = true
-                        image = imageAvatar
-                    } else {
-                        realm.delete(result)
-                    }
-                }
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-
-        return image
-    }
-
-    func getImageAvatarLoaded(fileName: String) -> UIImage? {
-
-        let realm = try! Realm()
-        let fileNameLocalPath = String(CCUtility.getDirectoryUserData()) + "/" + fileName
-
-        let result = realm.objects(tableAvatar.self).filter("fileName == %@", fileName).first
-        if result == nil {
-            NCUtilityFileSystem.shared.deleteFile(filePath: fileNameLocalPath)
-            return nil
-        } else if result?.loaded == false {
-            return nil
-        }
-
-        return UIImage(contentsOfFile: fileNameLocalPath)
-    }
-
+    
     // MARK: -
     // MARK: Table Capabilities
 
-    @objc func addCapabilitiesJSon(_ data: Data, account: String) {
+    func addCapabilitiesJSon(_ data: Data, account: String) {
 
         let realm = try! Realm()
 
@@ -360,7 +269,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getCapabilities(account: String) -> String? {
+    func getCapabilities(account: String) -> String? {
 
         let realm = try! Realm()
 
@@ -391,7 +300,7 @@ class NCManageDatabase: NSObject {
         return json[elements].string
     }
 
-    @objc func getCapabilitiesServerInt(account: String, elements: [String]) -> Int {
+    func getCapabilitiesServerInt(account: String, elements: [String]) -> Int {
 
         let realm = try! Realm()
 
@@ -423,7 +332,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getCapabilitiesServerArray(account: String, elements: [String]) -> [String]? {
+    func getCapabilitiesServerArray(account: String, elements: [String]) -> [String]? {
 
         let realm = try! Realm()
         var resultArray: [String] = []
@@ -546,7 +455,7 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table Direct Editing
 
-    @objc func addDirectEditing(account: String, editors: [NKEditorDetailsEditors], creators: [NKEditorDetailsCreators]) {
+    func addDirectEditing(account: String, editors: [NKEditorDetailsEditors], creators: [NKEditorDetailsCreators]) {
 
         let realm = try! Realm()
 
@@ -601,7 +510,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getDirectEditingCreators(account: String) -> [tableDirectEditingCreators]? {
+    func getDirectEditingCreators(account: String) -> [tableDirectEditingCreators]? {
 
         let realm = try! Realm()
         let results = realm.objects(tableDirectEditingCreators.self).filter("account == %@", account)
@@ -613,7 +522,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getDirectEditingCreators(predicate: NSPredicate) -> [tableDirectEditingCreators]? {
+    func getDirectEditingCreators(predicate: NSPredicate) -> [tableDirectEditingCreators]? {
 
         let realm = try! Realm()
 
@@ -626,7 +535,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getDirectEditingEditors(account: String) -> [tableDirectEditingEditors]? {
+    func getDirectEditingEditors(account: String) -> [tableDirectEditingEditors]? {
 
         let realm = try! Realm()
         let results = realm.objects(tableDirectEditingEditors.self).filter("account == %@", account)
@@ -795,7 +704,7 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table External Sites
 
-    @objc func addExternalSites(_ externalSite: NKExternalSite, account: String) {
+    func addExternalSites(_ externalSite: NKExternalSite, account: String) {
 
         let realm = try! Realm()
 
@@ -818,7 +727,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func deleteExternalSites(account: String) {
+    func deleteExternalSites(account: String) {
 
         let realm = try! Realm()
 
@@ -832,7 +741,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getAllExternalSites(account: String) -> [tableExternalSites]? {
+    func getAllExternalSites(account: String) -> [tableExternalSites]? {
 
         let realm = try! Realm()
 
@@ -940,7 +849,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func deleteLocalFile(predicate: NSPredicate) {
+    func deleteLocalFile(predicate: NSPredicate) {
 
         let realm = try! Realm()
 
@@ -954,7 +863,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func setLocalFile(ocId: String, fileName: String?, etag: String?) {
+    func setLocalFile(ocId: String, fileName: String?, etag: String?) {
 
         let realm = try! Realm()
 
@@ -993,7 +902,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getTableLocalFile(account: String) -> [tableLocalFile] {
+    func getTableLocalFile(account: String) -> [tableLocalFile] {
 
         let realm = try! Realm()
 
@@ -1001,7 +910,7 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableLocalFile.init(value: $0) })
     }
 
-    @objc func getTableLocalFile(predicate: NSPredicate) -> tableLocalFile? {
+    func getTableLocalFile(predicate: NSPredicate) -> tableLocalFile? {
 
         let realm = try! Realm()
 
@@ -1012,7 +921,7 @@ class NCManageDatabase: NSObject {
         return tableLocalFile.init(value: result)
     }
 
-    @objc func getTableLocalFiles(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableLocalFile] {
+    func getTableLocalFiles(predicate: NSPredicate, sorted: String, ascending: Bool) -> [tableLocalFile] {
 
         let realm = try! Realm()
 
@@ -1020,7 +929,7 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableLocalFile.init(value: $0) })
     }
 
-    @objc func setLocalFile(ocId: String, offline: Bool) {
+    func setLocalFile(ocId: String, offline: Bool) {
 
         let realm = try! Realm()
 
@@ -1038,7 +947,7 @@ class NCManageDatabase: NSObject {
     // MARK: Table Photo Library
 
     @discardableResult
-    @objc func addPhotoLibrary(_ assets: [PHAsset], account: String) -> Bool {
+    func addPhotoLibrary(_ assets: [PHAsset], account: String) -> Bool {
 
         let realm = try! Realm()
 
@@ -1073,7 +982,7 @@ class NCManageDatabase: NSObject {
         return true
     }
 
-    @objc func getPhotoLibraryIdAsset(image: Bool, video: Bool, account: String) -> [String]? {
+    func getPhotoLibraryIdAsset(image: Bool, video: Bool, account: String) -> [String]? {
 
         let realm = try! Realm()
         var predicate = NSPredicate()
@@ -1097,170 +1006,11 @@ class NCManageDatabase: NSObject {
 
         return Array(idsAsset)
     }
-
-    // MARK: -
-    // MARK: Table Share
-
-    @objc func addShare(account: String, home: String, shares: [NKShare]) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-
-                for share in shares {
-
-                    let serverUrlPath = home + share.path
-                    guard let serverUrl = NCUtilityFileSystem.shared.deleteLastPath(serverUrlPath: serverUrlPath, home: home) else {
-                        continue
-                    }
-
-                    let object = tableShare()
-
-                    object.account = account
-                    if let fileName = share.path.components(separatedBy: "/").last {
-                        object.fileName = fileName
-                    }
-                    object.serverUrl = serverUrl
-
-                    object.canEdit = share.canEdit
-                    object.canDelete = share.canDelete
-                    object.date = share.date
-                    object.displaynameFileOwner = share.displaynameFileOwner
-                    object.displaynameOwner = share.displaynameOwner
-                    object.expirationDate = share.expirationDate
-                    object.fileParent = share.fileParent
-                    object.fileSource = share.fileSource
-                    object.fileTarget = share.fileTarget
-                    object.hideDownload = share.hideDownload
-                    object.idShare = share.idShare
-                    object.itemSource = share.itemSource
-                    object.itemType = share.itemType
-                    object.label = share.label
-                    object.mailSend = share.mailSend
-                    object.mimeType = share.mimeType
-                    object.note = share.note
-                    object.parent = share.parent
-                    object.password = share.password
-                    object.path = share.path
-                    object.permissions = share.permissions
-                    object.primaryKey = account + " " + String(share.idShare)
-                    object.sendPasswordByTalk = share.sendPasswordByTalk
-                    object.shareType = share.shareType
-                    object.shareWith = share.shareWith
-                    object.shareWithDisplayname = share.shareWithDisplayname
-                    object.storage = share.storage
-                    object.storageId = share.storageId
-                    object.token = share.token
-                    object.uidOwner = share.uidOwner
-                    object.uidFileOwner = share.uidFileOwner
-                    object.url = share.url
-                    object.userClearAt = share.userClearAt
-                    object.userIcon = share.userIcon
-                    object.userMessage = share.userMessage
-                    object.userStatus = share.userStatus
-
-                    realm.add(object, update: .all)
-                }
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @objc func getTableShares(account: String) -> [tableShare] {
-
-        let realm = try! Realm()
-
-        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
-        let results = realm.objects(tableShare.self).filter("account == %@", account).sorted(by: sortProperties)
-
-        return Array(results.map { tableShare.init(value: $0) })
-    }
-
-    func getTableShares(metadata: tableMetadata) -> (firstShareLink: tableShare?, share: [tableShare]?) {
-
-        let realm = try! Realm()
-
-        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
-        let firstShareLink = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@ AND shareType == 3", metadata.account, metadata.serverUrl, metadata.fileName).first
-
-        if let firstShareLink = firstShareLink {
-            let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@ AND idShare != %d", metadata.account, metadata.serverUrl, metadata.fileName, firstShareLink.idShare).sorted(by: sortProperties)
-            return(firstShareLink: tableShare.init(value: firstShareLink), share: Array(results.map { tableShare.init(value: $0) }))
-        } else {
-            let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@", metadata.account, metadata.serverUrl, metadata.fileName).sorted(by: sortProperties)
-            return(firstShareLink: firstShareLink, share: Array(results.map { tableShare.init(value: $0) }))
-        }
-    }
-
-    func getTableShare(account: String, idShare: Int) -> tableShare? {
-
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableShare.self).filter("account = %@ AND idShare = %d", account, idShare).first else {
-            return nil
-        }
-
-        return tableShare.init(value: result)
-    }
-
-    @objc func getTableShares(account: String, serverUrl: String) -> [tableShare] {
-
-        let realm = try! Realm()
-
-        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
-        let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).sorted(by: sortProperties)
-
-        return Array(results.map { tableShare.init(value: $0) })
-    }
-
-    @objc func getTableShares(account: String, serverUrl: String, fileName: String) -> [tableShare] {
-
-        let realm = try! Realm()
-
-        let sortProperties = [SortDescriptor(keyPath: "shareType", ascending: false), SortDescriptor(keyPath: "idShare", ascending: false)]
-        let results = realm.objects(tableShare.self).filter("account == %@ AND serverUrl == %@ AND fileName == %@", account, serverUrl, fileName).sorted(by: sortProperties)
-
-        return Array(results.map { tableShare.init(value: $0) })
-    }
-
-    @objc func deleteTableShare(account: String, idShare: Int) {
-
-        let realm = try! Realm()
-
-        realm.beginWrite()
-
-        let result = realm.objects(tableShare.self).filter("account == %@ AND idShare == %d", account, idShare)
-        realm.delete(result)
-
-        do {
-            try realm.commitWrite()
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @objc func deleteTableShare(account: String) {
-
-        let realm = try! Realm()
-
-        realm.beginWrite()
-
-        let result = realm.objects(tableShare.self).filter("account == %@", account)
-        realm.delete(result)
-
-        do {
-            try realm.commitWrite()
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
+    
     // MARK: -
     // MARK: Table Tag
 
-    @objc func addTag(_ ocId: String, tagIOS: Data?, account: String) {
+    func addTag(_ ocId: String, tagIOS: Data?, account: String) {
 
         let realm = try! Realm()
 
@@ -1281,7 +1031,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func deleteTag(_ ocId: String) {
+    func deleteTag(_ ocId: String) {
 
         let realm = try! Realm()
 
@@ -1297,7 +1047,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func getTags(predicate: NSPredicate) -> [tableTag] {
+    func getTags(predicate: NSPredicate) -> [tableTag] {
 
         let realm = try! Realm()
 
@@ -1306,7 +1056,7 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableTag.init(value: $0) })
     }
 
-    @objc func getTag(predicate: NSPredicate) -> tableTag? {
+    func getTag(predicate: NSPredicate) -> tableTag? {
 
         let realm = try! Realm()
 
@@ -1320,7 +1070,7 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table Tip
 
-    @objc func tipExists(_ tipName: String) -> Bool {
+    func tipExists(_ tipName: String) -> Bool {
 
         let realm = try! Realm()
 
@@ -1333,7 +1083,7 @@ class NCManageDatabase: NSObject {
         return false
     }
 
-    @objc func addTip(_ tipName: String) {
+    func addTip(_ tipName: String) {
 
         let realm = try! Realm()
 
@@ -1351,7 +1101,7 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table Trash
 
-    @objc func addTrash(account: String, items: [NKTrash]) {
+    func addTrash(account: String, items: [NKTrash]) {
 
         let realm = try! Realm()
 
@@ -1383,7 +1133,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func deleteTrash(filePath: String?, account: String) {
+    func deleteTrash(filePath: String?, account: String) {
 
         let realm = try! Realm()
         var predicate = NSPredicate()
@@ -1405,7 +1155,7 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func deleteTrash(fileId: String?, account: String) {
+    func deleteTrash(fileId: String?, account: String) {
 
         let realm = try! Realm()
         var predicate = NSPredicate()
@@ -1438,7 +1188,7 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableTrash.init(value: $0) })
     }
 
-    @objc func getTrashItem(fileId: String, account: String) -> tableTrash? {
+    func getTrashItem(fileId: String, account: String) -> tableTrash? {
 
         let realm = try! Realm()
 
@@ -1452,7 +1202,7 @@ class NCManageDatabase: NSObject {
     // MARK: -
     // MARK: Table UserStatus
 
-    @objc func addUserStatus(_ userStatuses: [NKUserStatus], account: String, predefined: Bool) {
+    func addUserStatus(_ userStatuses: [NKUserStatus], account: String, predefined: Bool) {
 
         let realm = try! Realm()
 

+ 2 - 2
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -891,7 +891,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         if isEditMode { return }
         guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(objectId) else { return }
 
-        NCFunctionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
+        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
     }
 
     func tapMoreGridItem(with objectId: String, namedButtonMore: String, image: UIImage?, sender: Any) {
@@ -989,7 +989,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
     }
 
     @objc func pasteFilesMenu() {
-        NCFunctionCenter.shared.pastePasteboard(serverUrl: serverUrl)
+        NCActionCenter.shared.pastePasteboard(serverUrl: serverUrl)
     }
 
     // MARK: - DataSource + NC Endpoint

+ 70 - 64
iOSClient/Main/NCFunctionCenter.swift → iOSClient/Main/NCActionCenter.swift

@@ -1,5 +1,5 @@
 //
-//  NCFunctionCenter.swift
+//  NCActionCenter.swift
 //  Nextcloud
 //
 //  Created by Marino Faggiana on 19/04/2020.
@@ -28,15 +28,14 @@ import JGProgressHUD
 import SVGKit
 import Photos
 
-@objc class NCFunctionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelectDelegate {
-    @objc public static let shared: NCFunctionCenter = {
-        let instance = NCFunctionCenter()
+class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelectDelegate {
+    public static let shared: NCActionCenter = {
+        let instance = NCActionCenter()
         NotificationCenter.default.addObserver(instance, selector: #selector(downloadedFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterDownloadedFile), object: nil)
         NotificationCenter.default.addObserver(instance, selector: #selector(uploadedFile(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterUploadedFile), object: nil)
         return instance
     }()
 
-    let appDelegate = UIApplication.shared.delegate as! AppDelegate
     var viewerQuickLook: NCViewerQuickLook?
     var documentController: UIDocumentInteractionController?
 
@@ -44,6 +43,7 @@ import Photos
 
     @objc func downloadedFile(_ notification: NSNotification) {
 
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
         guard let userInfo = notification.userInfo as NSDictionary?,
               let ocId = userInfo["ocId"] as? String,
               let selector = userInfo["selector"] as? String,
@@ -60,7 +60,6 @@ import Photos
                 } catch { }
                 NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", ocId))
                 NCManageDatabase.shared.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", ocId))
-                
             } else {
                 NCContentPresenter.shared.messageNotification("_download_file_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, priority: .max)
             }
@@ -75,7 +74,7 @@ import Photos
             let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), isEditingEnabled: true, metadata: metadata)
             let navigationController = UINavigationController(rootViewController: viewerQuickLook)
             navigationController.modalPresentationStyle = .fullScreen
-            self.appDelegate.window?.rootViewController?.present(navigationController, animated: true)
+            appDelegate.window?.rootViewController?.present(navigationController, animated: true)
 
         case NCGlobal.shared.selectorLoadFileView:
             guard UIApplication.shared.applicationState == .active else { break }
@@ -85,27 +84,27 @@ import Photos
             } else if metadata.classFile == NKCommon.typeClassFile.compress.rawValue || metadata.classFile == NKCommon.typeClassFile.unknow.rawValue {
                 self.openDocumentController(metadata: metadata)
             } else {
-                if let viewController = self.appDelegate.activeViewController {
+                if let viewController = appDelegate.activeViewController {
                     let imageIcon = UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag))
                     NCViewer.shared.view(viewController: viewController, metadata: metadata, metadatas: [metadata], imageIcon: imageIcon)
                 }
             }
-            
+
         case NCGlobal.shared.selectorOpenIn:
             if UIApplication.shared.applicationState == .active {
                 self.openDocumentController(metadata: metadata)
             }
-            
+
         case NCGlobal.shared.selectorLoadOffline:
             NCManageDatabase.shared.setLocalFile(ocId: metadata.ocId, offline: true)
-            
+
         case NCGlobal.shared.selectorPrint:
             // waiting close menu
             // https://github.com/nextcloud/ios/issues/2278
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                 self.printDocument(metadata: metadata)
             }
-            
+
         case NCGlobal.shared.selectorSaveAlbum:
             saveAlbum(metadata: metadata)
 
@@ -140,15 +139,16 @@ import Photos
     }
 
     func setMetadataAvalableOffline(_ metadata: tableMetadata, isOffline: Bool) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
         let serverUrl = metadata.serverUrl + "/" + metadata.fileName
         if isOffline {
             if metadata.directory {
-                NCManageDatabase.shared.setDirectory(serverUrl: serverUrl, offline: false, account: self.appDelegate.account)
+                NCManageDatabase.shared.setDirectory(serverUrl: serverUrl, offline: false, account: appDelegate.account)
             } else {
                 NCManageDatabase.shared.setLocalFile(ocId: metadata.ocId, offline: false)
             }
         } else if metadata.directory {
-            NCManageDatabase.shared.setDirectory(serverUrl: serverUrl, offline: true, account: self.appDelegate.account)
+            NCManageDatabase.shared.setDirectory(serverUrl: serverUrl, offline: true, account: appDelegate.account)
             NCOperationQueue.shared.synchronizationMetadata(metadata, selector: NCGlobal.shared.selectorDownloadAllFile)
         } else {
             NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorLoadOffline) { _, _ in }
@@ -162,6 +162,7 @@ import Photos
 
     @objc func uploadedFile(_ notification: NSNotification) {
 
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
         guard let userInfo = notification.userInfo as NSDictionary?,
               let error = userInfo["error"] as? NKError,
               let account = userInfo["account"] as? String,
@@ -179,40 +180,29 @@ import Photos
 
         let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
         NCActivityIndicator.shared.start(backgroundView: viewController.view)
-        NCNetworking.shared.readFile(serverUrlFileName: serverUrlFileName, queue: .main) { account, metadata, error in
+        NCNetworking.shared.readFile(serverUrlFileName: serverUrlFileName, queue: .main) { _, metadata, error in
             NCActivityIndicator.shared.stop()
             if let metadata = metadata, error == .success {
-                let shareNavigationController = UIStoryboard(name: "NCShare", bundle: nil).instantiateInitialViewController() as! UINavigationController
-                let shareViewController = shareNavigationController.topViewController as! NCSharePaging
+                let shareNavigationController = UIStoryboard(name: "NCShare", bundle: nil).instantiateInitialViewController() as? UINavigationController
+                let shareViewController = shareNavigationController?.topViewController as? NCSharePaging
 
-                shareViewController.metadata = metadata
-                shareViewController.indexPage = indexPage
+                shareViewController?.metadata = metadata
+                shareViewController?.indexPage = indexPage
 
-                shareNavigationController.modalPresentationStyle = .formSheet
-                viewController.present(shareNavigationController, animated: true, completion: nil)
+                shareNavigationController?.modalPresentationStyle = .formSheet
+                if let shareNavigationController = shareNavigationController {
+                    viewController.present(shareNavigationController, animated: true, completion: nil)
+                }
             }
         }
     }
 
-    // MARK: -
-
-    func openDownload(metadata: tableMetadata, selector: String) {
-
-        if CCUtility.fileProviderStorageExists(metadata) {
-
-            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": selector, "error": NKError(), "account": metadata.account])
-
-        } else {
-
-            NCNetworking.shared.download(metadata: metadata, selector: selector) { _, _ in }
-        }
-    }
-
     // MARK: - Open in ...
 
     func openDocumentController(metadata: tableMetadata) {
 
-        guard let mainTabBar = self.appDelegate.mainTabBar else { return }
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
+              let mainTabBar = appDelegate.mainTabBar else { return }
         let fileURL = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
 
         documentController = UIDocumentInteractionController(url: fileURL)
@@ -220,17 +210,22 @@ import Photos
     }
 
     func openActivityViewController(selectedMetadata: [tableMetadata]) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
+
         let metadatas = selectedMetadata.filter({ !$0.directory })
         var items: [URL] = []
         var downloadMetadata: [(tableMetadata, URL)] = []
 
         for metadata in metadatas {
             let fileURL = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
-            if CCUtility.fileProviderStorageExists(metadata) { items.append(fileURL) }
-            else { downloadMetadata.append((metadata, fileURL)) }
+            if CCUtility.fileProviderStorageExists(metadata) {
+                items.append(fileURL)
+            } else {
+                downloadMetadata.append((metadata, fileURL))
+            }
         }
 
-        let processor = ParallelWorker(n: 5, titleKey: "_downloading_", totalTasks: downloadMetadata.count, hudView: self.appDelegate.window?.rootViewController?.view)
+        let processor = ParallelWorker(n: 5, titleKey: "_downloading_", totalTasks: downloadMetadata.count, hudView: appDelegate.window?.rootViewController?.view)
         for (metadata, url) in downloadMetadata {
             processor.execute { completion in
                 NCNetworking.shared.download(metadata: metadata, selector: "", completion: { _, _ in
@@ -241,18 +236,19 @@ import Photos
         }
 
         processor.completeWork {
-            guard !items.isEmpty, let mainTabBar = self.appDelegate.mainTabBar else { return }
+            guard !items.isEmpty, let mainTabBar = appDelegate.mainTabBar else { return }
             let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
             activityViewController.popoverPresentationController?.permittedArrowDirections = .any
             activityViewController.popoverPresentationController?.sourceView = mainTabBar
             activityViewController.popoverPresentationController?.sourceRect = mainTabBar.menuRect
-            self.appDelegate.window?.rootViewController?.present(activityViewController, animated: true)
+            appDelegate.window?.rootViewController?.present(activityViewController, animated: true)
         }
     }
 
     // MARK: - Save as scan
 
     func saveAsScan(metadata: tableMetadata) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
 
         let fileNamePath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
         let fileNameDestination = CCUtility.createFileName("scan.png", fileDate: Date(), fileType: PHAssetMediaType.image, keyFileName: NCGlobal.shared.keyFileNameMask, keyFileNameType: NCGlobal.shared.keyFileNameType, keyFileNameOriginal: NCGlobal.shared.keyFileNameOriginal, forcedNewFileName: true)!
@@ -271,9 +267,11 @@ import Photos
     // MARK: - Print
 
     func printDocument(metadata: tableMetadata) {
+
         let fileNameURL = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!)
         let printController = UIPrintInteractionController.shared
         let printInfo = UIPrintInfo(dictionary: nil)
+
         printInfo.jobName = fileNameURL.lastPathComponent
         printInfo.outputType = metadata.classFile == NKCommon.typeClassFile.image.rawValue ? .photo : .general
         printController.printInfo = printInfo
@@ -307,6 +305,7 @@ import Photos
     // MARK: - Save photo
 
     func saveAlbum(metadata: tableMetadata) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
 
         let fileNamePath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
 
@@ -324,7 +323,7 @@ import Photos
                     PHPhotoLibrary.shared().performChanges({
                         let assetRequest = PHAssetCreationRequest.forAsset()
                         assetRequest.addResource(with: .photo, data: data, options: nil)
-                    }) { (success, error) in
+                    }) { success, _ in
                         if !success {
                             NCContentPresenter.shared.messageNotification("_save_selected_files_", error: errorSave, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error)
                         }
@@ -332,7 +331,7 @@ import Photos
                 } else if metadata.classFile == NKCommon.typeClassFile.video.rawValue {
                     PHPhotoLibrary.shared().performChanges({
                         PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: fileNamePath))
-                    }) { (success, error) in
+                    }) { success, _ in
                         if !success {
                             NCContentPresenter.shared.messageNotification("_save_selected_files_", error: errorSave, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error)
                         }
@@ -363,11 +362,12 @@ import Photos
     }
 
     func saveLivePhotoToDisk(metadata: tableMetadata, metadataMov: tableMetadata) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
 
         let fileNameImage = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!)
         let fileNameMov = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadataMov.ocId, fileNameView: metadataMov.fileNameView)!)
         let hud = JGProgressHUD()
-        
+
         hud.indicatorView = JGProgressHUDRingIndicatorView()
         if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView {
             indicatorView.ringWidth = 1.5
@@ -376,9 +376,7 @@ import Photos
         hud.show(in: (appDelegate.window?.rootViewController?.view)!)
 
         NCLivePhoto.generate(from: fileNameImage, videoURL: fileNameMov, progress: { progress in
-            
             hud.progress = Float(progress)
-
         }, completion: { _, resources in
 
             if resources != nil {
@@ -415,8 +413,11 @@ import Photos
             var downloadMetadatas: [tableMetadata] = []
             for ocid in pasteboardOcIds {
                 guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocid) else { continue }
-                if let pasteboardItem = metadata.toPasteBoardItem() { items.append(pasteboardItem) }
-                else { downloadMetadatas.append(metadata) }
+                if let pasteboardItem = metadata.toPasteBoardItem() {
+                    items.append(pasteboardItem)
+                } else {
+                    downloadMetadatas.append(metadata)
+                }
             }
 
             DispatchQueue.main.async(execute: hud.dismiss)
@@ -437,12 +438,14 @@ import Photos
     }
 
     func pastePasteboard(serverUrl: String) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
+
         let parallelizer = ParallelWorker(n: 5, titleKey: "_uploading_", totalTasks: nil, hudView: appDelegate.window?.rootViewController?.view)
 
         func uploadPastePasteboard(fileName: String, serverUrlFileName: String, fileNameLocalPath: String, serverUrl: String, completion: @escaping () -> Void) {
             NextcloudKit.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath) { request in
                 NCNetworking.shared.uploadRequest[fileNameLocalPath] = request
-            } progressHandler: { progress in
+            } progressHandler: { _ in
             } completionHandler: { account, ocId, etag, _, _, _, afError, error in
                 NCNetworking.shared.uploadRequest.removeValue(forKey: fileNameLocalPath)
                 if error == .success && etag != nil && ocId != nil {
@@ -481,21 +484,22 @@ import Photos
     // MARK: -
 
     func openFileViewInFolder(serverUrl: String, fileNameBlink: String?, fileNameOpen: String?) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
 
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
             var topNavigationController: UINavigationController?
-            var pushServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId)
-            guard var mostViewController = self.appDelegate.window?.rootViewController?.topMostViewController() else { return }
+            var pushServerUrl = NCUtilityFileSystem.shared.getHomeServer(urlBase: appDelegate.urlBase, userId: appDelegate.userId)
+            guard var mostViewController = appDelegate.window?.rootViewController?.topMostViewController() else { return }
 
             if mostViewController.isModal {
                 mostViewController.dismiss(animated: false)
-                if let viewController = self.appDelegate.window?.rootViewController?.topMostViewController() {
+                if let viewController = appDelegate.window?.rootViewController?.topMostViewController() {
                     mostViewController = viewController
                 }
             }
             mostViewController.navigationController?.popToRootViewController(animated: false)
 
-            if let tabBarController = self.appDelegate.window?.rootViewController as? UITabBarController {
+            if let tabBarController = appDelegate.window?.rootViewController as? UITabBarController {
                 tabBarController.selectedIndex = 0
                 if let navigationController = tabBarController.viewControllers?.first as? UINavigationController {
                     navigationController.popToRootViewController(animated: false)
@@ -513,7 +517,7 @@ import Photos
             let diffDirectory = serverUrl.replacingOccurrences(of: pushServerUrl, with: "")
             var subDirs = diffDirectory.split(separator: "/")
 
-            while pushServerUrl != serverUrl, subDirs.count > 0  {
+            while pushServerUrl != serverUrl, !subDirs.isEmpty {
 
                 guard let dir = subDirs.first, let viewController = UIStoryboard(name: "NCFiles", bundle: nil).instantiateInitialViewController() as? NCFiles else { return }
                 pushServerUrl = pushServerUrl + "/" + dir
@@ -525,7 +529,7 @@ import Photos
                     viewController.fileNameBlink = fileNameBlink
                     viewController.fileNameOpen = fileNameOpen
                 }
-                self.appDelegate.listFilesVC[serverUrl] = viewController
+                appDelegate.listFilesVC[serverUrl] = viewController
 
                 viewController.navigationItem.backButtonTitle = viewController.titleCurrentFolder
                 topNavigationController.pushViewController(viewController, animated: false)
@@ -535,17 +539,16 @@ import Photos
         }
     }
 
-
     // MARK: - NCSelect + Delegate
 
     func dismissSelect(serverUrl: String?, metadata: tableMetadata?, type: String, items: [Any], overwrite: Bool, copy: Bool, move: Bool) {
-        if serverUrl != nil && items.count > 0 {
+        if serverUrl != nil && !items.isEmpty {
             if copy {
-                for metadata in items as! [tableMetadata] {
+                for case let metadata as tableMetadata in items {
                     NCOperationQueue.shared.copyMove(metadata: metadata, serverUrl: serverUrl!, overwrite: overwrite, move: false)
                 }
             } else if move {
-                for metadata in items as! [tableMetadata] {
+                for case let metadata as tableMetadata in items {
                     NCOperationQueue.shared.copyMove(metadata: metadata, serverUrl: serverUrl!, overwrite: overwrite, move: true)
                 }
             }
@@ -553,9 +556,10 @@ import Photos
     }
 
     func openSelectView(items: [tableMetadata]) {
+        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
 
-        let navigationController = UIStoryboard(name: "NCSelect", bundle: nil).instantiateInitialViewController() as! UINavigationController
-        let topViewController = navigationController.topViewController as! NCSelect
+        let navigationController = UIStoryboard(name: "NCSelect", bundle: nil).instantiateInitialViewController() as? UINavigationController
+        let topViewController = navigationController?.topViewController as? NCSelect
         var listViewController = [NCSelect]()
 
         var copyItems: [tableMetadata] = []
@@ -599,10 +603,12 @@ import Photos
             }
         }
 
-        navigationController.setViewControllers(listViewController, animated: false)
-        navigationController.modalPresentationStyle = .formSheet
+        navigationController?.setViewControllers(listViewController, animated: false)
+        navigationController?.modalPresentationStyle = .formSheet
 
-        appDelegate.window?.rootViewController?.present(navigationController, animated: true, completion: nil)
+        if let navigationController = navigationController {
+            appDelegate.window?.rootViewController?.present(navigationController, animated: true, completion: nil)
+        }
     }
 }
 

+ 13 - 5
iOSClient/Menu/NCCollectionViewCommon+Menu.swift

@@ -82,7 +82,7 @@ extension NCCollectionViewCommon {
                     icon: NCUtility.shared.loadImage(named: "info"),
                     order: 10,
                     action: { _ in
-                        NCFunctionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .activity)
+                        NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .activity)
                     }
                 )
             )
@@ -263,21 +263,25 @@ extension NCCollectionViewCommon {
         //
         // SAVE CAMERA ROLL
         //
-        if metadata.isSaveInCameraRoll {
+        if metadata.isSavebleInCameraRoll {
             actions.append(.saveMediaAction(selectedMediaMetadatas: [metadata], order: 100))
         }
 
         //
         // SAVE AS SCAN
         //
-        if metadata.isSaveAsScan {
+        if metadata.isSavebleAsScan {
             actions.append(
                 NCMenuAction(
                     title: NSLocalizedString("_save_as_scan_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "viewfinder.circle"),
                     order: 110,
                     action: { _ in
-                        NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorSaveAsScan)
+                        if CCUtility.fileProviderStorageExists(metadata) {
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorSaveAsScan, "error": NKError(), "account": metadata.account])
+                        } else {
+                            NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorSaveAsScan) { _, _ in }
+                        }
                     }
                 )
             )
@@ -332,7 +336,11 @@ extension NCCollectionViewCommon {
                     icon: NCUtility.shared.loadImage(named: "pencil.tip.crop.circle"),
                     order: 150,
                     action: { menuAction in
-                        NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook)
+                        if CCUtility.fileProviderStorageExists(metadata) {
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorLoadFileQuickLook, "error": NKError(), "account": metadata.account])
+                        } else {
+                            NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook) { _, _ in }
+                        }
                     }
                 )
             )

+ 117 - 39
iOSClient/Menu/NCContextMenu.swift

@@ -22,31 +22,43 @@
 //
 
 import Foundation
+import Alamofire
 import NextcloudKit
+import JGProgressHUD
 
 class NCContextMenu: NSObject {
 
     func viewMenu(ocId: String, viewController: UIViewController, image: UIImage?) -> UIMenu {
+        guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocId) else { return UIMenu() }
 
-        let appDelegate = UIApplication.shared.delegate as? AppDelegate
-        guard let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocId) else {
-            return UIMenu()
-        }
-
+        var downloadRequest: DownloadRequest?
         var titleDeleteConfirmFile = NSLocalizedString("_delete_file_", comment: "")
-        if metadata.directory { titleDeleteConfirmFile = NSLocalizedString("_delete_folder_", comment: "") }
-
         var titleSave: String = NSLocalizedString("_save_selected_files_", comment: "")
         let metadataMOV = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata)
-        if metadataMOV != nil {
-            titleSave = NSLocalizedString("_livephoto_save_", comment: "")
+
+        if metadata.directory { titleDeleteConfirmFile = NSLocalizedString("_delete_folder_", comment: "") }
+        if metadataMOV != nil { titleSave = NSLocalizedString("_livephoto_save_", comment: "") }
+
+        let hud = JGProgressHUD()
+        hud.indicatorView = JGProgressHUDRingIndicatorView()
+        hud.detailTextLabel.text = NSLocalizedString("_tap_to_cancel_", comment: "")
+        if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView { indicatorView.ringWidth = 1.5 }
+        hud.tapOnHUDViewBlock = { _ in
+            if let request = downloadRequest {
+                request.cancel()
+            }
         }
 
-        let detail = UIAction(title: NSLocalizedString("_details_", comment: ""), image: UIImage(systemName: "info")) { _ in
-            NCFunctionCenter.shared.openShare(viewController: viewController, metadata: metadata, indexPage: .activity)
+        // MENU ITEMS
+
+        let detail = UIAction(title: NSLocalizedString("_details_", comment: ""),
+                              image: UIImage(systemName: "info")) { _ in
+            NCActionCenter.shared.openShare(viewController: viewController, metadata: metadata, indexPage: .activity)
         }
 
-        let favorite = UIAction(title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""),
+        let favorite = UIAction(title: metadata.favorite ?
+                                NSLocalizedString("_remove_favorites_", comment: "") :
+                                NSLocalizedString("_add_favorites_", comment: ""),
                                 image: NCUtility.shared.loadImage(named: "star.fill", color: NCBrandColor.shared.yellowFavorite)) { _ in
             NCNetworking.shared.favoriteMetadata(metadata) { error in
                 if error != .success {
@@ -55,46 +67,109 @@ class NCContextMenu: NSObject {
             }
         }
 
-        let openIn = UIAction(title: NSLocalizedString("_open_in_", comment: ""), image: UIImage(systemName: "square.and.arrow.up") ) { _ in
-            NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorOpenIn)
+        let openIn = UIAction(title: NSLocalizedString("_open_in_", comment: ""),
+                              image: UIImage(systemName: "square.and.arrow.up") ) { _ in
+            if CCUtility.fileProviderStorageExists(metadata) {
+                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorOpenIn, "error": NKError(), "account": metadata.account])
+            } else {
+                hud.show(in: viewController.view)
+                NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorOpenIn, notificationCenterProgressTask: false) { request in
+                    downloadRequest = request
+                } progressHandler: { progress in
+                    hud.progress = Float(progress.fractionCompleted)
+                } completion: { afError, error in
+                    if error == .success || afError?.isExplicitlyCancelledError ?? false {
+                        hud.dismiss()
+                    } else {
+                        hud.indicatorView = JGProgressHUDErrorIndicatorView()
+                        hud.textLabel.text = error.description
+                        hud.dismiss(afterDelay: NCGlobal.shared.dismissAfterSecond)
+                    }
+                }
+            }
         }
 
-        let viewInFolder = UIAction(title: NSLocalizedString("_view_in_folder_", comment: ""), image: UIImage(systemName: "arrow.forward.square")) { _ in
-            NCFunctionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil)
+        let viewInFolder = UIAction(title: NSLocalizedString("_view_in_folder_", comment: ""),
+                                    image: UIImage(systemName: "arrow.forward.square")) { _ in
+            NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil)
         }
 
-        let save = UIAction(title: titleSave, image: UIImage(systemName: "square.and.arrow.down")) { _ in
-            if metadataMOV != nil {
-                NCFunctionCenter.shared.saveLivePhoto(metadata: metadata, metadataMOV: metadataMOV!)
+        let save = UIAction(title: titleSave,
+                            image: UIImage(systemName: "square.and.arrow.down")) { _ in
+            if let metadataMOV = metadataMOV {
+                NCActionCenter.shared.saveLivePhoto(metadata: metadata, metadataMOV: metadataMOV)
             } else {
                 if CCUtility.fileProviderStorageExists(metadata) {
-                    NCFunctionCenter.shared.saveAlbum(metadata: metadata)
+                    NCActionCenter.shared.saveAlbum(metadata: metadata)
                 } else {
-                    NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorSaveAlbum)
+                    hud.show(in: viewController.view)
+                    NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorSaveAlbum, notificationCenterProgressTask: false) { request in
+                        downloadRequest = request
+                    } progressHandler: { progress in
+                        hud.progress = Float(progress.fractionCompleted)
+                    } completion: { afError, error in
+                        if error == .success || afError?.isExplicitlyCancelledError ?? false {
+                            hud.dismiss()
+                        } else {
+                            hud.indicatorView = JGProgressHUDErrorIndicatorView()
+                            hud.textLabel.text = error.description
+                            hud.dismiss(afterDelay: NCGlobal.shared.dismissAfterSecond)
+                        }
+                    }
                 }
             }
         }
 
-        let copy = UIAction(title: NSLocalizedString("_copy_file_", comment: ""), image: UIImage(systemName: "doc.on.doc")) { _ in
-            NCFunctionCenter.shared.copyPasteboard(pasteboardOcIds: [metadata.ocId], hudView: viewController.view)
+        let copy = UIAction(title: NSLocalizedString("_copy_file_", comment: ""),
+                            image: UIImage(systemName: "doc.on.doc")) { _ in
+            NCActionCenter.shared.copyPasteboard(pasteboardOcIds: [metadata.ocId], hudView: viewController.view)
         }
 
-        let modify = UIAction(title: NSLocalizedString("_modify_", comment: ""), image: UIImage(systemName: "pencil.tip.crop.circle")) { _ in
-            NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook)
+        let modify = UIAction(title: NSLocalizedString("_modify_", comment: ""),
+                              image: UIImage(systemName: "pencil.tip.crop.circle")) { _ in
+            if CCUtility.fileProviderStorageExists(metadata) {
+                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorLoadFileQuickLook, "error": NKError(), "account": metadata.account])
+            } else {
+                hud.show(in: viewController.view)
+                NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook, notificationCenterProgressTask: false) { request in
+                    downloadRequest = request
+                } progressHandler: { progress in
+                    hud.progress = Float(progress.fractionCompleted)
+                } completion: { afError, error in
+                    if error == .success || afError?.isExplicitlyCancelledError ?? false {
+                        hud.dismiss()
+                    } else {
+                        hud.indicatorView = JGProgressHUDErrorIndicatorView()
+                        hud.textLabel.text = error.description
+                        hud.dismiss(afterDelay: NCGlobal.shared.dismissAfterSecond)
+                    }
+                }
+            }
         }
 
-        let deleteConfirmFile = UIAction(title: titleDeleteConfirmFile, image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
-            NCNetworking.shared.deleteMetadata(metadata, onlyLocalCache: false) { error in
-                if error != .success {
-                    NCContentPresenter.shared.showError(error: error)
+        let deleteConfirmFile = UIAction(title: titleDeleteConfirmFile,
+                                         image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
+            let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
+            alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_file_", comment: ""), style: .destructive) { _ in
+                NCNetworking.shared.deleteMetadata(metadata, onlyLocalCache: false) { error in
+                    if error != .success {
+                        NCContentPresenter.shared.showError(error: error)
+                    }
                 }
-            }
+            })
+            alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { _ in })
+            viewController.present(alertController, animated: true, completion: nil)
         }
-        let deleteConfirmLocal = UIAction(title: NSLocalizedString("_remove_local_file_", comment: ""), image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
-            NCNetworking.shared.deleteMetadata(metadata, onlyLocalCache: true) { _ in
-            }
+
+        let deleteConfirmLocal = UIAction(title: NSLocalizedString("_remove_local_file_", comment: ""),
+                                          image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
+            NCNetworking.shared.deleteMetadata(metadata, onlyLocalCache: true) { _ in }
         }
-        let deleteSubMenu = UIMenu(title: NSLocalizedString("_delete_file_", comment: ""), image: UIImage(systemName: "trash"), options: .destructive, children: [deleteConfirmLocal, deleteConfirmFile])
+
+        let deleteSubMenu = UIMenu(title: NSLocalizedString("_delete_file_", comment: ""),
+                                   image: UIImage(systemName: "trash"),
+                                   options: .destructive,
+                                   children: [deleteConfirmLocal, deleteConfirmFile])
 
         // ------ MENU -----
 
@@ -114,27 +189,30 @@ class NCContextMenu: NSObject {
 
             if metadata.lock {
                 menu.append(favorite)
-                if metadata.isViewOnly {
+                if metadata.isViewableOnly {
                     //
                 } else {
                     menu.append(openIn)
+                    // SAVE CAMERA ROLL
                     menu.append(save)
-                    menu.append(copy)
                 }
             } else {
                 menu.append(favorite)
-                if metadata.isViewOnly {
+                if metadata.isViewableOnly {
                     if viewController is NCMedia {
                         menu.append(viewInFolder)
                     }
                 } else {
                     menu.append(openIn)
+                    // SAVE CAMERA ROLL
                     menu.append(save)
                     if viewController is NCMedia {
                         menu.append(viewInFolder)
                     }
-                    menu.append(copy)
-                    menu.append(modify)
+                    // MODIFY WITH QUICK LOOK
+                    if metadata.isModifiableWithQuickLook {
+                        menu.append(modify)
+                    }
                 }
                 if viewController is NCMedia {
                     menu.append(deleteConfirmFile)

+ 13 - 8
iOSClient/Menu/NCMenuAction.swift

@@ -24,6 +24,7 @@
 
 import Foundation
 import UIKit
+import NextcloudKit
 
 class NCMenuAction {
     let title: String
@@ -88,7 +89,7 @@ extension NCMenuAction {
             icon: NCUtility.shared.loadImage(named: "doc.on.doc"),
             order: order,
             action: { _ in
-                NCFunctionCenter.shared.copyPasteboard(pasteboardOcIds: selectOcId, hudView: hudView)
+                NCActionCenter.shared.copyPasteboard(pasteboardOcIds: selectOcId, hudView: hudView)
                 completion?()
             }
         )
@@ -160,7 +161,7 @@ extension NCMenuAction {
             icon: NCUtility.shared.loadImage(named: "square.and.arrow.up"),
             order: order,
             action: { _ in
-                NCFunctionCenter.shared.openActivityViewController(selectedMetadata: selectedMetadatas)
+                NCActionCenter.shared.openActivityViewController(selectedMetadata: selectedMetadatas)
                 completion?()
             }
         )
@@ -182,10 +183,10 @@ extension NCMenuAction {
             action: { _ in
                 for metadata in selectedMediaMetadatas {
                     if let metadataMOV = NCManageDatabase.shared.getMetadataLivePhoto(metadata: metadata) {
-                        NCFunctionCenter.shared.saveLivePhoto(metadata: metadata, metadataMOV: metadataMOV)
+                        NCActionCenter.shared.saveLivePhoto(metadata: metadata, metadataMOV: metadataMOV)
                     } else {
                         if CCUtility.fileProviderStorageExists(metadata) {
-                            NCFunctionCenter.shared.saveAlbum(metadata: metadata)
+                            NCActionCenter.shared.saveAlbum(metadata: metadata)
                         } else {
                             NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorSaveAlbum)
                         }
@@ -209,13 +210,13 @@ extension NCMenuAction {
                         message: NSLocalizedString("_select_offline_warning_", comment: ""),
                         preferredStyle: .alert)
                     alert.addAction(UIAlertAction(title: NSLocalizedString("_continue_", comment: ""), style: .default, handler: { _ in
-                        selectedMetadatas.forEach { NCFunctionCenter.shared.setMetadataAvalableOffline($0, isOffline: isAnyOffline) }
+                        selectedMetadatas.forEach { NCActionCenter.shared.setMetadataAvalableOffline($0, isOffline: isAnyOffline) }
                         completion?()
                     }))
                     alert.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel))
                     viewController.present(alert, animated: true)
                 } else {
-                    selectedMetadatas.forEach { NCFunctionCenter.shared.setMetadataAvalableOffline($0, isOffline: isAnyOffline) }
+                    selectedMetadatas.forEach { NCActionCenter.shared.setMetadataAvalableOffline($0, isOffline: isAnyOffline) }
                     completion?()
                 }
             }
@@ -229,7 +230,7 @@ extension NCMenuAction {
             icon: NCUtility.shared.loadImage(named: "arrow.up.right.square"),
             order: order,
             action: { _ in
-                NCFunctionCenter.shared.openSelectView(items: selectedMetadatas)
+                NCActionCenter.shared.openSelectView(items: selectedMetadatas)
                 completion?()
             }
         )
@@ -242,7 +243,11 @@ extension NCMenuAction {
             icon: NCUtility.shared.loadImage(named: "printer"),
             order: order,
             action: { _ in
-                NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorPrint)
+                if CCUtility.fileProviderStorageExists(metadata) {
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorPrint, "error": NKError(), "account": metadata.account])
+                } else {
+                    NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorPrint) { _, _ in }
+                }
             }
         )
     }

+ 19 - 7
iOSClient/Menu/NCViewer+Menu.swift

@@ -46,7 +46,7 @@ extension NCViewer {
                     title: NSLocalizedString("_details_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "info"),
                     action: { _ in
-                        NCFunctionCenter.shared.openShare(viewController: viewController, metadata: metadata, indexPage: .activity)
+                        NCActionCenter.shared.openShare(viewController: viewController, metadata: metadata, indexPage: .activity)
                     }
                 )
             )
@@ -95,7 +95,11 @@ extension NCViewer {
                     title: NSLocalizedString("_print_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "printer"),
                     action: { _ in
-                        NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorPrint)
+                        if CCUtility.fileProviderStorageExists(metadata) {
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorPrint, "error": NKError(), "account": metadata.account])
+                        } else {
+                            NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorPrint) { _, _ in }
+                        }
                     }
                 )
             )
@@ -124,20 +128,24 @@ extension NCViewer {
         //
         // SAVE CAMERA ROLL
         //
-        if !webView, metadata.isSaveInCameraRoll {
+        if !webView, metadata.isSavebleInCameraRoll {
             actions.append(.saveMediaAction(selectedMediaMetadatas: [metadata]))
         }
 
         //
         // SAVE AS SCAN
         //
-        if !webView, metadata.isSaveAsScan {
+        if !webView, metadata.isSavebleAsScan {
             actions.append(
                 NCMenuAction(
                     title: NSLocalizedString("_save_as_scan_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "viewfinder.circle"),
                     action: { _ in
-                        NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorSaveAsScan)
+                        if CCUtility.fileProviderStorageExists(metadata) {
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorSaveAsScan, "error": NKError(), "account": metadata.account])
+                        } else {
+                            NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorSaveAsScan) { _, _ in }
+                        }
                     }
                 )
             )
@@ -191,7 +199,7 @@ extension NCViewer {
                     title: NSLocalizedString("_view_in_folder_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "arrow.forward.square"),
                     action: { menuAction in
-                        NCFunctionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil)
+                        NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil)
                     }
                 )
             )
@@ -246,7 +254,11 @@ extension NCViewer {
                     title: NSLocalizedString("_modify_", comment: ""),
                     icon: NCUtility.shared.loadImage(named: "pencil.tip.crop.circle"),
                     action: { _ in
-                        NCFunctionCenter.shared.openDownload(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook)
+                        if CCUtility.fileProviderStorageExists(metadata) {
+                            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "selector": NCGlobal.shared.selectorLoadFileQuickLook, "error": NKError(), "account": metadata.account])
+                        } else {
+                            NCNetworking.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorLoadFileQuickLook) { _, _ in }
+                        }
                     }
                 )
             )

+ 8 - 3
iOSClient/Networking/NCNetworking.swift

@@ -323,9 +323,12 @@ import Photos
             NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadCancelFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
         }
     }
-    
-    func download(metadata: tableMetadata, selector: String, notificationCenterProgressTask: Bool = true, progressHandler: @escaping (_ progress: Progress) -> Void = { _ in }, completion: @escaping (_ afError: AFError?, _ error: NKError) -> Void) {
-        
+
+    func download(metadata: tableMetadata, selector: String, notificationCenterProgressTask: Bool = true,
+                  requestHandler: @escaping (_ request: DownloadRequest) -> () = { _ in },
+                  progressHandler: @escaping (_ progress: Progress) -> Void = { _ in },
+                  completion: @escaping (_ afError: AFError?, _ error: NKError) -> Void) {
+
         let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
         let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileName)!
 
@@ -339,6 +342,8 @@ import Photos
 
         NextcloudKit.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, queue: NKCommon.shared.backgroundQueue, requestHandler: { request in
 
+            requestHandler(request)
+            
             self.downloadRequest[fileNameLocalPath] = request
 
             NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusDownloading)

+ 1 - 1
iOSClient/RichWorkspace/NCViewerRichWorkspaceWebView.swift

@@ -83,7 +83,7 @@ class NCViewerRichWorkspaceWebView: UIViewController, WKNavigationDelegate, WKSc
 
             if message.body as? String == "share" {
                 if metadata != nil {
-                    NCFunctionCenter.shared.openShare(viewController: self, metadata: metadata!, indexPage: .sharing)
+                    NCActionCenter.shared.openShare(viewController: self, metadata: metadata!, indexPage: .sharing)
                 }
             }
 

BIN
iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/de.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/fr.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/hu.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/it.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/th_TH.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/tr.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings


+ 1 - 1
iOSClient/Viewer/NCViewer.swift

@@ -239,7 +239,7 @@ class NCViewer: NSObject {
             viewController.present(viewerQuickLook, animated: true)
         } else {
         // Document Interaction Controller
-            NCFunctionCenter.shared.openDocumentController(metadata: metadata)
+            NCActionCenter.shared.openDocumentController(metadata: metadata)
         }
     }
 }

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

@@ -153,7 +153,7 @@ class NCViewerNextcloudText: UIViewController, WKNavigationDelegate, WKScriptMes
             }
 
             if message.body as? String == "share" {
-                NCFunctionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
+                NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
             }
 
             if message.body as? String == "loading" {

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

@@ -174,7 +174,7 @@ class NCViewerRichdocument: UIViewController, WKNavigationDelegate, WKScriptMess
             }
 
             if message.body as? String == "share" {
-                NCFunctionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
+                NCActionCenter.shared.openShare(viewController: self, metadata: metadata, indexPage: .sharing)
             }
 
             if let param = message.body as? [AnyHashable: Any] {