Forráskód Böngészése

Merge branch 'develop' of https://github.com/nextcloud/ios into 2460-add-other-nextcloud-apps-to-settings-as-suggestions

Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com>

# Conflicts:
#	Nextcloud.xcodeproj/project.pbxproj
Milen Pivchev 1 éve
szülő
commit
2afb8bc35b
100 módosított fájl, 353 hozzáadás és 104 törlés
  1. 1 1
      .swiftlint.yml
  2. 10 6
      Nextcloud.xcodeproj/project.pbxproj
  3. 38 0
      Tests/NextcloudIntegrationTests/BaseIntegrationXCTestCase.swift
  4. 2 8
      Tests/NextcloudIntegrationTests/FilesIntegrationTests.swift
  5. 253 50
      iOSClient/Data/NCManageDatabase+Capabilities.swift
  6. 0 1
      iOSClient/Data/NCManageDatabase+E2EE.swift
  7. 0 1
      iOSClient/Data/NCManageDatabase+Groupfolders.swift
  8. 1 3
      iOSClient/Data/NCManageDatabase+Metadata.swift
  9. 2 2
      iOSClient/Extensions/UIToolbar+Extension.swift
  10. 8 8
      iOSClient/Main/NCActionCenter.swift
  11. 20 14
      iOSClient/Main/NCPickerViewController.swift
  12. 0 1
      iOSClient/NCGlobal.swift
  13. 12 4
      iOSClient/Networking/NCNetworking.swift
  14. 0 1
      iOSClient/Networking/NCService.swift
  15. 1 1
      iOSClient/Share/Advanced/NCShareCells.swift
  16. 2 1
      iOSClient/Share/Advanced/NCShareNewUserAddComment.swift
  17. 1 0
      iOSClient/Share/NCShare.swift
  18. 2 2
      iOSClient/Share/NCShareNetworking.swift
  19. BIN
      iOSClient/Supporting Files/af.lproj/Localizable.strings
  20. BIN
      iOSClient/Supporting Files/an.lproj/Localizable.strings
  21. BIN
      iOSClient/Supporting Files/ar.lproj/Localizable.strings
  22. BIN
      iOSClient/Supporting Files/ast.lproj/Localizable.strings
  23. BIN
      iOSClient/Supporting Files/az.lproj/Localizable.strings
  24. BIN
      iOSClient/Supporting Files/be.lproj/Localizable.strings
  25. BIN
      iOSClient/Supporting Files/bg_BG.lproj/Localizable.strings
  26. BIN
      iOSClient/Supporting Files/bn_BD.lproj/Localizable.strings
  27. BIN
      iOSClient/Supporting Files/br.lproj/Localizable.strings
  28. BIN
      iOSClient/Supporting Files/bs.lproj/Localizable.strings
  29. BIN
      iOSClient/Supporting Files/ca.lproj/Localizable.strings
  30. BIN
      iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings
  31. BIN
      iOSClient/Supporting Files/cy_GB.lproj/Localizable.strings
  32. BIN
      iOSClient/Supporting Files/da.lproj/Localizable.strings
  33. BIN
      iOSClient/Supporting Files/de.lproj/Localizable.strings
  34. BIN
      iOSClient/Supporting Files/el.lproj/Localizable.strings
  35. BIN
      iOSClient/Supporting Files/en-GB.lproj/Localizable.strings
  36. BIN
      iOSClient/Supporting Files/eo.lproj/Localizable.strings
  37. BIN
      iOSClient/Supporting Files/es-419.lproj/Localizable.strings
  38. BIN
      iOSClient/Supporting Files/es-AR.lproj/Localizable.strings
  39. BIN
      iOSClient/Supporting Files/es-CL.lproj/Localizable.strings
  40. BIN
      iOSClient/Supporting Files/es-CO.lproj/Localizable.strings
  41. BIN
      iOSClient/Supporting Files/es-CR.lproj/Localizable.strings
  42. BIN
      iOSClient/Supporting Files/es-DO.lproj/Localizable.strings
  43. BIN
      iOSClient/Supporting Files/es-EC.lproj/InfoPlist.strings
  44. BIN
      iOSClient/Supporting Files/es-EC.lproj/Localizable.strings
  45. BIN
      iOSClient/Supporting Files/es-GT.lproj/Localizable.strings
  46. BIN
      iOSClient/Supporting Files/es-HN.lproj/Localizable.strings
  47. BIN
      iOSClient/Supporting Files/es-MX.lproj/Localizable.strings
  48. BIN
      iOSClient/Supporting Files/es-NI.lproj/Localizable.strings
  49. BIN
      iOSClient/Supporting Files/es-PA.lproj/Localizable.strings
  50. BIN
      iOSClient/Supporting Files/es-PE.lproj/Localizable.strings
  51. BIN
      iOSClient/Supporting Files/es-PR.lproj/Localizable.strings
  52. BIN
      iOSClient/Supporting Files/es-PY.lproj/Localizable.strings
  53. BIN
      iOSClient/Supporting Files/es-SV.lproj/Localizable.strings
  54. BIN
      iOSClient/Supporting Files/es-UY.lproj/Localizable.strings
  55. BIN
      iOSClient/Supporting Files/es.lproj/Localizable.strings
  56. BIN
      iOSClient/Supporting Files/et_EE.lproj/Localizable.strings
  57. BIN
      iOSClient/Supporting Files/eu.lproj/Localizable.strings
  58. BIN
      iOSClient/Supporting Files/fa.lproj/Localizable.strings
  59. BIN
      iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings
  60. BIN
      iOSClient/Supporting Files/fo.lproj/Localizable.strings
  61. BIN
      iOSClient/Supporting Files/fr.lproj/Localizable.strings
  62. BIN
      iOSClient/Supporting Files/gd.lproj/Localizable.strings
  63. BIN
      iOSClient/Supporting Files/gl.lproj/InfoPlist.strings
  64. BIN
      iOSClient/Supporting Files/gl.lproj/Localizable.strings
  65. BIN
      iOSClient/Supporting Files/he.lproj/Localizable.strings
  66. BIN
      iOSClient/Supporting Files/hi_IN.lproj/Localizable.strings
  67. BIN
      iOSClient/Supporting Files/hr.lproj/Localizable.strings
  68. BIN
      iOSClient/Supporting Files/hsb.lproj/Localizable.strings
  69. BIN
      iOSClient/Supporting Files/hu.lproj/Localizable.strings
  70. BIN
      iOSClient/Supporting Files/hy.lproj/Localizable.strings
  71. BIN
      iOSClient/Supporting Files/ia.lproj/Localizable.strings
  72. BIN
      iOSClient/Supporting Files/id.lproj/Localizable.strings
  73. BIN
      iOSClient/Supporting Files/ig.lproj/Localizable.strings
  74. BIN
      iOSClient/Supporting Files/is.lproj/Localizable.strings
  75. BIN
      iOSClient/Supporting Files/it.lproj/Localizable.strings
  76. BIN
      iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings
  77. BIN
      iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings
  78. BIN
      iOSClient/Supporting Files/ka.lproj/Localizable.strings
  79. BIN
      iOSClient/Supporting Files/kab.lproj/Localizable.strings
  80. BIN
      iOSClient/Supporting Files/km.lproj/Localizable.strings
  81. BIN
      iOSClient/Supporting Files/kn.lproj/Localizable.strings
  82. BIN
      iOSClient/Supporting Files/ko.lproj/Localizable.strings
  83. BIN
      iOSClient/Supporting Files/la.lproj/Localizable.strings
  84. BIN
      iOSClient/Supporting Files/lb.lproj/Localizable.strings
  85. BIN
      iOSClient/Supporting Files/lo.lproj/Localizable.strings
  86. BIN
      iOSClient/Supporting Files/lt_LT.lproj/Localizable.strings
  87. BIN
      iOSClient/Supporting Files/lv.lproj/Localizable.strings
  88. BIN
      iOSClient/Supporting Files/mk.lproj/Localizable.strings
  89. BIN
      iOSClient/Supporting Files/mn.lproj/Localizable.strings
  90. BIN
      iOSClient/Supporting Files/mr.lproj/Localizable.strings
  91. BIN
      iOSClient/Supporting Files/ms_MY.lproj/Localizable.strings
  92. BIN
      iOSClient/Supporting Files/my.lproj/Localizable.strings
  93. BIN
      iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings
  94. BIN
      iOSClient/Supporting Files/ne.lproj/Localizable.strings
  95. BIN
      iOSClient/Supporting Files/nl.lproj/Localizable.strings
  96. BIN
      iOSClient/Supporting Files/nn_NO.lproj/Localizable.strings
  97. BIN
      iOSClient/Supporting Files/oc.lproj/Localizable.strings
  98. BIN
      iOSClient/Supporting Files/pl.lproj/Localizable.strings
  99. BIN
      iOSClient/Supporting Files/ps.lproj/Localizable.strings
  100. BIN
      iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings

