diff options
author | marinofaggiana <ios@nextcloud.com> | 2022-02-02 12:26:38 +0300 |
---|---|---|
committer | marinofaggiana <ios@nextcloud.com> | 2022-02-02 12:26:38 +0300 |
commit | 541d12bdb8040cbe9d38561055d39e584e7e21a5 (patch) | |
tree | 313e81e4cc26ecbae77d512260ba548492788ff7 | |
parent | d33196a70f4cfe495260d7c0f56a998560f3815d (diff) | |
parent | 6e0ac29089b58755f830a7b7367de1e5ef648616 (diff) |
Merge branch 'develop'4.2.1
121 files changed, 1601 insertions, 1173 deletions
diff --git a/.gitignore b/.gitignore index 86f3f75ec..5d65d1376 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,6 @@ DerivedData ## Package Carthage/ -Package.resolved -Cartfile.resolved ### SwiftPackageManager ### .swiftpm diff --git a/.swiftlint.yml b/.swiftlint.yml index aa7354d20..6dc7182d3 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -4,6 +4,7 @@ opt_in_rules: # some rules are turned off by default, so you need to opt-in - empty_string - explicit_init - unneeded_parentheses_in_closure_argument + - operator_usage_whitespace empty_count: severity: warning @@ -33,7 +34,6 @@ excluded: - File Provider Extension/FileProviderExtension.swift - File Provider Extension/FileProviderUtility.swift - Notification Service Extension/NotificationService.swift - - Share/NCShareExtension.swift - iOSClient/Activity/NCActivity.swift - iOSClient/Activity/NCActivityTableViewCell.swift - iOSClient/AppDelegate.swift @@ -1,11 +1,3 @@ -github "tilltue/TLPhotoPicker" "2.1.4" -github "kishikawakatsumi/UICKeyChainStore" -github "WenchaoD/FSCalendar" "2.8.0" -github "FabrizioBrancati/Queuer" -github "xmartlabs/XLForm" ~> 4.1 -github "AssistoLab/DropDown" "v2.3.13" - github "https://github.com/marinofaggiana/KTVHTTPCache" "2.0.2" github "https://github.com/marinofaggiana/TOPasscodeViewController" "master" -github "https://github.com/marinofaggiana/OpenSSL" "master" -github "https://github.com/marinofaggiana/ChromaColorPicker" "master" +github "krzyzanowskim/OpenSSL"
\ No newline at end of file diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 000000000..c96766238 --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1,3 @@ +github "krzyzanowskim/OpenSSL" "1.1.1300" +github "marinofaggiana/KTVHTTPCache" "2.0.2" +github "marinofaggiana/TOPasscodeViewController" "7a750031bb86d9dc9f193bf34a38bbd288b3c4fd" diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 4c766e440..995415431 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -18,6 +18,13 @@ 371B5A2E23D0B04500FAFAE9 /* NCMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371B5A2D23D0B04500FAFAE9 /* NCMenu.swift */; }; 3781B9B023DB2B7E006B4B1D /* AppDelegate+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3781B9AF23DB2B7E006B4B1D /* AppDelegate+Menu.swift */; }; 8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8491B1CC273BBA82001C8C5B /* UIViewController+Menu.swift */; }; + AF22B206277B4E4C00DAB0CC /* NCCreateFormUploadConflict.swift in Sources */ = {isa = PBXBuildFile; fileRef = F704B5E42430AA8000632F5F /* NCCreateFormUploadConflict.swift */; }; + AF22B207277B4E4C00DAB0CC /* NCCreateFormUploadConflict.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F704B5E22430AA6F00632F5F /* NCCreateFormUploadConflict.storyboard */; }; + AF22B208277B4E4C00DAB0CC /* NCCreateFormUploadConflictCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F704B5E82430C0B800632F5F /* NCCreateFormUploadConflictCell.swift */; }; + AF22B209277B4E4C00DAB0CC /* NCCreateFormUploadConflictCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F704B5E62430C06700632F5F /* NCCreateFormUploadConflictCell.xib */; }; + AF22B20C277C6F4D00DAB0CC /* NCShareCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF22B20B277C6F4D00DAB0CC /* NCShareCell.swift */; }; + AF22B217277D196700DAB0CC /* NCShareExtension+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF22B215277D196700DAB0CC /* NCShareExtension+DataSource.swift */; }; + AF22B218277D196700DAB0CC /* NCShareExtension+Files.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF22B216277D196700DAB0CC /* NCShareExtension+Files.swift */; }; AF2D7C7C2742556F00ADF566 /* NCShareLinkCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF2D7C7B2742556F00ADF566 /* NCShareLinkCell.swift */; }; AF2D7C7E2742559100ADF566 /* NCShareUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF2D7C7D2742559100ADF566 /* NCShareUserCell.swift */; }; AF4BF614275629E20081CEEF /* NCManageDatabase+Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4BF613275629E20081CEEF /* NCManageDatabase+Account.swift */; }; @@ -32,6 +39,7 @@ AF4BF61F27562B3F0081CEEF /* NCManageDatabase+Activity.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */; }; AF4BF62027562B3F0081CEEF /* NCManageDatabase+Activity.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */; }; AF4BF62127562B3F0081CEEF /* NCManageDatabase+Activity.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */; }; + AF730AFA27843E4C00B7520E /* NCShareExtension+NCDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF730AF927843E4C00B7520E /* NCShareExtension+NCDelegate.swift */; }; AF817EF1274BC781009ED85B /* NCUserBaseUrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF817EF0274BC781009ED85B /* NCUserBaseUrl.swift */; }; AF817EF2274BC781009ED85B /* NCUserBaseUrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF817EF0274BC781009ED85B /* NCUserBaseUrl.swift */; }; AF817EF3274BC781009ED85B /* NCUserBaseUrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF817EF0274BC781009ED85B /* NCUserBaseUrl.swift */; }; @@ -76,25 +84,6 @@ F70B866D2642A21300ED5349 /* NCBackgroundImageColor.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F70B866B2642A21300ED5349 /* NCBackgroundImageColor.storyboard */; }; F70B866E2642A21300ED5349 /* NCBackgroundImageColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70B866C2642A21300ED5349 /* NCBackgroundImageColor.swift */; }; F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */; }; - F70B86762642CF5300ED5349 /* ChromaColorPicker.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B866F2642CA9500ED5349 /* ChromaColorPicker.xcframework */; }; - F70B86772642CF5300ED5349 /* ChromaColorPicker.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B866F2642CA9500ED5349 /* ChromaColorPicker.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B86872642CF5600ED5349 /* TLPhotoPicker.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867A2642CF5300ED5349 /* TLPhotoPicker.xcframework */; }; - F70B86882642CF5600ED5349 /* TLPhotoPicker.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867A2642CF5300ED5349 /* TLPhotoPicker.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B86892642CF5600ED5349 /* XLForm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867B2642CF5300ED5349 /* XLForm.xcframework */; }; - F70B868A2642CF5600ED5349 /* XLForm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867B2642CF5300ED5349 /* XLForm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B868B2642CF5600ED5349 /* Queuer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867C2642CF5300ED5349 /* Queuer.xcframework */; }; - F70B868C2642CF5600ED5349 /* Queuer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867C2642CF5300ED5349 /* Queuer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B868D2642CF5600ED5349 /* UICKeyChainStore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867D2642CF5400ED5349 /* UICKeyChainStore.xcframework */; }; - F70B868E2642CF5600ED5349 /* UICKeyChainStore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867D2642CF5400ED5349 /* UICKeyChainStore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B86932642CF5700ED5349 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; }; - F70B86942642CF5700ED5349 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B86972642CF5700ED5349 /* TOPasscodeViewController.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; }; - F70B86982642CF5700ED5349 /* TOPasscodeViewController.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B86992642CF5800ED5349 /* FSCalendar.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86832642CF5500ED5349 /* FSCalendar.xcframework */; }; - F70B869A2642CF5800ED5349 /* FSCalendar.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86832642CF5500ED5349 /* FSCalendar.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B869B2642CF5800ED5349 /* DropDown.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86842642CF5500ED5349 /* DropDown.xcframework */; }; - F70B869C2642CF5800ED5349 /* DropDown.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86842642CF5500ED5349 /* DropDown.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F70B869D2642CF6900ED5349 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; }; F70BFC7420E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; }; F70BFC7520E0FA7D00C67599 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; }; F70CAE3A1F8CF31A008125FD /* NCEndToEndEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = F70CAE391F8CF31A008125FD /* NCEndToEndEncryption.m */; }; @@ -106,6 +95,14 @@ F710D1F52405770F00A6033D /* NCViewerPDF.swift in Sources */ = {isa = PBXBuildFile; fileRef = F710D1F42405770F00A6033D /* NCViewerPDF.swift */; }; F710D2022405826100A6033D /* NCViewer+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F710D2012405826100A6033D /* NCViewer+Menu.swift */; }; F710E8111EF95C9C00DC2427 /* ImagesIntro.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F710E80F1EF95C9C00DC2427 /* ImagesIntro.xcassets */; }; + F710FC7A277B7D0000AA9FBF /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC79277B7D0000AA9FBF /* Realm */; }; + F710FC7C277B7D0000AA9FBF /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC7B277B7D0000AA9FBF /* RealmSwift */; }; + F710FC7E277B7D2600AA9FBF /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC7D277B7D2600AA9FBF /* Realm */; }; + F710FC80277B7D2700AA9FBF /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC7F277B7D2700AA9FBF /* RealmSwift */; }; + F710FC82277B7D3500AA9FBF /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC81277B7D3500AA9FBF /* Realm */; }; + F710FC84277B7D3500AA9FBF /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC83277B7D3500AA9FBF /* RealmSwift */; }; + F710FC86277B7D3F00AA9FBF /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC85277B7D3F00AA9FBF /* Realm */; }; + F710FC88277B7D3F00AA9FBF /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F710FC87277B7D3F00AA9FBF /* RealmSwift */; }; F7134186259747BA00768D21 /* NCPushNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = F7134185259747BA00768D21 /* NCPushNotification.m */; }; F713FF002472764100214AF6 /* UIImage+animatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = F713FEFF2472764100214AF6 /* UIImage+animatedGIF.m */; }; F71459D21D12E3B700CAFEEC /* CCUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = F7053E3D1C639DF500741EA5 /* CCUtility.m */; }; @@ -118,15 +115,12 @@ F7148059262ED52200693E51 /* NCSectionHeaderMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD57219048040088454D /* NCSectionHeaderMenu.xib */; }; F714805E262ED52900693E51 /* NCSectionFooter.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD53219047D40088454D /* NCSectionFooter.xib */; }; F7148063262ED66200693E51 /* NCEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7239876253D86D300257F49 /* NCEmptyView.xib */; }; - F716B75A26F0995200D37EFC /* KTVHTTPCache.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; }; - F716B75B26F0995200D37EFC /* KTVHTTPCache.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F716B75C26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; }; - F716B75D26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F716B75F26F09DF600D37EFC /* NCKTVHTTPCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */; }; F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F717402B24F699A5000C87D5 /* NCFavorite.storyboard */; }; F717402E24F699A5000C87D5 /* NCFavorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F717402C24F699A5000C87D5 /* NCFavorite.swift */; }; F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */; }; F7226EDC1EE4089300EBECB1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7226EDB1EE4089300EBECB1 /* Main.storyboard */; }; + F7233B3A27835FA400F40A43 /* ChromaColorPicker in Frameworks */ = {isa = PBXBuildFile; productRef = F7233B3927835FA400F40A43 /* ChromaColorPicker */; }; F723985C253C95CE00257F49 /* NCViewerRichdocument.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F723985B253C95CE00257F49 /* NCViewerRichdocument.storyboard */; }; F7239871253D86B600257F49 /* NCEmptyDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7239870253D86B600257F49 /* NCEmptyDataSet.swift */; }; F7239877253D86D300257F49 /* NCEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7239876253D86D300257F49 /* NCEmptyView.xib */; }; @@ -134,13 +128,13 @@ F726EEEC1FED1C820030B9C8 /* NCEndToEndInitialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = F726EEEB1FED1C820030B9C8 /* NCEndToEndInitialize.swift */; }; F72928A0253B0937009CA4FD /* NCMainNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F729289F253B0937009CA4FD /* NCMainNavigationController.swift */; }; F72A47EC2487B06B005AD489 /* NCOperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72A47EB2487B06B005AD489 /* NCOperationQueue.swift */; }; + F72CD01227A7E92400E59476 /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F72CD01127A7E92400E59476 /* JGProgressHUD */; }; F72CD63A25C19EBF00F46F9A /* NCAutoUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72CD63925C19EBF00F46F9A /* NCAutoUpload.swift */; }; F72D1007210B6882009C96B7 /* NCPushNotificationEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = F72D1005210B6882009C96B7 /* NCPushNotificationEncryption.m */; }; F72D404923D2082500A97FD0 /* NCViewerNextcloudText.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72D404823D2082500A97FD0 /* NCViewerNextcloudText.swift */; }; F72D7EB7263B1207000B3DFC /* MarkdownKit in Frameworks */ = {isa = PBXBuildFile; productRef = F72D7EB6263B1207000B3DFC /* MarkdownKit */; }; F72DA9B425F53E4E00B87DB1 /* SwiftRichString in Frameworks */ = {isa = PBXBuildFile; productRef = F72DA9B325F53E4E00B87DB1 /* SwiftRichString */; }; F733598125C1C188002ABA72 /* NCAskAuthorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = F733598025C1C188002ABA72 /* NCAskAuthorization.swift */; }; - F73521B527396D2900919197 /* IHProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F73521B427396D2900919197 /* IHProgressHUD */; }; F7362A1F220C853A005101B5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7362A1E220C853A005101B5 /* LaunchScreen.storyboard */; }; F7381EE1218218C9000B1560 /* NCOffline.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7381EDA218218C9000B1560 /* NCOffline.swift */; }; F7381EE5218218C9000B1560 /* NCOffline.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7381EDE218218C9000B1560 /* NCOffline.storyboard */; }; @@ -183,11 +177,13 @@ F74C0437253F1CDC009762AB /* NCShares.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F74C0435253F1CDC009762AB /* NCShares.storyboard */; }; F74DE14325135B6800917068 /* NCTransfers.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74DE14125135B6800917068 /* NCTransfers.swift */; }; F74DE14425135B6800917068 /* NCTransfers.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F74DE14225135B6800917068 /* NCTransfers.storyboard */; }; + F74E7720277A2EF40013B958 /* XLForm in Frameworks */ = {isa = PBXBuildFile; productRef = F74E771F277A2EF40013B958 /* XLForm */; }; F7501C322212E57500FB1415 /* NCMedia.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7501C302212E57400FB1415 /* NCMedia.storyboard */; }; F7501C332212E57500FB1415 /* NCMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7501C312212E57400FB1415 /* NCMedia.swift */; }; F755BD9B20594AC7008C5FBB /* NCService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F755BD9A20594AC7008C5FBB /* NCService.swift */; }; F7581D1A25EFDA61004DC699 /* NCLoginWeb+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D1925EFDA60004DC699 /* NCLoginWeb+Menu.swift */; }; F7581D2425EFDDDF004DC699 /* NCMedia+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7581D2325EFDDDF004DC699 /* NCMedia+Menu.swift */; }; + F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F758A01127A7F03E0069468B /* JGProgressHUD */; }; F758B45A212C564000515F55 /* Scan.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F758B457212C564000515F55 /* Scan.storyboard */; }; F758B45E212C569D00515F55 /* ScanCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B45D212C569C00515F55 /* ScanCell.swift */; }; F758B460212C56A400515F55 /* ScanCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B45F212C56A400515F55 /* ScanCollectionView.swift */; }; @@ -226,6 +222,17 @@ F76D3CF12428B40E005DFA87 /* NCViewerPDFSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76D3CF02428B40E005DFA87 /* NCViewerPDFSearch.swift */; }; F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF22428B94E005DFA87 /* NCViewerPDFSearchCell.xib */; }; F76D3CF52428D0C1005DFA87 /* NCViewerPDF.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F76D3CF42428D0C0005DFA87 /* NCViewerPDF.storyboard */; }; + F76DA93F277B75870082465B /* KTVCocoaHTTPServer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; }; + F76DA940277B75870082465B /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + F76DA941277B75870082465B /* KTVHTTPCache.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; }; + F76DA942277B75870082465B /* KTVHTTPCache.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; }; + F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86822642CF5500ED5349 /* TOPasscodeViewController.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + F76DA963277B760E0082465B /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA962277B760E0082465B /* Queuer */; }; + F76DA966277B76F30082465B /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA965277B76F30082465B /* UICKeyChainStore */; }; + F76DA969277B77EA0082465B /* DropDown in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA968277B77EA0082465B /* DropDown */; }; + F76DA96C277B78400082465B /* FSCalendar in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA96B277B78400082465B /* FSCalendar */; }; + F76DA96F277B78AE0082465B /* TLPhotoPicker in Frameworks */ = {isa = PBXBuildFile; productRef = F76DA96E277B78AE0082465B /* TLPhotoPicker */; }; F7707687263A853700A1BA94 /* NCContentPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F765608E23BF813500765969 /* NCContentPresenter.swift */; }; F7707689263A896A00A1BA94 /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B7504A2397D38E004E13EC /* UIImage+Extensions.swift */; }; F770768A263A8A2500A1BA94 /* NCUtilityFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74AF3A3247FB6AE00AC767B /* NCUtilityFileSystem.swift */; }; @@ -258,14 +265,6 @@ F78071091EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m in Sources */ = {isa = PBXBuildFile; fileRef = F78071081EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m */; }; F780710A1EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m in Sources */ = {isa = PBXBuildFile; fileRef = F78071081EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m */; }; F78295311F962EFA00A572F5 /* NCEndToEndEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = F70CAE391F8CF31A008125FD /* NCEndToEndEncryption.m */; }; - F782A57B25123694007BBABD /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F782A57A25123694007BBABD /* Realm */; }; - F782A57D25123694007BBABD /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F782A57C25123694007BBABD /* RealmSwift */; }; - F782A583251236B7007BBABD /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F782A582251236B7007BBABD /* Realm */; }; - F782A585251236B7007BBABD /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F782A584251236B7007BBABD /* RealmSwift */; }; - F782A587251236CA007BBABD /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F782A586251236CA007BBABD /* Realm */; }; - F782A589251236CA007BBABD /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F782A588251236CA007BBABD /* RealmSwift */; }; - F782A58B251236D1007BBABD /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = F782A58A251236D1007BBABD /* Realm */; }; - F782A58D251236D1007BBABD /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F782A58C251236D1007BBABD /* RealmSwift */; }; F782FDC424E6933900666099 /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; }; F785EE9D246196DF00B3F945 /* NCNetworkingE2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F785EE9C246196DF00B3F945 /* NCNetworkingE2EE.swift */; }; F785EE9E2461A09900B3F945 /* NCNetworking.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75A9EE523796C6F0044CFCE /* NCNetworking.swift */; }; @@ -304,7 +303,6 @@ F79B646226CA661600838ACA /* UIControl+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79B645F26CA661600838ACA /* UIControl+Extensions.swift */; }; F79B646326CA661600838ACA /* UIControl+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79B645F26CA661600838ACA /* UIControl+Extensions.swift */; }; F79B869B265E19D40085C0E0 /* NSMutableAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79B869A265E19D40085C0E0 /* NSMutableAttributedString+Extensions.swift */; }; - F79BCEEB270B49C800B5B71F /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F79BCEEA270B49C800B5B71F /* SwiftUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; F79EC77F26316193004E59D6 /* NCRenameFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70D87CE25EE6E58008CBBBD /* NCRenameFile.swift */; }; F79EC784263161BA004E59D6 /* NCRenameFile.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F70D87CD25EE6E58008CBBBD /* NCRenameFile.storyboard */; }; F79EC78926316AC4004E59D6 /* NCPopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F702F30725EE5D47008F8E80 /* NCPopupViewController.swift */; }; @@ -330,6 +328,7 @@ F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */; }; F7BAADCB1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; F7BAADCC1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; + F7BB7E4727A18C56009B9F29 /* Parchment in Frameworks */ = {isa = PBXBuildFile; productRef = F7BB7E4627A18C56009B9F29 /* Parchment */; }; F7BC287E26663F6C004D46C5 /* NCViewCertificateDetails.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */; }; F7BC288026663F85004D46C5 /* NCViewCertificateDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BC287F26663F85004D46C5 /* NCViewCertificateDetails.swift */; }; F7BD71E62636EAFC00643C34 /* NCNetworkingE2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F785EE9C246196DF00B3F945 /* NCNetworkingE2EE.swift */; }; @@ -353,6 +352,15 @@ F7DFB7F4219C5CA800680748 /* NCCreateFormUploadScanDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7DFB7F3219C5CA800680748 /* NCCreateFormUploadScanDocument.swift */; }; F7E0CDCF265CE8610044854E /* NCUserStatus.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7E0CDCE265CE8610044854E /* NCUserStatus.storyboard */; }; F7E4D9C422ED929B003675FD /* NCShareCommentsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E4D9C322ED929B003675FD /* NCShareCommentsCell.swift */; }; + F7E572FD278F146C00F8C99E /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; }; + F7E572FE278F146C00F8C99E /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + F7E57302278F14FF00F8C99E /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86802642CF5400ED5349 /* OpenSSL.xcframework */; }; + F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */; }; + F7EBCDD1277B820D00A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD0277B820D00A4EF67 /* UICKeyChainStore */; }; + F7EBCDD3277B821700A4EF67 /* UICKeyChainStore in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD2277B821700A4EF67 /* UICKeyChainStore */; }; + F7EBCDD5277B82DE00A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD4277B82DE00A4EF67 /* Queuer */; }; + F7EBCDD7277B834400A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD6277B834400A4EF67 /* Queuer */; }; + F7EBCDD9277B834F00A4EF67 /* Queuer in Frameworks */ = {isa = PBXBuildFile; productRef = F7EBCDD8277B834F00A4EF67 /* Queuer */; }; F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */ = {isa = PBXBuildFile; productRef = F7ED547B25EEA65400956C55 /* QRCodeReader */; }; F7EDE4CC262D7B6F00414FE6 /* NCEmptyDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7239870253D86B600257F49 /* NCEmptyDataSet.swift */; }; F7EDE4D1262D7B8400414FE6 /* NCDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7C1EEA425053A9C00866ACC /* NCDataSource.swift */; }; @@ -367,8 +375,6 @@ F7EFC0C6256BC77700461AAD /* NCMoreUserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7EFC0C5256BC77700461AAD /* NCMoreUserCell.xib */; }; F7EFC0CD256BF8DD00461AAD /* NCUserStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7EFC0CC256BF8DD00461AAD /* NCUserStatus.swift */; }; F7F1E54C2492369A00E42386 /* NCMediaCommandView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7F1E54B2492369A00E42386 /* NCMediaCommandView.xib */; }; - F7F5488F273995CE0067475B /* IHProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F7F5488E273995CE0067475B /* IHProgressHUD */; }; - F7F5CE252707089C007ED1CD /* Parchment in Frameworks */ = {isa = PBXBuildFile; productRef = F7F5CE242707089C007ED1CD /* Parchment */; }; F7F878AE1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; }; F7F878AF1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */; }; F7F9D1BB25397CE000D9BFF5 /* NCViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F9D1BA25397CE000D9BFF5 /* NCViewer.swift */; }; @@ -406,23 +412,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - F70B86782642CF5300ED5349 /* Embed Frameworks */ = { + F76DA934277B75710082465B /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - F716B75B26F0995200D37EFC /* KTVHTTPCache.xcframework in Embed Frameworks */, - F70B869A2642CF5800ED5349 /* FSCalendar.xcframework in Embed Frameworks */, - F70B868E2642CF5600ED5349 /* UICKeyChainStore.xcframework in Embed Frameworks */, - F70B86982642CF5700ED5349 /* TOPasscodeViewController.xcframework in Embed Frameworks */, - F70B86942642CF5700ED5349 /* OpenSSL.xcframework in Embed Frameworks */, - F716B75D26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */, - F70B868C2642CF5600ED5349 /* Queuer.xcframework in Embed Frameworks */, - F70B868A2642CF5600ED5349 /* XLForm.xcframework in Embed Frameworks */, - F70B869C2642CF5800ED5349 /* DropDown.xcframework in Embed Frameworks */, - F70B86882642CF5600ED5349 /* TLPhotoPicker.xcframework in Embed Frameworks */, - F70B86772642CF5300ED5349 /* ChromaColorPicker.xcframework in Embed Frameworks */, + F76DA942277B75870082465B /* KTVHTTPCache.xcframework in Embed Frameworks */, + F76DA95C277B75A90082465B /* TOPasscodeViewController.xcframework in Embed Frameworks */, + F7E572FE278F146C00F8C99E /* OpenSSL.xcframework in Embed Frameworks */, + F76DA940277B75870082465B /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -457,11 +456,15 @@ 371B5A3223D0BD5500FAFAE9 /* FloatingPanel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FloatingPanel.framework; path = Carthage/Build/iOS/FloatingPanel.framework; sourceTree = "<group>"; }; 3781B9AF23DB2B7E006B4B1D /* AppDelegate+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Menu.swift"; sourceTree = "<group>"; }; 8491B1CC273BBA82001C8C5B /* UIViewController+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Menu.swift"; sourceTree = "<group>"; }; + AF22B20B277C6F4D00DAB0CC /* NCShareCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareCell.swift; sourceTree = "<group>"; }; + AF22B215277D196700DAB0CC /* NCShareExtension+DataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCShareExtension+DataSource.swift"; sourceTree = "<group>"; }; + AF22B216277D196700DAB0CC /* NCShareExtension+Files.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCShareExtension+Files.swift"; sourceTree = "<group>"; }; AF2D7C7B2742556F00ADF566 /* NCShareLinkCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareLinkCell.swift; sourceTree = "<group>"; }; AF2D7C7D2742559100ADF566 /* NCShareUserCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareUserCell.swift; sourceTree = "<group>"; }; AF4BF613275629E20081CEEF /* NCManageDatabase+Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Account.swift"; sourceTree = "<group>"; }; AF4BF61827562A4B0081CEEF /* NCManageDatabse+Metadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabse+Metadata.swift"; sourceTree = "<group>"; }; AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Activity.swift"; sourceTree = "<group>"; }; + AF730AF927843E4C00B7520E /* NCShareExtension+NCDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCShareExtension+NCDelegate.swift"; sourceTree = "<group>"; }; AF817EF0274BC781009ED85B /* NCUserBaseUrl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUserBaseUrl.swift; sourceTree = "<group>"; }; AF8ED1F92757821000B8DBC4 /* NextcloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NextcloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; AF8ED1FB2757821000B8DBC4 /* NextcloudTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudTests.swift; sourceTree = "<group>"; }; @@ -474,6 +477,21 @@ F700510222DF6897003A3356 /* Parchment.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Parchment.framework; path = Carthage/Build/iOS/Parchment.framework; sourceTree = "<group>"; }; F700510422DF6A89003A3356 /* NCShare.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShare.swift; sourceTree = "<group>"; }; F7020FCD2233D7F700B7297D /* NCCreateFormUploadVoiceNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadVoiceNote.swift; sourceTree = "<group>"; }; + F702864D27735D1400ADA8BE /* libavdevice.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavdevice.xcframework; path = ffmpeg/libavdevice.xcframework; sourceTree = "<group>"; }; + F702864E27735D1400ADA8BE /* ffmpegkit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ffmpegkit.xcframework; path = ffmpeg/ffmpegkit.xcframework; sourceTree = "<group>"; }; + F702864F27735D1500ADA8BE /* libnettle.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libnettle.xcframework; path = ffmpeg/libnettle.xcframework; sourceTree = "<group>"; }; + F702865027735D1500ADA8BE /* libswscale.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libswscale.xcframework; path = ffmpeg/libswscale.xcframework; sourceTree = "<group>"; }; + F702865127735D1500ADA8BE /* gmp.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = gmp.xcframework; path = ffmpeg/gmp.xcframework; sourceTree = "<group>"; }; + F702865227735D1500ADA8BE /* libavcodec.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavcodec.xcframework; path = ffmpeg/libavcodec.xcframework; sourceTree = "<group>"; }; + F702865327735D1500ADA8BE /* libavutil.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavutil.xcframework; path = ffmpeg/libavutil.xcframework; sourceTree = "<group>"; }; + F702865427735D1500ADA8BE /* openh264.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = openh264.xcframework; path = ffmpeg/openh264.xcframework; sourceTree = "<group>"; }; + F702865527735D1600ADA8BE /* libavfilter.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavfilter.xcframework; path = ffmpeg/libavfilter.xcframework; sourceTree = "<group>"; }; + F702865627735D1600ADA8BE /* libhogweed.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libhogweed.xcframework; path = ffmpeg/libhogweed.xcframework; sourceTree = "<group>"; }; + F702865727735D1600ADA8BE /* x264.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = x264.xcframework; path = ffmpeg/x264.xcframework; sourceTree = "<group>"; }; + F702865827735D1600ADA8BE /* libavformat.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavformat.xcframework; path = ffmpeg/libavformat.xcframework; sourceTree = "<group>"; }; + F702865927735D1600ADA8BE /* libswresample.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libswresample.xcframework; path = ffmpeg/libswresample.xcframework; sourceTree = "<group>"; }; + F702865A27735D1700ADA8BE /* gnutls.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = gnutls.xcframework; path = ffmpeg/gnutls.xcframework; sourceTree = "<group>"; }; + F702867E2773609C00ADA8BE /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; F702F2CC25EE5B4F008F8E80 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; F702F2CE25EE5B5C008F8E80 /* NCGlobal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCGlobal.swift; sourceTree = "<group>"; }; F702F2E425EE5C82008F8E80 /* NCAudioRecorderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCAudioRecorderViewController.swift; sourceTree = "<group>"; }; @@ -824,10 +842,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F710FC88277B7D3F00AA9FBF /* RealmSwift in Frameworks */, + F7EBCDD9277B834F00A4EF67 /* Queuer in Frameworks */, + F710FC86277B7D3F00AA9FBF /* Realm in Frameworks */, + F7EBCDD3277B821700A4EF67 /* UICKeyChainStore in Frameworks */, F75E57C325BF0ED2002B72C2 /* SVGKit in Frameworks */, - F782A58D251236D1007BBABD /* RealmSwift in Frameworks */, F786D597253454D800E3DD7B /* NCCommunication in Frameworks */, - F782A58B251236D1007BBABD /* Realm in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -842,13 +862,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F70B869D2642CF6900ED5349 /* OpenSSL.xcframework in Frameworks */, + F7E57302278F14FF00F8C99E /* OpenSSL.xcframework in Frameworks */, + F710FC80277B7D2700AA9FBF /* RealmSwift in Frameworks */, + F72CD01227A7E92400E59476 /* JGProgressHUD in Frameworks */, + F710FC7E277B7D2600AA9FBF /* Realm in Frameworks */, F73ADD2126554F8E0069EA0D /* SwiftEntryKit in Frameworks */, + F7EBCDCF277B81FF00A4EF67 /* UICKeyChainStore in Frameworks */, F75E57BF25BF0EC8002B72C2 /* SVGKit in Frameworks */, - F782A585251236B7007BBABD /* RealmSwift in Frameworks */, - F7F5488F273995CE0067475B /* IHProgressHUD in Frameworks */, + F7EBCDD5277B82DE00A4EF67 /* Queuer in Frameworks */, F786D593253454CE00E3DD7B /* NCCommunication in Frameworks */, - F782A583251236B7007BBABD /* Realm in Frameworks */, F72D7EB7263B1207000B3DFC /* MarkdownKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -857,11 +879,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F7EBCDD1277B820D00A4EF67 /* UICKeyChainStore in Frameworks */, F75E57C125BF0ECD002B72C2 /* SVGKit in Frameworks */, - F782A589251236CA007BBABD /* RealmSwift in Frameworks */, + F7EBCDD7277B834400A4EF67 /* Queuer in Frameworks */, F73ADD2426554FE20069EA0D /* SwiftEntryKit in Frameworks */, + F710FC82277B7D3500AA9FBF /* Realm in Frameworks */, + F710FC84277B7D3500AA9FBF /* RealmSwift in Frameworks */, F786D595253454D300E3DD7B /* NCCommunication in Frameworks */, - F782A587251236CA007BBABD /* Realm in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -869,31 +893,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F79BCEEB270B49C800B5B71F /* SwiftUI.framework in Frameworks */, + F76DA941277B75870082465B /* KTVHTTPCache.xcframework in Frameworks */, F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */, - F70B86972642CF5700ED5349 /* TOPasscodeViewController.xcframework in Frameworks */, F788ECC7263AAAFA00ADC67F /* MarkdownKit in Frameworks */, - F70B869B2642CF5800ED5349 /* DropDown.xcframework in Frameworks */, - F70B86892642CF5600ED5349 /* XLForm.xcframework in Frameworks */, + F7BB7E4727A18C56009B9F29 /* Parchment in Frameworks */, + F7233B3A27835FA400F40A43 /* ChromaColorPicker in Frameworks */, F770768E263A8C3400A1BA94 /* FloatingPanel in Frameworks */, + F710FC7C277B7D0000AA9FBF /* RealmSwift in Frameworks */, + F7E572FD278F146C00F8C99E /* OpenSSL.xcframework in Frameworks */, F786D58D253454BF00E3DD7B /* NCCommunication in Frameworks */, - F70B868B2642CF5600ED5349 /* Queuer.xcframework in Frameworks */, - F716B75C26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Frameworks */, - F782A57B25123694007BBABD /* Realm in Frameworks */, - F716B75A26F0995200D37EFC /* KTVHTTPCache.xcframework in Frameworks */, + F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */, + F76DA96F277B78AE0082465B /* TLPhotoPicker in Frameworks */, + F76DA966277B76F30082465B /* UICKeyChainStore in Frameworks */, + F76DA95B277B75A90082465B /* TOPasscodeViewController.xcframework in Frameworks */, + F76DA963277B760E0082465B /* Queuer in Frameworks */, F75E57BD25BF0EC1002B72C2 /* SVGKit in Frameworks */, F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */, - F70B86992642CF5800ED5349 /* FSCalendar.xcframework in Frameworks */, - F70B86762642CF5300ED5349 /* ChromaColorPicker.xcframework in Frameworks */, + F76DA969277B77EA0082465B /* DropDown in Frameworks */, F75EAED826D2552E00F4320E /* MarqueeLabel in Frameworks */, - F73521B527396D2900919197 /* IHProgressHUD in Frameworks */, + F710FC7A277B7D0000AA9FBF /* Realm in Frameworks */, F72DA9B425F53E4E00B87DB1 /* SwiftRichString in Frameworks */, - F7F5CE252707089C007ED1CD /* Parchment in Frameworks */, - F70B86932642CF5700ED5349 /* OpenSSL.xcframework in Frameworks */, + F74E7720277A2EF40013B958 /* XLForm in Frameworks */, F73ADD1C265546890069EA0D /* SwiftEntryKit in Frameworks */, - F70B868D2642CF5600ED5349 /* UICKeyChainStore.xcframework in Frameworks */, - F782A57D25123694007BBABD /* RealmSwift in Frameworks */, - F70B86872642CF5600ED5349 /* TLPhotoPicker.xcframework in Frameworks */, + F76DA96C277B78400082465B /* FSCalendar in Frameworks */, + F76DA93F277B75870082465B /* KTVCocoaHTTPServer.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1426,6 +1449,10 @@ children = ( F714803A262EBE3900693E51 /* MainInterface.storyboard */, F7148040262EBE4000693E51 /* NCShareExtension.swift */, + AF730AF927843E4C00B7520E /* NCShareExtension+NCDelegate.swift */, + AF22B215277D196700DAB0CC /* NCShareExtension+DataSource.swift */, + AF22B216277D196700DAB0CC /* NCShareExtension+Files.swift */, + AF22B20B277C6F4D00DAB0CC /* NCShareCell.swift */, F7148046262EBE4B00693E51 /* Share-Bridging-Header.h */, ); path = Share; @@ -1622,6 +1649,21 @@ F7FC7D541DC1F93700BB2C6A /* Frameworks */ = { isa = PBXGroup; children = ( + F702867E2773609C00ADA8BE /* libiconv.tbd */, + F702864E27735D1400ADA8BE /* ffmpegkit.xcframework */, + F702865127735D1500ADA8BE /* gmp.xcframework */, + F702865A27735D1700ADA8BE /* gnutls.xcframework */, + F702865227735D1500ADA8BE /* libavcodec.xcframework */, + F702864D27735D1400ADA8BE /* libavdevice.xcframework */, + F702865527735D1600ADA8BE /* libavfilter.xcframework */, + F702865827735D1600ADA8BE /* libavformat.xcframework */, + F702865327735D1500ADA8BE /* libavutil.xcframework */, + F702865627735D1600ADA8BE /* libhogweed.xcframework */, + F702864F27735D1500ADA8BE /* libnettle.xcframework */, + F702865927735D1600ADA8BE /* libswresample.xcframework */, + F702865027735D1500ADA8BE /* libswscale.xcframework */, + F702865427735D1500ADA8BE /* openh264.xcframework */, + F702865727735D1600ADA8BE /* x264.xcframework */, F79BCEEA270B49C800B5B71F /* SwiftUI.framework */, F70B86842642CF5500ED5349 /* DropDown.xcframework */, F70B86832642CF5500ED5349 /* FSCalendar.xcframework */, @@ -1744,10 +1786,12 @@ ); name = "Notification Service Extension"; packageProductDependencies = ( - F782A58A251236D1007BBABD /* Realm */, - F782A58C251236D1007BBABD /* RealmSwift */, F786D596253454D800E3DD7B /* NCCommunication */, F75E57C225BF0ED2002B72C2 /* SVGKit */, + F710FC85277B7D3F00AA9FBF /* Realm */, + F710FC87277B7D3F00AA9FBF /* RealmSwift */, + F7EBCDD2277B821700A4EF67 /* UICKeyChainStore */, + F7EBCDD8277B834F00A4EF67 /* Queuer */, ); productName = "Notification Service Extension"; productReference = 2C33C47F23E2C475005F963B /* Notification Service Extension.appex */; @@ -1785,13 +1829,15 @@ ); name = Share; packageProductDependencies = ( - F782A582251236B7007BBABD /* Realm */, - F782A584251236B7007BBABD /* RealmSwift */, F786D592253454CE00E3DD7B /* NCCommunication */, F75E57BE25BF0EC8002B72C2 /* SVGKit */, F72D7EB6263B1207000B3DFC /* MarkdownKit */, F73ADD2026554F8E0069EA0D /* SwiftEntryKit */, - F7F5488E273995CE0067475B /* IHProgressHUD */, + F710FC7D277B7D2600AA9FBF /* Realm */, + F710FC7F277B7D2700AA9FBF /* RealmSwift */, + F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */, + F7EBCDD4277B82DE00A4EF67 /* Queuer */, + F72CD01127A7E92400E59476 /* JGProgressHUD */, ); productName = "Share Ext"; productReference = F7CE8AFB1DC1F8D8009CAE48 /* Share.appex */; @@ -1811,11 +1857,13 @@ ); name = "File Provider Extension"; packageProductDependencies = ( - F782A586251236CA007BBABD /* Realm */, - F782A588251236CA007BBABD /* RealmSwift */, F786D594253454D300E3DD7B /* NCCommunication */, F75E57C025BF0ECD002B72C2 /* SVGKit */, F73ADD2326554FE20069EA0D /* SwiftEntryKit */, + F710FC81277B7D3500AA9FBF /* Realm */, + F710FC83277B7D3500AA9FBF /* RealmSwift */, + F7EBCDD0277B820D00A4EF67 /* UICKeyChainStore */, + F7EBCDD6277B834400A4EF67 /* Queuer */, ); productName = "File Provider Extension"; productReference = F771E3D020E2392D00AFB62D /* File Provider Extension.appex */; @@ -1829,9 +1877,9 @@ F77B0EDC1D118A16002130FE /* Frameworks */, F77B0EE91D118A16002130FE /* Resources */, F77B0F981D118A16002130FE /* Embed App Extensions */, - F70B86782642CF5300ED5349 /* Embed Frameworks */, F7439BF8265669E800406313 /* Run Script */, AFBFD01327551A54002244BC /* ShellScript */, + F76DA934277B75710082465B /* Embed Frameworks */, ); buildRules = ( ); @@ -1842,8 +1890,6 @@ ); name = Nextcloud; packageProductDependencies = ( - F782A57A25123694007BBABD /* Realm */, - F782A57C25123694007BBABD /* RealmSwift */, F786D58C253454BF00E3DD7B /* NCCommunication */, F75E57BC25BF0EC1002B72C2 /* SVGKit */, F7ED547B25EEA65400956C55 /* QRCodeReader */, @@ -1853,8 +1899,17 @@ F70B86742642CE3B00ED5349 /* FirebaseCrashlytics */, F73ADD1B265546890069EA0D /* SwiftEntryKit */, F75EAED726D2552E00F4320E /* MarqueeLabel */, - F7F5CE242707089C007ED1CD /* Parchment */, - F73521B427396D2900919197 /* IHProgressHUD */, + F74E771F277A2EF40013B958 /* XLForm */, + F76DA962277B760E0082465B /* Queuer */, + F76DA965277B76F30082465B /* UICKeyChainStore */, + F76DA968277B77EA0082465B /* DropDown */, + F76DA96B277B78400082465B /* FSCalendar */, + F76DA96E277B78AE0082465B /* TLPhotoPicker */, + F710FC79277B7D0000AA9FBF /* Realm */, + F710FC7B277B7D0000AA9FBF /* RealmSwift */, + F7233B3927835FA400F40A43 /* ChromaColorPicker */, + F7BB7E4627A18C56009B9F29 /* Parchment */, + F758A01127A7F03E0069468B /* JGProgressHUD */, ); productName = "Crypto Cloud"; productReference = F7CE8AFA1DC1F8D8009CAE48 /* Nextcloud.app */; @@ -1963,7 +2018,6 @@ ); mainGroup = F7F67B9F1A24D27800EE80DA; packageReferences = ( - F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */, F786D58B253454BF00E3DD7B /* XCRemoteSwiftPackageReference "ios-communication-library" */, F75E57A725BF0D61002B72C2 /* XCRemoteSwiftPackageReference "SVGKit" */, F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */, @@ -1973,8 +2027,16 @@ F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */, F75EAED626D2552E00F4320E /* XCRemoteSwiftPackageReference "MarqueeLabel" */, - F7F5CE232707089B007ED1CD /* XCRemoteSwiftPackageReference "Parchment" */, - F73521B327396D2800919197 /* XCRemoteSwiftPackageReference "IHProgressHUD" */, + F74E771E277A2EF40013B958 /* XCRemoteSwiftPackageReference "XLForm" */, + F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */, + F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */, + F76DA967277B77E90082465B /* XCRemoteSwiftPackageReference "DropDown" */, + F76DA96A277B78400082465B /* XCRemoteSwiftPackageReference "FSCalendar" */, + F76DA96D277B78AE0082465B /* XCRemoteSwiftPackageReference "TLPhotoPicker" */, + F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */, + F7233B3827835FA300F40A43 /* XCRemoteSwiftPackageReference "ChromaColorPicker" */, + F7BB7E4527A18C56009B9F29 /* XCRemoteSwiftPackageReference "Parchment" */, + F72CD01027A7E92400E59476 /* XCRemoteSwiftPackageReference "JGProgressHUD" */, ); productRefGroup = F7F67B9F1A24D27800EE80DA; projectDirPath = ""; @@ -2014,7 +2076,9 @@ F7148054262ED51000693E51 /* NCListCell.xib in Resources */, F7D57C8626317BDA00DE301D /* NCAccountRequest.storyboard in Resources */, F7145A1A1D12E3B700CAFEEC /* Images.xcassets in Resources */, + AF22B209277B4E4C00DAB0CC /* NCCreateFormUploadConflictCell.xib in Resources */, F7148063262ED66200693E51 /* NCEmptyView.xib in Resources */, + AF22B207277B4E4C00DAB0CC /* NCCreateFormUploadConflict.storyboard in Resources */, F7145A231D12E3B700CAFEEC /* Localizable.strings in Resources */, F746EC51273906C40052598D /* NCViewCertificateDetails.storyboard in Resources */, F79EC784263161BA004E59D6 /* NCRenameFile.storyboard in Resources */, @@ -2202,6 +2266,7 @@ F7707687263A853700A1BA94 /* NCContentPresenter.swift in Sources */, F70460532499095400BB98A7 /* NotificationCenter+MainThread.swift in Sources */, F70BFC7520E0FA7D00C67599 /* NCUtility.swift in Sources */, + AF22B20C277C6F4D00DAB0CC /* NCShareCell.swift in Sources */, F79B646126CA661600838ACA /* UIControl+Extensions.swift in Sources */, F7EDE4CC262D7B6F00414FE6 /* NCEmptyDataSet.swift in Sources */, AF4BF61A27562A4B0081CEEF /* NCManageDatabse+Metadata.swift in Sources */, @@ -2210,20 +2275,25 @@ AF817EF2274BC781009ED85B /* NCUserBaseUrl.swift in Sources */, F78295311F962EFA00A572F5 /* NCEndToEndEncryption.m in Sources */, F74AF3A5247FB6AE00AC767B /* NCUtilityFileSystem.swift in Sources */, + AF22B206277B4E4C00DAB0CC /* NCCreateFormUploadConflict.swift in Sources */, F7BD71E62636EAFC00643C34 /* NCNetworkingE2EE.swift in Sources */, F7F878AF1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */, + AF22B218277D196700DAB0CC /* NCShareExtension+Files.swift in Sources */, F702F2D025EE5B5C008F8E80 /* NCGlobal.swift in Sources */, F7EDE4DB262D7BA200414FE6 /* NCCellProtocol.swift in Sources */, F7EDE4D1262D7B8400414FE6 /* NCDataSource.swift in Sources */, F71459D21D12E3B700CAFEEC /* CCUtility.m in Sources */, F75A9EE723796C6F0044CFCE /* NCNetworking.swift in Sources */, + AF730AFA27843E4C00B7520E /* NCShareExtension+NCDelegate.swift in Sources */, F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */, F7A76DC8256A71CD00119AB3 /* UIImage+Extensions.swift in Sources */, F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */, F7BAADC91ED5A87C00B7EAD4 /* NCDatabase.swift in Sources */, F7D57C8B26317BDE00DE301D /* NCAccountRequest.swift in Sources */, + AF22B217277D196700DAB0CC /* NCShareExtension+DataSource.swift in Sources */, F780710A1EDAB65800EAFFF6 /* NSNotificationCenter+MainThread.m in Sources */, F79EC77F26316193004E59D6 /* NCRenameFile.swift in Sources */, + AF22B208277B4E4C00DAB0CC /* NCCreateFormUploadConflictCell.swift in Sources */, F7148041262EBE4000693E51 /* NCShareExtension.swift in Sources */, F76B3CCF1EAE01BD00921AC9 /* NCBrand.swift in Sources */, F7BAADCC1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */, @@ -2508,7 +2578,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2521,14 +2590,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/Notification_Service_Extension.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-ObjC"; @@ -2562,7 +2630,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2575,14 +2642,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/Notification_Service_Extension.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.Notification-Service-Extension"; @@ -2609,7 +2675,6 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 6JLRKY9ZV7; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2624,7 +2689,6 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; @@ -2651,7 +2715,6 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2662,7 +2725,6 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2684,7 +2746,6 @@ CODE_SIGN_ENTITLEMENTS = iOSClient/Brand/Share.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2697,14 +2758,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/Share.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2730,7 +2790,6 @@ CODE_SIGN_ENTITLEMENTS = iOSClient/Brand/Share.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2743,14 +2802,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/Share.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2783,7 +2841,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2796,14 +2853,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/File_Provider_Extension.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2836,7 +2892,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 6JLRKY9ZV7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2849,14 +2904,13 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/File_Provider_Extension.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2881,7 +2935,6 @@ CODE_SIGN_ENTITLEMENTS = iOSClient/Brand/iOSClient.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = 6JLRKY9ZV7; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2891,15 +2944,18 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/iOSClient.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; - OTHER_LDFLAGS = "-ObjC"; + OTHER_LDFLAGS = ( + "-ObjC", + "-weak_framework", + SwiftUI, + ); OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2929,7 +2985,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = 6JLRKY9ZV7; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -2938,15 +2993,18 @@ GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "$(SRCROOT)/iOSClient/Brand/iOSClient.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 4.2.0; - OTHER_LDFLAGS = "-ObjC"; + OTHER_LDFLAGS = ( + "-ObjC", + "-weak_framework", + SwiftUI, + ); PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -2993,6 +3051,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 7; DEFINES_MODULE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -3012,7 +3071,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MARKETING_VERSION = 4.2.1; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( @@ -3057,6 +3117,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 7; DEFINES_MODULE = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -3072,7 +3133,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MARKETING_VERSION = 4.2.1; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ( "-Obj-C", @@ -3155,22 +3217,38 @@ minimumVersion = 8.9.0; }; }; - F72DA9B225F53E4E00B87DB1 /* XCRemoteSwiftPackageReference "SwiftRichString" */ = { + F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/malcommac/SwiftRichString"; + repositoryURL = "https://github.com/realm/realm-swift"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 3.7.2; + minimumVersion = 10.0.0; }; }; - F73521B327396D2800919197 /* XCRemoteSwiftPackageReference "IHProgressHUD" */ = { + F7233B3827835FA300F40A43 /* XCRemoteSwiftPackageReference "ChromaColorPicker" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/marinofaggiana/IHProgressHUD"; + repositoryURL = "https://github.com/marinofaggiana/ChromaColorPicker"; requirement = { branch = master; kind = branch; }; }; + F72CD01027A7E92400E59476 /* XCRemoteSwiftPackageReference "JGProgressHUD" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/JonasGessner/JGProgressHUD.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.0.0; + }; + }; + F72DA9B225F53E4E00B87DB1 /* XCRemoteSwiftPackageReference "SwiftRichString" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/malcommac/SwiftRichString"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.7.2; + }; + }; F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/huri000/SwiftEntryKit"; @@ -3179,6 +3257,14 @@ minimumVersion = 1.2.7; }; }; + F74E771E277A2EF40013B958 /* XCRemoteSwiftPackageReference "XLForm" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/xmartlabs/XLForm"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.0.0; + }; + }; F75E57A725BF0D61002B72C2 /* XCRemoteSwiftPackageReference "SVGKit" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SVGKit/SVGKit.git"; @@ -3195,20 +3281,52 @@ minimumVersion = 4.3.0; }; }; - F770768C263A8C3400A1BA94 /* XCRemoteSwiftPackageReference "FloatingPanel" */ = { + F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/scenee/FloatingPanel"; + repositoryURL = "https://github.com/FabrizioBrancati/Queuer"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.0.0; + }; + }; + F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kishikawakatsumi/UICKeyChainStore"; + requirement = { + branch = master; + kind = branch; + }; + }; + F76DA967277B77E90082465B /* XCRemoteSwiftPackageReference "DropDown" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/AssistoLab/DropDown"; + requirement = { + branch = master; + kind = branch; + }; + }; + F76DA96A277B78400082465B /* XCRemoteSwiftPackageReference "FSCalendar" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/WenchaoD/FSCalendar"; requirement = { kind = upToNextMajorVersion; minimumVersion = 2.0.0; }; }; - F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */ = { + F76DA96D277B78AE0082465B /* XCRemoteSwiftPackageReference "TLPhotoPicker" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/realm/realm-cocoa"; + repositoryURL = "https://github.com/tilltue/TLPhotoPicker"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 10.20.1; + minimumVersion = 2.0.0; + }; + }; + F770768C263A8C3400A1BA94 /* XCRemoteSwiftPackageReference "FloatingPanel" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/scenee/FloatingPanel"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.0.0; }; }; F786D58B253454BF00E3DD7B /* XCRemoteSwiftPackageReference "ios-communication-library" */ = { @@ -3216,7 +3334,7 @@ repositoryURL = "https://github.com/nextcloud/ios-communication-library/"; requirement = { kind = exactVersion; - version = 0.99.3; + version = 0.99.4; }; }; F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */ = { @@ -3227,20 +3345,20 @@ minimumVersion = 1.7.1; }; }; - F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */ = { + F7BB7E4527A18C56009B9F29 /* XCRemoteSwiftPackageReference "Parchment" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/yannickl/QRCodeReader.swift"; + repositoryURL = "https://github.com/rechsteiner/Parchment"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 10.1.1; + branch = main; + kind = branch; }; }; - F7F5CE232707089B007ED1CD /* XCRemoteSwiftPackageReference "Parchment" */ = { + F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/marinofaggiana/Parchment"; + repositoryURL = "https://github.com/yannickl/QRCodeReader.swift"; requirement = { - branch = master; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 10.1.1; }; }; /* End XCRemoteSwiftPackageReference section */ @@ -3251,6 +3369,56 @@ package = F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; productName = FirebaseCrashlytics; }; + F710FC79277B7D0000AA9FBF /* Realm */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = Realm; + }; + F710FC7B277B7D0000AA9FBF /* RealmSwift */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = RealmSwift; + }; + F710FC7D277B7D2600AA9FBF /* Realm */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = Realm; + }; + F710FC7F277B7D2700AA9FBF /* RealmSwift */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = RealmSwift; + }; + F710FC81277B7D3500AA9FBF /* Realm */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = Realm; + }; + F710FC83277B7D3500AA9FBF /* RealmSwift */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = RealmSwift; + }; + F710FC85277B7D3F00AA9FBF /* Realm */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = Realm; + }; + F710FC87277B7D3F00AA9FBF /* RealmSwift */ = { + isa = XCSwiftPackageProductDependency; + package = F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */; + productName = RealmSwift; + }; + F7233B3927835FA400F40A43 /* ChromaColorPicker */ = { + isa = XCSwiftPackageProductDependency; + package = F7233B3827835FA300F40A43 /* XCRemoteSwiftPackageReference "ChromaColorPicker" */; + productName = ChromaColorPicker; + }; + F72CD01127A7E92400E59476 /* JGProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = F72CD01027A7E92400E59476 /* XCRemoteSwiftPackageReference "JGProgressHUD" */; + productName = JGProgressHUD; + }; F72D7EB6263B1207000B3DFC /* MarkdownKit */ = { isa = XCSwiftPackageProductDependency; package = F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */; @@ -3261,11 +3429,6 @@ package = F72DA9B225F53E4E00B87DB1 /* XCRemoteSwiftPackageReference "SwiftRichString" */; productName = SwiftRichString; }; - F73521B427396D2900919197 /* IHProgressHUD */ = { - isa = XCSwiftPackageProductDependency; - package = F73521B327396D2800919197 /* XCRemoteSwiftPackageReference "IHProgressHUD" */; - productName = IHProgressHUD; - }; F73ADD1B265546890069EA0D /* SwiftEntryKit */ = { isa = XCSwiftPackageProductDependency; package = F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */; @@ -3281,6 +3444,16 @@ package = F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */; productName = SwiftEntryKit; }; + F74E771F277A2EF40013B958 /* XLForm */ = { + isa = XCSwiftPackageProductDependency; + package = F74E771E277A2EF40013B958 /* XCRemoteSwiftPackageReference "XLForm" */; + productName = XLForm; + }; + F758A01127A7F03E0069468B /* JGProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = F72CD01027A7E92400E59476 /* XCRemoteSwiftPackageReference "JGProgressHUD" */; + productName = JGProgressHUD; + }; F75E57BC25BF0EC1002B72C2 /* SVGKit */ = { isa = XCSwiftPackageProductDependency; package = F75E57A725BF0D61002B72C2 /* XCRemoteSwiftPackageReference "SVGKit" */; @@ -3306,50 +3479,35 @@ package = F75EAED626D2552E00F4320E /* XCRemoteSwiftPackageReference "MarqueeLabel" */; productName = MarqueeLabel; }; - F770768D263A8C3400A1BA94 /* FloatingPanel */ = { - isa = XCSwiftPackageProductDependency; - package = F770768C263A8C3400A1BA94 /* XCRemoteSwiftPackageReference "FloatingPanel" */; - productName = FloatingPanel; - }; - F782A57A25123694007BBABD /* Realm */ = { - isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = Realm; - }; - F782A57C25123694007BBABD /* RealmSwift */ = { + F76DA962277B760E0082465B /* Queuer */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = RealmSwift; - }; - F782A582251236B7007BBABD /* Realm */ = { - isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = Realm; + package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */; + productName = Queuer; }; - F782A584251236B7007BBABD /* RealmSwift */ = { + F76DA965277B76F30082465B /* UICKeyChainStore */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = RealmSwift; + package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */; + productName = UICKeyChainStore; }; - F782A586251236CA007BBABD /* Realm */ = { + F76DA968277B77EA0082465B /* DropDown */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = Realm; + package = F76DA967277B77E90082465B /* XCRemoteSwiftPackageReference "DropDown" */; + productName = DropDown; }; - F782A588251236CA007BBABD /* RealmSwift */ = { + F76DA96B277B78400082465B /* FSCalendar */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = RealmSwift; + package = F76DA96A277B78400082465B /* XCRemoteSwiftPackageReference "FSCalendar" */; + productName = FSCalendar; }; - F782A58A251236D1007BBABD /* Realm */ = { + F76DA96E277B78AE0082465B /* TLPhotoPicker */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = Realm; + package = F76DA96D277B78AE0082465B /* XCRemoteSwiftPackageReference "TLPhotoPicker" */; + productName = TLPhotoPicker; }; - F782A58C251236D1007BBABD /* RealmSwift */ = { + F770768D263A8C3400A1BA94 /* FloatingPanel */ = { isa = XCSwiftPackageProductDependency; - package = F782A57925123694007BBABD /* XCRemoteSwiftPackageReference "realm-cocoa" */; - productName = RealmSwift; + package = F770768C263A8C3400A1BA94 /* XCRemoteSwiftPackageReference "FloatingPanel" */; + productName = FloatingPanel; }; F786D58C253454BF00E3DD7B /* NCCommunication */ = { isa = XCSwiftPackageProductDependency; @@ -3376,20 +3534,45 @@ package = F788ECC5263AAAF900ADC67F /* XCRemoteSwiftPackageReference "MarkdownKit" */; productName = MarkdownKit; }; - F7ED547B25EEA65400956C55 /* QRCodeReader */ = { + F7BB7E4627A18C56009B9F29 /* Parchment */ = { isa = XCSwiftPackageProductDependency; - package = F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */; - productName = QRCodeReader; + package = F7BB7E4527A18C56009B9F29 /* XCRemoteSwiftPackageReference "Parchment" */; + productName = Parchment; }; - F7F5488E273995CE0067475B /* IHProgressHUD */ = { + F7EBCDCE277B81FF00A4EF67 /* UICKeyChainStore */ = { isa = XCSwiftPackageProductDependency; - package = F73521B327396D2800919197 /* XCRemoteSwiftPackageReference "IHProgressHUD" */; - productName = IHProgressHUD; + package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */; + productName = UICKeyChainStore; }; - F7F5CE242707089C007ED1CD /* Parchment */ = { + F7EBCDD0277B820D00A4EF67 /* UICKeyChainStore */ = { isa = XCSwiftPackageProductDependency; - package = F7F5CE232707089B007ED1CD /* XCRemoteSwiftPackageReference "Parchment" */; - productName = Parchment; + package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */; + productName = UICKeyChainStore; + }; + F7EBCDD2277B821700A4EF67 /* UICKeyChainStore */ = { + isa = XCSwiftPackageProductDependency; + package = F76DA964277B76F10082465B /* XCRemoteSwiftPackageReference "UICKeyChainStore" */; + productName = UICKeyChainStore; + }; + F7EBCDD4277B82DE00A4EF67 /* Queuer */ = { + isa = XCSwiftPackageProductDependency; + package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */; + productName = Queuer; + }; + F7EBCDD6277B834400A4EF67 /* Queuer */ = { + isa = XCSwiftPackageProductDependency; + package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */; + productName = Queuer; + }; + F7EBCDD8277B834F00A4EF67 /* Queuer */ = { + isa = XCSwiftPackageProductDependency; + package = F76DA961277B760E0082465B /* XCRemoteSwiftPackageReference "Queuer" */; + productName = Queuer; + }; + F7ED547B25EEA65400956C55 /* QRCodeReader */ = { + isa = XCSwiftPackageProductDependency; + package = F7ED547A25EEA65400956C55 /* XCRemoteSwiftPackageReference "QRCodeReader" */; + productName = QRCodeReader; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/Nextcloud.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Nextcloud.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 93020ee70..a5f4f1b8c 100644 --- a/Nextcloud.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Nextcloud.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -15,8 +15,8 @@ "repositoryURL": "https://github.com/Alamofire/Alamofire", "state": { "branch": null, - "revision": "d120af1e8638c7da36c8481fd61a66c0c08dc4fc", - "version": "5.4.4" + "revision": "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864", + "version": "5.5.0" } }, { @@ -29,12 +29,30 @@ } }, { + "package": "ChromaColorPicker", + "repositoryURL": "https://github.com/marinofaggiana/ChromaColorPicker", + "state": { + "branch": "master", + "revision": "b1b2c58c3c5617c73863a073cb6393c79195932e", + "version": null + } + }, + { "package": "CocoaLumberjack", "repositoryURL": "https://github.com/CocoaLumberjack/CocoaLumberjack.git", "state": { "branch": null, - "revision": "e518eb6e362df327574ba5e04269cd6d29f40aec", - "version": "3.7.2" + "revision": "80ada1f753b0d53d9b57c465936a7c4169375002", + "version": "3.7.4" + } + }, + { + "package": "DropDown", + "repositoryURL": "https://github.com/AssistoLab/DropDown", + "state": { + "branch": "master", + "revision": "2ab6f6ce19f0117d1a76ea043ef8f57722c65d16", + "version": null } }, { @@ -42,8 +60,8 @@ "repositoryURL": "https://github.com/firebase/firebase-ios-sdk", "state": { "branch": null, - "revision": "08686f04881483d2bc098b2696e674c0ba135e47", - "version": "8.10.0" + "revision": "5344857522053b5d4403ec8173ec0d23200a97ea", + "version": "8.11.0" } }, { @@ -56,6 +74,15 @@ } }, { + "package": "FSCalendar", + "repositoryURL": "https://github.com/WenchaoD/FSCalendar", + "state": { + "branch": null, + "revision": "afaf247581eb1f8aea847f2e6c99c665ae900494", + "version": "2.8.3" + } + }, + { "package": "GoogleAppMeasurement", "repositoryURL": "https://github.com/google/GoogleAppMeasurement.git", "state": { @@ -78,8 +105,8 @@ "repositoryURL": "https://github.com/google/GoogleUtilities.git", "state": { "branch": null, - "revision": "797005ad8a1f0614063933e2fa010a5d13cb09d0", - "version": "7.6.0" + "revision": "b3bb0c5551fb3f80ca939829639ab5b093edd14f", + "version": "7.7.0" } }, { @@ -101,21 +128,21 @@ } }, { - "package": "IHProgressHUD", - "repositoryURL": "https://github.com/marinofaggiana/IHProgressHUD", + "package": "NCCommunication", + "repositoryURL": "https://github.com/nextcloud/ios-communication-library/", "state": { - "branch": "master", - "revision": "a3d94dfb869ff9b2f9e5a4d0359a73a625072853", - "version": null + "branch": null, + "revision": "c7aabb42f734f30c2e325dec4000c59349f33005", + "version": "0.99.4" } }, { - "package": "NCCommunication", - "repositoryURL": "https://github.com/nextcloud/ios-communication-library/", + "package": "JGProgressHUD", + "repositoryURL": "https://github.com/JonasGessner/JGProgressHUD.git", "state": { "branch": null, - "revision": "c8e3eac61a846775d570b1d252612a8d2d02930d", - "version": "0.99.3" + "revision": "78d7cd35f1d90ff74fd82e486f2cbe4b24be8cf9", + "version": "2.2.0" } }, { @@ -156,10 +183,10 @@ }, { "package": "Parchment", - "repositoryURL": "https://github.com/marinofaggiana/Parchment", + "repositoryURL": "https://github.com/rechsteiner/Parchment", "state": { - "branch": "master", - "revision": "f4081dbd1a1793217686a381330e90b6626710c7", + "branch": "main", + "revision": "cad6924f8a292eecaedc1bdefb57006f7979b9eb", "version": null } }, @@ -182,6 +209,15 @@ } }, { + "package": "Queuer", + "repositoryURL": "https://github.com/FabrizioBrancati/Queuer", + "state": { + "branch": null, + "revision": "52515108d0ac4616d9e15ffcc7ad986e300d31ff", + "version": "2.1.1" + } + }, + { "package": "QuickLayout", "repositoryURL": "https://github.com/huri000/QuickLayout", "state": { @@ -191,21 +227,21 @@ } }, { - "package": "Realm", - "repositoryURL": "https://github.com/realm/realm-cocoa", + "package": "RealmDatabase", + "repositoryURL": "https://github.com/realm/realm-core", "state": { "branch": null, - "revision": "f483fa0a52f6d49897d133a827510a35e21183c1", - "version": "10.20.1" + "revision": "6b81f1a7a2d421f9e0b9e7f04e76bcf736a54409", + "version": "11.9.0" } }, { - "package": "RealmDatabase", - "repositoryURL": "https://github.com/realm/realm-core", + "package": "Realm", + "repositoryURL": "https://github.com/realm/realm-swift", "state": { "branch": null, - "revision": "c3c11a841642ac93c27bd1edd61f989fc0bfb809", - "version": "11.6.1" + "revision": "9dff9f2862240d521ad6ad599541269177ddb993", + "version": "10.22.0" } }, { @@ -270,6 +306,33 @@ "revision": "d7a1d23f04c86c1cd2e8f19247dd15d74e0ea8be", "version": "5.6.0" } + }, + { + "package": "TLPhotoPicker", + "repositoryURL": "https://github.com/tilltue/TLPhotoPicker", + "state": { + "branch": null, + "revision": "0d0cbbd2d20ed5fd36e5f4052209f5e2d9aaa8b7", + "version": "2.1.9" + } + }, + { + "package": "UICKeyChainStore", + "repositoryURL": "https://github.com/kishikawakatsumi/UICKeyChainStore", + "state": { + "branch": "master", + "revision": "db869212bc69b6198a62efe03e2f5fc8e19c6b65", + "version": null + } + }, + { + "package": "XLForm", + "repositoryURL": "https://github.com/xmartlabs/XLForm", + "state": { + "branch": null, + "revision": "870afc56602fd518e33d0b271371a2d5acd410ea", + "version": "4.3.0" + } } ] }, @@ -41,7 +41,7 @@ branch. Maybe start working on [starter issues](https://github.com/nextcloud/ios Easy starting points are also reviewing [pull requests](https://github.com/nextcloud/ios/pulls) -### Xcode 13 Project Setup +### Xcode 13.2 Project Setup #### Dependencies diff --git a/Share/MainInterface.storyboard b/Share/MainInterface.storyboard index 3862d7da3..16924d3b6 100644 --- a/Share/MainInterface.storyboard +++ b/Share/MainInterface.storyboard @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EAU-PF-EEd"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EAU-PF-EEd"> <device id="retina6_5" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> @@ -46,39 +46,42 @@ <rect key="frame" x="10" y="70" width="394" height="220"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <prototypes> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="Cell" rowHeight="50" id="6Kt-n0-i8J"> - <rect key="frame" x="0.0" y="24.333333969116211" width="394" height="50"/> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="Cell" rowHeight="50" id="6Kt-n0-i8J" customClass="NCShareCell" customModule="Share" customModuleProvider="target"> + <rect key="frame" x="0.0" y="44.666666030883789" width="394" height="50"/> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="6Kt-n0-i8J" id="WGN-Zn-lR8"> <rect key="frame" x="0.0" y="0.0" width="394" height="50"/> <autoresizingMask key="autoresizingMask"/> <subviews> - <imageView clipsSubviews="YES" userInteractionEnabled="NO" tag="10" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="uvl-De-S9p"> + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="uvl-De-S9p"> <rect key="frame" x="10" y="5" width="40" height="40"/> <constraints> <constraint firstAttribute="width" constant="40" id="Vpb-6e-ta9"/> <constraint firstAttribute="height" constant="40" id="wvf-Ey-woY"/> </constraints> </imageView> - <label opaque="NO" userInteractionEnabled="NO" tag="20" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="filename" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rz6-pe-DB5"> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="filename" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rz6-pe-DB5"> <rect key="frame" x="60" y="10" width="284" height="17"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> - <label opaque="NO" userInteractionEnabled="NO" tag="40" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QFh-Vy-b4Z"> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QFh-Vy-b4Z"> <rect key="frame" x="60" y="29.999999999999996" width="284" height="14.333333333333332"/> <fontDescription key="fontDescription" type="system" pointSize="12"/> <color key="textColor" systemColor="systemGray2Color"/> <nil key="highlightedColor"/> </label> - <button opaque="NO" tag="30" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OGY-95-ZYi" customClass="NCShareExtensionButtonWithIndexPath" customModule="Share" customModuleProvider="target"> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OGY-95-ZYi"> <rect key="frame" x="354" y="10" width="30" height="30"/> <constraints> <constraint firstAttribute="height" constant="30" id="QqR-Uw-RnV"/> <constraint firstAttribute="width" constant="30" id="bpm-t5-3HA"/> </constraints> <state key="normal" image="more"/> + <connections> + <action selector="buttonTapped:" destination="6Kt-n0-i8J" eventType="touchUpInside" id="Xx7-1X-AhZ"/> + </connections> </button> </subviews> <constraints> @@ -95,6 +98,12 @@ </constraints> </tableViewCellContentView> <inset key="separatorInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> + <connections> + <outlet property="fileNameCell" destination="rz6-pe-DB5" id="e8w-G7-bBe"/> + <outlet property="imageCell" destination="uvl-De-S9p" id="S4F-TD-YGI"/> + <outlet property="moreButton" destination="OGY-95-ZYi" id="vA3-mU-S1e"/> + <outlet property="sizeCell" destination="QFh-Vy-b4Z" id="rmM-qr-QXU"/> + </connections> </tableViewCell> </prototypes> <connections> diff --git a/Share/NCShareCell.swift b/Share/NCShareCell.swift new file mode 100644 index 000000000..15e1504ab --- /dev/null +++ b/Share/NCShareCell.swift @@ -0,0 +1,82 @@ +// +// NCShareCell.swift +// Share +// +// Created by Henrik Storch on 29.12.21. +// Copyright © 2021 Henrik Storch. All rights reserved. +// +// Author Henrik Storch <henrik.storch@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 UIKit +import NCCommunication + +protocol NCShareCellDelegate: AnyObject { + var uploadStarted: Bool { get } + func removeFile(named fileName: String) + func renameFile(named fileName: String) +} + +class NCShareCell: UITableViewCell { + @IBOutlet weak var imageCell: UIImageView! + @IBOutlet weak var fileNameCell: UILabel! + @IBOutlet weak var moreButton: UIButton! + @IBOutlet weak var sizeCell: UILabel! + weak var delegate: (NCShareCellDelegate & UIViewController)? + var fileName = "" + + func setup(fileName: String) { + self.fileName = fileName + let resultInternalType = NCCommunicationCommon.shared.getInternalType(fileName: fileName, mimeType: "", directory: false) + + backgroundColor = NCBrandColor.shared.systemBackground + imageCell?.layer.cornerRadius = 6 + imageCell?.layer.masksToBounds = true + + if let image = UIImage.downsample(imageAt: URL(fileURLWithPath: NSTemporaryDirectory() + fileName), to: CGSize(width: 80, height: 80)) { + imageCell.image = image + } else { + if !resultInternalType.iconName.isEmpty { + imageCell?.image = UIImage(named: resultInternalType.iconName) + } else { + imageCell?.image = NCBrandColor.cacheImages.file + } + } + + fileNameCell?.text = fileName + + let fileSize = NCUtilityFileSystem.shared.getFileSize(filePath: (NSTemporaryDirectory() + fileName)) + sizeCell?.text = CCUtility.transformedSize(fileSize) + + moreButton?.setImage(NCUtility.shared.loadImage(named: "more").image(color: NCBrandColor.shared.label, size: 15), for: .normal) + } + + @IBAction func buttonTapped(_ sender: Any) { + guard !fileName.isEmpty, delegate?.uploadStarted != true else { return } + let alertController = UIAlertController(title: "", message: fileName, preferredStyle: .alert) + + alertController.addAction(UIAlertAction(title: NSLocalizedString("_rename_file_", comment: ""), style: .default) { _ in + self.delegate?.renameFile(named: self.fileName) + }) + + alertController.addAction(UIAlertAction(title: NSLocalizedString("_remove_file_", comment: ""), style: .default) { _ in + self.delegate?.removeFile(named: self.fileName) + }) + + alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { _ in }) + delegate?.present(alertController, animated: true, completion: nil) + } +} diff --git a/Share/NCShareExtension+DataSource.swift b/Share/NCShareExtension+DataSource.swift new file mode 100644 index 000000000..ef2ec2a99 --- /dev/null +++ b/Share/NCShareExtension+DataSource.swift @@ -0,0 +1,180 @@ +// +// NCShareExtension+DataSource.swift +// Share +// +// Created by Henrik Storch on 29.12.21. +// Copyright © 2021 Henrik Storch. All rights reserved. +// +// Author Henrik Storch <henrik.storch@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 UIKit +import NCCommunication + +// MARK: - Collection View (target folder) + +extension NCShareExtension: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let metadata = dataSource.cellForItemAt(indexPath: indexPath), + let serverUrl = CCUtility.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName) else { + return showAlert(description: "_invalid_url_") + } + + if metadata.e2eEncrypted && !CCUtility.isEnd(toEndEnabled: activeAccount.account) { + showAlert(title: "_info_", description: "_e2e_goto_settings_for_enable_") + } + + self.serverUrl = serverUrl + reloadDatasource(withLoadFolder: true) + setNavigationBar(navigationTitle: metadata.fileNameView) + } +} + +extension NCShareExtension: UICollectionViewDataSource { + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + let numberOfItems = dataSource.numberOfItems() + emptyDataSet?.numberOfItemsInSection(numberOfItems, section: section) + return numberOfItems + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + + guard let metadata = dataSource.cellForItemAt(indexPath: indexPath), let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listCell", for: indexPath) as? NCListCell else { + return UICollectionViewCell() + } + + cell.delegate = self + + cell.fileObjectId = metadata.ocId + cell.fileUser = metadata.ownerId + cell.labelTitle.text = metadata.fileNameView + cell.labelTitle.textColor = NCBrandColor.shared.label + + cell.imageSelect.image = nil + cell.imageStatus.image = nil + cell.imageLocal.image = nil + cell.imageFavorite.image = nil + cell.imageShared.image = nil + cell.imageMore.image = nil + cell.imageItem.image = nil + cell.imageItem.backgroundColor = nil + + cell.progressView.progress = 0.0 + + if metadata.directory { + setupDirectoryCell(cell, with: metadata) + } + + // image Favorite + if metadata.favorite { + cell.imageFavorite.image = NCBrandColor.cacheImages.favorite + } + + cell.imageSelect.isHidden = true + cell.backgroundView = nil + cell.hideButtonMore(true) + cell.hideButtonShare(true) + cell.selectMode(false) + + // Live Photo + if metadata.livePhoto { + cell.imageStatus.image = NCBrandColor.cacheImages.livePhoto + } + + // Remove last separator + cell.separator.isHidden = collectionView.numberOfItems(inSection: indexPath.section) == indexPath.row + 1 + + return cell + } + + func setupDirectoryCell(_ cell: NCListCell, with metadata: tableMetadata) { + var isShare = false + var isMounted = false + if let metadataFolder = metadataFolder { + isShare = metadata.permissions.contains(NCGlobal.shared.permissionShared) && !metadataFolder.permissions.contains(NCGlobal.shared.permissionShared) + isMounted = metadata.permissions.contains(NCGlobal.shared.permissionMounted) && !metadataFolder.permissions.contains(NCGlobal.shared.permissionMounted) + } + + var tableShare: tableShare? + if dataSource.metadataShare[metadata.ocId] != nil { + tableShare = dataSource.metadataShare[metadata.ocId] + } + + if metadata.e2eEncrypted { + cell.imageItem.image = NCBrandColor.cacheImages.folderEncrypted + } else if isShare { + cell.imageItem.image = NCBrandColor.cacheImages.folderSharedWithMe + } else if tableShare != nil && tableShare?.shareType != 3 { + cell.imageItem.image = NCBrandColor.cacheImages.folderSharedWithMe + } else if tableShare != nil && tableShare?.shareType == 3 { + cell.imageItem.image = NCBrandColor.cacheImages.folderPublic + } else if metadata.mountType == "group" { + cell.imageItem.image = NCBrandColor.cacheImages.folderGroup + } else if isMounted { + cell.imageItem.image = NCBrandColor.cacheImages.folderExternal + } else if metadata.fileName == autoUploadFileName && metadata.serverUrl == autoUploadDirectory { + cell.imageItem.image = NCBrandColor.cacheImages.folderAutomaticUpload + } else { + cell.imageItem.image = NCBrandColor.cacheImages.folder + } + + cell.labelInfo.text = CCUtility.dateDiff(metadata.date as Date) + + let lockServerUrl = CCUtility.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName)! + let tableDirectory = NCManageDatabase.shared.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", activeAccount.account, lockServerUrl)) + + // Local image: offline + if tableDirectory != nil && tableDirectory!.offline { + cell.imageLocal.image = NCBrandColor.cacheImages.offlineFlag + } + } +} + +// MARK: - Table View (uploading files) + +extension NCShareExtension: UITableViewDelegate { + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return heightRowTableView + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard !uploadStarted else { return } + let fileName = filesName[indexPath.row] + renameFile(named: fileName) + } +} + +extension NCShareExtension: UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + filesName.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? NCShareCell else { return UITableViewCell() } + let fileName = filesName[indexPath.row] + cell.setup(fileName: fileName) + cell.delegate = self + return cell + } +} diff --git a/Share/NCShareExtension+Files.swift b/Share/NCShareExtension+Files.swift new file mode 100644 index 000000000..13f05e8dc --- /dev/null +++ b/Share/NCShareExtension+Files.swift @@ -0,0 +1,215 @@ +// +// NCShareExtension+Files.swift +// Share +// +// Created by Henrik Storch on 29.12.21. +// Copyright © 2021 Henrik Storch. All rights reserved. +// +// Author Henrik Storch <henrik.storch@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 + +extension NCShareExtension { + + @objc func reloadDatasource(withLoadFolder: Bool) { + + layoutForView = NCUtility.shared.getLayoutForView(key: keyLayout, serverUrl: serverUrl) + + let metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND directory == true", activeAccount.account, serverUrl)) + self.dataSource = NCDataSource( + metadatasSource: metadatasSource, + sort: layoutForView?.sort, + ascending: layoutForView?.ascending, + directoryOnTop: layoutForView?.directoryOnTop, + favoriteOnTop: true, + filterLivePhoto: true) + + if withLoadFolder { + loadFolder() + } else { + self.refreshControl.endRefreshing() + } + + collectionView.reloadData() + } + + func createFolder(with fileName: String) { + + NCNetworking.shared.createFolder(fileName: fileName, serverUrl: serverUrl, account: activeAccount.account, urlBase: activeAccount.urlBase) { errorCode, errorDescription in + + DispatchQueue.main.async { + if errorCode == 0 { + + self.serverUrl += "/" + fileName + self.reloadDatasource(withLoadFolder: true) + self.setNavigationBar(navigationTitle: fileName) + + } else { + self.showAlert(title: "_error_createsubfolders_upload_", description: errorDescription) + } + } + } + } + + func loadFolder() { + + networkInProgress = true + collectionView.reloadData() + + NCNetworking.shared.readFolder(serverUrl: serverUrl, account: activeAccount.account) { _, metadataFolder, _, _, _, _, errorCode, errorDescription in + + DispatchQueue.main.async { + if errorCode != 0 { + self.showAlert(description: errorDescription) + } + self.networkInProgress = false + self.metadataFolder = metadataFolder + self.reloadDatasource(withLoadFolder: false) + } + } + } +} + +class NCFilesExtensionHandler { + var itemsProvider: [NSItemProvider] = [] + lazy var filesName: [String] = [] + let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd HH-mm-ss-" + return formatter + }() + + @discardableResult + init(items: [NSExtensionItem], completion: @escaping ([String]) -> Void) { + CCUtility.emptyTemporaryDirectory() + var counter = 0 + + self.itemsProvider = items.compactMap({ $0.attachments }).flatMap { $0.filter({ + $0.hasItemConformingToTypeIdentifier(kUTTypeItem as String) || $0.hasItemConformingToTypeIdentifier("public.url") + }) } + + for (ix, provider) in itemsProvider.enumerated() { + provider.loadItem(forTypeIdentifier: provider.typeIdentifier) { [self] item, error in + defer { + counter += 1 + if counter == itemsProvider.count { completion(self.filesName) } + } + guard error == nil else { return } + var originalName = (dateFormatter.string(from: Date())) + String(ix) + + if let url = item as? URL, url.isFileURL, !url.lastPathComponent.isEmpty { + originalName = url.lastPathComponent + } + + var fileName: String? + switch item { + case let image as UIImage: + fileName = getItem(image: image, fileName: originalName) + case let url as URL: + fileName = getItem(url: url, fileName: originalName) + case let data as Data: + fileName = getItem(data: data, fileName: originalName, provider: provider) + case let text as String: + fileName = getItem(string: text, fileName: originalName) + default: return + } + + if let fileName = fileName, !filesName.contains(fileName) { filesName.append(fileName) } + } + } + } + + // Image + func getItem(image: UIImage, fileName: String) -> String? { + var fileUrl = URL(fileURLWithPath: NSTemporaryDirectory() + fileName) + if fileUrl.pathExtension.isEmpty { fileUrl.appendPathExtension("png") } + guard let pngImageData = image.pngData(), + (try? pngImageData.write(to: fileUrl, options: [.atomic])) != nil + else { return nil } + return fileUrl.lastPathComponent + } + + // URL + // Does not work for directories + func getItem(url: URL, fileName: String) -> String? { + var fileName = fileName + guard url.isFileURL else { + guard !filesName.contains(url.lastPathComponent) else { return nil } + if !url.deletingPathExtension().lastPathComponent.isEmpty { fileName = url.deletingPathExtension().lastPathComponent } + fileName += "." + (url.pathExtension.isEmpty ? "html" : url.pathExtension) + let filenamePath = NSTemporaryDirectory() + fileName + + do { + let downloadedContent = try Data(contentsOf: url) + guard !FileManager.default.fileExists(atPath: filenamePath) else { return nil } + try downloadedContent.write(to: URL(fileURLWithPath: filenamePath)) + } catch { print(error); return nil } + return fileName + } + + let filenamePath = NSTemporaryDirectory() + fileName + + try? FileManager.default.removeItem(atPath: filenamePath) + + do { + try FileManager.default.copyItem(atPath: url.path, toPath: filenamePath) + + let attr = try FileManager.default.attributesOfItem(atPath: filenamePath) + guard !attr.isEmpty else { return nil } + return fileName + } catch { return nil } + } + + // Data + func getItem(data: Data, fileName: String, provider: NSItemProvider) -> String? { + guard !data.isEmpty else { return nil } + var fileName = fileName + + if let url = URL(string: fileName), !url.pathExtension.isEmpty { + fileName = url.lastPathComponent + } else if let name = provider.suggestedName { + fileName = name + } else if let ext = provider.registeredTypeIdentifiers.last?.split(separator: ".").last { + fileName += "." + ext + } // else: no file information, use default name without ext + + // when sharing images in safari only data is retuned. + // also, when sharing option "Automatic" is slected extension will return both raw data and a url, which will be downloaded, causing the image to appear twice with different names + if let image = UIImage(data: data) { + return getItem(image: image, fileName: fileName) + } + + let filenamePath = NSTemporaryDirectory() + fileName + FileManager.default.createFile(atPath: filenamePath, contents: data, attributes: nil) + return fileName + } + + // String + func getItem(string: String, fileName: String) -> String? { + guard !string.isEmpty else { return nil } + let filenamePath = NSTemporaryDirectory() + fileName + ".txt" + FileManager.default.createFile(atPath: filenamePath, contents: string.data(using: String.Encoding.utf8), attributes: nil) + return fileName + } +} + +extension NSItemProvider { + var typeIdentifier: String { + if hasItemConformingToTypeIdentifier("public.url") { return "public.url" } else + if hasItemConformingToTypeIdentifier(kUTTypeItem as String) { return kUTTypeItem as String } else { return "" } + } +} diff --git a/Share/NCShareExtension+NCDelegate.swift b/Share/NCShareExtension+NCDelegate.swift new file mode 100644 index 000000000..17f6e379a --- /dev/null +++ b/Share/NCShareExtension+NCDelegate.swift @@ -0,0 +1,159 @@ +// +// NCShareExtension.swift +// Share +// +// Created by Marino Faggiana on 04.01.2022. +// Copyright © 2022 Henrik Storch. All rights reserved. +// +// Author Henrik Storch <henrik.storch@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 NCCommunication +import UIKit + +extension NCShareExtension: NCEmptyDataSetDelegate, NCAccountRequestDelegate { + // MARK: - Empty + + func emptyDataSetView(_ view: NCEmptyView) { + + if networkInProgress { + view.emptyImage.image = UIImage(named: "networkInProgress")?.image(color: .gray, size: UIScreen.main.bounds.width) + view.emptyTitle.text = NSLocalizedString("_request_in_progress_", comment: "") + view.emptyDescription.text = "" + } else { + view.emptyImage.image = UIImage(named: "folder")?.image(color: NCBrandColor.shared.brandElement, size: UIScreen.main.bounds.width) + view.emptyTitle.text = NSLocalizedString("_files_no_folders_", comment: "") + view.emptyDescription.text = "" + } + } + + // MARK: - Account + + func showAccountPicker() { + let accounts = NCManageDatabase.shared.getAllAccountOrderAlias() + guard accounts.count > 1, + let vcAccountRequest = UIStoryboard(name: "NCAccountRequest", bundle: nil).instantiateInitialViewController() as? NCAccountRequest else { return } + + // Only here change the active account + for account in accounts { + account.active = account.account == self.activeAccount.account + } + + vcAccountRequest.activeAccount = self.activeAccount + vcAccountRequest.accounts = accounts.sorted { sorg, dest -> Bool in + return sorg.active && !dest.active + } + vcAccountRequest.enableTimerProgress = false + vcAccountRequest.enableAddAccount = false + vcAccountRequest.delegate = self + vcAccountRequest.dismissDidEnterBackground = true + + let screenHeighMax = UIScreen.main.bounds.height - (UIScreen.main.bounds.height / 5) + let height = min(CGFloat(accounts.count * Int(vcAccountRequest.heightCell) + 45), screenHeighMax) + + let popup = NCPopupViewController(contentController: vcAccountRequest, popupWidth: 300, popupHeight: height + 20) + + self.present(popup, animated: true) + } + + func accountRequestChangeAccount(account: String) { + guard let activeAccount = NCManageDatabase.shared.getAccount(predicate: NSPredicate(format: "account == %@", account)) else { + cancel(with: NCShareExtensionError.noAccount) + return + } + self.activeAccount = activeAccount + + // NETWORKING + NCCommunicationCommon.shared.setup( + account: activeAccount.account, + user: activeAccount.user, + userId: activeAccount.userId, + password: CCUtility.getPassword(activeAccount.account), + urlBase: activeAccount.urlBase, + userAgent: CCUtility.getUserAgent(), + webDav: NCUtilityFileSystem.shared.getWebDAV(account: activeAccount.account), + nextcloudVersion: 0, + delegate: NCNetworking.shared) + + // get auto upload folder + autoUploadFileName = NCManageDatabase.shared.getAccountAutoUploadFileName() + autoUploadDirectory = NCManageDatabase.shared.getAccountAutoUploadDirectory(urlBase: activeAccount.urlBase, account: activeAccount.account) + + serverUrl = NCUtilityFileSystem.shared.getHomeServer(account: activeAccount.account) + + layoutForView = NCUtility.shared.getLayoutForView(key: keyLayout, serverUrl: serverUrl) + + reloadDatasource(withLoadFolder: true) + setNavigationBar(navigationTitle: NCBrandOptions.shared.brand) + } +} + +extension NCShareExtension: NCShareCellDelegate, NCRenameFileDelegate, NCListCellDelegate { + + func removeFile(named fileName: String) { + guard let index = self.filesName.firstIndex(of: fileName) else { + return showAlert(title: "_file_not_found_", description: fileName) + } + self.filesName.remove(at: index) + if self.filesName.isEmpty { + cancel(with: NCShareExtensionError.noFiles) + } else { + self.setCommandView() + } + } + + func renameFile(named fileName: String) { + guard let vcRename = UIStoryboard(name: "NCRenameFile", bundle: nil).instantiateInitialViewController() as? NCRenameFile else { return } + + let resultInternalType = NCCommunicationCommon.shared.getInternalType(fileName: fileName, mimeType: "", directory: false) + vcRename.delegate = self + vcRename.fileName = fileName + if let previewImage = UIImage.downsample(imageAt: URL(fileURLWithPath: NSTemporaryDirectory() + fileName), to: CGSize(width: 140, height: 140)) { + vcRename.imagePreview = previewImage + } else { + vcRename.imagePreview = UIImage(named: resultInternalType.iconName) ?? NCBrandColor.cacheImages.file + } + + let popup = NCPopupViewController(contentController: vcRename, popupWidth: vcRename.width, popupHeight: vcRename.height) + + self.present(popup, animated: true) + } + + func rename(fileName: String, fileNameNew: String) { + guard fileName != fileNameNew else { return } + guard let fileIx = self.filesName.firstIndex(of: fileName), + !self.filesName.contains(fileNameNew), + NCUtilityFileSystem.shared.moveFile(atPath: (NSTemporaryDirectory() + fileName), toPath: (NSTemporaryDirectory() + fileNameNew)) else { + return showAlert(title: "_single_file_conflict_title_", description: "'\(fileName)' -> '\(fileNameNew)'") + } + + filesName[fileIx] = fileNameNew + tableView.reloadData() + } +} + +extension NCShareExtension: NCCreateFormUploadConflictDelegate { + func dismissCreateFormUploadConflict(metadatas: [tableMetadata]?) { + guard let metadatas = metadatas else { + uploadStarted = false + uploadMetadata.removeAll() + return + } + + self.uploadMetadata.append(contentsOf: metadatas) + self.upload() + } +} diff --git a/Share/NCShareExtension.swift b/Share/NCShareExtension.swift index dda59037e..970700054 100644 --- a/Share/NCShareExtension.swift +++ b/Share/NCShareExtension.swift @@ -1,11 +1,13 @@ // // NCShareExtension.swift -// Nextcloud +// Share // // Created by Marino Faggiana on 20/04/2021. // Copyright © 2021 Marino Faggiana. All rights reserved. +// Copyright © 2021 Henrik Storch. All rights reserved. // // Author Marino Faggiana <marino.faggiana@nextcloud.com> +// Author Henrik Storch <henrik.storch@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 @@ -23,9 +25,13 @@ import UIKit import NCCommunication -import IHProgressHUD +import JGProgressHUD -class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDelegate, NCRenameFileDelegate, NCAccountRequestDelegate { +enum NCShareExtensionError: Error { + case cancel, fileUpload, noAccount, noFiles +} + +class NCShareExtension: UIViewController { @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var tableView: UITableView! @@ -38,7 +44,6 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele @IBOutlet weak var createFolderView: UIView! @IBOutlet weak var createFolderImage: UIImageView! @IBOutlet weak var createFolderLabel: UILabel! - @IBOutlet weak var uploadView: UIView! @IBOutlet weak var uploadImage: UIImageView! @IBOutlet weak var uploadLabel: UILabel! @@ -48,26 +53,25 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele var filesName: [String] = [] // ------------------------------------------------------------- - private var emptyDataSet: NCEmptyDataSet? - private let keyLayout = NCGlobal.shared.layoutViewShareExtension - private var metadataFolder: tableMetadata? - private var networkInProgress = false - private var dataSource = NCDataSource() - - private var layoutForView: NCGlobal.layoutForViewType? - - private var heightRowTableView: CGFloat = 50 - private var heightCommandView: CGFloat = 170 - - private var autoUploadFileName = "" - private var autoUploadDirectory = "" - - private let refreshControl = UIRefreshControl() - private var activeAccount: tableAccount! - private let chunckSize = CCUtility.getChunkSize() * 1000000 - - private var numberFilesName: Int = 0 - private var counterUpload: Int = 0 + var emptyDataSet: NCEmptyDataSet? + let keyLayout = NCGlobal.shared.layoutViewShareExtension + var metadataFolder: tableMetadata? + var networkInProgress = false + var dataSource = NCDataSource() + var layoutForView: NCGlobal.layoutForViewType? + let heightRowTableView: CGFloat = 50 + let heightCommandView: CGFloat = 170 + var autoUploadFileName = "" + var autoUploadDirectory = "" + let refreshControl = UIRefreshControl() + var activeAccount: tableAccount! + let chunckSize = CCUtility.getChunkSize() * 1000000 + var progress: CGFloat = 0 + var counterUploaded: Int = 0 + var uploadErrors: [tableMetadata] = [] + var uploadMetadata: [tableMetadata] = [] + var uploadStarted = false + let hud = JGProgressHUD() // MARK: - View Life Cycle @@ -76,36 +80,31 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele self.navigationController?.navigationBar.prefersLargeTitles = false - // Cell collectionView.register(UINib(nibName: "NCListCell", bundle: nil), forCellWithReuseIdentifier: "listCell") collectionView.collectionViewLayout = NCListLayout() - // Add Refresh Control collectionView.addSubview(refreshControl) refreshControl.tintColor = NCBrandColor.shared.brandText refreshControl.backgroundColor = NCBrandColor.shared.systemBackground refreshControl.addTarget(self, action: #selector(reloadDatasource), for: .valueChanged) - // Command view commandView.backgroundColor = NCBrandColor.shared.secondarySystemBackground separatorView.backgroundColor = NCBrandColor.shared.separator separatorHeightConstraint.constant = 0.5 - // Table view tableView.separatorColor = NCBrandColor.shared.separator tableView.layer.cornerRadius = 10 tableView.tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1))) commandViewHeightConstraint.constant = heightCommandView - // Create folder createFolderView.layer.cornerRadius = 10 createFolderImage.image = NCUtility.shared.loadImage(named: "folder.badge.plus", color: NCBrandColor.shared.label) createFolderLabel.text = NSLocalizedString("_create_folder_", comment: "") let createFolderGesture = UITapGestureRecognizer(target: self, action: #selector(actionCreateFolder)) createFolderView.addGestureRecognizer(createFolderGesture) - // Upload uploadView.layer.cornerRadius = 10 + // uploadImage.image = NCUtility.shared.loadImage(named: "square.and.arrow.up", color: NCBrandColor.shared.label) uploadLabel.text = NSLocalizedString("_upload_", comment: "") uploadLabel.textColor = .systemBlue @@ -127,62 +126,37 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele NCCommunicationCommon.shared.writeLog("Start session with level \(levelLog) " + versionNextcloudiOS) } - // HUD - IHProgressHUD.set(viewForExtension: self.view) - IHProgressHUD.set(defaultMaskType: .clear) - IHProgressHUD.set(minimumDismiss: 0) - + hud.indicatorView = JGProgressHUDRingIndicatorView() + if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView { + indicatorView.ringWidth = 1.5 + } + NotificationCenter.default.addObserver(self, selector: #selector(triggerProgressTask(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterProgressTask), object: nil) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + guard serverUrl.isEmpty else { return } - if serverUrl == "" { - - if let activeAccount = NCManageDatabase.shared.getActiveAccount() { - - setAccount(account: activeAccount.account) - getFilesExtensionContext { filesName in - - self.filesName = filesName - DispatchQueue.main.async { - - var saveHtml: [String] = [] - var saveOther: [String] = [] - - for fileName in self.filesName { - if (fileName as NSString).pathExtension.lowercased() == "html" { - saveHtml.append(fileName) - } else { - saveOther.append(fileName) - } - } - - if saveOther.count > 0 && saveHtml.count > 0 { - for file in saveHtml { - self.filesName = self.filesName.filter {$0 != file} - } - } - - self.setCommandView() - } - } - - } else { - - let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: NSLocalizedString("_no_active_account_", comment: ""), preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in - self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) - })) - self.present(alertController, animated: true) + guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { + return showAlert(description: "_no_active_account_") { + self.cancel(with: .noAccount) } } + + accountRequestChangeAccount(account: activeAccount.account) + guard let inputItems = extensionContext?.inputItems as? [NSExtensionItem] else { + cancel(with: .noFiles) + return + } + NCFilesExtensionHandler(items: inputItems) { fileNames in + self.filesName = fileNames + DispatchQueue.main.async { self.setCommandView() } + } } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) - coordinator.animate(alongsideTransition: nil) { _ in self.collectionView?.collectionViewLayout.invalidateLayout() } @@ -190,84 +164,62 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) - collectionView.reloadData() tableView.reloadData() } // MARK: - - @objc func triggerProgressTask(_ notification: NSNotification) { - - if let userInfo = notification.userInfo as NSDictionary?, let progressNumber = userInfo["progress"] as? NSNumber { - - let progress = CGFloat(progressNumber.floatValue) - let status = NSLocalizedString("_upload_file_", comment: "") + " \(self.counterUpload) " + NSLocalizedString("_of_", comment: "") + " \(self.numberFilesName)" - IHProgressHUD.show(progress: progress, status: status) - } + func cancel(with error: NCShareExtensionError) { + // make sure no uploads are continued + uploadStarted = false + extensionContext?.cancelRequest(withError: error) } - // MARK: - - - func setAccount(account: String) { - - guard let activeAccount = NCManageDatabase.shared.getAccount(predicate: NSPredicate(format: "account == %@", account)) else { - extensionContext?.completeRequest(returningItems: extensionContext?.inputItems, completionHandler: nil) - return - } - self.activeAccount = activeAccount - - // NETWORKING - NCCommunicationCommon.shared.setup(account: activeAccount.account, user: activeAccount.user, userId: activeAccount.userId, password: CCUtility.getPassword(activeAccount.account), urlBase: activeAccount.urlBase, userAgent: CCUtility.getUserAgent(), webDav: NCUtilityFileSystem.shared.getWebDAV(account: activeAccount.account), nextcloudVersion: 0, delegate: NCNetworking.shared) - - // get auto upload folder - autoUploadFileName = NCManageDatabase.shared.getAccountAutoUploadFileName() - autoUploadDirectory = NCManageDatabase.shared.getAccountAutoUploadDirectory(urlBase: activeAccount.urlBase, account: activeAccount.account) - - serverUrl = NCUtilityFileSystem.shared.getHomeServer(account: activeAccount.account) - - layoutForView = NCUtility.shared.getLayoutForView(key: keyLayout, serverUrl: serverUrl) - - reloadDatasource(withLoadFolder: true) - setNavigationBar(navigationTitle: NCBrandOptions.shared.brand) + func showAlert(title: String = "_error_", description: String, onDismiss: (() -> Void)? = nil) { + let alertController = UIAlertController(title: NSLocalizedString(title, comment: ""), message: NSLocalizedString(description, comment: ""), preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in + onDismiss?() + })) + self.present(alertController, animated: true) } + @objc func triggerProgressTask(_ notification: NSNotification) { + guard let progress = notification.userInfo?["progress"] as? Float else { return } + hud.progress = progress + } + func setNavigationBar(navigationTitle: String) { navigationItem.title = navigationTitle cancelButton.title = NSLocalizedString("_cancel_", comment: "") // BACK BUTTON - let backButton = UIButton(type: .custom) backButton.setImage(UIImage(named: "back"), for: .normal) backButton.tintColor = .systemBlue backButton.semanticContentAttribute = .forceLeftToRight - backButton.setTitle(" "+NSLocalizedString("_back_", comment: ""), for: .normal) + backButton.setTitle(" " + NSLocalizedString("_back_", comment: ""), for: .normal) backButton.setTitleColor(.systemBlue, for: .normal) backButton.action(for: .touchUpInside) { _ in - - while self.serverUrl.last != "/" { + if !self.uploadStarted { + while self.serverUrl.last != "/" { self.serverUrl.removeLast() } self.serverUrl.removeLast() - } - self.serverUrl.removeLast() - self.reloadDatasource(withLoadFolder: true) + self.reloadDatasource(withLoadFolder: true) - var navigationTitle = (self.serverUrl as NSString).lastPathComponent - if NCUtilityFileSystem.shared.getHomeServer(account: self.activeAccount.account) == self.serverUrl { - navigationTitle = NCBrandOptions.shared.brand + var navigationTitle = (self.serverUrl as NSString).lastPathComponent + if NCUtilityFileSystem.shared.getHomeServer(account: self.activeAccount.account) == self.serverUrl { + navigationTitle = NCBrandOptions.shared.brand + } + self.setNavigationBar(navigationTitle: navigationTitle) } - self.setNavigationBar(navigationTitle: navigationTitle) } - // PROFILE BUTTON - let image = NCUtility.shared.loadUserImage( for: activeAccount.user, displayName: activeAccount.displayName, userBaseUrl: activeAccount) - let profileButton = UIButton(type: .custom) profileButton.setImage(image, for: .normal) @@ -287,100 +239,41 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele profileButton.semanticContentAttribute = .forceLeftToRight profileButton.sizeToFit() profileButton.action(for: .touchUpInside) { _ in - - let accounts = NCManageDatabase.shared.getAllAccountOrderAlias() - if accounts.count > 1 { - - if let vcAccountRequest = UIStoryboard(name: "NCAccountRequest", bundle: nil).instantiateInitialViewController() as? NCAccountRequest { - - // Only here change the active account - for account in accounts { - if account.account == self.activeAccount.account { - account.active = true - } else { - account.active = false - } - } - - vcAccountRequest.activeAccount = self.activeAccount - vcAccountRequest.accounts = accounts.sorted { sorg, dest -> Bool in - return sorg.active && !dest.active - } - vcAccountRequest.enableTimerProgress = false - vcAccountRequest.enableAddAccount = false - vcAccountRequest.delegate = self - vcAccountRequest.dismissDidEnterBackground = true - - let screenHeighMax = UIScreen.main.bounds.height - (UIScreen.main.bounds.height/5) - let numberCell = accounts.count - let height = min(CGFloat(numberCell * Int(vcAccountRequest.heightCell) + 45), screenHeighMax) - - let popup = NCPopupViewController(contentController: vcAccountRequest, popupWidth: 300, popupHeight: height+20) - - self.present(popup, animated: true) - } + if !self.uploadStarted { + self.showAccountPicker() } } - - if serverUrl == NCUtilityFileSystem.shared.getHomeServer(account: activeAccount.account) { - - navigationItem.setLeftBarButtonItems([UIBarButtonItem(customView: profileButton)], animated: true) - - } else { - + var navItems = [UIBarButtonItem(customView: profileButton)] + if serverUrl != NCUtilityFileSystem.shared.getHomeServer(account: activeAccount.account) { let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) space.width = 20 - - navigationItem.setLeftBarButtonItems([UIBarButtonItem(customView: backButton), space, UIBarButtonItem(customView: profileButton)], animated: true) + navItems.append(contentsOf: [UIBarButtonItem(customView: backButton), space]) } + navigationItem.setLeftBarButtonItems(navItems, animated: true) } func setCommandView() { - - var counter: CGFloat = 0 - - if filesName.count == 0 { - self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) + guard !filesName.isEmpty else { + cancel(with: .noFiles) return - } else { - if filesName.count < 3 { - counter = CGFloat(filesName.count) - self.commandViewHeightConstraint.constant = heightCommandView + (self.heightRowTableView * counter) - } else { - counter = 3 - self.commandViewHeightConstraint.constant = heightCommandView + (self.heightRowTableView * counter) - } - if filesName.count <= 3 { - self.tableView.isScrollEnabled = false - } - // Label upload button - numberFilesName = filesName.count - uploadLabel.text = NSLocalizedString("_upload_", comment: "") + " \(numberFilesName) " + NSLocalizedString("_files_", comment: "") - // Empty - emptyDataSet = NCEmptyDataSet(view: collectionView, offset: -50*counter, delegate: self) - self.tableView.reloadData() } - } - - // MARK: - Empty - - func emptyDataSetView(_ view: NCEmptyView) { + let counter = min(CGFloat(filesName.count), 3) + self.commandViewHeightConstraint.constant = heightCommandView + (self.heightRowTableView * counter) - if networkInProgress { - view.emptyImage.image = UIImage(named: "networkInProgress")?.image(color: .gray, size: UIScreen.main.bounds.width) - view.emptyTitle.text = NSLocalizedString("_request_in_progress_", comment: "") - view.emptyDescription.text = "" - } else { - view.emptyImage.image = UIImage(named: "folder")?.image(color: NCBrandColor.shared.brandElement, size: UIScreen.main.bounds.width) - view.emptyTitle.text = NSLocalizedString("_files_no_folders_", comment: "") - view.emptyDescription.text = "" + if filesName.count <= 3 { + self.tableView.isScrollEnabled = false } + // Label upload button + uploadLabel.text = NSLocalizedString("_upload_", comment: "") + " \(filesName.count) " + NSLocalizedString("_files_", comment: "") + // Empty + emptyDataSet = NCEmptyDataSet(view: collectionView, offset: -50 * counter, delegate: self) + self.tableView.reloadData() } // MARK: ACTION @IBAction func actionCancel(_ sender: UIBarButtonItem) { - extensionContext?.completeRequest(returningItems: extensionContext?.inputItems, completionHandler: nil) + cancel(with: .cancel) } @objc func actionCreateFolder() { @@ -391,609 +284,107 @@ class NCShareExtension: UIViewController, NCListCellDelegate, NCEmptyDataSetDele textField.autocapitalizationType = UITextAutocapitalizationType.words } - let actionSave = UIAlertAction(title: NSLocalizedString("_save_", comment: ""), style: .default) { (_: UIAlertAction) in + let actionSave = UIAlertAction(title: NSLocalizedString("_save_", comment: ""), style: .default) { _ in if let fileName = alertController.textFields?.first?.text { self.createFolder(with: fileName) } } - let actionCancel = UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { (_: UIAlertAction) in - print("You've pressed cancel button") - } + let actionCancel = UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) alertController.addAction(actionSave) alertController.addAction(actionCancel) self.present(alertController, animated: true, completion: nil) } +} +// MARK: - Upload +extension NCShareExtension { @objc func actionUpload() { + guard !uploadStarted else { return } + guard !filesName.isEmpty else { return showAlert(description: "_files_no_files_") } - if let fileName = filesName.first { + counterUploaded = 0 + uploadStarted = true + uploadErrors = [] - counterUpload += 1 - filesName.removeFirst() + var conflicts: [tableMetadata] = [] + for fileName in filesName { let ocId = NSUUID().uuidString - let filePath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)! - - if NCUtilityFileSystem.shared.moveFile(atPath: (NSTemporaryDirectory() + fileName), toPath: filePath) { - - let metadata = NCManageDatabase.shared.createMetadata(account: activeAccount.account, user: activeAccount.user, userId: activeAccount.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: serverUrl, urlBase: activeAccount.urlBase, url: "", contentType: "", livePhoto: false) - - metadata.session = NCCommunicationCommon.shared.sessionIdentifierUpload - metadata.sessionSelector = NCGlobal.shared.selectorUploadFile - metadata.size = NCUtilityFileSystem.shared.getFileSize(filePath: filePath) - metadata.status = NCGlobal.shared.metadataStatusWaitUpload - - // E2EE - if CCUtility.isFolderEncrypted(metadata.serverUrl, e2eEncrypted: metadata.e2eEncrypted, account: metadata.account, urlBase: metadata.urlBase) { - metadata.e2eEncrypted = true - } - - // CHUNCK - if chunckSize != 0 && metadata.size > chunckSize { - metadata.chunk = true - } - - NCNetworking.shared.upload(metadata: metadata) { - - } completion: { errorCode, errorDescription in - - if errorCode == 0 { - - self.actionUpload() - - } else { - - IHProgressHUD.dismiss() - - NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", ocId)) - NCManageDatabase.shared.deleteChunks(account: self.activeAccount.account, ocId: ocId) - - let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: errorDescription, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in - self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) - })) - self.present(alertController, animated: true) - } - } - } - } else { - - IHProgressHUD.showSuccesswithStatus(NSLocalizedString("_success_", comment: "")) - - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { - self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) - } - } - } - - func rename(fileName: String, fileNameNew: String) { - - if let row = self.filesName.firstIndex(where: {$0 == fileName}) { - - if NCUtilityFileSystem.shared.moveFile(atPath: (NSTemporaryDirectory() + fileName), toPath: (NSTemporaryDirectory() + fileNameNew)) { - filesName[row] = fileNameNew - tableView.reloadData() - } - } - } - - func accountRequestChangeAccount(account: String) { - setAccount(account: account) - } -} - -// MARK: - Collection View - -extension NCShareExtension: UICollectionViewDelegate { - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - - if let metadata = dataSource.cellForItemAt(indexPath: indexPath) { - if let serverUrl = CCUtility.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName) { - - if metadata.e2eEncrypted && !CCUtility.isEnd(toEndEnabled: activeAccount.account) { - let alertController = UIAlertController(title: NSLocalizedString("_info_", comment: ""), message: NSLocalizedString("_e2e_goto_settings_for_enable_", comment: ""), preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in })) - self.present(alertController, animated: true) - return - } - - self.serverUrl = serverUrl - reloadDatasource(withLoadFolder: true) - setNavigationBar(navigationTitle: metadata.fileNameView) - } - } - } -} - -extension NCShareExtension: UICollectionViewDataSource { - - func numberOfSections(in collectionView: UICollectionView) -> Int { - return 1 - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - let numberOfItems = dataSource.numberOfItems() - emptyDataSet?.numberOfItemsInSection(numberOfItems, section: section) - return numberOfItems - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - - guard let metadata = dataSource.cellForItemAt(indexPath: indexPath) else { - return collectionView.dequeueReusableCell(withReuseIdentifier: "listCell", for: indexPath) as! NCListCell - } - - var tableShare: tableShare? - var isShare = false - var isMounted = false - - if let metadataFolder = metadataFolder { - isShare = metadata.permissions.contains(NCGlobal.shared.permissionShared) && !metadataFolder.permissions.contains(NCGlobal.shared.permissionShared) - isMounted = metadata.permissions.contains(NCGlobal.shared.permissionMounted) && !metadataFolder.permissions.contains(NCGlobal.shared.permissionMounted) - } - - if dataSource.metadataShare[metadata.ocId] != nil { - tableShare = dataSource.metadataShare[metadata.ocId] - } - - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listCell", for: indexPath) as! NCListCell - cell.delegate = self - - cell.fileObjectId = metadata.ocId - cell.fileUser = metadata.ownerId - cell.labelTitle.text = metadata.fileNameView - cell.labelTitle.textColor = NCBrandColor.shared.label - - cell.imageSelect.image = nil - cell.imageStatus.image = nil - cell.imageLocal.image = nil - cell.imageFavorite.image = nil - cell.imageShared.image = nil - cell.imageMore.image = nil - - cell.imageItem.image = nil - cell.imageItem.backgroundColor = nil - - cell.progressView.progress = 0.0 - - if metadata.directory { - - if metadata.e2eEncrypted { - cell.imageItem.image = NCBrandColor.cacheImages.folderEncrypted - } else if isShare { - cell.imageItem.image = NCBrandColor.cacheImages.folderSharedWithMe - } else if tableShare != nil && tableShare?.shareType != 3 { - cell.imageItem.image = NCBrandColor.cacheImages.folderSharedWithMe - } else if tableShare != nil && tableShare?.shareType == 3 { - cell.imageItem.image = NCBrandColor.cacheImages.folderPublic - } else if metadata.mountType == "group" { - cell.imageItem.image = NCBrandColor.cacheImages.folderGroup - } else if isMounted { - cell.imageItem.image = NCBrandColor.cacheImages.folderExternal - } else if metadata.fileName == autoUploadFileName && metadata.serverUrl == autoUploadDirectory { - cell.imageItem.image = NCBrandColor.cacheImages.folderAutomaticUpload + let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)! + guard NCUtilityFileSystem.shared.copyFile(atPath: (NSTemporaryDirectory() + fileName), toPath: toPath) else { continue } + let metadata = NCManageDatabase.shared.createMetadata( + account: activeAccount.account, user: activeAccount.user, userId: activeAccount.userId, + fileName: fileName, fileNameView: fileName, + ocId: ocId, + serverUrl: serverUrl, urlBase: activeAccount.urlBase, url: "", + contentType: "", + livePhoto: false) + metadata.session = NCCommunicationCommon.shared.sessionIdentifierUpload + metadata.sessionSelector = NCGlobal.shared.selectorUploadFileShareExtension + metadata.size = NCUtilityFileSystem.shared.getFileSize(filePath: toPath) + metadata.status = NCGlobal.shared.metadataStatusWaitUpload + if NCManageDatabase.shared.getMetadataConflict(account: activeAccount.account, serverUrl: serverUrl, fileName: fileName) != nil { + conflicts.append(metadata) } else { - cell.imageItem.image = NCBrandColor.cacheImages.folder + uploadMetadata.append(metadata) } - - cell.labelInfo.text = CCUtility.dateDiff(metadata.date as Date) - - let lockServerUrl = CCUtility.stringAppendServerUrl(metadata.serverUrl, addFileName: metadata.fileName)! - let tableDirectory = NCManageDatabase.shared.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", activeAccount.account, lockServerUrl)) - - // Local image: offline - if tableDirectory != nil && tableDirectory!.offline { - cell.imageLocal.image = NCBrandColor.cacheImages.offlineFlag - } - - } - - // image Favorite - if metadata.favorite { - cell.imageFavorite.image = NCBrandColor.cacheImages.favorite } - cell.imageSelect.isHidden = true - cell.backgroundView = nil - cell.hideButtonMore(true) - cell.hideButtonShare(true) - cell.selectMode(false) - - // Live Photo - if metadata.livePhoto { - cell.imageStatus.image = NCBrandColor.cacheImages.livePhoto - } - - // Remove last separator - if collectionView.numberOfItems(inSection: indexPath.section) == indexPath.row + 1 { - cell.separator.isHidden = true + if !conflicts.isEmpty { + guard let conflict = UIStoryboard(name: "NCCreateFormUploadConflict", bundle: nil).instantiateInitialViewController() as? NCCreateFormUploadConflict + else { return } + conflict.serverUrl = self.serverUrl + conflict.metadatasUploadInConflict = conflicts + conflict.delegate = self + self.present(conflict, animated: true, completion: nil) } else { - cell.separator.isHidden = false + upload() } - - return cell - } -} - -// MARK: - Table View - -extension NCShareExtension: UITableViewDelegate { - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return heightRowTableView } - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - } -} - -extension NCShareExtension: UITableViewDataSource { - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - filesName.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - - let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) - cell.backgroundColor = NCBrandColor.shared.systemBackground - - let imageCell = cell.viewWithTag(10) as? UIImageView - let fileNameCell = cell.viewWithTag(20) as? UILabel - let moreButton = cell.viewWithTag(30) as? NCShareExtensionButtonWithIndexPath - let sizeCell = cell.viewWithTag(40) as? UILabel - - imageCell?.layer.cornerRadius = 6 - imageCell?.layer.masksToBounds = true + func upload() { + guard uploadStarted else { return } + guard uploadMetadata.count > counterUploaded else { return finishedUploading() } + let metadata = uploadMetadata[counterUploaded] - let fileName = filesName[indexPath.row] - let resultInternalType = NCCommunicationCommon.shared.getInternalType(fileName: fileName, mimeType: "", directory: false) + // E2EE + metadata.e2eEncrypted = CCUtility.isFolderEncrypted(metadata.serverUrl, e2eEncrypted: metadata.e2eEncrypted, account: metadata.account, urlBase: metadata.urlBase) + // CHUNCK + metadata.chunk = chunckSize != 0 && metadata.size > chunckSize - if let image = UIImage(contentsOfFile: (NSTemporaryDirectory() + fileName)) { - imageCell?.image = image.resizeImage(size: CGSize(width: 80, height: 80), isAspectRation: true) - } else { - if resultInternalType.iconName.count > 0 { - imageCell?.image = UIImage(named: resultInternalType.iconName) + hud.textLabel.text = NSLocalizedString("_upload_file_", comment: "") + " \(counterUploaded + 1) " + NSLocalizedString("_of_", comment: "") + " \(filesName.count)" + hud.progress = 0 + hud.show(in: self.view) + + NCNetworking.shared.upload(metadata: metadata) { } completion: { errorCode, _ in + if errorCode == 0 { + self.counterUploaded += 1 + self.upload() } else { - imageCell?.image = NCBrandColor.cacheImages.file + let path = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)! + NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId) + NCUtilityFileSystem.shared.deleteFile(filePath: path) + self.uploadErrors.append(metadata) } } - - fileNameCell?.text = fileName - - let fileSize = NCUtilityFileSystem.shared.getFileSize(filePath: (NSTemporaryDirectory() + fileName)) - sizeCell?.text = CCUtility.transformedSize(fileSize) - - moreButton?.setImage(NCUtility.shared.loadImage(named: "more").image(color: NCBrandColor.shared.label, size: 15), for: .normal) - moreButton?.indexPath = indexPath - moreButton?.fileName = fileName - moreButton?.image = imageCell?.image - moreButton?.action(for: .touchUpInside, { sender in - - if let fileName = (sender as! NCShareExtensionButtonWithIndexPath).fileName { - let alertController = UIAlertController(title: "", message: fileName, preferredStyle: .alert) - - alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_file_", comment: ""), style: .default) { (_: UIAlertAction) in - if let index = self.filesName.firstIndex(of: fileName) { - - self.filesName.remove(at: index) - if self.filesName.count == 0 { - self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) - } else { - self.setCommandView() - } - } - }) - - alertController.addAction(UIAlertAction(title: NSLocalizedString("_rename_file_", comment: ""), style: .default) { (_: UIAlertAction) in - - if let vcRename = UIStoryboard(name: "NCRenameFile", bundle: nil).instantiateInitialViewController() as? NCRenameFile { - - vcRename.delegate = self - vcRename.fileName = fileName - vcRename.imagePreview = (sender as! NCShareExtensionButtonWithIndexPath).image - - let popup = NCPopupViewController(contentController: vcRename, popupWidth: vcRename.width, popupHeight: vcRename.height) - - self.present(popup, animated: true) - } - }) - - alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { (_: UIAlertAction) in }) - - self.present(alertController, animated: true, completion: nil) - } - }) - - return cell } -} -// MARK: - NC API & Algorithm - -extension NCShareExtension { - - @objc func reloadDatasource(withLoadFolder: Bool) { - - layoutForView = NCUtility.shared.getLayoutForView(key: keyLayout, serverUrl: serverUrl) - - let metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND directory == true", activeAccount.account, serverUrl)) - self.dataSource = NCDataSource(metadatasSource: metadatasSource, sort: layoutForView?.sort, ascending: layoutForView?.ascending, directoryOnTop: layoutForView?.directoryOnTop, favoriteOnTop: true, filterLivePhoto: true) - - if withLoadFolder { - loadFolder() - } else { - self.refreshControl.endRefreshing() - } - - collectionView.reloadData() - } - - func createFolder(with fileName: String) { - - NCNetworking.shared.createFolder(fileName: fileName, serverUrl: serverUrl, account: activeAccount.account, urlBase: activeAccount.urlBase) { errorCode, errorDescription in - - DispatchQueue.main.async { - if errorCode == 0 { - - self.serverUrl += "/" + fileName - self.reloadDatasource(withLoadFolder: true) - self.setNavigationBar(navigationTitle: fileName) - - } else { - - let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: errorDescription, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in })) - self.present(alertController, animated: true) - } + func finishedUploading() { + uploadStarted = false + if !uploadErrors.isEmpty { + let fileList = "- " + uploadErrors.map({ $0.fileName }).joined(separator: "\n - ") + showAlert(title: "_error_files_upload_", description: fileList) { + self.extensionContext?.cancelRequest(withError: NCShareExtensionError.fileUpload) } - } - } - - func loadFolder() { - - networkInProgress = true - collectionView.reloadData() - - NCNetworking.shared.readFolder(serverUrl: serverUrl, account: activeAccount.account) { _, metadataFolder, _, _, _, _, errorCode, errorDescription in - - DispatchQueue.main.async { - if errorCode != 0 { - let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: errorDescription, preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in })) - self.present(alertController, animated: true) - } - self.networkInProgress = false - self.metadataFolder = metadataFolder - self.reloadDatasource(withLoadFolder: false) - } - } - } - - func getFilesExtensionContext(completion: @escaping (_ filesName: [String]) -> Void) { - - var itemsProvider: [NSItemProvider] = [] - var filesName: [String] = [] - var conuter = 0 - let dateFormatter = DateFormatter() - - // ---------------------------------------------------------------------------------------- - - // Image - func getItem(image: UIImage, fileNameOriginal: String?) { - - var fileName: String = "" - - if let pngImageData = image.pngData() { - - if fileNameOriginal != nil { - fileName = fileNameOriginal! - } else { - fileName = "\(dateFormatter.string(from: Date()))\(conuter).png" - } - - let filenamePath = NSTemporaryDirectory() + fileName - - if (try? pngImageData.write(to: URL(fileURLWithPath: filenamePath), options: [.atomic])) != nil { - filesName.append(fileName) - } - } - } - - // URL - func getItem(url: NSURL, fileNameOriginal: String?) { - - guard let path = url.path else { return } - - var fileName: String = "" - - if fileNameOriginal != nil { - fileName = fileNameOriginal! - } else { - if let ext = url.pathExtension { - fileName = "\(dateFormatter.string(from: Date()))\(conuter)." + ext - } - } - - let filenamePath = NSTemporaryDirectory() + fileName - - do { - try FileManager.default.removeItem(atPath: filenamePath) - } catch { } - - do { - try FileManager.default.copyItem(atPath: path, toPath: filenamePath) - - do { - let attr: NSDictionary? = try FileManager.default.attributesOfItem(atPath: filenamePath) as NSDictionary? - - if let _attr = attr { - if _attr.fileSize() > 0 { - filesName.append(fileName) - } - } - - } catch { } - } catch { } - } - - // Data - func getItem(data: Data, fileNameOriginal: String?, description: String) { - - var fileName: String = "" - - if data.count > 0 { - - if fileNameOriginal != nil { - fileName = fileNameOriginal! - } else { - let fullNameArr = description.components(separatedBy: "\"") - let fileExtArr = fullNameArr[1].components(separatedBy: ".") - let pathExtention = (fileExtArr[fileExtArr.count-1]).uppercased() - fileName = "\(dateFormatter.string(from: Date()))\(conuter).\(pathExtention)" - } - - let filenamePath = NSTemporaryDirectory() + fileName - FileManager.default.createFile(atPath: filenamePath, contents: data, attributes: nil) - filesName.append(fileName) - } - } - - // String - func getItem(string: NSString, fileNameOriginal: String?) { - - var fileName: String = "" - - if string.length > 0 { - - fileName = "\(dateFormatter.string(from: Date()))\(conuter).txt" - let filenamePath = NSTemporaryDirectory() + "\(dateFormatter.string(from: Date()))\(conuter).txt" - FileManager.default.createFile(atPath: filenamePath, contents: string.data(using: String.Encoding.utf8.rawValue), attributes: nil) - filesName.append(fileName) - } - } - - // ---------------------------------------------------------------------------------------- - - guard let inputItems: [NSExtensionItem] = extensionContext?.inputItems as? [NSExtensionItem] else { - return completion(filesName) - } - - for item: NSExtensionItem in inputItems { - if let attachments = item.attachments { - if attachments.isEmpty { continue } - for (_, itemProvider) in (attachments.enumerated()) { - if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeItem as String) || itemProvider.hasItemConformingToTypeIdentifier("public.url") { - itemsProvider.append(itemProvider) - } - } - } - } - - CCUtility.emptyTemporaryDirectory() - dateFormatter.dateFormat = "yyyy-MM-dd HH-mm-ss-" - - for itemProvider in itemsProvider { - - var typeIdentifier = "" - if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeItem as String) { typeIdentifier = kUTTypeItem as String } - if itemProvider.hasItemConformingToTypeIdentifier("public.url") { typeIdentifier = "public.url" } - - itemProvider.loadItem(forTypeIdentifier: typeIdentifier, options: nil, completionHandler: {item, error -> Void in - - if error == nil { - - var fileNameOriginal: String? - - if let url = item as? NSURL { - if FileManager.default.fileExists(atPath: url.path ?? "") { - fileNameOriginal = url.lastPathComponent! - } else if url.scheme?.lowercased().contains("http") == true { - fileNameOriginal = "\(dateFormatter.string(from: Date()))\(conuter).html" - } else { - fileNameOriginal = "\(dateFormatter.string(from: Date()))\(conuter)" - } - } - - if let image = item as? UIImage { - getItem(image: image, fileNameOriginal: fileNameOriginal) - } - - if let url = item as? URL { - getItem(url: url as NSURL, fileNameOriginal: fileNameOriginal) - } - - if let data = item as? Data { - getItem(data: data, fileNameOriginal: fileNameOriginal, description: itemProvider.description) - } - - if let string = item as? NSString { - getItem(string: string, fileNameOriginal: fileNameOriginal) - } - } - - conuter += 1 - if conuter == itemsProvider.count { - completion(filesName) - } - }) - } - } -} - -/* -let task = URLSession.shared.downloadTask(with: urlitem) { localURL, urlResponse, error in - - if let localURL = localURL { - - if fileNameOriginal != nil { - fileName = fileNameOriginal! } else { - let ext = url.pathExtension - fileName = "\(dateFormatter.string(from: Date()))\(conuter)." + ext - } - - let filenamePath = NSTemporaryDirectory() + fileName - - do { - try FileManager.default.removeItem(atPath: filenamePath) - } - catch { } - - do { - try FileManager.default.copyItem(atPath: localURL.path, toPath:filenamePath) - - do { - let attr : NSDictionary? = try FileManager.default.attributesOfItem(atPath: filenamePath) as NSDictionary? - - if let _attr = attr { - if _attr.fileSize() > 0 { - - filesName.append(fileName) - } - } - - } catch let error { - outError = error + hud.indicatorView = JGProgressHUDSuccessIndicatorView() + hud.textLabel.text = NSLocalizedString("_success_", comment: "") + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.extensionContext?.completeRequest(returningItems: self.extensionContext?.inputItems, completionHandler: nil) } - - } catch let error { - outError = error } } - - if index + 1 == attachments.count { - completion(filesName, outError) - } -} -task.resume() -*/ - -class NCShareExtensionButtonWithIndexPath: UIButton { - var indexPath: IndexPath? - var fileName: String? - var image: UIImage? } diff --git a/iOSClient/AppDelegate.swift b/iOSClient/AppDelegate.swift index 452f63e46..a790747e3 100644 --- a/iOSClient/AppDelegate.swift +++ b/iOSClient/AppDelegate.swift @@ -27,7 +27,6 @@ import NCCommunication import TOPasscodeViewController import LocalAuthentication import Firebase -import IHProgressHUD @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, TOPasscodeViewControllerDelegate, NCAccountRequestDelegate, NCViewCertificateDetailsDelegate, NCUserBaseUrl { @@ -211,9 +210,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD if account == "" { return } guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return } - // close HUD - IHProgressHUD.dismiss() - // Account changed ?? if activeAccount.account != account { settingAccount(activeAccount.account, urlBase: activeAccount.urlBase, user: activeAccount.user, userId: activeAccount.userId, password: CCUtility.getPassword(activeAccount.account)) @@ -890,3 +886,10 @@ extension AppDelegate: NCAudioRecorderViewControllerDelegate { func didFinishWithoutRecording(_ viewController: NCAudioRecorderViewController, fileName: String) { } } + +extension AppDelegate: NCCreateFormUploadConflictDelegate { + func dismissCreateFormUploadConflict(metadatas: [tableMetadata]?) { + guard let metadatas = metadatas, !metadatas.isEmpty else { return } + networkingProcessUpload?.createProcessUploads(metadatas: metadatas) + } +} diff --git a/iOSClient/Brand/NCBrand.swift b/iOSClient/Brand/NCBrand.swift index 08d1d23a6..f393126b4 100755 --- a/iOSClient/Brand/NCBrand.swift +++ b/iOSClient/Brand/NCBrand.swift @@ -92,7 +92,6 @@ import UIKit @objc public var disable_background_color: Bool = true @objc public var disable_background_image: Bool = true - @objc public var disable_ff: Bool = true override init() { diff --git a/iOSClient/Data/NCDatabase.swift b/iOSClient/Data/NCDatabase.swift index 2f7ac4789..b5a6ca5eb 100644 --- a/iOSClient/Data/NCDatabase.swift +++ b/iOSClient/Data/NCDatabase.swift @@ -526,6 +526,13 @@ class tableVideo: Object { @objc dynamic var duration: Int64 = 0 @objc dynamic var ocId = "" @objc dynamic var time: Int64 = 0 + @objc dynamic var codecNameVideo: String? + @objc dynamic var codecNameAudio: String? + @objc dynamic var codecAudioChannelLayout: String? + @objc dynamic var codecAudioLanguage: String? + @objc dynamic var codecSubtitleLanguage: String? + @objc dynamic var codecMaxCompatibility: Bool = false + @objc dynamic var codecQuality: String? override static func primaryKey() -> String { return "ocId" diff --git a/iOSClient/Data/NCManageDatabase.swift b/iOSClient/Data/NCManageDatabase.swift index efc5cac1b..858d709bd 100644 --- a/iOSClient/Data/NCManageDatabase.swift +++ b/iOSClient/Data/NCManageDatabase.swift @@ -1721,6 +1721,51 @@ class NCManageDatabase: NSObject { NCCommunicationCommon.shared.writeLog("Could not write to database: \(error)") } } + + func addVideoCodec(metadata: tableMetadata, codecNameVideo: String?, codecNameAudio: String?, codecAudioChannelLayout: String?, codecAudioLanguage: String?, codecSubtitleLanguage: String?, codecMaxCompatibility: Bool, codecQuality: String?) { + + let realm = try! Realm() + + do { + try realm.safeWrite { + if let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first { + if let codecNameVideo = codecNameVideo { result.codecNameVideo = codecNameVideo } + if let codecNameAudio = codecNameAudio { result.codecNameAudio = codecNameAudio } + if let codecAudioChannelLayout = codecAudioChannelLayout { result.codecAudioChannelLayout = codecAudioChannelLayout } + if let codecAudioLanguage = codecAudioLanguage { result.codecAudioLanguage = codecAudioLanguage } + if let codecSubtitleLanguage = codecSubtitleLanguage { result.codecSubtitleLanguage = codecSubtitleLanguage } + result.codecMaxCompatibility = codecMaxCompatibility + if let codecQuality = codecQuality { result.codecQuality = codecQuality } + realm.add(result, update: .all) + } else { + let addObject = tableVideo() + addObject.account = metadata.account + addObject.ocId = metadata.ocId + addObject.codecNameVideo = codecNameVideo + addObject.codecNameAudio = codecNameAudio + addObject.codecAudioChannelLayout = codecAudioChannelLayout + addObject.codecAudioLanguage = codecAudioLanguage + addObject.codecSubtitleLanguage = codecSubtitleLanguage + addObject.codecMaxCompatibility = codecMaxCompatibility + addObject.codecQuality = codecQuality + realm.add(addObject, update: .all) + } + } + } catch let error { + NCCommunicationCommon.shared.writeLog("Could not write to database: \(error)") + } + } + + func getVideo(metadata: tableMetadata?) -> tableVideo? { + guard let metadata = metadata else { return nil } + + let realm = try! Realm() + guard let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first else { + return nil + } + + return tableVideo.init(value: result) + } func getVideoDurationTime(metadata: tableMetadata?) -> CMTime? { guard let metadata = metadata else { return nil } diff --git a/iOSClient/Extensions/UIImage+Extensions.swift b/iOSClient/Extensions/UIImage+Extensions.swift index 0211ca167..2bc191ed4 100644 --- a/iOSClient/Extensions/UIImage+Extensions.swift +++ b/iOSClient/Extensions/UIImage+Extensions.swift @@ -173,4 +173,35 @@ extension UIImage { UIGraphicsEndImageContext() return newImage } + + /// Downsamles a image using ImageIO. Has better memory perfomance than redrawing using UIKit + /// + /// - [Source](https://swiftsenpai.com/development/reduce-uiimage-memory-footprint/) + /// - [Original Source, WWDC18](https://developer.apple.com/videos/play/wwdc2018/416/?time=1352) + /// - Parameters: + /// - imageURL: The URL path of the image + /// - pointSize: The target point size + /// - scale: The point to pixel scale (Pixeld per point) + /// - Returns: The downsampled image, if successful + static func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat = UIScreen.main.scale) -> UIImage? { + + // Create an CGImageSource that represent an image + let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary + guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions) else { return nil } + + // Calculate the desired dimension + let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale + + // Perform downsampling + let downsampleOptions = [ + kCGImageSourceCreateThumbnailFromImageAlways: true, + kCGImageSourceShouldCacheImmediately: true, + kCGImageSourceCreateThumbnailWithTransform: true, + kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels + ] as CFDictionary + guard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions) else { return nil } + + // Return the downsampled image as UIImage + return UIImage(cgImage: downsampledImage) + } } diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadAssets.swift b/iOSClient/Main/Create cloud/NCCreateFormUploadAssets.swift index 287f3fcfc..686abeefa 100644 --- a/iOSClient/Main/Create cloud/NCCreateFormUploadAssets.swift +++ b/iOSClient/Main/Create cloud/NCCreateFormUploadAssets.swift @@ -463,6 +463,7 @@ class NCCreateFormUploadAssets: XLFormViewController, NCSelectDelegate { conflict.metadatasNOConflict = metadatasNOConflict conflict.metadatasMOV = metadatasMOV conflict.metadatasUploadInConflict = metadatasUploadInConflict + conflict.delegate = self.appDelegate self.appDelegate.window?.rootViewController?.present(conflict, animated: true, completion: nil) } diff --git a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift b/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift index b354b3b80..0816812c5 100644 --- a/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift +++ b/iOSClient/Main/Create cloud/NCCreateFormUploadConflict.swift @@ -58,7 +58,6 @@ extension NCCreateFormUploadConflictDelegate { @objc var alwaysNewFileNameNumber: Bool = false @objc var textLabelDetailNewFile: String? - let appDelegate = UIApplication.shared.delegate as! AppDelegate var metadatasConflictNewFiles: [String] = [] var metadatasConflictAlreadyExistingFiles: [String] = [] var fileNamesPath: [String: String] = [:] @@ -179,7 +178,9 @@ extension NCCreateFormUploadConflictDelegate { })) conflictAlert.addAction(UIAlertAction(title: NSLocalizedString("_cancel_keep_existing_action_title_", comment: ""), style: .cancel, handler: { _ in - self.dismiss(animated: true, completion: nil) + self.dismiss(animated: true) { + self.delegate?.dismissCreateFormUploadConflict(metadatas: nil) + } })) conflictAlert.addAction(UIAlertAction(title: NSLocalizedString("_more_action_title_", comment: ""), style: .default, handler: { _ in @@ -237,9 +238,9 @@ extension NCCreateFormUploadConflictDelegate { } @IBAction func buttonCancelTouch(_ sender: Any) { - - delegate?.dismissCreateFormUploadConflict(metadatas: nil) - dismiss(animated: true) + dismiss(animated: true) { + self.delegate?.dismissCreateFormUploadConflict(metadatas: nil) + } } @IBAction func buttonContinueTouch(_ sender: Any) { @@ -305,19 +306,15 @@ extension NCCreateFormUploadConflictDelegate { } } else { - print("error") + // used UIAlert (replace all) } } metadatasNOConflict.append(contentsOf: metadatasMOV) - if delegate != nil { - delegate?.dismissCreateFormUploadConflict(metadatas: metadatasNOConflict) - } else { - appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: metadatasNOConflict) + dismiss(animated: true) { + self.delegate?.dismissCreateFormUploadConflict(metadatas: self.metadatasNOConflict) } - - dismiss(animated: true) } } @@ -458,8 +455,8 @@ extension NCCreateFormUploadConflict: UITableViewDataSource { do { if metadataNewFile.classFile == NCCommunicationCommon.typeClassFile.image.rawValue { - let data = try Data(contentsOf: URL(fileURLWithPath: filePathNewFile)) - if let image = UIImage(data: data) { + // preserver memory especially for very large files in Share extension + if let image = UIImage.downsample(imageAt: URL(fileURLWithPath: filePathNewFile), to: cell.imageNewFile.frame.size) { cell.imageNewFile.image = image } } diff --git a/iOSClient/Main/NCFunctionCenter.swift b/iOSClient/Main/NCFunctionCenter.swift index 5ec47ed59..fca6d01f8 100644 --- a/iOSClient/Main/NCFunctionCenter.swift +++ b/iOSClient/Main/NCFunctionCenter.swift @@ -24,7 +24,7 @@ import UIKit import NCCommunication import Queuer -import IHProgressHUD +import JGProgressHUD @objc class NCFunctionCenter: NSObject, UIDocumentInteractionControllerDelegate, NCSelectDelegate { @objc public static let shared: NCFunctionCenter = { @@ -361,26 +361,38 @@ import IHProgressHUD let fileNameImage = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!) let fileNameMov = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadataMov.ocId, fileNameView: metadataMov.fileNameView)!) - - IHProgressHUD.set(defaultMaskType: .clear) - IHProgressHUD.set(minimumDismiss: 2) - + let hud = JGProgressHUD() + + hud.indicatorView = JGProgressHUDRingIndicatorView() + if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView { + indicatorView.ringWidth = 1.5 + } + hud.show(in: (appDelegate.window?.rootViewController?.view)!) + hud.textLabel.text = NSLocalizedString("_saving_", comment: "") + NCLivePhoto.generate(from: fileNameImage, videoURL: fileNameMov, progress: { progress in - - IHProgressHUD.show(progress: CGFloat(progress)) + + hud.progress = Float(progress) }, completion: { _, resources in if resources != nil { NCLivePhoto.saveToLibrary(resources!) { result in - if !result { - IHProgressHUD.showError(withStatus: NSLocalizedString("_livephoto_save_error_", comment: "")) - } else { - IHProgressHUD.showSuccesswithStatus(NSLocalizedString("_success_", comment: "")) + DispatchQueue.main.async { + if !result { + hud.indicatorView = JGProgressHUDErrorIndicatorView() + hud.textLabel.text = NSLocalizedString("_livephoto_save_error_", comment: "") + } else { + hud.indicatorView = JGProgressHUDSuccessIndicatorView() + hud.textLabel.text = NSLocalizedString("_success_", comment: "") + } + hud.dismiss(afterDelay: 1) } } } else { - IHProgressHUD.showError(withStatus: NSLocalizedString("_livephoto_save_error_", comment: "")) + hud.indicatorView = JGProgressHUDErrorIndicatorView() + hud.textLabel.text = NSLocalizedString("_livephoto_save_error_", comment: "") + hud.dismiss(afterDelay: 1) } }) } @@ -457,25 +469,31 @@ import IHProgressHUD let ocIdUpload = UUID().uuidString let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(ocIdUpload, fileNameView: fileName)! try data.write(to: URL(fileURLWithPath: fileNameLocalPath)) - - IHProgressHUD.set(defaultMaskType: .clear) - IHProgressHUD.set(minimumDismiss: 2) + let hud = JGProgressHUD() + + hud.indicatorView = JGProgressHUDRingIndicatorView() + if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView { + indicatorView.ringWidth = 1.5 + } + hud.show(in: (appDelegate.window?.rootViewController?.view)!) + hud.textLabel.text = fileName NCCommunication.shared.upload(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath) { _ in } progressHandler: { progress in - - IHProgressHUD.show(progress: CGFloat(progress.fractionCompleted), status: fileName) - + hud.progress = Float(progress.fractionCompleted) } completionHandler: { account, ocId, etag, _, _, _, errorCode, errorDescription in if errorCode == 0 && etag != nil && ocId != nil { let toPath = CCUtility.getDirectoryProviderStorageOcId(ocId!, fileNameView: fileName)! NCUtilityFileSystem.shared.moveFile(atPath: fileNameLocalPath, toPath: toPath) NCManageDatabase.shared.addLocalFile(account: account, etag: etag!, ocId: ocId!, fileName: fileName) NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSourceNetworkForced, userInfo: ["serverUrl": serverUrl]) - IHProgressHUD.showSuccesswithStatus(NSLocalizedString("_success_", comment: "")) + hud.indicatorView = JGProgressHUDSuccessIndicatorView() + hud.textLabel.text = NSLocalizedString("_success_", comment: "") } else { - IHProgressHUD.showError(withStatus: NSLocalizedString(errorDescription, comment: "")) + hud.indicatorView = JGProgressHUDErrorIndicatorView() + hud.textLabel.text = NSLocalizedString(errorDescription, comment: "") } + hud.dismiss(afterDelay: 1) } } catch { return false diff --git a/iOSClient/Main/NCPickerViewController.swift b/iOSClient/Main/NCPickerViewController.swift index e005aa5ec..a4fddfa01 100644 --- a/iOSClient/Main/NCPickerViewController.swift +++ b/iOSClient/Main/NCPickerViewController.swift @@ -160,7 +160,7 @@ class NCDocumentPickerViewController: NSObject, UIDocumentPickerDelegate { if NCManageDatabase.shared.getMetadataConflict(account: appDelegate.account, serverUrl: serverUrl, fileName: fileName) != nil { if let conflict = UIStoryboard(name: "NCCreateFormUploadConflict", bundle: nil).instantiateInitialViewController() as? NCCreateFormUploadConflict { - + conflict.delegate = appDelegate conflict.serverUrl = serverUrl conflict.metadatasUploadInConflict = [metadataForUpload] diff --git a/iOSClient/Menu/NCViewer+Menu.swift b/iOSClient/Menu/NCViewer+Menu.swift index 8f87ec463..6a23fb6d9 100644 --- a/iOSClient/Menu/NCViewer+Menu.swift +++ b/iOSClient/Menu/NCViewer+Menu.swift @@ -133,7 +133,27 @@ extension NCViewer { ) ) } - + + // + // CONVERSION VIDEO TO MPEG4 (MFFF Lib) + // + #if MFFFLIB + if metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue { + + actions.append( + NCMenuAction( + title: NSLocalizedString("_video_conversion_", comment: ""), + icon: NCUtility.shared.loadImage(named: "film"), + action: { menuAction in + if let ncplayer = (viewController as? NCViewerMediaPage)?.currentViewController.ncplayer { + ncplayer.convertVideo() + } + } + ) + ) + } + #endif + // // SAVE IMAGE / VIDEO // diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index 3c3a1b274..0decbce5f 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -112,7 +112,7 @@ class NCGlobal: NSObject { // Database Realm // let databaseDefault = "nextcloud.realm" - let databaseSchemaVersion: UInt64 = 213 + let databaseSchemaVersion: UInt64 = 215 // Intro selector // @@ -279,6 +279,7 @@ class NCGlobal: NSObject { let selectorUploadAutoUpload = "uploadAutoUpload" let selectorUploadAutoUploadAll = "uploadAutoUploadAll" let selectorUploadFile = "uploadFile" + let selectorUploadFileShareExtension = "uploadFileShareExtension" let selectorSaveAlbum = "saveAlbum" let selectorSaveBackground = "saveBackground" let selectorSaveAlbumLivePhotoIMG = "saveAlbumLivePhotoIMG" diff --git a/iOSClient/Networking/NCNetworking.swift b/iOSClient/Networking/NCNetworking.swift index 35a8356be..4ffd96360 100644 --- a/iOSClient/Networking/NCNetworking.swift +++ b/iOSClient/Networking/NCNetworking.swift @@ -411,12 +411,46 @@ import Queuer // MARK: - Upload @objc func upload(metadata: tableMetadata, start: @escaping () -> Void, completion: @escaping (_ errorCode: Int, _ errorDescription: String) -> Void) { - - var metadata = tableMetadata.init(value: metadata) - var fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)! + + func uploadMetadata(_ metadata: tableMetadata) { + + NCManageDatabase.shared.addMetadata(metadata) + let metadata = tableMetadata.init(value: metadata) + + if metadata.e2eEncrypted { +#if !EXTENSION_FILE_PROVIDER_EXTENSION + NCNetworkingE2EE.shared.upload(metadata: metadata, start: start) { errorCode, errorDescription in + DispatchQueue.main.async { + completion(errorCode, errorDescription) + } + } +#endif + } else if metadata.chunk { + uploadChunkedFile(metadata: metadata, start: start) { errorCode, errorDescription in + DispatchQueue.main.async { + completion(errorCode, errorDescription) + } + } + } else if metadata.session == NCCommunicationCommon.shared.sessionIdentifierUpload { + uploadFile(metadata: metadata, start: start) { errorCode, errorDescription in + DispatchQueue.main.async { + completion(errorCode, errorDescription) + } + } + } else { + uploadFileInBackground(metadata: metadata, start: start) { errorCode, errorDescription in + DispatchQueue.main.async { + completion(errorCode, errorDescription) + } + } + } + } + + let metadata = tableMetadata.init(value: metadata) if CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: metadata.fileNameView) { + let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)! let results = NCCommunicationCommon.shared.getInternalType(fileName: metadata.fileNameView, mimeType: metadata.contentType, directory: false) metadata.contentType = results.mimeType metadata.iconName = results.iconName @@ -429,47 +463,21 @@ import Queuer } metadata.size = NCUtilityFileSystem.shared.getFileSize(filePath: fileNameLocalPath) - NCManageDatabase.shared.addMetadata(metadata) - metadata = tableMetadata.init(value: metadata) - - if metadata.e2eEncrypted { -#if !EXTENSION_FILE_PROVIDER_EXTENSION - NCNetworkingE2EE.shared.upload(metadata: tableMetadata.init(value: metadata), start: { start() }, completion: completion) -#endif - } else if metadata.chunk { - uploadChunkedFile(metadata: metadata, start: { start() }, completion: completion) - } else if metadata.session == NCCommunicationCommon.shared.sessionIdentifierUpload { - uploadFile(metadata: metadata, start: { start() }, completion: completion) - } else { - uploadFileInBackground(metadata: metadata, start: { start() }, completion: completion) - } + uploadMetadata(metadata) } else { CCUtility.extractImageVideoFromAssetLocalIdentifier(forUpload: metadata, notification: true) { extractMetadata, fileNamePath in - guard let extractMetadata = extractMetadata else { + guard let metadata = extractMetadata else { NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) return completion(NCGlobal.shared.errorInternalError, "Internal error") } - let metadata = tableMetadata.init(value: extractMetadata) - fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(extractMetadata.ocId, fileNameView: extractMetadata.fileNameView) + let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)! NCUtilityFileSystem.shared.moveFileInBackground(atPath: fileNamePath!, toPath: fileNameLocalPath) - NCManageDatabase.shared.addMetadata(extractMetadata) - - if metadata.e2eEncrypted { - #if !EXTENSION_FILE_PROVIDER_EXTENSION - NCNetworkingE2EE.shared.upload(metadata: extractMetadata, start: { start() }, completion: completion) - #endif - } else if metadata.chunk { - self.uploadChunkedFile(metadata: metadata, start: { start() }, completion: completion) - } else if metadata.session == NCCommunicationCommon.shared.sessionIdentifierUpload { - self.uploadFile(metadata: metadata, start: { start() }, completion: completion) - } else { - self.uploadFileInBackground(metadata: metadata, start: { start() }, completion: completion) - } + uploadMetadata(metadata) } } } diff --git a/iOSClient/Networking/NCNetworkingE2EE.swift b/iOSClient/Networking/NCNetworkingE2EE.swift index ae1789216..0d738164c 100644 --- a/iOSClient/Networking/NCNetworkingE2EE.swift +++ b/iOSClient/Networking/NCNetworkingE2EE.swift @@ -86,7 +86,7 @@ import Alamofire object.serverUrl = serverUrl object.version = 1 - _ = NCManageDatabase.shared.addE2eEncryption(object) + NCManageDatabase.shared.addE2eEncryption(object) self.sendE2EMetadata(account: account, serverUrl: serverUrl, fileNameRename: nil, fileNameNewRename: nil, deleteE2eEncryption: nil, urlBase: urlBase) { e2eToken, errorCode, errorDescription in // unlock diff --git a/iOSClient/Networking/NCNetworkingProcessUpload.swift b/iOSClient/Networking/NCNetworkingProcessUpload.swift index 018295a4a..5b7bb01e5 100644 --- a/iOSClient/Networking/NCNetworkingProcessUpload.swift +++ b/iOSClient/Networking/NCNetworkingProcessUpload.swift @@ -242,6 +242,15 @@ class NCNetworkingProcessUpload: NSObject { var session: URLSession? + // remove leaning upload share extension + let metadatasUploadShareExtension = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "session == %@ AND sessionSelector == %@", NCCommunicationCommon.shared.sessionIdentifierUpload, NCGlobal.shared.selectorUploadFileShareExtension)) + for metadata in metadatasUploadShareExtension { + let path = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId)! + NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) + NCManageDatabase.shared.deleteChunks(account: metadata.account, ocId: metadata.ocId) + NCUtilityFileSystem.shared.deleteFile(filePath: path) + } + // verify metadataStatusInUpload (BACKGROUND) let metadatasInUploadBackground = NCManageDatabase.shared.getMetadatas( predicate: NSPredicate( diff --git a/iOSClient/Rename file/NCRenameFile.swift b/iOSClient/Rename file/NCRenameFile.swift index 017c15d3c..c96085ef0 100644 --- a/iOSClient/Rename file/NCRenameFile.swift +++ b/iOSClient/Rename file/NCRenameFile.swift @@ -219,8 +219,9 @@ class NCRenameFile: UIViewController, UITextFieldDelegate { } fileNameNew = (fileNameWithoutExt.text ?? "") + "." + (ext.text ?? "") - self.delegate?.rename(fileName: fileName, fileNameNew: fileNameNew) - self.dismiss(animated: true) + self.dismiss(animated: true) { + self.delegate?.rename(fileName: fileName, fileNameNew: fileNameNew) + } } } diff --git a/iOSClient/Security/NCEndToEndEncryption.m b/iOSClient/Security/NCEndToEndEncryption.m index f3252ace8..8ff38430f 100644 --- a/iOSClient/Security/NCEndToEndEncryption.m +++ b/iOSClient/Security/NCEndToEndEncryption.m @@ -78,16 +78,21 @@ { OPENSSL_init(); + int ret; EVP_PKEY * pkey; pkey = EVP_PKEY_new(); - RSA * rsa; - rsa = RSA_generate_key( - 2048, /* number of bits for the key - 2048 is a sensible value */ - RSA_F4, /* exponent - RSA_F4 is defined as 0x10001L */ - NULL, /* callback - can be NULL if we aren't displaying progress */ - NULL /* callback argument - not needed in this case */ - ); + BIGNUM *bignum = BN_new(); + ret = BN_set_word(bignum, RSA_F4); + if (ret != 1) { + return NO; + } + + rsa = RSA_new(); + ret = RSA_generate_key_ex(rsa, 2048, bignum, NULL); + if (ret != 1) { + return NO; + } EVP_PKEY_assign_RSA(pkey, rsa); @@ -581,7 +586,6 @@ - (NSData *)encryptAsymmetricString:(NSString *)plain publicKey:(NSString *)publicKey privateKey:(NSString *)privateKey { - ENGINE *eng = ENGINE_get_default_RSA(); EVP_PKEY *key = NULL; int status = 0; @@ -616,7 +620,7 @@ return nil; } - EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key, eng); + EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key, NULL); if (!ctx) return nil; @@ -658,7 +662,6 @@ - (NSString *)decryptAsymmetricData:(NSData *)cipherData privateKey:(NSString *)privateKey { unsigned char *pKey = (unsigned char *)[privateKey UTF8String]; - ENGINE *eng = ENGINE_get_default_RSA(); int status = 0; BIO *bio = BIO_new_mem_buf(pKey, -1); @@ -669,7 +672,7 @@ if (!key) return nil; - EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key, eng); + EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key, NULL); if (!ctx) return nil; diff --git a/iOSClient/Settings/Acknowledgements.rtf b/iOSClient/Settings/Acknowledgements.rtf index c2f32cf70..57bd9041d 100644 --- a/iOSClient/Settings/Acknowledgements.rtf +++ b/iOSClient/Settings/Acknowledgements.rtf @@ -1,8 +1,8 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2580 +{\rtf1\ansi\ansicpg1252\cocoartf2636 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} -\paperw12240\paperh15840\margl1440\margr1440\vieww34680\viewh19260\viewkind0 +\margl1440\margr1440\vieww34680\viewh19260\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 \f0\fs24 \cf0 \ @@ -199,11 +199,11 @@ Copyright (c) Tim Oliver\ ____________________________________________\ \ -\f1\b IHProgressHUD +\f1\b JGProgressHUD \f0\b0 \ \ MIT License\ \ -Copyright (c) Md Ibrahim Hassan\ +Copyright (c) Jonas Gessner\ ____________________________________________\ }
\ No newline at end of file diff --git a/iOSClient/Settings/CCAdvanced.h b/iOSClient/Settings/CCAdvanced.h index 1c22e8fb2..7f9845888 100755 --- a/iOSClient/Settings/CCAdvanced.h +++ b/iOSClient/Settings/CCAdvanced.h @@ -22,7 +22,7 @@ // #import <MessageUI/MFMailComposeViewController.h> -#import <XLForm/XLForm.h> +#import <XLForm.h> @interface CCAdvanced : XLFormViewController <MFMailComposeViewControllerDelegate> diff --git a/iOSClient/Settings/CCManageAccount.h b/iOSClient/Settings/CCManageAccount.h index 6eea2af27..48a072c44 100644 --- a/iOSClient/Settings/CCManageAccount.h +++ b/iOSClient/Settings/CCManageAccount.h @@ -21,7 +21,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. // -#import <XLForm/XLForm.h> +#import <XLForm.h> @interface CCManageAccount : XLFormViewController diff --git a/iOSClient/Settings/CCManageAutoUpload.h b/iOSClient/Settings/CCManageAutoUpload.h index 168b7f883..1e6b701cf 100644 --- a/iOSClient/Settings/CCManageAutoUpload.h +++ b/iOSClient/Settings/CCManageAutoUpload.h @@ -21,7 +21,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. // -#import <XLForm/XLForm.h> +#import <XLForm.h> @interface CCManageAutoUpload : XLFormViewController diff --git a/iOSClient/Settings/NCManageEndToEndEncryption.h b/iOSClient/Settings/NCManageEndToEndEncryption.h index a35a3208d..41add2021 100644 --- a/iOSClient/Settings/NCManageEndToEndEncryption.h +++ b/iOSClient/Settings/NCManageEndToEndEncryption.h @@ -21,7 +21,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. // -#import <XLForm/XLForm.h> +#import <XLForm.h> @class NCEndToEndInitialize; diff --git a/iOSClient/Settings/NCSettings.h b/iOSClient/Settings/NCSettings.h index 05ebabe0c..e06a29f1a 100644 --- a/iOSClient/Settings/NCSettings.h +++ b/iOSClient/Settings/NCSettings.h @@ -23,7 +23,7 @@ #import <UIKit/UIKit.h> #import <MessageUI/MessageUI.h> -#import <XLForm/XLForm.h> +#import <XLForm.h> #import "CCUtility.h" @interface NCSettings : XLFormViewController diff --git a/iOSClient/Supporting Files/af.lproj/Localizable.strings b/iOSClient/Supporting Files/af.lproj/Localizable.strings Binary files differindex 3efb91c30..21e263093 100644 --- a/iOSClient/Supporting Files/af.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/af.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ar.lproj/Localizable.strings b/iOSClient/Supporting Files/ar.lproj/Localizable.strings Binary files differindex 47d88f81e..df9a3d9d9 100644 --- a/iOSClient/Supporting Files/ar.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ar.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ast.lproj/Localizable.strings b/iOSClient/Supporting Files/ast.lproj/Localizable.strings Binary files differindex 976711c3f..69b463bb3 100644 --- a/iOSClient/Supporting Files/ast.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ast.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/az.lproj/Localizable.strings b/iOSClient/Supporting Files/az.lproj/Localizable.strings Binary files differindex 49c6f8050..7468c2f81 100644 --- a/iOSClient/Supporting Files/az.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/az.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/bg_BG.lproj/Localizable.strings b/iOSClient/Supporting Files/bg_BG.lproj/Localizable.strings Binary files differindex bc062b616..5098e4369 100644 --- a/iOSClient/Supporting Files/bg_BG.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/bg_BG.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/bn_BD.lproj/Localizable.strings b/iOSClient/Supporting Files/bn_BD.lproj/Localizable.strings Binary files differindex c3a5ad2d8..66318496e 100644 --- a/iOSClient/Supporting Files/bn_BD.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/bn_BD.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/br.lproj/Localizable.strings b/iOSClient/Supporting Files/br.lproj/Localizable.strings Binary files differindex 516956454..4c277bd66 100644 --- a/iOSClient/Supporting Files/br.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/br.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/bs.lproj/Localizable.strings b/iOSClient/Supporting Files/bs.lproj/Localizable.strings Binary files differindex b2d172074..0b70741f9 100644 --- a/iOSClient/Supporting Files/bs.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/bs.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ca.lproj/Localizable.strings b/iOSClient/Supporting Files/ca.lproj/Localizable.strings Binary files differindex 1f2cdd384..7f8aea723 100644 --- a/iOSClient/Supporting Files/ca.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ca.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings b/iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings Binary files differindex 42ae9e102..dbd35be77 100644 --- a/iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/cy_GB.lproj/Localizable.strings b/iOSClient/Supporting Files/cy_GB.lproj/Localizable.strings Binary files differindex 66fc24ba2..cb306e884 100644 --- a/iOSClient/Supporting Files/cy_GB.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/cy_GB.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/da.lproj/Localizable.strings b/iOSClient/Supporting Files/da.lproj/Localizable.strings Binary files differindex 6b20c7433..ed9f65cb9 100644 --- a/iOSClient/Supporting Files/da.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/da.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/de.lproj/Localizable.strings b/iOSClient/Supporting Files/de.lproj/Localizable.strings Binary files differindex 0eb8af558..f14fb07d8 100644 --- a/iOSClient/Supporting Files/de.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/de.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/el.lproj/Localizable.strings b/iOSClient/Supporting Files/el.lproj/Localizable.strings Binary files differindex 1e7228d0e..b75187879 100644 --- a/iOSClient/Supporting Files/el.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/el.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/en-GB.lproj/Localizable.strings b/iOSClient/Supporting Files/en-GB.lproj/Localizable.strings Binary files differindex 2a35fa58e..104bf8157 100644 --- a/iOSClient/Supporting Files/en-GB.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/en-GB.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/en.lproj/Localizable.strings b/iOSClient/Supporting Files/en.lproj/Localizable.strings index 43a3941f8..e08d82840 100644 --- a/iOSClient/Supporting Files/en.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/en.lproj/Localizable.strings @@ -25,7 +25,7 @@ "_accessibility_add_upload_" = "Add and upload"; "_download_file_" = "Download file"; "_loading_" = "Loading"; -"_loading_with_points_" = "Loading…"; +"_loading_with_points_" = "Loading …"; "_loading_num_" = "Loading file %i"; "_loading_autoupload_" = "Auto uploading"; "_uploading_" = "Uploading"; @@ -71,7 +71,7 @@ "_save_exit_" = "Do you want to exit without saving?"; "_video_" = "Video"; "_overwrite_" = "Overwrite"; -"_transfers_in_queue_" = "Tranfers in progress, please wait…"; +"_transfers_in_queue_" = "Transfers in progress, please wait …"; "_too_errors_upload_" = "Too many errors, please verify the problem"; "_create_folder_" = "Create folder"; "_create_folder_on_" = "Create folder on"; @@ -115,7 +115,7 @@ "_dark_mode_detect_" = "Detect iOS dark mode"; "_screen_" = "Screen"; "_wipe_account_" = "Account wiped from server"; -"_appconfig_view_title_" = "Account configuration in progress…"; +"_appconfig_view_title_" = "Account configuration in progress …"; "_no_permission_add_file_" = "You don't have permission to add files"; "_no_permission_delete_file_" = "You don't have permission to delete files"; "_no_permission_modify_file_" = "You don't have permission to modify files"; @@ -143,6 +143,11 @@ "_recent_" = "Recent"; "_view_in_folder_" = "View in folder"; "_leave_share_" = "Leave this share"; + +/* Remove a file from a list, don't delete it entirely */ +"_remove_file_" = "Remove file"; + +/* Delete file and put it into the trash */ "_delete_file_" = "Delete file"; "_delete_folder_" = "Delete folder"; "_delete_photo_" = "Delete photo"; @@ -298,7 +303,7 @@ "_want_delete_" = "Do you really want to delete?"; "_no_delete_" = "No, do not delete"; "_yes_delete_" = "Yes, delete"; -"_remove_cache_" = "Please wait, deleting cache…"; +"_remove_cache_" = "Deleting cache, please wait …"; "_optimizations_" = "Optimizations"; "_synchronizations_" = "Synchronized folders"; "_version_server_" = "Server version"; @@ -386,7 +391,7 @@ "_connection_error_" = "Connection error"; "_serverstatus_error_" = "Connection to server failure, verify your server address or network status"; "_add_your_nextcloud_" = "Add your Nextcloud account"; -"_login_url_" = "Server address https://…"; +"_login_url_" = "Server address https:// …"; "_login_bottom_label_" = "Don't have a server yet?\nChoose one of the providers."; "_error_multidomain_" = "Address not allowed, only the following domains are valid:"; "_account_already_exists_" = "The account %@ already exists"; @@ -417,7 +422,7 @@ "_access_photo_location_not_enabled_" = "Access to Photos and Location not enabled"; "_access_photo_location_not_enabled_msg_" = "Please go to \"Settings\" and turn on \"Photo Access\" and \"Location Services\""; "_tutorial_photo_view_" = "No photos or videos uploaded yet"; -"_create_full_upload_" = "Creating archive… May take a long time. During this process, keep the application active during the transfer as well."; +"_create_full_upload_" = "Creating archive … May take a long time. During this process, keep the application active during the transfer as well."; "_error_createsubfolders_upload_" = "Error creating subfolders"; "_activate_autoupload_" = "Enable auto upload"; "_remove_photo_CameraRoll_" = "Remove from camera roll"; @@ -433,13 +438,13 @@ "_over_30_days_" = "over 30 days"; "_connection_internet_offline_" = "The internet connection appears to be offline or Wi-Fi is required"; "_insert_password_" = "Enter password"; -"_update_in_progress_" = "Version upgrade, please wait…"; +"_update_in_progress_" = "Version upgrade, please wait …"; "_forbidden_characters_" = "The file or folder name contains invalid characters"; "_cannot_send_mail_error_" = "No account set up, or wrong email address entered"; "_open_url_error_" = "Cannot open the URL for this action"; "_photo_camera_" = "Photos"; "_media_" = "Media"; -"_unzip_in_progress_" = "Extraction in progress on local storage…"; +"_unzip_in_progress_" = "Extraction in progress on local storage …"; "_file_unpacked_" = "File unpacked on local storage"; "_file_saved_local_" = "File saved on local storage."; "_file_not_present_" = "Error: File not present, please reload."; @@ -473,8 +478,8 @@ "_protect_passcode_" = "Protect with password"; "_share_" = "Share"; "_reload_" = "Reload"; -"_open_in_" = "Open in…"; -"_open_" = "Open…"; +"_open_in_" = "Open in …"; +"_open_" = "Open …"; "_remove_local_file_" = "Remove from cache"; "_add_local_" = "Add to local storage"; "_comm_erro_pull_down_" = "Attention: Communication error with the server. Pull down to refresh."; @@ -485,7 +490,7 @@ "_files_" = "files"; "_file_" = "file"; "_folder_blocked_" = "Folder blocked"; -"_downloading_progress_" = "Initiating download of files…"; +"_downloading_progress_" = "Initiating download of files …"; "_no_file_pull_down_" = "Upload a file or pull down to refresh"; "_browse_images_" = "Browse images"; "_synchronized_folder_" = "Keep the folder synchronized"; @@ -515,11 +520,11 @@ "_directory_on_top_no_" = "Folders on top"; "_folder_automatic_upload_" = "Folder for \"Auto upload\""; "_search_no_record_found_" = "No result"; -"_search_in_progress_" = "Search in progress…"; +"_search_in_progress_" = "Search in progress …"; "_search_instruction_" = "Search for file (minimum 2 characters)"; "_files_no_files_" = "No files in here"; "_files_no_folders_" = "No folders in here"; -"_request_in_progress_" = "Request to server in progress…"; +"_request_in_progress_" = "Request to server in progress …"; "audio" = "AUDIO"; "compress" = "COMPRESS"; @@ -558,7 +563,7 @@ "_password_pdf_error_" = "Wrong password"; "_error_download_photobrowser_" = "Error: Unable to download photo"; "_share_link_" = "Share link"; -"_share_link_button_" = "Send link to…"; +"_share_link_button_" = "Send link to …"; "_Link_name_" = "Link name"; "_password_" = "Password"; "_share_password_" = "Password protected link"; @@ -568,12 +573,12 @@ "_add_sharee_" = "Add users or groups"; "_add_sharee_footer_" = "You can share this resource by adding users or groups. To remove a share, remove all users and groups"; "_find_sharee_title_" = "Search"; -"_find_sharee_" = "Search for user or group…"; +"_find_sharee_" = "Search for user or group …"; "_find_sharee_footer_" = "Enter part of the name of the user or group to search for (at least 2 characters) followed by \"Return\", select the users that should be allowed to access the share followed by \"Done\" to confirm"; "_user_is_group_" = "(Group)"; "_direct_sharee_title_" = "Share"; "_direct_sharee_footer_" = "If you already know the name, enter it, then select the share type and press \"Done\" to confirm"; -"_direct_sharee_" = "Enter the username…"; +"_direct_sharee_" = "Enter the username …"; "_user_sharee_footer_" = "Tap to change permissions"; "_share_type_title_" = "Type of share"; "_share_type_user_" = "User"; @@ -583,7 +588,7 @@ "_password_obligatory_" = "Enforce password protection enabled, password obligatory"; "_shared_with_you_by_" = "Shared with you by"; "_shareLinksearch_placeholder_" = "Type a name and press Enter"; -"_new_comment_" = "New comment…"; +"_new_comment_" = "New comment …"; "_edit_comment_" = "Edit comment"; "_delete_comment_" = "Delete comment"; "_share_allow_editing_" = "Allow editing"; @@ -763,6 +768,7 @@ "_request_entity_too_large_" = "The file is too large"; "_not_possible_download_" = "It is not possible to download the file"; "_not_possible_upload_" = "It is not possible to upload the file"; +"_error_files_upload_" = "Error uploading files"; "_method_not_allowed_" = "The requested method is not supported"; "_invalid_url_" = "Invalid server URL"; "_invalid_literal_" = "Invalid search string"; @@ -822,4 +828,16 @@ "_copy_path_" = "Copy path"; "_certificates_" = "Certificates"; "_privacy_screen_" = "Splash screen when app inactive"; - +"_saving_" = "Saving …"; +// Video +"_video_processing_" = "Video processing"; +"_video_being_processed_" = "Video being processed …"; +"_downloading_" = "Downloading"; +"_download_error_" = "Download error"; +"_subtitle_" = "Subtitle"; +"_dts_to_ac3_" = "The DTS is not supported, it requires a conversion to Dolby Digital"; +"_reuired_conversion_" = "This video takes a long time to convert."; +"_stay_app_foreground_" = "Keep the app in the foreground …"; +"_conversion_available_" = "The conversion is always available on menu"; +"_video_format_not_recognized_" = "This video needs to be processed to be played, do you want to do it now?"; +"_conversion_max_compatibility_" = "Max compatibility, the conversion can take much longer"; diff --git a/iOSClient/Supporting Files/eo.lproj/Localizable.strings b/iOSClient/Supporting Files/eo.lproj/Localizable.strings Binary files differindex 6ef9c3dcd..a37cd5521 100644 --- a/iOSClient/Supporting Files/eo.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/eo.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-419.lproj/Localizable.strings b/iOSClient/Supporting Files/es-419.lproj/Localizable.strings Binary files differindex 292250b74..87e431b7d 100644 --- a/iOSClient/Supporting Files/es-419.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-419.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-AR.lproj/Localizable.strings b/iOSClient/Supporting Files/es-AR.lproj/Localizable.strings Binary files differindex bd6992ffc..f5a0f7e59 100644 --- a/iOSClient/Supporting Files/es-AR.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-AR.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-CL.lproj/Localizable.strings b/iOSClient/Supporting Files/es-CL.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-CL.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-CL.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-CO.lproj/Localizable.strings b/iOSClient/Supporting Files/es-CO.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-CO.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-CO.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-CR.lproj/Localizable.strings b/iOSClient/Supporting Files/es-CR.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-CR.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-CR.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-DO.lproj/Localizable.strings b/iOSClient/Supporting Files/es-DO.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-DO.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-DO.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-EC.lproj/Localizable.strings b/iOSClient/Supporting Files/es-EC.lproj/Localizable.strings Binary files differindex e7f49175f..51311efc0 100644 --- a/iOSClient/Supporting Files/es-EC.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-EC.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-GT.lproj/Localizable.strings b/iOSClient/Supporting Files/es-GT.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-GT.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-GT.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-HN.lproj/Localizable.strings b/iOSClient/Supporting Files/es-HN.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-HN.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-HN.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-MX.lproj/Localizable.strings b/iOSClient/Supporting Files/es-MX.lproj/Localizable.strings Binary files differindex e59a07f1a..5af7133a6 100644 --- a/iOSClient/Supporting Files/es-MX.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-MX.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-NI.lproj/Localizable.strings b/iOSClient/Supporting Files/es-NI.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-NI.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-NI.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-PA.lproj/Localizable.strings b/iOSClient/Supporting Files/es-PA.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-PA.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-PA.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-PE.lproj/Localizable.strings b/iOSClient/Supporting Files/es-PE.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-PE.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-PE.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-PR.lproj/Localizable.strings b/iOSClient/Supporting Files/es-PR.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-PR.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-PR.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-PY.lproj/Localizable.strings b/iOSClient/Supporting Files/es-PY.lproj/Localizable.strings Binary files differindex b0d7b02ea..9db190576 100644 --- a/iOSClient/Supporting Files/es-PY.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-PY.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-SV.lproj/Localizable.strings b/iOSClient/Supporting Files/es-SV.lproj/Localizable.strings Binary files differindex 9755b0a9f..1d765f7b9 100644 --- a/iOSClient/Supporting Files/es-SV.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-SV.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es-UY.lproj/Localizable.strings b/iOSClient/Supporting Files/es-UY.lproj/Localizable.strings Binary files differindex 96ae36764..63e8fc6b6 100644 --- a/iOSClient/Supporting Files/es-UY.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es-UY.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/es.lproj/Localizable.strings b/iOSClient/Supporting Files/es.lproj/Localizable.strings Binary files differindex 067cf5a49..a66685a43 100644 --- a/iOSClient/Supporting Files/es.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/es.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/et_EE.lproj/Localizable.strings b/iOSClient/Supporting Files/et_EE.lproj/Localizable.strings Binary files differindex 3c5ca9b97..a75c94f67 100644 --- a/iOSClient/Supporting Files/et_EE.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/et_EE.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/eu.lproj/Localizable.strings b/iOSClient/Supporting Files/eu.lproj/Localizable.strings Binary files differindex 0ad96afa1..2b341dbe9 100644 --- a/iOSClient/Supporting Files/eu.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/eu.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/fa.lproj/Localizable.strings b/iOSClient/Supporting Files/fa.lproj/Localizable.strings Binary files differindex cf44b0c48..a7e04a24e 100644 --- a/iOSClient/Supporting Files/fa.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/fa.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings b/iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings Binary files differindex 5fe4efd52..264e87450 100644 --- a/iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/fr.lproj/Localizable.strings b/iOSClient/Supporting Files/fr.lproj/Localizable.strings Binary files differindex 474800104..376e187a9 100644 --- a/iOSClient/Supporting Files/fr.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/fr.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/gl.lproj/Localizable.strings b/iOSClient/Supporting Files/gl.lproj/Localizable.strings Binary files differindex bb9f2958e..6cd87ef3c 100644 --- a/iOSClient/Supporting Files/gl.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/gl.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/he.lproj/Localizable.strings b/iOSClient/Supporting Files/he.lproj/Localizable.strings Binary files differindex c018f0daf..ce6a9c74f 100644 --- a/iOSClient/Supporting Files/he.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/he.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/hr.lproj/Localizable.strings b/iOSClient/Supporting Files/hr.lproj/Localizable.strings Binary files differindex f0e5e87ed..93aa635c5 100644 --- a/iOSClient/Supporting Files/hr.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/hr.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/hu.lproj/Localizable.strings b/iOSClient/Supporting Files/hu.lproj/Localizable.strings Binary files differindex f5c74bad9..863dfa382 100644 --- a/iOSClient/Supporting Files/hu.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/hu.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ia.lproj/Localizable.strings b/iOSClient/Supporting Files/ia.lproj/Localizable.strings Binary files differindex 90f8beb84..512a9744d 100644 --- a/iOSClient/Supporting Files/ia.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ia.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/id.lproj/Localizable.strings b/iOSClient/Supporting Files/id.lproj/Localizable.strings Binary files differindex df99eb24c..e65a18559 100644 --- a/iOSClient/Supporting Files/id.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/id.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/is.lproj/Localizable.strings b/iOSClient/Supporting Files/is.lproj/Localizable.strings Binary files differindex 37a72f17d..77ce1282a 100644 --- a/iOSClient/Supporting Files/is.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/is.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/it.lproj/Localizable.strings b/iOSClient/Supporting Files/it.lproj/Localizable.strings Binary files differindex 55186b2f7..7e76dcf01 100644 --- a/iOSClient/Supporting Files/it.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/it.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings b/iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings Binary files differindex fa64bf6cb..547f85a4a 100644 --- a/iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ja-JP.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings b/iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings Binary files differindex a51cbe7f2..980dd2284 100644 --- a/iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ko.lproj/Localizable.strings b/iOSClient/Supporting Files/ko.lproj/Localizable.strings Binary files differindex a92f4615d..aafb05b37 100644 --- a/iOSClient/Supporting Files/ko.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ko.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/lb.lproj/Localizable.strings b/iOSClient/Supporting Files/lb.lproj/Localizable.strings Binary files differindex ed5772bd7..fae4465b7 100644 --- a/iOSClient/Supporting Files/lb.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/lb.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/lo.lproj/Localizable.strings b/iOSClient/Supporting Files/lo.lproj/Localizable.strings Binary files differindex dab2b2b9f..264f74f32 100644 --- a/iOSClient/Supporting Files/lo.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/lo.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/lt_LT.lproj/Localizable.strings b/iOSClient/Supporting Files/lt_LT.lproj/Localizable.strings Binary files differindex 1f31b8079..f88b4f87d 100644 --- a/iOSClient/Supporting Files/lt_LT.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/lt_LT.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/lv.lproj/Localizable.strings b/iOSClient/Supporting Files/lv.lproj/Localizable.strings Binary files differindex 26f2e7cf5..ac1da0780 100644 --- a/iOSClient/Supporting Files/lv.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/lv.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/mk.lproj/Localizable.strings b/iOSClient/Supporting Files/mk.lproj/Localizable.strings Binary files differindex f61ad8027..9dd9b4609 100644 --- a/iOSClient/Supporting Files/mk.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/mk.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/mn.lproj/Localizable.strings b/iOSClient/Supporting Files/mn.lproj/Localizable.strings Binary files differindex 65807c359..fd792c77b 100644 --- a/iOSClient/Supporting Files/mn.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/mn.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings b/iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings Binary files differindex 2b11487af..a5e04176a 100644 --- a/iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/nl.lproj/Localizable.strings b/iOSClient/Supporting Files/nl.lproj/Localizable.strings Binary files differindex fdfb0f35a..823702989 100644 --- a/iOSClient/Supporting Files/nl.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/nl.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/nn_NO.lproj/Localizable.strings b/iOSClient/Supporting Files/nn_NO.lproj/Localizable.strings Binary files differindex da2a2b1a0..c34e8715f 100644 --- a/iOSClient/Supporting Files/nn_NO.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/nn_NO.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/oc.lproj/Localizable.strings b/iOSClient/Supporting Files/oc.lproj/Localizable.strings Binary files differindex 8090f99c0..77ecdf6f8 100644 --- a/iOSClient/Supporting Files/oc.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/oc.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/pl.lproj/Localizable.strings b/iOSClient/Supporting Files/pl.lproj/Localizable.strings Binary files differindex c49bda67c..6dec5b026 100644 --- a/iOSClient/Supporting Files/pl.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/pl.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings b/iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings Binary files differindex 6054f4672..934bfad15 100644 --- a/iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings b/iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings Binary files differindex 3a0b0a2fc..f6e2514e1 100644 --- a/iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ro.lproj/Localizable.strings b/iOSClient/Supporting Files/ro.lproj/Localizable.strings Binary files differindex 386fad178..2ed82520d 100644 --- a/iOSClient/Supporting Files/ro.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ro.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/ru.lproj/Localizable.strings b/iOSClient/Supporting Files/ru.lproj/Localizable.strings Binary files differindex 85698c41b..ca1a3f56b 100644 --- a/iOSClient/Supporting Files/ru.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/ru.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sc.lproj/Localizable.strings b/iOSClient/Supporting Files/sc.lproj/Localizable.strings Binary files differindex e3c7eda7b..54b9c1777 100644 --- a/iOSClient/Supporting Files/sc.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sc.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/si.lproj/Localizable.strings b/iOSClient/Supporting Files/si.lproj/Localizable.strings Binary files differindex 27e552922..21cd9ca0c 100644 --- a/iOSClient/Supporting Files/si.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/si.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings b/iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings Binary files differindex e06764a5c..21b2589f1 100644 --- a/iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sl.lproj/Localizable.strings b/iOSClient/Supporting Files/sl.lproj/Localizable.strings Binary files differindex d20393a1e..6524d21f6 100644 --- a/iOSClient/Supporting Files/sl.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sl.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sq.lproj/Localizable.strings b/iOSClient/Supporting Files/sq.lproj/Localizable.strings Binary files differindex 37225fe73..2d3efbb22 100644 --- a/iOSClient/Supporting Files/sq.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sq.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sr.lproj/Localizable.strings b/iOSClient/Supporting Files/sr.lproj/Localizable.strings Binary files differindex f16069e25..1d79879fd 100644 --- a/iOSClient/Supporting Files/sr.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sr.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sr@latin.lproj/Localizable.strings b/iOSClient/Supporting Files/sr@latin.lproj/Localizable.strings Binary files differindex c0a4bc668..7b1f593d3 100644 --- a/iOSClient/Supporting Files/sr@latin.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sr@latin.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/sv.lproj/Localizable.strings b/iOSClient/Supporting Files/sv.lproj/Localizable.strings Binary files differindex eba3a29dd..804e59180 100644 --- a/iOSClient/Supporting Files/sv.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/sv.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/th_TH.lproj/Localizable.strings b/iOSClient/Supporting Files/th_TH.lproj/Localizable.strings Binary files differindex 7b654608a..5e11e4de5 100644 --- a/iOSClient/Supporting Files/th_TH.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/th_TH.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/tr.lproj/Localizable.strings b/iOSClient/Supporting Files/tr.lproj/Localizable.strings Binary files differindex 58f6c0895..7d12c0f38 100644 --- a/iOSClient/Supporting Files/tr.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/tr.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/uk.lproj/Localizable.strings b/iOSClient/Supporting Files/uk.lproj/Localizable.strings Binary files differindex 69af5cc02..ca5b942fe 100644 --- a/iOSClient/Supporting Files/uk.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/uk.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/vi.lproj/Localizable.strings b/iOSClient/Supporting Files/vi.lproj/Localizable.strings Binary files differindex 1ddc5eca7..a390b61f0 100644 --- a/iOSClient/Supporting Files/vi.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/vi.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings b/iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings Binary files differindex 5185e2eb5..4e59a0f48 100644 --- a/iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings b/iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings Binary files differindex 49fed5d3b..4e1076bc4 100644 --- a/iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings diff --git a/iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings b/iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings Binary files differindex e38510ffb..d2fe23210 100644 --- a/iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings +++ b/iOSClient/Supporting Files/zh_HK.lproj/Localizable.strings diff --git a/iOSClient/Utility/CCUtility.h b/iOSClient/Utility/CCUtility.h index db9593127..360056a67 100644 --- a/iOSClient/Utility/CCUtility.h +++ b/iOSClient/Utility/CCUtility.h @@ -27,7 +27,7 @@ #import <sys/sysctl.h> #import <AssetsLibrary/AssetsLibrary.h> #import <MessageUI/MessageUI.h> -#import <UICKeyChainStore/UICKeyChainStore.h> +#import <UICKeyChainStore.h> #import <Photos/Photos.h> #import <PDFKit/PDFKit.h> diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift index a04eb68b0..05548d089 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift @@ -29,10 +29,10 @@ import MediaPlayer class NCPlayer: NSObject { - private let appDelegate = UIApplication.shared.delegate as! AppDelegate + internal let appDelegate = UIApplication.shared.delegate as! AppDelegate + internal var url: URL + internal var playerToolBar: NCPlayerToolBar? - private var url: URL - private var playerToolBar: NCPlayerToolBar? private var imageVideoContainer: imageVideoContainerView private var detailView: NCViewerMediaDetailView? private var viewController: UIViewController @@ -69,7 +69,7 @@ class NCPlayer: NSObject { if CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: NCGlobal.shared.fileNameVideoEncoded) { self.url = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: NCGlobal.shared.fileNameVideoEncoded)) } - + openAVPlayer() { status, error in switch status { @@ -79,41 +79,16 @@ class NCPlayer: NSObject { } break case .failed: - if error?.code == AVError.Code.fileFormatNotRecognized.rawValue && !CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: NCGlobal.shared.fileNameVideoEncoded) && !NCBrandOptions.shared.disable_ff { - let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: NSLocalizedString("_video_format_not_recognized_", comment: ""), preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_", comment: ""), style: .default, handler: { action in - /* - ncFF.convertVideo { session, url in - let returnCode = session?.getReturnCode() - - if returnCode?.isSuccess() ?? false { - self.url = url - self.openAVPlayer() { status, error in - if let error = error { - NCContentPresenter.shared.messageNotification(error.localizedDescription, description: error.localizedFailureReason, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) - } - } - } else if returnCode?.isCancel() ?? false { - // nothing - } else { - NCContentPresenter.shared.messageNotification("_error_", description: "_error_something_wrong_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) - } - } - */ - })) - alertController.addAction(UIAlertAction(title: NSLocalizedString("_no_", comment: ""), style: .default, handler: { action in - NCContentPresenter.shared.messageNotification("_info_", description: "_video_conversion_available_after_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.info, errorCode: NCGlobal.shared.errorNoError, priority: .max) - })) - self.appDelegate.window?.rootViewController?.present(alertController, animated: true) + #if MFFFLIB + self.convertVideo(error: error) + #else + if let title = error?.localizedDescription, let description = error?.localizedFailureReason { + NCContentPresenter.shared.messageNotification(title, description: description, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) } else { - if let title = error?.localizedDescription, let description = error?.localizedFailureReason { - NCContentPresenter.shared.messageNotification(title, description: description, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) - } else { - NCContentPresenter.shared.messageNotification("_error_", description: "_error_something_wrong_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) - } + NCContentPresenter.shared.messageNotification("_error_", description: "_error_something_wrong_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max) } + #endif break - case .cancelled: break default: @@ -126,6 +101,7 @@ class NCPlayer: NSObject { print("Play URL: \(self.url)") player = AVPlayer(url: self.url) + playerToolBar?.setMetadata(self.metadata) if metadata.livePhoto { player?.isMuted = false @@ -162,7 +138,7 @@ class NCPlayer: NSObject { self.imageVideoContainer.image = self.imageVideoContainer.image?.image(alpha: 0) } - self.playerToolBar?.setBarPlayer(ncplayer: self, metadata: self.metadata) + self.playerToolBar?.setBarPlayer(ncplayer: self) self.generatorImagePreview() if !(self.detailView?.isShow() ?? false) { NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterShowPlayerToolBar, userInfo: ["ocId":self.metadata.ocId, "enableTimerAutoHide": false]) @@ -256,7 +232,7 @@ class NCPlayer: NSObject { playerToolBar?.updateToolBar() } - + // MARK: - func isPlay() -> Bool { @@ -303,9 +279,7 @@ class NCPlayer: NSObject { @objc func generatorImagePreview() { - guard let time = player?.currentTime() else { return } - if metadata.livePhoto { return } - if metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue { return } + guard let time = player?.currentTime(), !metadata.livePhoto, metadata.classFile != NCCommunicationCommon.typeClassFile.audio.rawValue else { return } var image: UIImage? @@ -339,3 +313,4 @@ class NCPlayer: NSObject { } } } + diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift index cd3abadf2..f3a539597 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift @@ -39,7 +39,7 @@ class NCPlayerToolBar: UIView { @IBOutlet weak var playbackSlider: UISlider! @IBOutlet weak var labelLeftTime: UILabel! @IBOutlet weak var labelCurrentTime: UILabel! - + enum sliderEventType { case began case ended @@ -121,11 +121,15 @@ class NCPlayerToolBar: UIView { } // MARK: - - - func setBarPlayer(ncplayer: NCPlayer, metadata: tableMetadata) { + + func setMetadata(_ metadata: tableMetadata) { + + self.metadata = metadata + } + + func setBarPlayer(ncplayer: NCPlayer) { self.ncplayer = ncplayer - self.metadata = metadata playbackSlider.value = 0 playbackSlider.minimumValue = 0 @@ -139,7 +143,7 @@ class NCPlayerToolBar: UIView { } public func updateToolBar() { - + guard let ncplayer = self.ncplayer else { return } // MUTE @@ -205,6 +209,7 @@ class NCPlayerToolBar: UIView { // MARK: Handle Notifications @objc func handleRouteChange(notification: Notification) { + guard let userInfo = notification.userInfo, let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt, let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { return } switch reason { @@ -257,16 +262,22 @@ class NCPlayerToolBar: UIView { public func show(enableTimerAutoHide: Bool = false) { - if metadata?.classFile != NCCommunicationCommon.typeClassFile.video.rawValue && metadata?.classFile != NCCommunicationCommon.typeClassFile.audio.rawValue { return } - if let metadata = self.metadata, metadata.livePhoto { return } - + guard let metadata = self.metadata, ncplayer != nil, !metadata.livePhoto, (metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue) else + { return } + + #if MFFFLIB + if MFFF.shared.existsMFFFSession(url: URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))) { + self.hide() + return + } + #endif + timerAutoHide?.invalidate() if enableTimerAutoHide { startTimerAutoHide() } - if !self.isHidden { return } - + UIView.animate(withDuration: 0.3, animations: { self.alpha = 1 self.playerTopToolBarView.alpha = 1 @@ -316,8 +327,7 @@ class NCPlayerToolBar: UIView { func skip(seconds: Float64) { - guard let ncplayer = ncplayer else { return } - guard let player = ncplayer.player else { return } + guard let ncplayer = ncplayer, let player = ncplayer.player else { return } let currentTime = player.currentTime() var newTime: CMTime = .zero @@ -359,7 +369,7 @@ class NCPlayerToolBar: UIView { timerAutoHide?.invalidate() } - + // MARK: - Event / Gesture @objc func onSliderValChanged(slider: UISlider, event: UIEvent) { @@ -487,7 +497,7 @@ class NCPlayerToolBar: UIView { } */ } - + func forward() { var index: Int = 0 diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift index 997c53706..e43aca34a 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift @@ -162,6 +162,13 @@ class NCViewerMedia: UIViewController { if let ncplayer = self.ncplayer { self.viewerMediaPage?.updateCommandCenter(ncplayer: ncplayer, metadata: self.metadata) } + + #if MFFFLIB + MFFF.shared.delegate = self.ncplayer +// if !MFFF.shared.existsMFFFSession(url: URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))) { +// self.playerToolBar.hideMessage() +// } + #endif } else if metadata.classFile == NCCommunicationCommon.typeClassFile.image.rawValue { diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard index 7e2a01943..8e3d04ebb 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ne8-hS-cp3"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ne8-hS-cp3"> <device id="retina5_5" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/> <capability name="Image references" minToolsVersion="12.0"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> |