+ 1 - 1
.swiftlint.yml

@@ -14,7 +14,7 @@ line_length:
   error: 5000
 
 function_body_length:
-   warning: 200
+   warning: 400
 
 type_body_length:
   warning: 800

+ 10 - 6
Nextcloud.xcodeproj/project.pbxproj

@@ -118,6 +118,7 @@
 		F343A4C02A1E734600DDA874 /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
 		F343A4C12A1E734600DDA874 /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
 		F39298972A3B12CB00509762 /* BaseNCMoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39298962A3B12CB00509762 /* BaseNCMoreCell.swift */; };
+		F3953BD72A6E87E000EE03F9 /* BaseIntegrationXCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3953BD62A6E87E000EE03F9 /* BaseIntegrationXCTestCase.swift */; };
 		F3A7AFC62A41AA82001FC89C /* BaseUIXCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A7AFC52A41AA82001FC89C /* BaseUIXCTestCase.swift */; };
 		F3BB464D2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3BB464C2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib */; };
 		F3BB464F2A39EBE500461F6E /* NCMoreUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3BB464E2A39EBE500461F6E /* NCMoreUserCell.swift */; };
@@ -817,6 +818,7 @@
 		F33AAF992A60394C006ECCBD /* NCMoreUserCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCMoreUserCell.xib; sourceTree = "<group>"; };
 		F343A4B22A1E01FF00DDA874 /* PHAsset+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAsset+Extension.swift"; sourceTree = "<group>"; };
 		F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Optional+Extension.swift"; sourceTree = "<group>"; };
+		F3953BD62A6E87E000EE03F9 /* BaseIntegrationXCTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseIntegrationXCTestCase.swift; sourceTree = "<group>"; };
 		F39298962A3B12CB00509762 /* BaseNCMoreCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNCMoreCell.swift; sourceTree = "<group>"; };
 		F3A7AFC52A41AA82001FC89C /* BaseUIXCTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUIXCTestCase.swift; sourceTree = "<group>"; };
 		F3BB464C2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCMoreAppSuggestionsCell.xib; sourceTree = "<group>"; };
@@ -1552,6 +1554,7 @@
 		C04E2F212A17BB4D001BAD85 /* NextcloudIntegrationTests */ = {
 			isa = PBXGroup;
 			children = (
+				F3953BD62A6E87E000EE03F9 /* BaseIntegrationXCTestCase.swift */,
 				C04E2F222A17BB4D001BAD85 /* FilesIntegrationTests.swift */,
 			);
 			path = NextcloudIntegrationTests;
@@ -3335,6 +3338,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				F3953BD72A6E87E000EE03F9 /* BaseIntegrationXCTestCase.swift in Sources */,
 				F30A96322A27AEDD00D7BCFE /* EnvVars.generated.swift in Sources */,
 				C04E2F232A17BB4D001BAD85 /* FilesIntegrationTests.swift in Sources */,
 			);
@@ -4604,7 +4608,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -4630,7 +4634,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.8.6;
+				MARKETING_VERSION = 4.8.7;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
@@ -4669,7 +4673,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -4692,7 +4696,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.8.6;
+				MARKETING_VERSION = 4.8.7;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
@@ -4975,8 +4979,8 @@
 			isa = XCRemoteSwiftPackageReference;
 			repositoryURL = "https://github.com/nextcloud/NextcloudKit";
 			requirement = {
-				kind = exactVersion;
-				version = 2.7.0;
+				branch = "2521-external-share-with-email-2-mails-sent-instead-of-1";
+				kind = branch;
 			};
 		};
 		F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */ = {

+ 38 - 0
Tests/NextcloudIntegrationTests/BaseIntegrationXCTestCase.swift

@@ -0,0 +1,38 @@
+//
+//  BaseIntegrationXCTestCase.swift
+//  
+// 
+//  Created by Milen Pivchev on 20.06.23.
+//  Copyright © 2023 Milen Pivchev. All rights reserved.
+//
+//  Author: Milen Pivchev <milen.pivchev@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 XCTest
+@testable import NextcloudKit
+
+class BaseIntegrationXCTestCase: XCTestCase {
+    internal let baseUrl = EnvVars.testServerUrl
+    internal let user = EnvVars.testUser
+    internal let userId = EnvVars.testUser
+    internal let password = EnvVars.testAppPassword
+    internal lazy var account = "\(userId) \(baseUrl)"
+
+    internal var randomInt: Int {
+        get {
+            return Int.random(in: 1000...Int.max)
+        }
+    }
+}

+ 2 - 8
Tests/NextcloudIntegrationTests/FilesIntegrationTests.swift

@@ -10,13 +10,7 @@ import XCTest
 import NextcloudKit
 @testable import Nextcloud
 
-final class FilesIntegrationTests: XCTestCase {
-    private let baseUrl = EnvVars.testServerUrl
-    private let user = EnvVars.testUser
-    private let userId = EnvVars.testUser
-    private let password = EnvVars.testAppPassword
-    private lazy var account = "\(userId) \(baseUrl)"
-
+final class FilesIntegrationTests: BaseIntegrationXCTestCase {
     private let appDelegate = (UIApplication.shared.delegate as? AppDelegate)!
 
     override func setUp() {
@@ -26,7 +20,7 @@ final class FilesIntegrationTests: XCTestCase {
     func test_createReadDeleteFolder_withProperParams_shouldCreateReadDeleteFolder() throws {
         let expectation = expectation(description: "Should finish last callback")
 
-        let folderName = "TestFolder10"
+        let folderName = "TestFolder\(randomInt)"
         let serverUrl = "\(baseUrl)/remote.php/dav/files/\(userId)"
         let serverUrlFileName = "\(serverUrl)/\(folderName)"
 

+ 253 - 50
iOSClient/Data/NCManageDatabase+Capabilities.swift

@@ -24,7 +24,6 @@
 import Foundation
 import RealmSwift
 import NextcloudKit
-import SwiftyJSON
 
 class tableCapabilities: Object {
 
@@ -68,10 +67,204 @@ extension NCManageDatabase {
 
     func setCapabilities(account: String, data: Data? = nil) {
 
-        let json: JSON?
+        let jsonData: Data?
+
+        struct CapabilityNextcloud: Codable {
+
+            struct Ocs: Codable {
+                let meta: Meta
+                let data: Data
+
+                struct Meta: Codable {
+                    let status: String?
+                    let message: String?
+                    let statuscode: Int?
+                }
+
+                struct Data: Codable {
+                    let version: Version
+                    let capabilities: Capabilities
+
+                    struct Version: Codable {
+                        let string: String
+                        let major: Int
+                    }
+
+                    struct Capabilities: Codable {
+                        let filessharing: FilesSharing?
+                        let theming: Theming?
+                        let endtoendencryption: EndToEndEncryption?
+                        let richdocuments: RichDocuments?
+                        let activity: Activity?
+                        let notifications: Notifications?
+                        let files: Files?
+                        let userstatus: UserStatus?
+                        let external: External?
+                        let groupfolders: GroupFolders?
+
+                        enum CodingKeys: String, CodingKey {
+                            case filessharing = "files_sharing"
+                            case theming
+                            case endtoendencryption = "end-to-end-encryption"
+                            case richdocuments, activity, notifications, files
+                            case userstatus = "user_status"
+                            case external, groupfolders
+                        }
+
+                        struct FilesSharing: Codable {
+                            let apienabled: Bool?
+                            let groupsharing: Bool?
+                            let resharing: Bool?
+                            let defaultpermissions: Int?
+                            let ncpublic: Public?
+
+                            enum CodingKeys: String, CodingKey {
+                                case apienabled = "api_enabled"
+                                case groupsharing = "group_sharing"
+                                case resharing
+                                case defaultpermissions = "default_permissions"
+                                case ncpublic = "public"
+                            }
+
+                            struct Public: Codable {
+                                let upload: Bool
+                                let enabled: Bool
+                                let password: Password?
+                                let sendmail: Bool
+                                let uploadfilesdrop: Bool
+                                let multiplelinks: Bool
+                                let expiredate: ExpireDate?
+                                let expiredateinternal: ExpireDate?
+                                let expiredateremote: ExpireDate?
+
+                                enum CodingKeys: String, CodingKey {
+                                    case upload, enabled, password
+                                    case sendmail = "send_mail"
+                                    case uploadfilesdrop = "upload_files_drop"
+                                    case multiplelinks = "multiple_links"
+                                    case expiredate = "expire_date"
+                                    case expiredateinternal = "expire_date_internal"
+                                    case expiredateremote = "expire_date_remote"
+                                }
+
+                                struct Password: Codable {
+                                    let enforced: Bool?
+                                    let askForOptionalPassword: Bool?
+                                }
+
+                                struct ExpireDate: Codable {
+                                    let enforced: Bool?
+                                    let days: Int?
+                                }
+                            }
+                        }
+
+                        struct Theming: Codable {
+                            let color: String?
+                            let colorelement: String?
+                            let colortext: String?
+                            let colorelementbright: String?
+                            let backgrounddefault: Bool?
+                            let backgroundplain: Bool?
+                            let colorelementdark: String?
+                            let name: String?
+                            let slogan: String?
+                            let url: String?
+                            let logo: String?
+                            let background: String?
+                            let logoheader: String?
+                            let favicon: String?
+
+                            enum CodingKeys: String, CodingKey {
+                                case color
+                                case colorelement = "color-element"
+                                case colortext = "color-text"
+                                case colorelementbright = "color-element-bright"
+                                case backgrounddefault = "background-default"
+                                case backgroundplain = "background-plain"
+                                case colorelementdark = "color-element-dark"
+                                case name, slogan, url, logo, background, logoheader, favicon
+                            }
+                        }
+
+                        struct EndToEndEncryption: Codable {
+                            let enabled: Bool?
+                            let apiversion: String?
+                            let keysexist: Bool?
+
+                            enum CodingKeys: String, CodingKey {
+                                case enabled
+                                case apiversion = "api-version"
+                                case keysexist = "keys-exist"
+                            }
+                        }
+
+                        struct RichDocuments: Codable {
+                            let mimetypes: [String]?
+                        }
+
+                        struct Activity: Codable {
+                            let apiv2: [String]?
+                        }
+
+                        struct Notifications: Codable {
+                            let ocsendpoints: [String]?
+
+                            enum CodingKeys: String, CodingKey {
+                                case ocsendpoints = "ocs-endpoints"
+                            }
+                        }
+
+                        struct Files: Codable {
+                            let undelete: Bool?
+                            let locking: String?
+                            let comments: Bool?
+                            let versioning: Bool?
+                            let directEditing: DirectEditing?
+                            let bigfilechunking: Bool?
+                            let versiondeletion: Bool?
+                            let versionlabeling: Bool?
+
+                            enum CodingKeys: String, CodingKey {
+                                case undelete, locking, comments, versioning, directEditing, bigfilechunking
+                                case versiondeletion = "version_deletion"
+                                case versionlabeling = "version_labeling"
+                            }
+
+                            struct DirectEditing: Codable {
+                                let url: String?
+                                let etag: String?
+                                let supportsFileId: Bool?
+                            }
+                        }
+
+                        struct UserStatus: Codable {
+                            let enabled: Bool?
+                            let restore: Bool?
+                            let supportsemoji: Bool?
+
+                            enum CodingKeys: String, CodingKey {
+                                case enabled, restore
+                                case supportsemoji = "supports_emoji"
+                            }
+                        }
+
+                        struct External: Codable {
+                            let v1: [String]?
+                        }
+
+                        struct GroupFolders: Codable {
+                            let hasGroupFolders: Bool?
+                        }
+                    }
+                }
+            }
+
+            let ocs: Ocs
+        }
 
         if let data = data {
-            json = JSON(data)
+            jsonData = data
         } else {
             do {
                 let realm = try Realm()
@@ -79,61 +272,71 @@ extension NCManageDatabase {
                       let data = result.jsondata else {
                     return
                 }
-                json = JSON(data)
+                jsonData = data
             } catch let error as NSError {
-                NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
+                NextcloudKit.shared.nkCommonInstance.writeLog("I cannot access to database: \(error)")
                 return
             }
         }
+        guard let jsonData = jsonData else { return }
 
-        guard let json = json else { return }
-
-        NCGlobal.shared.capabilityServerVersion = json["ocs", "data", "version", "string"].stringValue
-        NCGlobal.shared.capabilityServerVersionMajor = json["ocs", "data", "version", "major"].intValue
-
-        NCGlobal.shared.capabilityFileSharingApiEnabled = json["ocs", "data", "capabilities", "files_sharing", "api_enabled"].boolValue
-        NCGlobal.shared.capabilityFileSharingPubPasswdEnforced = json["ocs", "data", "capabilities", "files_sharing", "public", "password", "enforced"].boolValue
-        NCGlobal.shared.capabilityFileSharingPubExpireDateEnforced = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date", "enforced"].boolValue
-        NCGlobal.shared.capabilityFileSharingPubExpireDateDays = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date", "days"].intValue
-        NCGlobal.shared.capabilityFileSharingInternalExpireDateEnforced = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date_internal", "enforced"].boolValue
-        NCGlobal.shared.capabilityFileSharingInternalExpireDateDays = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date_internal", "days"].intValue
-        NCGlobal.shared.capabilityFileSharingRemoteExpireDateEnforced = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date_remote", "enforced"].boolValue
-        NCGlobal.shared.capabilityFileSharingRemoteExpireDateDays = json["ocs", "data", "capabilities", "files_sharing", "public", "expire_date_remote", "days"].intValue
-        NCGlobal.shared.capabilityFileSharingDefaultPermission = json["ocs", "data", "capabilities", "files_sharing", "default_permissions"].intValue
-
-        NCGlobal.shared.capabilityThemingColor = json["ocs", "data", "capabilities", "theming", "color"].stringValue
-        NCGlobal.shared.capabilityThemingColorElement = json["ocs", "data", "capabilities", "theming", "color-element"].stringValue
-        NCGlobal.shared.capabilityThemingColorText = json["ocs", "data", "capabilities", "theming", "color-text"].stringValue
-        NCGlobal.shared.capabilityThemingName = json["ocs", "data", "capabilities", "theming", "name"].stringValue
-        NCGlobal.shared.capabilityThemingSlogan = json["ocs", "data", "capabilities", "theming", "slogan"].stringValue
-
-        NCGlobal.shared.capabilityE2EEEnabled = json["ocs", "data", "capabilities", "end-to-end-encryption", "enabled"].boolValue
-        NCGlobal.shared.capabilityE2EEApiVersion = json["ocs", "data", "capabilities", "end-to-end-encryption", "api-version"].stringValue
-
-        NCGlobal.shared.capabilityRichdocumentsMimetypes.removeAll()
-        let mimetypes = json["ocs", "data", "capabilities", "richdocuments", "mimetypes"].arrayValue
-        for mimetype in mimetypes {
-            NCGlobal.shared.capabilityRichdocumentsMimetypes.append(mimetype.stringValue)
-        }
+        do {
+            let json = try JSONDecoder().decode(CapabilityNextcloud.self, from: jsonData)
+            NCGlobal.shared.capabilityServerVersion = json.ocs.data.version.string
+            NCGlobal.shared.capabilityServerVersionMajor = json.ocs.data.version.major
 
-        NCGlobal.shared.capabilityActivity.removeAll()
-        let activities = json["ocs", "data", "capabilities", "activity", "apiv2"].arrayValue
-        for activity in activities {
-            NCGlobal.shared.capabilityActivity.append(activity.stringValue)
-        }
+            NCGlobal.shared.capabilityFileSharingApiEnabled = json.ocs.data.capabilities.filessharing?.apienabled ?? false
+            NCGlobal.shared.capabilityFileSharingDefaultPermission = json.ocs.data.capabilities.filessharing?.defaultpermissions ?? 0
+            NCGlobal.shared.capabilityFileSharingPubPasswdEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.password?.enforced ?? false
+            NCGlobal.shared.capabilityFileSharingPubExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredate?.enforced ?? false
+            NCGlobal.shared.capabilityFileSharingPubExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredate?.days ?? 0
+            NCGlobal.shared.capabilityFileSharingInternalExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateinternal?.enforced ?? false
+            NCGlobal.shared.capabilityFileSharingInternalExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateinternal?.days ?? 0
+            NCGlobal.shared.capabilityFileSharingRemoteExpireDateEnforced = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateremote?.enforced ?? false
+            NCGlobal.shared.capabilityFileSharingRemoteExpireDateDays = json.ocs.data.capabilities.filessharing?.ncpublic?.expiredateremote?.days ?? 0
 
-        NCGlobal.shared.capabilityNotification.removeAll()
-        let notifications = json["ocs", "data", "capabilities", "notifications", "ocs-endpoints"].arrayValue
-        for notify in notifications {
-            NCGlobal.shared.capabilityNotification.append(notify.stringValue)
-        }
+            NCGlobal.shared.capabilityThemingColor = json.ocs.data.capabilities.theming?.color ?? ""
+            NCGlobal.shared.capabilityThemingColorElement = json.ocs.data.capabilities.theming?.colorelement ?? ""
+            NCGlobal.shared.capabilityThemingColorText = json.ocs.data.capabilities.theming?.colortext ?? ""
+            NCGlobal.shared.capabilityThemingName = json.ocs.data.capabilities.theming?.name ?? ""
+            NCGlobal.shared.capabilityThemingSlogan = json.ocs.data.capabilities.theming?.slogan ?? ""
 
-        NCGlobal.shared.capabilityFilesUndelete = json["ocs", "data", "capabilities", "files", "undelete"].boolValue
-        NCGlobal.shared.capabilityFilesLockVersion = json["ocs", "data", "capabilities", "files", "locking"].stringValue
-        NCGlobal.shared.capabilityFilesComments = json["ocs", "data", "capabilities", "files", "comments"].boolValue
+            NCGlobal.shared.capabilityE2EEEnabled = json.ocs.data.capabilities.endtoendencryption?.enabled ?? false
+            NCGlobal.shared.capabilityE2EEApiVersion = json.ocs.data.capabilities.endtoendencryption?.apiversion ?? ""
 
-        NCGlobal.shared.capabilityUserStatusEnabled = json["ocs", "data", "capabilities", "user_status", "enabled"].boolValue
-        NCGlobal.shared.capabilityExternalSites = json["ocs", "data", "capabilities", "external"].exists()
-        NCGlobal.shared.capabilityGroupfoldersEnabled = json["ocs", "data", "capabilities", "groupfolders", "hasGroupFolders"].boolValue
+            NCGlobal.shared.capabilityRichdocumentsMimetypes.removeAll()
+            if let mimetypes = json.ocs.data.capabilities.richdocuments?.mimetypes {
+                for mimetype in mimetypes {
+                    NCGlobal.shared.capabilityRichdocumentsMimetypes.append(mimetype)
+                }
+            }
+
+            NCGlobal.shared.capabilityActivity.removeAll()
+            if let activities = json.ocs.data.capabilities.activity?.apiv2 {
+                for activity in activities {
+                    NCGlobal.shared.capabilityActivity.append(activity)
+                }
+            }
+
+            NCGlobal.shared.capabilityNotification.removeAll()
+            if let notifications = json.ocs.data.capabilities.notifications?.ocsendpoints {
+                for notification in notifications {
+                    NCGlobal.shared.capabilityNotification.append(notification)
+                }
+            }
+
+            NCGlobal.shared.capabilityFilesUndelete = json.ocs.data.capabilities.files?.undelete ?? false
+            NCGlobal.shared.capabilityFilesLockVersion = json.ocs.data.capabilities.files?.locking ?? ""
+            NCGlobal.shared.capabilityFilesComments = json.ocs.data.capabilities.files?.comments ?? false
+
+            NCGlobal.shared.capabilityUserStatusEnabled = json.ocs.data.capabilities.files?.undelete ?? false
+            if json.ocs.data.capabilities.external != nil {
+                NCGlobal.shared.capabilityExternalSites = true
+            }
+            NCGlobal.shared.capabilityGroupfoldersEnabled = json.ocs.data.capabilities.groupfolders?.hasGroupFolders ?? false
+        } catch let error as NSError {
+            NextcloudKit.shared.nkCommonInstance.writeLog("I cannot access to database: \(error)")
+            return
+        }
     }
 }

+ 0 - 1
iOSClient/Data/NCManageDatabase+E2EE.swift

@@ -24,7 +24,6 @@
 import Foundation
 import RealmSwift
 import NextcloudKit
-import SwiftyJSON
 
 class tableE2eEncryption: Object {
 

+ 0 - 1
iOSClient/Data/NCManageDatabase+Groupfolders.swift

@@ -24,7 +24,6 @@
 import Foundation
 import RealmSwift
 import NextcloudKit
-import SwiftyJSON
 
 class TableGroupfolders: Object {
 

+ 1 - 3
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -464,9 +464,7 @@ extension NCManageDatabase {
         do {
             let realm = try Realm()
             try realm.write {
-                for metadata in metadatas {
-                    realm.add(metadata, update: .all)
-                }
+                realm.add(metadatas, update: .all)
             }
         } catch let error {
             NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")

+ 2 - 2
iOSClient/Extensions/UIToolbar+Extension.swift

@@ -24,7 +24,7 @@
 import UIKit
 
 extension UIToolbar {
-    static func toolbar(onClear: (() -> Void)?, completion: @escaping () -> Void) -> UIToolbar {
+    static func toolbar(onClear: (() -> Void)?, onDone: @escaping () -> Void) -> UIToolbar {
         let toolbar = UIToolbar()
         toolbar.sizeToFit()
         var buttons: [UIBarButtonItem] = []
@@ -37,7 +37,7 @@ extension UIToolbar {
         }
         buttons.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil))
         let doneButton = UIBarButtonItem(title: NSLocalizedString("_done_", comment: ""), style: .done) {
-            completion()
+            onDone()
         }
         buttons.append(doneButton)
         toolbar.setItems(buttons, animated: false)

+ 8 - 8
iOSClient/Main/NCActionCenter.swift

@@ -339,7 +339,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
         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
+                NCNetworking.shared.download(metadata: metadata, selector: "", notificationCenterProgressTask: false, completion: { _, _ in
                     if CCUtility.fileProviderStorageExists(metadata) { items.append(url) }
                     completion()
                 })
@@ -534,14 +534,14 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
             DispatchQueue.main.async(execute: hud.dismiss)
 
             // do 5 downloads in parallel to optimize efficiency
-            let parallelizer = ParallelWorker(n: 5, titleKey: "_downloading_", totalTasks: downloadMetadatas.count, hudView: hudView)
+            let processor = ParallelWorker(n: 5, titleKey: "_downloading_", totalTasks: downloadMetadatas.count, hudView: hudView)
 
             for metadata in downloadMetadatas {
-                parallelizer.execute { completion in
-                    NCNetworking.shared.download(metadata: metadata, selector: "") { _, _ in completion() }
+                processor.execute { completion in
+                    NCNetworking.shared.download(metadata: metadata, selector: "", notificationCenterProgressTask: false) { _, _ in completion() }
                 }
             }
-            parallelizer.completeWork {
+            processor.completeWork {
                 items.append(contentsOf: downloadMetadatas.compactMap({ $0.toPasteBoardItem() }))
                 UIPasteboard.general.setItems(items, options: [:])
             }
@@ -551,7 +551,7 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
     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)
+        let processor = 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
@@ -584,12 +584,12 @@ class NCActionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelec
                 let ocIdUpload = UUID().uuidString
                 let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(ocIdUpload, fileNameView: fileName)!
                 do { try data.write(to: URL(fileURLWithPath: fileNameLocalPath)) } catch { continue }
-                parallelizer.execute { completion in
+                processor.execute { completion in
                     uploadPastePasteboard(fileName: fileName, serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath, serverUrl: serverUrl, completion: completion)
                 }
             }
         }
-        parallelizer.completeWork()
+        processor.completeWork()
     }
 
     // MARK: -

+ 20 - 14
iOSClient/Main/NCPickerViewController.swift

@@ -138,13 +138,11 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
     }
 
     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
-
-        let ocId = NSUUID().uuidString
-
         if isViewerMedia,
             let urlIn = urls.first,
             let url = self.copySecurityScopedResource(url: urlIn, urlOut: FileManager.default.temporaryDirectory.appendingPathComponent(urlIn.lastPathComponent)),
             let viewController = self.viewController {
+            let ocId = NSUUID().uuidString
 
             let fileName = url.lastPathComponent
             let metadata = NCManageDatabase.shared.createMetadata(account: appDelegate.account, user: appDelegate.user, userId: appDelegate.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: "", urlBase: appDelegate.urlBase, url: url.path, contentType: "")
@@ -155,15 +153,19 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
             NCViewer.shared.view(viewController: viewController, metadata: metadata, metadatas: [metadata], imageIcon: nil)
 
         } else {
+            let serverUrl = appDelegate.activeServerUrl
+
+            var metadatas = [tableMetadata]()
+            var metadatasInConflict = [tableMetadata]()
 
             for urlIn in urls {
+                let ocId = NSUUID().uuidString
 
                 let fileName = urlIn.lastPathComponent
                 let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!
                 let urlOut = URL(fileURLWithPath: toPath)
-                let serverUrl = appDelegate.activeServerUrl
 
-                guard let url = self.copySecurityScopedResource(url: urlIn, urlOut: urlOut) else { continue }
+                guard let _ = self.copySecurityScopedResource(url: urlIn, urlOut: urlOut) else { continue }
 
                 let metadataForUpload = NCManageDatabase.shared.createMetadata(account: appDelegate.account, user: appDelegate.user, userId: appDelegate.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: serverUrl, urlBase: appDelegate.urlBase, url: "", contentType: "")
 
@@ -172,19 +174,23 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate {
                 metadataForUpload.size = NCUtilityFileSystem.shared.getFileSize(filePath: toPath)
                 metadataForUpload.status = NCGlobal.shared.metadataStatusWaitUpload
 
-                if NCManageDatabase.shared.getMetadataConflict(account: appDelegate.account, serverUrl: serverUrl, fileNameView: fileName) != nil {
+                if let _ = NCManageDatabase.shared.getMetadataConflict(account: appDelegate.account, serverUrl: serverUrl, fileNameView: fileName) {
+                    metadatasInConflict.append(metadataForUpload)
+                } else {
+                    metadatas.append(metadataForUpload)
+                }
+            }
 
-                    if let conflict = UIStoryboard(name: "NCCreateFormUploadConflict", bundle: nil).instantiateInitialViewController() as? NCCreateFormUploadConflict {
+            NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: metadatas, completion: { _ in })
 
-                        conflict.delegate = appDelegate
-                        conflict.serverUrl = serverUrl
-                        conflict.metadatasUploadInConflict = [metadataForUpload]
+            if !metadatasInConflict.isEmpty {
+                if let conflict = UIStoryboard(name: "NCCreateFormUploadConflict", bundle: nil).instantiateInitialViewController() as? NCCreateFormUploadConflict {
 
-                        appDelegate.window?.rootViewController?.present(conflict, animated: true, completion: nil)
-                    }
+                    conflict.delegate = appDelegate
+                    conflict.serverUrl = serverUrl
+                    conflict.metadatasUploadInConflict = metadatasInConflict
 
-                } else {
-                    NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: [metadataForUpload], completion: { _ in })
+                    appDelegate.window?.rootViewController?.present(conflict, animated: true, completion: nil)
                 }
             }
         }

+ 0 - 1
iOSClient/NCGlobal.swift

@@ -22,7 +22,6 @@
 //
 
 import UIKit
-import SwiftyJSON
 
 class NCGlobal: NSObject {
     @objc static let shared: NCGlobal = {

+ 12 - 4
iOSClient/Networking/NCNetworking.swift

@@ -351,7 +351,9 @@ class NCNetworking: NSObject, NKCommonDelegate {
             self.downloadRequest[fileNameLocalPath] = request
 
             NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusDownloading)
-            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadStartFile, userInfo: ["ocId":metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
+            if notificationCenterProgressTask {
+                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadStartFile, userInfo: ["ocId":metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
+            }
             
         }, taskHandler: { (_) in
             
@@ -369,7 +371,9 @@ class NCNetworking: NSObject, NKCommonDelegate {
             if afError?.isExplicitlyCancelledError ?? false {
 
                 NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: "", sessionError: "", sessionSelector: selector, sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusNormal)
-                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadCancelFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
+                if notificationCenterProgressTask {
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadCancelFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account])
+                }
 
             } else if error == .success {
 
@@ -381,12 +385,16 @@ class NCNetworking: NSObject, NKCommonDelegate {
                 }
                 CCUtility.setExif(metadata) { _, _, _, _, _ in }
 #endif
-                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "selector": selector, "error": error])
+                if notificationCenterProgressTask {
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "selector": selector, "error": error])
+                }
 
             } else {
 
                 NCManageDatabase.shared.setMetadataSession(ocId: metadata.ocId, session: "", sessionError: error.errorDescription, sessionSelector: selector, sessionTaskIdentifier: 0, status: NCGlobal.shared.metadataStatusDownloadError)
-                NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "selector": selector, "error": error])
+                if notificationCenterProgressTask {
+                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "selector": selector, "error": error])
+                }
             }
 
             DispatchQueue.main.async { completion(afError, error) }

+ 0 - 1
iOSClient/Networking/NCService.swift

@@ -24,7 +24,6 @@
 import UIKit
 import SVGKit
 import NextcloudKit
-import SwiftyJSON
 
 class NCService: NSObject {
     @objc static let shared: NCService = {

+ 1 - 1
iOSClient/Share/Advanced/NCShareCells.swift

@@ -310,7 +310,7 @@ class NCShareDateCell: UITableViewCell {
             self.resignFirstResponder()
             share.expirationDate = nil
             self.onReload?()
-        } completion: {
+        } onDone: {
             self.resignFirstResponder()
             share.expirationDate = self.picker.date as NSDate
             self.onReload?()

+ 2 - 1
iOSClient/Share/Advanced/NCShareNewUserAddComment.swift

@@ -52,9 +52,10 @@ class NCShareNewUserAddComment: UIViewController, NCShareDetail {
             self.noteTextField.resignFirstResponder()
             self.noteTextField.text = ""
             self.share.note = ""
-        } completion: {
+        } onDone: {
             self.noteTextField.resignFirstResponder()
             self.share.note = self.noteTextField.text
+            self.navigationController?.popViewController(animated: true)
         }
 
         noteTextField.inputAccessoryView = toolbar.wrappedSafeAreaContainer

+ 1 - 0
iOSClient/Share/NCShare.swift

@@ -70,6 +70,7 @@ class NCShare: UIViewController, NCShareNetworkingDelegate, NCSharePagingContent
         searchFieldTopConstraint.constant = 10
 
         searchField.placeholder = NSLocalizedString("_shareLinksearch_placeholder_", comment: "")
+        searchField.autocorrectionType = .no
 
         tableView.dataSource = self
         tableView.delegate = self

+ 2 - 2
iOSClient/Share/NCShareNetworking.swift

@@ -75,14 +75,14 @@ class NCShareNetworking: NSObject {
         // NOTE: Permissions don't work for creating with file drop!
         // https://github.com/nextcloud/server/issues/17504
 
-        // NOTE: Can't save label, expirationDate, and note in same request.
+        // NOTE: Can't save label and expirationDate in the same request.
         // Library update needed:
         // https://github.com/nextcloud/ios-communication-library/pull/104
 
         NCActivityIndicator.shared.start(backgroundView: view)
         let filenamePath = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: metadata.serverUrl, urlBase: metadata.urlBase, userId: metadata.userId, account: metadata.account)!
 
-        NextcloudKit.shared.createShare(path: filenamePath, shareType: option.shareType, shareWith: option.shareWith, password: option.password, permissions: option.permissions, attributes: option.attributes) { (account, share, data, error) in
+        NextcloudKit.shared.createShare(path: filenamePath, shareType: option.shareType, shareWith: option.shareWith, password: option.password, note: option.note, permissions: option.permissions, attributes: option.attributes) { (account, share, data, error) in
             NCActivityIndicator.shared.stop()
             if error == .success, let share = share {
                 option.idShare = share.idShare

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


BIN
iOSClient/Supporting Files/en-GB.lproj/Localizable.strings


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


BIN
iOSClient/Supporting Files/es-419.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-AR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CL.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CO.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-DO.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-EC.lproj/InfoPlist.strings


BIN
iOSClient/Supporting Files/es-EC.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-GT.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-HN.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-MX.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-NI.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PA.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PE.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PY.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-SV.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-UY.lproj/Localizable.strings


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


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


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


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


BIN
iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings


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


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


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


BIN
iOSClient/Supporting Files/gl.lproj/InfoPlist.strings


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


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


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


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


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


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


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


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


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


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


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


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


BIN
iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


BIN
iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings


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


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


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


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


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


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


BIN
iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott