From f0374ae6cd6c25f03d2ab6a2f774e3e4c0be27da Mon Sep 17 00:00:00 2001 From: Vitalii Tolkach Date: Fri, 9 May 2025 14:36:22 +0200 Subject: [PATCH 1/4] IONOS HiDrive Next release 1.0.0 --- .github/workflows/xcode.xxx | 72 + .gitignore | 5 + .gitlab-ci.yml | 150 ++ .slather.yml | 3 + .../File_Provider_Extension.entitlements | 14 + Brand/AppStore/File_Provider_Extension.plist | 40 + .../File_Provider_Extension_UI.entitlements | 14 + .../AppStore/File_Provider_Extension_UI.plist | 44 + ...otification_Service_Extension.entitlements | 18 + .../Notification_Service_Extension.plist | 31 + Brand/AppStore/Share.entitlements | 18 + Brand/AppStore/Share.plist | 42 + Brand/AppStore/Widget.entitlements | 18 + Brand/AppStore/Widget.plist | 16 + .../WidgetDashboardIntentHandler.entitlements | 18 + .../WidgetDashboardIntentHandler.plist | 30 + Brand/AppStore/iOSClient.entitlements | 28 + Brand/AppStore/iOSClient.plist | 195 ++ .../Beta/File_Provider_Extension.entitlements | 14 + Brand/Beta/File_Provider_Extension.plist | 40 + .../File_Provider_Extension_UI.entitlements | 14 + Brand/Beta/File_Provider_Extension_UI.plist | 44 + ...otification_Service_Extension.entitlements | 18 + .../Beta/Notification_Service_Extension.plist | 31 + Brand/Beta/Share.entitlements | 18 + Brand/Beta/Share.plist | 42 + Brand/Beta/Widget.entitlements | 18 + Brand/Beta/Widget.plist | 16 + .../WidgetDashboardIntentHandler.entitlements | 18 + Brand/Beta/WidgetDashboardIntentHandler.plist | 30 + Brand/Beta/iOSClient.entitlements | 28 + Brand/Beta/iOSClient.plist | 197 ++ .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 10876 bytes .../AppIcon.appiconset/Contents.json | 158 +- .../nextcloud-icon100@2x.png | Bin 5702 -> 0 bytes .../nextcloud-icon1024@1x.png | Bin 92806 -> 0 bytes .../nextcloud-icon114@2x.png | Bin 6523 -> 0 bytes .../nextcloud-icon120@2x.png | Bin 6641 -> 0 bytes .../nextcloud-icon120@3x.png | Bin 6641 -> 0 bytes .../nextcloud-icon144@2x.png | Bin 8380 -> 0 bytes .../nextcloud-icon152@2x.png | Bin 8981 -> 0 bytes .../nextcloud-icon167@2x.png | Bin 9874 -> 0 bytes .../nextcloud-icon180@3x.png | Bin 10742 -> 0 bytes .../nextcloud-icon20@1x.png | Bin 699 -> 0 bytes .../nextcloud-icon29@1x-1.png | Bin 1307 -> 0 bytes .../nextcloud-icon29@1x.png | Bin 1307 -> 0 bytes .../nextcloud-icon40@1x-1.png | Bin 1754 -> 0 bytes .../nextcloud-icon40@1x.png | Bin 1754 -> 0 bytes .../nextcloud-icon40@2x.png | Bin 1754 -> 0 bytes .../nextcloud-icon50@1x.png | Bin 2458 -> 0 bytes .../nextcloud-icon57@1x.png | Bin 2974 -> 0 bytes .../nextcloud-icon58@2x-1.png | Bin 2769 -> 0 bytes .../nextcloud-icon58@2x.png | Bin 2769 -> 0 bytes .../nextcloud-icon60@3x.png | Bin 3008 -> 0 bytes .../nextcloud-icon72@1x.png | Bin 3759 -> 0 bytes .../nextcloud-icon76@1x.png | Bin 4054 -> 0 bytes .../nextcloud-icon80@2x-1.png | Bin 4339 -> 0 bytes .../nextcloud-icon80@2x.png | Bin 4339 -> 0 bytes .../nextcloud-icon87@3x.png | Bin 4544 -> 0 bytes .../gradientBackground.imageset/Contents.json | 19 + .../GradientBackgroundPad.svg | 9 + .../GradientBackgroundPhone.svg | 9 + .../logo.imageset/Contents.json | 4 + Brand/Custom.xcassets/logo.imageset/logo.svg | 36 +- Brand/Database.swift | 2 +- Brand/File_Provider_Extension.entitlements | 4 +- Brand/File_Provider_Extension.plist | 4 +- Brand/File_Provider_Extension_UI.entitlements | 4 +- Brand/File_Provider_Extension_UI.plist | 34 +- Brand/LaunchScreen.storyboard | 50 +- Brand/NCBrand.swift | 74 +- ...otification_Service_Extension.entitlements | 4 +- Brand/Share.entitlements | 4 +- Brand/Share.plist | 2 +- Brand/Widget.entitlements | 4 +- Brand/Widget.plist | 10 +- .../WidgetDashboardIntentHandler.entitlements | 4 +- Brand/iOSClient.entitlements | 5 +- Brand/iOSClient.plist | 38 +- .../FileProviderItem.swift | 3 + Gemfile | 3 + Nextcloud.xcodeproj/project.pbxproj | 1700 +++++++++++++---- .../File Provider Extension.xcscheme | 5 - .../xcshareddata/xcschemes/Nextcloud.xcscheme | 18 + .../NotificationService.swift | 4 +- Share/NCShareCell.swift | 2 +- Share/NCShareExtension+DataSource.swift | 4 +- Share/NCShareExtension.swift | 2 +- .../Extensions/SwiftUIView+Extensions.swift | 33 + .../NextcloudSnapshotTests.swift | 37 + ...itiesView.DefaultPreviewConfiguration.heic | Bin 0 -> 32097 bytes ...t_HUDView.DefaultPreviewConfiguration.heic | Bin 0 -> 18202 bytes .../NextcloudUITests/AutoUploadUITests.swift | 127 ++ Tests/NextcloudUITests/BaseUIXCTestCase.swift | 27 + .../Cloud_Checkmark.svg | 3 + .../Cloud_Checkmark.imageset/Contents.json | 12 + .../Cloud_Xmark.imageset/Cloud_Xmark.svg | 3 + .../Cloud_Xmark.imageset/Contents.json | 12 + .../Contents.json | 12 + .../file_unsupported_widget.svg | 3 + .../Media.imageset/Contents.json | 12 + .../Assets.xcassets/Media.imageset/Media.svg | 3 + .../Contents.json | 3 +- Widget/Assets.xcassets/Mic.imageset/Mic.svg | 3 + .../Contents.json | 3 +- Widget/Assets.xcassets/Note.imageset/Note.svg | 3 + .../Scan.imageset/Contents.json | 12 + Widget/Assets.xcassets/Scan.imageset/Scan.svg | 3 + .../Background.colorset/Contents.json | 38 + .../Contents.json | 38 + Widget/Colors.xcassets/Contents.json | 6 + .../Divider.colorset/Contents.json | 20 + .../Subtitle.colorset/Contents.json | 38 + .../Text.colorset/Contents.json | 20 + .../Title.colorset/Contents.json | 38 + Widget/Dashboard/DashboardData.swift | 14 +- .../Dashboard/DashboardWidgetProvider.swift | 2 +- Widget/Dashboard/DashboardWidgetView.swift | 109 +- Widget/Files/FilesData.swift | 34 +- Widget/Files/FilesWidgetProvider.swift | 2 +- Widget/Files/FilesWidgetView.swift | 309 ++- Widget/Toolbar/ToolbarData.swift | 6 +- Widget/Toolbar/ToolbarWidgetProvider.swift | 2 +- Widget/Toolbar/ToolbarWidgetView.swift | 87 +- Widget/Widget.swift | 2 - Widget/WidgetCommon.swift | 76 + .../NCAccountSettingsModel.swift | 30 +- .../NCAccountSettingsView.swift | 517 ++--- iOSClient/Activity/NCActivity.swift | 6 +- iOSClient/AppDelegate.swift | 16 +- .../BurgerMenuAttachController.swift | 69 + iOSClient/BurgerMenu/BurgerMenuView.swift | 258 +++ .../BurgerMenu/BurgerMenuViewController.swift | 31 + .../BurgerMenu/BurgerMenuViewModel.swift | 103 + .../Color.colorset/Contents.json | 38 + .../AppBackground/Contents.json | 9 + .../DataProtection.colorset/Contents.json | 38 + .../AppBackground/Form.colorset/Contents.json | 38 + .../FormRow.colorset/Contents.json | 38 + .../AppBackground/Main.colorset/Contents.json | 38 + .../Background.colorset/Contents.json | 38 + .../ButtonForeground.colorset/Contents.json | 38 + .../CommonShadow.colorset/Contents.json | 20 + .../Colors.xcassets/BurgerMenu/Contents.json | 9 + .../Contents.json | 38 + .../BurgerMenu/Overlay.colorset/Contents.json | 20 + .../PressedButton.colorset/Contents.json | 38 + .../Contents.json | 20 + .../Colors.xcassets/Button/Contents.json | 9 + .../Colors.xcassets/Button/Link/Contents.json | 9 + .../Button/Link/Text/Contents.json | 9 + .../Link/Text/Disabled.colorset/Contents.json | 38 + .../Link/Text/Normal.colorset/Contents.json | 38 + .../Link/Text/Selected.colorset/Contents.json | 38 + .../Button/Primary/Background/Contents.json | 9 + .../Disabled.colorset/Contents.json | 38 + .../Background/Normal.colorset/Contents.json | 38 + .../Selected.colorset/Contents.json | 38 + .../Button/Primary/Contents.json | 9 + .../Button/Primary/Text/Contents.json | 9 + .../Text/Disabled.colorset/Contents.json | 38 + .../Text/Normal.colorset/Contents.json | 20 + .../Text/Selected.colorset/Contents.json | 20 + .../Button/Secondary/Background/Contents.json | 9 + .../Disabled.colorset/Contents.json | 20 + .../Background/Normal.colorset/Contents.json | 20 + .../Selected.colorset/Contents.json | 38 + .../Button/Secondary/Border/Contents.json | 9 + .../Border/Disabled.colorset/Contents.json | 38 + .../Border/Normal.colorset/Contents.json | 38 + .../Button/Secondary/Contents.json | 9 + .../Button/Secondary/Text/Contents.json | 9 + .../Text/Disabled.colorset/Contents.json | 38 + .../Text/Normal.colorset/Contents.json | 38 + .../Text/Selected.colorset/Contents.json | 38 + .../Background.colorset/Contents.json | 38 + .../CameraInformation/Contents.json | 9 + .../Contents.json | 20 + .../ImageTypeText.colorset/Contents.json | 20 + .../Text.colorset/Contents.json | 38 + .../TitleBackground.colorset/Contents.json | 38 + .../TitleText.colorset/Contents.json | 38 + iOSClient/Colors.xcassets/Contents.json | 6 + .../DataProtection/Contents.json | 9 + .../Link.colorset/Contents.json | 20 + .../ListRow.colorset/Contents.json | 38 + .../ListRowSubtitle.colorset/Contents.json | 38 + .../ListSeparator.colorset/Contents.json | 38 + .../NavigationBarTint.colorset/Contents.json | 38 + .../DestructiveAction.colorset/Contents.json | 20 + .../ButtonTint.colorset/Contents.json | 38 + .../FileActionsHeader/Contents.json | 9 + .../GrayButtonTint.colorset/Contents.json | 38 + .../Contents.json | 38 + .../Contents.json | 38 + .../SortButtonText.colorset/Contents.json | 38 + .../Background.colorset/Contents.json | 38 + .../Colors.xcassets/FileMenu/Contents.json | 9 + .../FolderIcon.colorset/Contents.json | 20 + .../FileMenu/Grabber.colorset/Contents.json | 38 + .../FileMenu/Icon.colorset/Contents.json | 38 + .../FileMenu/Overlay.colorset/Contents.json | 38 + .../SelectedRow.colorset/Contents.json | 38 + .../FileMenu/Text.colorset/Contents.json | 36 + .../FileSelection/Contents.json | 9 + .../Contents.json | 38 + .../Colors.xcassets/ListCell/Contents.json | 9 + .../ListCell/Separator.colorset/Contents.json | 20 + .../ListCell/Subtitle.colorset/Contents.json | 38 + .../ListCell/Title.colorset/Contents.json | 38 + .../Colors.xcassets/MediaPlayer/Contents.json | 9 + .../IconTint.colorset/Contents.json | 20 + .../SliderMaxColor.colorset/Contents.json | 20 + .../SliderMinColor.colorset/Contents.json | 20 + .../SliderThumb.colorset/Contents.json | 20 + .../NavigationBar/Contents.json | 9 + .../LogoTint.colorset/Contents.json | 38 + .../QualitySlider/Contents.json | 9 + .../MaximumTrackColor.colorset/Contents.json | 20 + .../ThumbColor.colorset/Contents.json | 20 + .../Contents.json | 38 + .../CancelTint.colorset/Contents.json | 38 + .../SelectToolbar/Contents.json | 9 + .../ItemStateActive.colorset/Contents.json | 38 + .../ItemStateInactive.colorset/Contents.json | 38 + .../ItemStateSelected.colorset/Contents.json | 38 + .../Background.colorset/Contents.json | 38 + .../Contents.json | 38 + .../BackgroundNormal.colorset/Contents.json | 38 + .../Share/Advanced/Cell/Contents.json | 9 + .../Cell/Subtitle.colorset/Contents.json | 38 + .../Cell/Title.colorset/Contents.json | 38 + .../Share/Advanced/Contents.json | 9 + .../SearchField/Border.colorset/Contents.json | 38 + .../Share/Advanced/SearchField/Contents.json | 9 + .../Placeholder.colorset/Contents.json | 38 + .../SectionTitle.colorset/Contents.json | 38 + .../Contents.json | 38 + .../TableCellSeparator.colorset/Contents.json | 38 + .../Share/Comment/Contents.json | 9 + .../Contents.json | 38 + .../TextFieldBorder.colorset/Contents.json | 38 + .../CommonIconTint.colorset/Contents.json | 38 + iOSClient/Colors.xcassets/Share/Contents.json | 9 + .../SearchUserCell/Background/Contents.json | 9 + .../Background/Normal.colorset/Contents.json | 38 + .../Background/Pressed.colorset/Contents.json | 38 + .../Share/SearchUserCell/Contents.json | 9 + .../Title.colorset/Contents.json | 36 + .../UserType.colorset/Contents.json | 38 + .../Share/TabTitle.colorset/Contents.json | 38 + .../Tabbar/ActiveItem.colorset/Contents.json | 38 + .../Tabbar/Background.colorset/Contents.json | 38 + .../Colors.xcassets/Tabbar/Contents.json | 9 + .../Tabbar/FabButton.colorset/Contents.json | 38 + .../InactiveItem.colorset/Contents.json | 38 + .../Transfers/Cell/Contents.json | 9 + .../Cell/Subtitle.colorset/Contents.json | 38 + .../Cell/Title.colorset/Contents.json | 38 + .../Colors.xcassets/Transfers/Contents.json | 9 + .../Background.colorset/Contents.json | 20 + .../Colors.xcassets/UserButton/Contents.json | 9 + .../UserButton/Tint.colorset/Contents.json | 20 + .../formSeparator.colorset/Contents.json | 20 + .../Components/Buttons/ButtonStyleGuide.swift | 171 ++ .../Buttons/CommonButtonConstants.swift | 23 + iOSClient/Components/Buttons/LinkButton.swift | 50 + .../Components/Buttons/PrimaryButton.swift | 67 + .../Components/Buttons/SecondaryButton.swift | 82 + iOSClient/Data/NCManageDatabase+Account.swift | 51 +- .../Data/NCManageDatabase+Metadata.swift | 4 + iOSClient/Data/NCManageDatabase.swift | 2 - .../DataProtectionAgreementManager.swift | 143 ++ .../DataProtectionAgreementScreen.swift | 98 + .../DataProtectionHostingController.swift | 16 + .../DataProtection/DataProtectionModel.swift | 46 + .../DataProtectionSettingsScreen.swift | 189 ++ iOSClient/DeepLink/NCDeepLinkHandler.swift | 8 +- .../PHAssetCollection+Extension.swift | 4 + .../UIAlertController+Extension.swift | 37 +- iOSClient/Extensions/UIColor+Extension.swift | 1 + iOSClient/Extensions/UIFont+Extension.swift | 2 +- .../UINavigationController+Extension.swift | 27 +- iOSClient/Extensions/UIView+Extension.swift | 4 + .../Extensions/UIView+GridSelection.swift | 23 + .../UIViewController+Extension.swift | 29 + iOSClient/Extensions/View+Design.swift | 37 + iOSClient/Extensions/View+Extension.swift | 2 + iOSClient/Favorites/NCFavorite.storyboard | 23 +- iOSClient/Favorites/NCFavorite.swift | 2 - .../NCFavoriteNavigationController.swift | 25 - iOSClient/Files/NCFiles.storyboard | 29 +- iOSClient/Files/NCFiles.swift | 14 +- .../Files/NCFilesNavigationController.swift | 145 -- .../Contents.json | 26 + .../MenuGroupByAlphabetic.png | Bin 0 -> 542 bytes .../MenuGroupByAlphabetic@3x-1.png | Bin 0 -> 1135 bytes .../MenuGroupByAlphabetic@3x.png | Bin 0 -> 1699 bytes .../MenuGroupByDate.imageset/Contents.json | 26 + .../MenuGroupByDate.png | Bin 0 -> 319 bytes .../MenuGroupByDate@2x.png | Bin 0 -> 570 bytes .../MenuGroupByDate@3x.png | Bin 0 -> 925 bytes .../MenuGroupByFile.imageset/Contents.json | 26 + .../MenuGroupByFile.png | Bin 0 -> 639 bytes .../MenuGroupByFile@2x.png | Bin 0 -> 729 bytes .../MenuGroupByFile@3x.png | Bin 0 -> 934 bytes .../Contents.json | 26 + .../MenuOrderByFileName.png | Bin 0 -> 459 bytes .../MenuOrderByFileName@2x.png | Bin 0 -> 841 bytes .../MenuOrderByFileName@3x.png | Bin 0 -> 1262 bytes .../MenuOrdeyByDate.imageset/Contents.json | 26 + .../MenuOrdeyByDate.png | Bin 0 -> 464 bytes .../MenuOrdeyByDate@2x.png | Bin 0 -> 724 bytes .../MenuOrdeyByDate@3x.png | Bin 0 -> 1377 bytes .../Contents.json | 26 + .../MenuOrdinamentoAscendente.png | Bin 0 -> 343 bytes .../MenuOrdinamentoAscendente@2x.png | Bin 0 -> 442 bytes .../MenuOrdinamentoAscendente@3x.png | Bin 0 -> 780 bytes .../Contents.json | 26 + .../MenuOrdinamentoDiscendente.png | Bin 0 -> 340 bytes .../MenuOrdinamentoDiscendente@2x.png | Bin 0 -> 441 bytes .../MenuOrdinamentoDiscendente@3x.png | Bin 0 -> 780 bytes .../WiFiSmall.imageset/Contents.json | 26 + .../WiFiSmall.imageset/WiFiSmall.png | Bin 0 -> 1565 bytes .../WiFiSmall.imageset/WiFiSmall@2x.png | Bin 0 -> 1451 bytes .../WiFiSmall.imageset/WiFiSmall@3x.png | Bin 0 -> 3633 bytes .../actionSheetModify.imageset/Contents.json | 26 + .../actionSheetModify.png | Bin 0 -> 441 bytes .../actionSheetModify@2x.png | Bin 0 -> 831 bytes .../actionSheetModify@3x.png | Bin 0 -> 1184 bytes .../Contents.json | 26 + .../activityTypeFailure.png | Bin 0 -> 564 bytes .../activityTypeFailure@2x.png | Bin 0 -> 1108 bytes .../activityTypeFailure@3x.png | Bin 0 -> 1796 bytes .../activityTypeInfo.imageset/Contents.json | 26 + .../activityTypeInfo.png | Bin 0 -> 770 bytes .../activityTypeInfo@2x.png | Bin 0 -> 1729 bytes .../activityTypeInfo@3x.png | Bin 0 -> 2643 bytes .../Contents.json | 26 + .../activityTypeInfoServer.png | Bin 0 -> 1897 bytes .../activityTypeInfoServer@2x.png | Bin 0 -> 2441 bytes .../activityTypeInfoServer@3x.png | Bin 0 -> 7301 bytes .../Contents.json | 26 + .../activityTypeSucces@2x.png | Bin 0 -> 1574 bytes .../activityTypeSuccess.png | Bin 0 -> 750 bytes .../activityTypeSuccess@3x.png | Bin 0 -> 2712 bytes .../addFolderInfo.imageset/Contents.json | 15 + .../addFolderInfo.imageset/addFolderInfo.pdf | Bin 0 -> 1061 bytes .../Contents.json | 2 +- .../application.imageset/application.pdf | Bin 0 -> 4089 bytes .../audioPlay.imageset/Contents.json | 15 + .../audioPlay.imageset/play.pdf | Bin 0 -> 2049 bytes .../Contents.json | 2 +- .../backward.imageset/backward.svg | 4 + .../Contents.json | 15 + .../sortCreatedDate.pdf | Bin 0 -> 1065 bytes .../Contents.json | 15 + .../sortUploadDate.pdf | Bin 0 -> 1060 bytes .../Contents.json | 15 + .../sortModifiedDate.pdf | Bin 0 -> 1061 bytes .../circle.imageset/Contents.json | 15 + .../circle.imageset/checkedNo.pdf | Bin 0 -> 3123 bytes .../cityzip.imageset/Contents.json | 15 + .../cityzip.imageset/cityzip.pdf | Bin 0 -> 1718 bytes .../closeCircle.imageset/Contents.json | 15 + .../closeCircle.imageset/closeCircle.pdf | Bin 0 -> 919 bytes .../cloudDownload.imageset/Contents.json | 15 + .../cloudDownload.imageset/cloudDownload.pdf | Bin 0 -> 4345 bytes .../cloudUpload.imageset/Contents.json | 15 + .../cloudUpload.imageset/cloudUpload.pdf | Bin 0 -> 4380 bytes .../contact.imageset/Contents.json | 12 + .../contact.imageset/contact.svg | 7 + .../Contents.json | 26 + .../create_file_document@2x.png | Bin 0 -> 573 bytes .../document_menu.png | Bin 0 -> 1463 bytes .../document_menu@3x.png | Bin 0 -> 2358 bytes .../create_file_ppt.imageset/Contents.json | 26 + .../create_file_ppt@2x.png | Bin 0 -> 342 bytes .../file_ppt_menu.png | Bin 0 -> 983 bytes .../file_ppt_menu@3x.png | Bin 0 -> 1415 bytes .../create_file_xls.imageset/Contents.json | 26 + .../create_file_xls@2x.png | Bin 0 -> 634 bytes .../file_xls_menu.png | Bin 0 -> 1464 bytes .../file_xls_menu@3x.png | Bin 0 -> 2841 bytes .../deleteScan.imageset/Contents.json | 26 + .../deleteScan.imageset/deleteScan.png | Bin 0 -> 919 bytes .../deleteScan.imageset/deleteScan@2x.png | Bin 0 -> 1792 bytes .../deleteScan.imageset/deleteScan@3x.png | Bin 0 -> 3033 bytes .../Contents.json | 15 + .../disclosureIndicator@2x.png | Bin 0 -> 324 bytes .../e2eReadPassphrase.imageset/Contents.json | 15 + .../e2eReadPassphrase.pdf | Bin 0 -> 2233 bytes .../favoriteSmall.imageset/Contents.json | 15 + .../videoFavoriteOn.pdf | Bin 0 -> 1072 bytes .../file_application.imageset/Contents.json | 15 + .../file_application.pdf | Bin 0 -> 1955 bytes .../file_audio.imageset/Contents.json | 15 + .../file_audio.imageset/file_audio.pdf | Bin 0 -> 1104 bytes .../file_code.imageset/Contents.json | 15 + .../file_code.imageset/file_code.pdf | Bin 0 -> 921 bytes .../file_compress.imageset/Contents.json | 15 + .../file_compress.imageset/file_compress.pdf | Bin 0 -> 896 bytes .../file_movie.imageset/Contents.json | 15 + .../file_movie.imageset/file_movie.pdf | Bin 0 -> 937 bytes .../file_pdf.imageset/Untitled.pdf | Bin 0 -> 1801 bytes .../file_ppt.imageset/Contents.json | 15 + .../file_ppt.imageset/file_ppt.pdf | Bin 0 -> 908 bytes .../file_txt.imageset/Contents.json | 15 + .../file_txt.imageset/file_txt.pdf | Bin 0 -> 940 bytes .../file_xls.imageset/Contents.json | 15 + .../file_xls.imageset/file_xls.pdf | Bin 0 -> 962 bytes .../folder.imageset/folder.svg | 10 - .../folder_photo.svg | 10 - .../folder_encrypted.svg | 10 - .../folder_external.imageset/Contents.json | 16 - .../folder_external.svg | 10 - .../folder_group.imageset/folder_group.svg | 10 - .../folder_public.imageset/folder_link.svg | 10 - .../Contents.json | 16 - .../folder_shared_with_me.svg | 10 - .../Contents.json | 2 +- .../grid.imageset/Untitled.pdf | Bin 0 -> 1165 bytes .../icon-calendar.imageset/Contents.json | 15 + .../icons8-calendario.svg | 1 + .../icon-confirm.imageset/Contents.json | 15 + .../icon-confirm.imageset/icon-confirm.svg | 1 + .../icon-contacts.imageset/Contents.json | 15 + .../icons8-gruppo-utente-uomo-uomo.svg | 1 + .../icon-deck.imageset/Contents.json | 15 + .../icon-deck.imageset/deck.svg | 9 + .../icon-mail.imageset/Contents.json | 15 + .../icons8-nuovo-messaggio.svg | 1 + .../icon-pages.imageset/Contents.json | 15 + .../icon-pages.imageset/icon-pages.svg | 1 + .../icon-talk.imageset/Contents.json | 15 + .../icon-talk.imageset/app-dark.svg | 1 + .../lock.imageset/lock-outline.svg | 4 - .../lock-open-variant-outline.svg | 4 - .../loginPassword.imageset/Contents.json | 26 + .../passwordNextcloud.png | Bin 0 -> 2460 bytes .../passwordNextcloud@2x.png | Bin 0 -> 2039 bytes .../passwordNextcloud@3x.png | Bin 0 -> 7569 bytes .../loginURL.imageset/Contents.json | 26 + .../loginURL.imageset/baseurlNextcloud.png | Bin 0 -> 2818 bytes .../loginURL.imageset/baseurlNextcloud@2x.png | Bin 0 -> 3482 bytes .../loginURL.imageset/baseurlNextcloud@3x.png | Bin 0 -> 11758 bytes .../loginUser.imageset/Contents.json | 26 + .../loginUser.imageset/userNextcloud.png | Bin 0 -> 1825 bytes .../loginUser.imageset/userNextcloud@2x.png | Bin 0 -> 1236 bytes .../loginUser.imageset/userNextcloud@3x.png | Bin 0 -> 4653 bytes .../mediaPlay.imageset/Contents.json | 15 + .../mediaPlay.imageset/play.png | Bin 0 -> 2936 bytes .../menuLogoUser.imageset/Contents.json | 26 + .../menuLogoUser.imageset/menuLogoUser.png | Bin 0 -> 1248 bytes .../menuLogoUser.imageset/menuLogoUser@2x.png | Bin 0 -> 1294 bytes .../menuLogoUser.imageset/menuLogoUser@3x.png | Bin 0 -> 3819 bytes .../moreBig.imageset/Contents.json | 26 + .../moreBig.imageset/moreBig.png | Bin 0 -> 548 bytes .../moreBig.imageset/moreBig@2x.png | Bin 0 -> 1015 bytes .../moreBig.imageset/moreBig@3x.png | Bin 0 -> 1481 bytes .../moreEmpty.imageset/Contents.json | 26 + .../moreEmpty.imageset/moreEmpty.png | Bin 0 -> 212 bytes .../moreEmpty.imageset/moreEmpty@2x.png | Bin 0 -> 318 bytes .../moreEmpty.imageset/moreEmpty@3x.png | Bin 0 -> 520 bytes .../navigationMore.imageset/Contents.json | 25 + .../navigationMore.imageset/more-round.png | Bin 0 -> 848 bytes .../Contents.json | 2 +- .../navigationSort.imageset/Untitled.pdf | Bin 0 -> 1054 bytes .../networkInProgress.imageset/Contents.json | 15 + .../networkInProgress.pdf | Bin 0 -> 1041 bytes .../noPreview.imageset/Contents.json | 15 + .../noPreview.imageset/noPreview.pdf | Bin 0 -> 1246 bytes .../noPreviewAudio.imageset/Contents.json | 15 + .../noPreviewAudio.pdf | Bin 0 -> 1226 bytes .../noPreviewVideo.imageset/Contents.json | 15 + .../noPreviewVideo.pdf | Bin 0 -> 1158 bytes .../nonetwork.imageset/Contents.json | 15 + .../nonetwork.imageset/nonetwork.pdf | Bin 0 -> 1177 bytes .../notaMusic.imageset/Contents.json | 26 + .../notaMusic.imageset/notaMusic.png | Bin 0 -> 1521 bytes .../notaMusic.imageset/notaMusic@2x.png | Bin 0 -> 2595 bytes .../notaMusic.imageset/notaMusic@3x.png | Bin 0 -> 3512 bytes .../offOutlineAudio.imageset/Contents.json | 15 + .../offOutlineAudio.imageset/Untitled.pdf | Bin 0 -> 1268 bytes .../offOutlineImage.imageset/Contents.json | 15 + .../offOutlineImage.imageset/image.pdf | Bin 0 -> 1186 bytes .../offOutlineVideo.imageset/Contents.json | 15 + .../offOutlineVideo.imageset/Untitled.pdf | Bin 0 -> 1120 bytes .../palette.imageset/Contents.json | 15 + .../palette.imageset/palette.svg | 1 + .../passcode.imageset/Contents.json | 26 + .../passcode.imageset/passcode.png | Bin 0 -> 2027 bytes .../passcode.imageset/passcode@2x.png | Bin 0 -> 4598 bytes .../passcode.imageset/passcode@3x.png | Bin 0 -> 5360 bytes .../pip.enter.imageset/Contents.json | 15 + .../pip.enter.imageset/pip.enter.svg | 1 + .../printer.imageset/Contents.json | 15 + .../printer.imageset/print.svg | 1 + .../search.imageset/Contents.json | 15 + .../search.imageset/search.pdf | Bin 0 -> 2031 bytes .../share.imageset/Contents.json | 15 + .../Images.xcassets/share.imageset/share.pdf | Bin 0 -> 55201 bytes .../shareAdd.imageset/Contents.json | 15 + .../shareAdd.imageset/shareAdd.pdf | Bin 0 -> 898 bytes .../shareFill.imageset/Contents.json | 15 + .../shareFill.imageset/share.pdf | Bin 0 -> 57972 bytes .../shareInternalLink.imageset/Contents.json | 15 + .../shareInternalLink.pdf | Bin 0 -> 1157 bytes .../shareMenu.imageset/Contents.json | 15 + .../shareMenu.imageset/shareMenu.pdf | Bin 0 -> 3854 bytes .../shareMounted.imageset/Contents.json | 15 + .../shareMounted.imageset/shareMounted.pdf | Bin 0 -> 1237 bytes .../sharePhotoBrowser.imageset/Contents.json | 26 + .../sharePhotoBrowser.imageset/share.png | Bin 0 -> 353 bytes .../sharePhotoBrowser.imageset/share@3x.png | Bin 0 -> 913 bytes .../sharePhotoBrowser@2x.png | Bin 0 -> 547 bytes .../sharebylink.imageset/Contents.json | 15 + .../sharebylink.imageset/sharebylink.pdf | Bin 0 -> 59178 bytes .../sortDateLessRecent.imageset/Contents.json | 26 + .../sortDateLessRecent.png | Bin 0 -> 502 bytes .../sortDateLessRecent@2x.png | Bin 0 -> 1133 bytes .../sortDateLessRecent@3x.png | Bin 0 -> 1743 bytes .../sortDateMoreRecent.imageset/Contents.json | 26 + .../sortDateLess.png | Bin 0 -> 536 bytes .../sortDateLess@2x.png | Bin 0 -> 1188 bytes .../sortDateLess@3x.png | Bin 0 -> 1863 bytes .../sortFileNameAZ.imageset/Contents.json | 26 + .../sortFileNameAZ.png | Bin 0 -> 472 bytes .../sortFileNameAZ@2x.png | Bin 0 -> 800 bytes .../sortFileNameAZ@3x.png | Bin 0 -> 1244 bytes .../sortFileNameZA.imageset/Contents.json | 26 + .../sortFileNameZA.png | Bin 0 -> 459 bytes .../sortFileNameZA@2x.png | Bin 0 -> 811 bytes .../sortFileNameZA@3x.png | Bin 0 -> 1278 bytes .../sortLargest.imageset/Contents.json | 26 + .../sortLargest.imageset/sortLargest.png | Bin 0 -> 287 bytes .../sortLargest.imageset/sortLargest@2x.png | Bin 0 -> 403 bytes .../sortLargest.imageset/sortLargest@3x.png | Bin 0 -> 708 bytes .../sortSmallest.imageset/Contents.json | 26 + .../sortSmallest.imageset/sortSmallest.png | Bin 0 -> 292 bytes .../sortSmallest.imageset/sortSmallest@2x.png | Bin 0 -> 408 bytes .../sortSmallest.imageset/sortSmallest@3x.png | Bin 0 -> 722 bytes .../speaker0.imageset/Contents.json | 12 + .../speaker0.imageset/speaker0.svg | 8 + .../speaker1.imageset/Contents.json | 12 + .../speaker1.imageset/speaker1.svg | 8 + .../speaker2.imageset/Contents.json | 12 + .../speaker2.imageset/speaker2.svg | 8 + .../speaker3.imageset/Contents.json | 12 + .../speaker3.imageset/speaker3.svg | 8 + .../Contents.json | 15 + .../Unknown-1.svg | 1 + .../star.fill.imageset/Contents.json | 16 - .../statusdownload.imageset/Contents.json | 26 + .../statusdownload.png | Bin 0 -> 2853 bytes .../statusdownload@2x.png | Bin 0 -> 3370 bytes .../statusdownload@3x.png | Bin 0 -> 6296 bytes .../statuserror.imageset/Contents.json | 26 + .../statuserror.imageset/statuserror.png | Bin 0 -> 4690 bytes .../statuserror.imageset/statuserror@2x.png | Bin 0 -> 6124 bytes .../statuserror.imageset/statuserror@3x.png | Bin 0 -> 7814 bytes .../statusupload.imageset/Contents.json | 26 + .../statusupload.imageset/statusupload.png | Bin 0 -> 2815 bytes .../statusupload.imageset/statusupload@2x.png | Bin 0 -> 3433 bytes .../statusupload.imageset/statusupload@3x.png | Bin 0 -> 6277 bytes .../Contents.json | 2 +- .../tabBarFiles.pdf} | Bin 57667 -> 57893 bytes .../tabBarMore.imageset/Contents.json | 16 + .../tabBarMore.pdf} | Bin 58260 -> 58391 bytes .../talk-template.imageset/talk.png | Bin 0 -> 26026 bytes .../talk.imageset/Contents.json | 12 + .../Images.xcassets/talk.imageset/talk.png | Bin 0 -> 26026 bytes .../talk_bar.imageset/Contents.json | 23 + .../talk_bar.imageset/talk.png | Bin 0 -> 1672 bytes .../talk_bar.imageset/talk_bar 1.png | Bin 0 -> 2644 bytes .../talk_bar.imageset/talk_bar 2.png | Bin 0 -> 4063 bytes .../BurgerMenu/Contents.json | 9 + .../BurgerMenu/bars.imageset/Contents.json | 12 + .../BurgerMenu/bars.imageset/bars.svg | 3 + .../chevronLeft.imageset/Contents.json | 12 + .../chevronLeft.imageset/chevronLeft.svg | 3 + .../BurgerMenu/cloud.imageset/Contents.json | 12 + .../BurgerMenu/cloud.imageset/cloud.svg | 3 + .../BurgerMenu/deleted.imageset/Contents.json | 12 + .../BurgerMenu/deleted.imageset/deleted.svg | 3 + .../BurgerMenu/offline.imageset/Contents.json | 12 + .../BurgerMenu/offline.imageset/offline.svg | 10 + .../BurgerMenu/recent.imageset/Contents.json | 12 + .../BurgerMenu/recent.imageset/recent.svg | 10 + .../settings.imageset/Contents.json | 12 + .../BurgerMenu/settings.imageset/settings.svg | 3 + iOSClient/IonosImages.xcassets/Contents.json | 6 + .../FileFolderCell/Contents.json | 9 + .../star.imageset/Contents.json | 12 + .../FileFolderCell/star.imageset/star.svg | 10 + .../FileSelection/Contents.json | 9 + .../files_selection.imageset/Contents.json | 22 + .../files_selection_dark.svg | 5 + .../files_selection_light.svg | 5 + .../grid_item_selected.imageset/Contents.json | 12 + .../grid_item_selected.svg | 7 + .../Contents.json | 12 + .../list_item_deselected.svg | 3 + .../list_item_selected.imageset/Contents.json | 12 + .../list_item_selected.svg | 7 + .../Contents.json | 12 + .../list_item_some_selected.svg | 7 + .../Contents.json | 22 + .../selection_mode_close_dark.svg | 3 + .../selection_mode_close_light.svg | 3 + .../view_mode_grid.imageset/Contents.json | 12 + .../view_mode_grid.svg | 3 + .../view_mode_list.imageset/Contents.json | 12 + .../view_mode_list.svg | 3 + .../Contents.json | 12 + .../IONOSEasyStorageLogo.svg | 78 + .../IONOS_icons/Contents.json | 6 + .../allowEdit.imageset/Contents.json | 12 + .../allowEdit.imageset/allowEdit.svg | 4 + .../createFolder.imageset/Contents.json | 12 + .../createFolder.imageset/createFolder.svg | 3 + .../data_protection.imageset/Contents.json | 12 + .../data_protection.svg | 3 + .../details.imageset/Contents.json | 15 + .../IONOS_icons/details.imageset/details.svg | 10 + .../goToPage.imageset/Contents.json | 12 + .../goToPage.imageset/goToPage.svg | 4 + .../item.lock.imageset/Contents.json | 16 + .../item.lock.imageset/item.lock.svg | 3 + .../item.lock.open.imageset}/Contents.json | 2 +- .../item.lock.open.svg | 3 + .../IONOS_icons/media.imageset}/Contents.json | 2 +- .../IONOS_icons/media.imageset/media.svg | 3 + .../menu.add.imageset/Contents.json | 12 + .../menu.add.imageset/menu.add.svg | 3 + .../menu.search.imageset/Contents.json | 12 + .../menu.search.imageset/menu.search.svg | 10 + .../menu.share.imageset/Contents.json | 15 + .../menu.share.imageset/menu.share.svg | 10 + .../Contents.json | 12 + .../modifyWithQuickLook.svg | 11 + .../moveOrCopy.imageset/Contents.json | 12 + .../moveOrCopy.imageset/moveOrCopy.svg | 3 + .../offline.imageset/Contents.json | 12 + .../IONOS_icons/offline.imageset/offline.svg | 3 + .../photoOrVideo.imageset/Contents.json | 12 + .../photoOrVideo.imageset/photoOrVideo.svg | 3 + .../IONOS_icons/qrcode.imageset/Contents.json | 15 + .../IONOS_icons/qrcode.imageset/qrcode.svg | 3 + .../readOnly.imageset/Contents.json | 12 + .../readOnly.imageset/readOnly.svg | 3 + .../IONOS_icons/rename.imageset/Contents.json | 15 + .../IONOS_icons/rename.imageset/rename.svg | 10 + .../IONOS_icons/scan.imageset/Contents.json | 12 + .../IONOS_icons/scan.imageset/scan.svg | 10 + .../star.filled.imageset/Contents.json | 16 + .../star.filled.imageset/star.filled.svg | 10 + .../star.hollow.imageset/Contents.json | 12 + .../star.hollow.imageset/star.hollow.svg | 10 + .../IONOS_icons/synced.imageset/Contents.json | 15 + .../IONOS_icons/synced.imageset/synced.svg | 3 + .../trash_icon.imageset/Contents.json | 16 + .../trash_icon.imageset/trash_icon.svg | 3 + .../unshare.imageset/Contents.json | 12 + .../IONOS_icons/unshare.imageset/unshare.svg | 4 + .../viewInFolder.imageset/Contents.json | 12 + .../viewInFolder.imageset/viewInFolder.svg | 11 + .../CloseFullscreen.svg | 3 + .../CloseFullscreen.imageset/Contents.json | 12 + .../MediaPlayer/Contents.json | 9 + .../Forward.imageset/Contents.json | 12 + .../MediaPlayer/Forward.imageset/Forward.svg | 11 + .../Fullscreen.imageset/Contents.json | 12 + .../Fullscreen.imageset/Fullscreen.svg | 3 + .../Message.imageset/Contents.json | 12 + .../MediaPlayer/Message.imageset/Message.svg | 3 + .../MediaPlayer/Pause.imageset/Contents.json | 12 + .../MediaPlayer/Pause.imageset/Pause.svg | 10 + .../MediaPlayer/Play.imageset/Contents.json | 12 + .../MediaPlayer/Play.imageset/Play.svg | 10 + .../MediaPlayer/Rewind.imageset/Contents.json | 12 + .../MediaPlayer/Rewind.imageset/Rewind.svg | 11 + .../MediaPlayer/Sound.imageset/Contents.json | 12 + .../MediaPlayer/Sound.imageset/Sound.svg | 3 + .../SelectTabBar/Contents.json | 9 + .../SelectTabBar/copy.imageset/Contents.json | 16 + .../SelectTabBar/copy.imageset/copy.svg | 3 + .../delete.imageset/Contents.json | 16 + .../delete.imageset/trash-can.svg | 3 + .../download.imageset}/Contents.json | 2 +- .../download.imageset/cloud-arrow-down.svg | 3 + .../SelectTabBar/lock.imageset/Contents.json | 16 + .../SelectTabBar/lock.imageset/unlock.svg | 3 + .../restoreFromTrash.imageset/Contents.json | 16 + .../restoreFromTrash.imageset/rotate-left.svg | 3 + .../SelectTabBar/share.imageset/Contents.json | 16 + .../share.imageset/\356\202\232.svg" | 3 + .../unlock.imageset/Contents.json | 16 + .../SelectTabBar/unlock.imageset/lock.svg | 3 + .../Settings/AutoUpload/Contents.json | 9 + .../AutoUpload/folder.imageset/400-folder.svg | 3 + .../AutoUpload/folder.imageset/Contents.json | 15 + .../400-folder-open.svg | 3 + .../folder.opened.imageset/Contents.json | 15 + .../Settings/Contents.json | 9 + .../autoupload.folder.imageset/Contents.json | 15 + .../autoupload.folder.svg | 3 + .../bulletlist.imageset/Contents.json | 15 + .../bulletlist.imageset/bulletlist.svg | 3 + .../calendar.user.imageset/Contents.json | 15 + .../calendar.user.imageset/calendar.user.svg | 3 + .../Settings/camera.imageset/Contents.json | 15 + .../Settings/camera.imageset/camera.svg | 3 + .../dataprivacy.imageset/Contents.json | 15 + .../dataprivacy.imageset/dataprivacy.svg | 4 + .../folder.gear.imageset/Contents.json | 15 + .../folder.gear.imageset/folder.gear.svg | 3 + .../Settings/gear.imageset/Contents.json | 15 + .../Settings/gear.imageset/gear.svg | 3 + .../Settings/github.imageset/Contents.json | 15 + .../Settings/github.imageset/github.svg | 10 + .../Settings/handshake.imageset/Contents.json | 15 + .../Settings/handshake.imageset/handshake.svg | 3 + .../shield.halved.imageset/Contents.json | 15 + .../shield.halved.imageset/shield.halved.svg | 3 + .../Settings/xmark.imageset/Contents.json | 15 + .../Settings/xmark.imageset/xmark.svg | 3 + .../Transfers/Contents.json | 9 + .../Transfers/copy.imageset/Contents.json | 22 + .../Transfers/copy.imageset/copy_dark.svg | 12 + .../Transfers/copy.imageset/copy_light.svg | 12 + .../downloading.imageset/Contents.json | 22 + .../downloading.imageset/downloading_dark.svg | 11 + .../downloading_light.svg | 11 + .../Transfers/error.imageset/Contents.json | 22 + .../Transfers/error.imageset/error_dark.svg | 12 + .../Transfers/error.imageset/error_light.svg | 12 + .../Transfers/favorite.imageset/Contents.json | 22 + .../favorite.imageset/favorite_dark.svg | 11 + .../favorite.imageset/favorite_light.svg | 11 + .../Transfers/move.imageset/Contents.json | 22 + .../Transfers/move.imageset/move_dark.svg | 4 + .../Transfers/move.imageset/move_light.svg | 4 + .../Transfers/rename.imageset/Contents.json | 22 + .../Transfers/rename.imageset/rename_dark.svg | 11 + .../rename.imageset/rename_light.svg | 11 + .../Transfers/stop.imageset/Contents.json | 22 + .../Transfers/stop.imageset/stop_dark.svg | 3 + .../Transfers/stop.imageset/stop_light.svg | 3 + .../Transfers/trash.imageset/Contents.json | 22 + .../Transfers/trash.imageset/trash_dark.svg | 11 + .../Transfers/trash.imageset/trash_light.svg | 11 + .../Transfers/upload.imageset/Contents.json | 22 + .../Transfers/upload.imageset/upload_dark.svg | 11 + .../upload.imageset/upload_light.svg | 11 + .../waitToDownload.imageset/Contents.json | 22 + .../wait_to_download_dark.svg | 4 + .../wait_to_download_light.svg | 4 + .../Transfers/waiting.imageset/Contents.json | 22 + .../waiting.imageset/waiting_dark.svg | 11 + .../waiting.imageset/waiting_light.svg | 11 + .../accountCheckmark.imageset/Contents.json | 15 + .../accountCheckmark.svg | 3 + .../checkmarkIcon.imageset/Contents.json | 12 + .../checkmarkIcon.imageset/checkmarkIcon.svg | 3 + .../contactsIcon.imageset/Contents.json | 22 + .../contactsIcon_dark.svg | 3 + .../contactsIcon_light.svg | 3 + .../delete.imageset/Contents.json | 12 + .../delete.imageset/delete.svg | 3 + .../deleted.imageset/Contents.json | 12 + .../deleted.imageset/deleted.svg | 3 + .../favorites.imageset/Contents.json | 15 + .../favorites.imageset/favorites.svg | 3 + .../file_unsupported.imageset/Contents.json | 22 + .../file_unsupported_dark.svg | 3 + .../file_unsupported_light.svg | 3 + .../folder.imageset/Contents.json | 26 + .../folder.imageset/folder_icon_dark_mode.svg | 39 + .../folder_icon_light_mode.svg | 39 + .../Contents.json | 26 + .../folderAutomaticUpload_dark.svg | 11 + .../folderAutomaticUpload_light.svg | 11 + .../folderEncrypted.imageset/Contents.json | 26 + .../folder_icon_dark_mode.svg | 39 + .../folder_icon_light_mode.svg | 39 + .../folder_external.imageset/Contents.json | 26 + .../folder_icon_dark_mode.svg | 39 + .../folder_icon_light_mode.svg | 39 + .../folder_group.imageset/Contents.json | 26 + .../folder_group_dark.svg | 4 + .../folder_group_light.svg | 4 + .../home.imageset/Contents.json | 15 + .../home.imageset/home.svg | 3 + .../local.imageset/Contents.json | 15 + .../local.imageset/local.svg | 4 + .../more.imageset/Contents.json | 25 + .../more.imageset/more_dark.svg | 3 + .../more.imageset/more_light.svg | 3 + .../offlineFlag.imageset/Contents.json | 25 + .../offlineFlag.imageset/offlineFlag_dark.svg | 4 + .../offlineFlag_light.svg | 4 + .../restore.imageset/Contents.json | 16 + .../restore.imageset/restore.svg | 3 + .../restoreFromDeleted.imageset/Contents.json | 12 + .../restoreFromDeleted.svg | 3 + .../IonosImages.xcassets/share/Contents.json | 9 + .../share/canShare.imageset/Contents.json | 25 + .../share/canShare.imageset/canShare_dark.svg | 10 + .../canShare.imageset/canShare_light.svg | 10 + .../share/folder/Contents.json | 9 + .../folder/byLink.imageset/Contents.json | 22 + .../shared_by_link_folder 1.svg | 11 + .../byLink.imageset/shared_by_link_folder.svg | 11 + .../folder/internally.imageset/Contents.json | 22 + .../shared_internally_folder 1.svg | 6 + .../shared_internally_folder.svg | 6 + .../folder/withMe.imageset/Contents.json | 22 + .../shared_with_me_folder 1.svg | 6 + .../withMe.imageset/shared_with_me_folder.svg | 6 + .../share/icon/Contents.json | 9 + .../share/icon/byLink.imageset/Contents.json | 22 + .../byLink.imageset/shared_by_link_icon 1.svg | 4 + .../byLink.imageset/shared_by_link_icon.svg | 4 + .../icon/internally.imageset/Contents.json | 22 + .../shared_internally_icon 1.svg | 4 + .../shared_internally_icon.svg | 4 + .../share/icon/withMe.imageset/Contents.json | 22 + .../withMe.imageset/shared_with_me_icon 1.svg | 4 + .../withMe.imageset/shared_with_me_icon.svg | 4 + .../share/internalLink.imageset/Contents.json | 22 + .../internalLink_dark.svg | 3 + .../internalLink_light.svg | 3 + .../linkCircleFill.imageset/Contents.json | 22 + .../share/linkCircleFill.imageset/lnk_d.svg | 16 + .../share/linkCircleFill.imageset/lnk_l.svg | 16 + .../magnifyingGlass.imageset/Contents.json | 22 + .../magnifyingGlass_dark.svg | 3 + .../magnifyingGlass_light.svg | 3 + .../share/plus.imageset/Contents.json | 22 + .../share/plus.imageset/plus_dark.svg | 3 + .../share/plus.imageset/plus_light.svg | 3 + .../share/shared.imageset/Contents.json | 25 + .../share/shared.imageset/shared_dark.svg | 4 + .../share/shared.imageset/shared_light.svg | 4 + .../Contents.json | 22 + .../sq_drk.svg | 16 + .../sq_l.svg | 11 + .../share/threeDots.imageset/Contents.json | 22 + .../threeDots.imageset/threeDots_dark.svg | 3 + .../threeDots.imageset/threeDots_lights.svg | 3 + .../share/userContacts.imageset/Contents.json | 22 + .../userContacts_dark.svg | 3 + .../userContacts_light.svg | 3 + .../shares.imageset/Contents.json | 15 + .../shares.imageset/shares.svg | 3 + .../uploadFile.imageset/Contents.json | 15 + .../uploadFile.imageset/uploadFile.svg | 4 + .../userAvatar.imageset/Contents.json | 25 + .../userAvatar.imageset/userAvatar_dark.svg | 4 + .../userAvatar.imageset/userAvatar_light.svg | 4 + iOSClient/Login/NCLogin.storyboard | 235 ++- iOSClient/Login/NCLogin.swift | 203 +- iOSClient/Login/NCLoginPoll.swift | 223 +++ iOSClient/Login/NCLoginProvider.swift | 7 +- .../ActionsHeader/FileActionsHeader.swift | 160 ++ .../ActionsHeader/FileActionsHeader.xib | 191 ++ .../Collection Common/Cell/NCGridCell.swift | 26 +- .../Collection Common/Cell/NCGridCell.xib | 28 +- .../Collection Common/Cell/NCListCell.swift | 56 +- .../Collection Common/Cell/NCListCell.xib | 190 +- .../Collection Common/Cell/NCPhotoCell.swift | 26 +- .../Collection Common/Cell/NCPhotoCell.xib | 35 +- ...nViewCommon+CollectionViewDataSource.swift | 106 +- ...ionViewCommon+CollectionViewDelegate.swift | 9 + ...llectionViewCommon+FileActionsHeader.swift | 172 ++ .../NCCollectionViewCommon+SelectTabBar.swift | 26 +- .../NCCollectionViewCommon.swift | 103 +- .../NCCollectionViewCommonSelectTabBar.swift | 245 --- .../NCCollectionViewDataSource.swift | 2 +- .../Section Header Footer/NCSectionFooter.xib | 7 +- .../NCCreateFormUploadConflict.storyboard | 17 +- .../NCCreateFormUploadConflict.swift | 27 +- .../Upload Assets/NCUploadAssetsModel.swift | 53 +- .../Upload Assets/NCUploadAssetsView.swift | 30 +- .../HiDriveMainNavigationController.swift | 139 ++ iOSClient/Main/Main.storyboard | 69 +- iOSClient/Main/NCActionCenter.swift | 44 +- .../Main/NCMainNavigationController.swift | 347 ---- iOSClient/Main/NCMainTabBar.swift | 104 +- iOSClient/Main/NCMainTabBarController.swift | 35 +- iOSClient/Main/UITabBarGuideline.swift | 83 + iOSClient/Media/Cell/NCMediaCell.swift | 17 +- iOSClient/Media/Cell/NCMediaCell.xib | 24 +- .../NCMedia+CollectionViewDataSource.swift | 24 +- .../NCMedia+CollectionViewDelegate.swift | 3 +- iOSClient/Media/NCMedia+Command.swift | 80 +- iOSClient/Media/NCMedia.storyboard | 98 +- iOSClient/Media/NCMedia.swift | 187 +- iOSClient/Media/NCMediaDataSource.swift | 7 +- iOSClient/Media/NCMediaPinchGesture.swift | 2 +- iOSClient/Menu/AppDelegate+Menu.swift | 73 +- .../Menu/NCCollectionViewCommon+Menu.swift | 44 +- iOSClient/Menu/NCContextMenu.swift | 20 +- iOSClient/Menu/NCMenu+FloatingPanel.swift | 12 +- iOSClient/Menu/NCMenu.storyboard | 20 +- iOSClient/Menu/NCMenu.swift | 45 +- iOSClient/Menu/NCMenuAction.swift | 42 +- iOSClient/Menu/NCShare+Menu.swift | 11 +- iOSClient/Menu/NCSortMenu.swift | 149 ++ iOSClient/Menu/NCTrash+Menu.swift | 6 +- iOSClient/Menu/NCViewer+Menu.swift | 21 +- iOSClient/Menu/UIViewController+Menu.swift | 2 +- .../More/NCMoreNavigationController.swift | 37 - iOSClient/NCGlobal.swift | 4 +- iOSClient/NCImageCache.swift | 67 +- iOSClient/NCImagesRepository.swift | 244 +++ iOSClient/Networking/NCAutoUpload.swift | 163 +- .../Networking/NCNetworking+Upload.swift | 13 + .../Networking/NCNetworking+WebDAV.swift | 75 +- .../Networking/NCNetworkingProcess.swift | 14 +- iOSClient/Notification/NCNotification.swift | 4 +- iOSClient/Offline/NCOffline.storyboard | 23 +- iOSClient/Recent/NCRecent.storyboard | 23 +- iOSClient/Recent/NCRecent.swift | 5 + .../RichWorkspace/NCViewerRichWorkspace.swift | 2 +- iOSClient/Scan document/NCScan.swift | 8 +- .../Scan document/NCUploadScanDocument.swift | 19 +- iOSClient/SceneDelegate.swift | 24 +- iOSClient/Select/NCSelect.swift | 69 +- .../Select/NCSelectCommandViewCopyMove.xib | 72 +- ...NCSelectCommandViewSelect+CreateFolder.xib | 56 +- .../Select/NCSelectCommandViewSelect.xib | 43 +- .../Advanced/File Name/NCFileNameView.swift | 19 +- .../Advanced/NCSettingsAdvancedModel.swift | 6 +- .../Advanced/NCSettingsAdvancedView.swift | 91 +- iOSClient/Settings/AutoUpload/Albums.swift | 9 + .../AutoUpload/NCAutoUploadModel.swift | 132 +- .../AutoUpload/NCAutoUploadView.swift | 319 ++-- .../Settings/Display/NCDisplayModel.swift | 3 +- .../Settings/Display/NCDisplayView.swift | 8 +- iOSClient/Settings/NCKeychain.swift | 2 +- .../Settings/SelectAlbum/AlbumModel.swift | 180 ++ .../PHAssetCollectionThumbnailLoader.swift | 33 + .../SelectAlbum/SelectAlbumView.swift | 123 ++ .../Settings/Settings/NCSettingsModel.swift | 14 +- .../Settings/Settings/NCSettingsView.swift | 214 +-- .../Advanced/NCShareAdvancePermission.swift | 32 +- .../NCShareAdvancePermissionFooter.swift | 13 +- .../NCShareAdvancePermissionFooter.xib | 6 +- iOSClient/Share/Advanced/NCShareCells.swift | 8 +- .../Advanced/NCShareNewUserAddComment.swift | 18 + .../Share/Advanced/NCShareToggleCell.swift | 13 +- iOSClient/Share/NCShare.storyboard | 45 +- iOSClient/Share/NCShare.swift | 126 +- iOSClient/Share/NCShareHeader.swift | 6 +- iOSClient/Share/NCShareLinkCell.swift | 16 +- iOSClient/Share/NCShareLinkCell.xib | 34 +- iOSClient/Share/NCShareNetworking.swift | 41 +- .../Share/NCShareNetworkingDelegate.swift | 2 + iOSClient/Share/NCSharePaging.swift | 23 +- iOSClient/Share/NCShareUserCell.swift | 25 +- iOSClient/Share/NCShareUserCell.xib | 13 +- iOSClient/Share/ShareSearchField.swift | 122 ++ iOSClient/Shares/NCShares.storyboard | 23 +- iOSClient/Style/CircleItemSpinner.swift | 43 + .../de.lproj/InfoPlist.strings | Bin 1620 -> 2204 bytes .../de.lproj/Localizable.strings | Bin 89756 -> 96022 bytes .../en.lproj/InfoPlist.strings | 1 + .../en.lproj/Localizable.strings | 69 +- .../es.lproj/InfoPlist.strings | Bin 1380 -> 1926 bytes .../es.lproj/Localizable.strings | Bin 86880 -> 94972 bytes .../fr.lproj/InfoPlist.strings | Bin 1562 -> 2210 bytes .../fr.lproj/Localizable.strings | Bin 89590 -> 98306 bytes .../it.lproj/InfoPlist.strings | Bin 1488 -> 2098 bytes .../it.lproj/Localizable.strings | Bin 87850 -> 94704 bytes .../nl.lproj/InfoPlist.strings | Bin 1426 -> 2042 bytes .../nl.lproj/Localizable.strings | Bin 84368 -> 90510 bytes ...iveCollectionViewCommonSelectToolbar.swift | 185 ++ ...ctionViewCommonSelectToolbarDelegate.swift | 32 + ...ollectionViewCommonSelectToolbarView.swift | 166 ++ iOSClient/Transfers/NCTransferCell.xib | 28 +- iOSClient/Transfers/NCTransfers.swift | 43 +- iOSClient/Transfers/TransfersListener.swift | 46 + .../Trash/Cell/NCTrashCellProtocol.swift | 2 +- iOSClient/Trash/Cell/NCTrashGridCell.swift | 18 +- iOSClient/Trash/Cell/NCTrashGridCell.xib | 20 +- iOSClient/Trash/Cell/NCTrashListCell.swift | 21 +- iOSClient/Trash/Cell/NCTrashListCell.xib | 73 +- iOSClient/Trash/NCTrash+CollectionView.swift | 15 +- .../Trash/NCTrash+SelectTabBarDelegate.swift | 6 +- iOSClient/Trash/NCTrash.storyboard | 25 +- iOSClient/Trash/NCTrash.swift | 134 +- iOSClient/Trash/NCTrashSelectTabBar.swift | 138 -- iOSClient/UserStatus/NCUserStatus.swift | 4 +- iOSClient/Utility/AccountButtonFactory.swift | 79 + iOSClient/Utility/NCUtility+Date.swift | 4 + iOSClient/Utility/NCUtility+Image.swift | 26 +- .../Utility/UIDevice+VirtualOrientation.swift | 19 + iOSClient/Viewer/NCViewer.swift | 8 +- .../NCPlayer/NCPlayerToolBar.swift | 46 +- .../NCPlayer/NCPlayerToolBar.xib | 172 +- .../Viewer/NCViewerMedia/NCViewerMedia.swift | 1 + .../NCViewerMediaPage.storyboard | 169 +- .../NCViewerMedia/NCViewerMediaPage.swift | 2 +- .../Viewer/NCViewerPDF/NCViewerPDF.swift | 5 +- .../NCViewerQuickLook/NCViewerQuickLook.swift | 2 +- .../NCViewerQuickLookView.swift | 5 +- .../NCViewerRichDocument.swift | 2 + 1009 files changed, 19174 insertions(+), 4741 deletions(-) create mode 100644 .github/workflows/xcode.xxx create mode 100644 .gitlab-ci.yml create mode 100644 .slather.yml create mode 100755 Brand/AppStore/File_Provider_Extension.entitlements create mode 100755 Brand/AppStore/File_Provider_Extension.plist create mode 100644 Brand/AppStore/File_Provider_Extension_UI.entitlements create mode 100644 Brand/AppStore/File_Provider_Extension_UI.plist create mode 100644 Brand/AppStore/Notification_Service_Extension.entitlements create mode 100644 Brand/AppStore/Notification_Service_Extension.plist create mode 100755 Brand/AppStore/Share.entitlements create mode 100755 Brand/AppStore/Share.plist create mode 100644 Brand/AppStore/Widget.entitlements create mode 100644 Brand/AppStore/Widget.plist create mode 100644 Brand/AppStore/WidgetDashboardIntentHandler.entitlements create mode 100644 Brand/AppStore/WidgetDashboardIntentHandler.plist create mode 100755 Brand/AppStore/iOSClient.entitlements create mode 100755 Brand/AppStore/iOSClient.plist create mode 100755 Brand/Beta/File_Provider_Extension.entitlements create mode 100755 Brand/Beta/File_Provider_Extension.plist create mode 100644 Brand/Beta/File_Provider_Extension_UI.entitlements create mode 100644 Brand/Beta/File_Provider_Extension_UI.plist create mode 100644 Brand/Beta/Notification_Service_Extension.entitlements create mode 100644 Brand/Beta/Notification_Service_Extension.plist create mode 100755 Brand/Beta/Share.entitlements create mode 100755 Brand/Beta/Share.plist create mode 100644 Brand/Beta/Widget.entitlements create mode 100644 Brand/Beta/Widget.plist create mode 100644 Brand/Beta/WidgetDashboardIntentHandler.entitlements create mode 100644 Brand/Beta/WidgetDashboardIntentHandler.plist create mode 100755 Brand/Beta/iOSClient.entitlements create mode 100755 Brand/Beta/iOSClient.plist create mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/AppIcon.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon100@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon1024@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon114@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon120@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon120@3x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon144@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon152@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon167@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon180@3x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon20@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x-1.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x-1.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon50@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon57@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x-1.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon60@3x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon72@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon76@1x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x-1.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x.png delete mode 100644 Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon87@3x.png create mode 100644 Brand/Custom.xcassets/gradientBackground.imageset/Contents.json create mode 100644 Brand/Custom.xcassets/gradientBackground.imageset/GradientBackgroundPad.svg create mode 100644 Brand/Custom.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg create mode 100644 Gemfile create mode 100644 Tests/NextcloudSnapshotTests/Extensions/SwiftUIView+Extensions.swift create mode 100644 Tests/NextcloudSnapshotTests/NextcloudSnapshotTests.swift create mode 100644 Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_CapalitiesView.DefaultPreviewConfiguration.heic create mode 100644 Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_HUDView.DefaultPreviewConfiguration.heic create mode 100644 Tests/NextcloudUITests/AutoUploadUITests.swift create mode 100644 Widget/Assets.xcassets/Cloud_Checkmark.imageset/Cloud_Checkmark.svg create mode 100644 Widget/Assets.xcassets/Cloud_Checkmark.imageset/Contents.json create mode 100644 Widget/Assets.xcassets/Cloud_Xmark.imageset/Cloud_Xmark.svg create mode 100644 Widget/Assets.xcassets/Cloud_Xmark.imageset/Contents.json create mode 100644 Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/Contents.json create mode 100644 Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/file_unsupported_widget.svg create mode 100644 Widget/Assets.xcassets/Media.imageset/Contents.json create mode 100644 Widget/Assets.xcassets/Media.imageset/Media.svg rename Widget/Assets.xcassets/{AccentColor.colorset => Mic.imageset}/Contents.json (70%) create mode 100644 Widget/Assets.xcassets/Mic.imageset/Mic.svg rename Widget/Assets.xcassets/{WidgetBackground.colorset => Note.imageset}/Contents.json (70%) create mode 100644 Widget/Assets.xcassets/Note.imageset/Note.svg create mode 100644 Widget/Assets.xcassets/Scan.imageset/Contents.json create mode 100644 Widget/Assets.xcassets/Scan.imageset/Scan.svg create mode 100644 Widget/Colors.xcassets/Background.colorset/Contents.json create mode 100644 Widget/Colors.xcassets/BottomElementForeground.colorset/Contents.json create mode 100644 Widget/Colors.xcassets/Contents.json create mode 100644 Widget/Colors.xcassets/Divider.colorset/Contents.json create mode 100644 Widget/Colors.xcassets/Subtitle.colorset/Contents.json create mode 100644 Widget/Colors.xcassets/Text.colorset/Contents.json create mode 100644 Widget/Colors.xcassets/Title.colorset/Contents.json create mode 100644 Widget/WidgetCommon.swift create mode 100644 iOSClient/BurgerMenu/BurgerMenuAttachController.swift create mode 100644 iOSClient/BurgerMenu/BurgerMenuView.swift create mode 100644 iOSClient/BurgerMenu/BurgerMenuViewController.swift create mode 100644 iOSClient/BurgerMenu/BurgerMenuViewModel.swift create mode 100644 iOSClient/Colors.xcassets/AppBackground/Color.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/AppBackground/Contents.json create mode 100644 iOSClient/Colors.xcassets/AppBackground/DataProtection.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/AppBackground/Form.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/AppBackground/FormRow.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/AppBackground/Main.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/ButtonForeground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/CommonShadow.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/NavigationBarButton.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/Overlay.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/PressedButton.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/BurgerMenu/ProgressBarBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Link/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Link/Text/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Link/Text/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Link/Text/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Link/Text/Selected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Background/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Background/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Background/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Background/Selected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Text/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Text/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Text/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Primary/Text/Selected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Background/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Background/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Background/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Background/Selected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Border/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Border/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Border/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Text/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Text/Disabled.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Text/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Button/Secondary/Text/Selected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/ImageTypeBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/ImageTypeText.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/Text.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/TitleBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/CameraInformation/TitleText.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/Link.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/ListRow.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/ListRowSubtitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/ListSeparator.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/DataProtection/NavigationBarTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/DestructiveAction.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/ButtonTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/GrayButtonTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeButtonBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeHeaderBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileActionsHeader/SortButtonText.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/FolderIcon.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Grabber.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Icon.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Overlay.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/SelectedRow.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileMenu/Text.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileSelection/Contents.json create mode 100644 iOSClient/Colors.xcassets/FileSelection/list_item_deselected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/ListCell/Contents.json create mode 100644 iOSClient/Colors.xcassets/ListCell/Separator.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/ListCell/Subtitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/ListCell/Title.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/MediaPlayer/Contents.json create mode 100644 iOSClient/Colors.xcassets/MediaPlayer/IconTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/MediaPlayer/SliderMaxColor.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/MediaPlayer/SliderMinColor.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/MediaPlayer/SliderThumb.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/NavigationBar/Contents.json create mode 100644 iOSClient/Colors.xcassets/NavigationBar/LogoTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/QualitySlider/Contents.json create mode 100644 iOSClient/Colors.xcassets/QualitySlider/MaximumTrackColor.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/QualitySlider/ThumbColor.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/SearchBarBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/SelectToolbar/CancelTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/SelectToolbar/Contents.json create mode 100644 iOSClient/Colors.xcassets/SelectToolbar/ItemStateActive.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/SelectToolbar/ItemStateInactive.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/SelectToolbar/ItemStateSelected.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundHighlighted.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundNormal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Cell/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Cell/Subtitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Cell/Title.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/SearchField/Border.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/SearchField/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/SearchField/Placeholder.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/SectionTitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/SectionTitleBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Advanced/TableCellSeparator.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Comment/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Comment/TextFieldBackground.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Comment/TextFieldBorder.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/CommonIconTint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Normal.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Pressed.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/Title.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/SearchUserCell/UserType.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Share/TabTitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Tabbar/ActiveItem.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Tabbar/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Tabbar/Contents.json create mode 100644 iOSClient/Colors.xcassets/Tabbar/FabButton.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Tabbar/InactiveItem.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Transfers/Cell/Contents.json create mode 100644 iOSClient/Colors.xcassets/Transfers/Cell/Subtitle.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Transfers/Cell/Title.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/Transfers/Contents.json create mode 100644 iOSClient/Colors.xcassets/UserButton/Background.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/UserButton/Contents.json create mode 100644 iOSClient/Colors.xcassets/UserButton/Tint.colorset/Contents.json create mode 100644 iOSClient/Colors.xcassets/formSeparator.colorset/Contents.json create mode 100644 iOSClient/Components/Buttons/ButtonStyleGuide.swift create mode 100644 iOSClient/Components/Buttons/CommonButtonConstants.swift create mode 100644 iOSClient/Components/Buttons/LinkButton.swift create mode 100644 iOSClient/Components/Buttons/PrimaryButton.swift create mode 100644 iOSClient/Components/Buttons/SecondaryButton.swift create mode 100644 iOSClient/DataProtection/DataProtectionAgreementManager.swift create mode 100644 iOSClient/DataProtection/DataProtectionAgreementScreen.swift create mode 100644 iOSClient/DataProtection/DataProtectionHostingController.swift create mode 100644 iOSClient/DataProtection/DataProtectionModel.swift create mode 100644 iOSClient/DataProtection/DataProtectionSettingsScreen.swift create mode 100644 iOSClient/Extensions/UIView+GridSelection.swift create mode 100644 iOSClient/Extensions/View+Design.swift delete mode 100644 iOSClient/Favorites/NCFavoriteNavigationController.swift delete mode 100644 iOSClient/Files/NCFilesNavigationController.swift create mode 100644 iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x-1.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByDate.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@2x.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@3x.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByFile.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@2x.png create mode 100644 iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@3x.png create mode 100644 iOSClient/Images.xcassets/MenuOrderByFileName.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName.png create mode 100644 iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@2x.png create mode 100644 iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@3x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate.png create mode 100644 iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@2x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@3x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@2x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@3x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@2x.png create mode 100644 iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@3x.png create mode 100644 iOSClient/Images.xcassets/WiFiSmall.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall.png create mode 100644 iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@2x.png create mode 100644 iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@3x.png create mode 100644 iOSClient/Images.xcassets/actionSheetModify.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify.png create mode 100644 iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@2x.png create mode 100644 iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@3x.png create mode 100644 iOSClient/Images.xcassets/activityTypeFailure.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure.png create mode 100644 iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@2x.png create mode 100644 iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@3x.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfo.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@2x.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@3x.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfoServer.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@2x.png create mode 100644 iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@3x.png create mode 100644 iOSClient/Images.xcassets/activityTypeSuccess.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSucces@2x.png create mode 100644 iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png create mode 100644 iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess@3x.png create mode 100644 iOSClient/Images.xcassets/addFolderInfo.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/addFolderInfo.imageset/addFolderInfo.pdf rename iOSClient/Images.xcassets/{lock.imageset => application.imageset}/Contents.json (83%) create mode 100644 iOSClient/Images.xcassets/application.imageset/application.pdf create mode 100644 iOSClient/Images.xcassets/audioPlay.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/audioPlay.imageset/play.pdf rename iOSClient/Images.xcassets/{lock_open.imageset => backward.imageset}/Contents.json (78%) create mode 100644 iOSClient/Images.xcassets/backward.imageset/backward.svg create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/sortCreatedDate.pdf create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/sortUploadDate.pdf create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/sortModifiedDate.pdf create mode 100644 iOSClient/Images.xcassets/circle.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/circle.imageset/checkedNo.pdf create mode 100644 iOSClient/Images.xcassets/cityzip.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/cityzip.imageset/cityzip.pdf create mode 100644 iOSClient/Images.xcassets/closeCircle.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/closeCircle.imageset/closeCircle.pdf create mode 100644 iOSClient/Images.xcassets/cloudDownload.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/cloudDownload.imageset/cloudDownload.pdf create mode 100644 iOSClient/Images.xcassets/cloudUpload.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/cloudUpload.imageset/cloudUpload.pdf create mode 100644 iOSClient/Images.xcassets/contact.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/contact.imageset/contact.svg create mode 100644 iOSClient/Images.xcassets/create_file_document.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/create_file_document.imageset/create_file_document@2x.png create mode 100644 iOSClient/Images.xcassets/create_file_document.imageset/document_menu.png create mode 100644 iOSClient/Images.xcassets/create_file_document.imageset/document_menu@3x.png create mode 100644 iOSClient/Images.xcassets/create_file_ppt.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/create_file_ppt.imageset/create_file_ppt@2x.png create mode 100644 iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu.png create mode 100644 iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu@3x.png create mode 100644 iOSClient/Images.xcassets/create_file_xls.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/create_file_xls.imageset/create_file_xls@2x.png create mode 100644 iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu.png create mode 100644 iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu@3x.png create mode 100644 iOSClient/Images.xcassets/deleteScan.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/deleteScan.imageset/deleteScan.png create mode 100644 iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@2x.png create mode 100644 iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@3x.png create mode 100644 iOSClient/Images.xcassets/disclosureIndicator.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/disclosureIndicator.imageset/disclosureIndicator@2x.png create mode 100644 iOSClient/Images.xcassets/e2eReadPassphrase.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/e2eReadPassphrase.imageset/e2eReadPassphrase.pdf create mode 100644 iOSClient/Images.xcassets/favoriteSmall.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/favoriteSmall.imageset/videoFavoriteOn.pdf create mode 100644 iOSClient/Images.xcassets/file_application.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_application.imageset/file_application.pdf create mode 100644 iOSClient/Images.xcassets/file_audio.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_audio.imageset/file_audio.pdf create mode 100644 iOSClient/Images.xcassets/file_code.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_code.imageset/file_code.pdf create mode 100644 iOSClient/Images.xcassets/file_compress.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_compress.imageset/file_compress.pdf create mode 100644 iOSClient/Images.xcassets/file_movie.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_movie.imageset/file_movie.pdf create mode 100644 iOSClient/Images.xcassets/file_pdf.imageset/Untitled.pdf create mode 100644 iOSClient/Images.xcassets/file_ppt.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_ppt.imageset/file_ppt.pdf create mode 100644 iOSClient/Images.xcassets/file_txt.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_txt.imageset/file_txt.pdf create mode 100644 iOSClient/Images.xcassets/file_xls.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/file_xls.imageset/file_xls.pdf delete mode 100644 iOSClient/Images.xcassets/folder.imageset/folder.svg delete mode 100644 iOSClient/Images.xcassets/folderAutomaticUpload.imageset/folder_photo.svg delete mode 100644 iOSClient/Images.xcassets/folderEncrypted.imageset/folder_encrypted.svg delete mode 100644 iOSClient/Images.xcassets/folder_external.imageset/Contents.json delete mode 100644 iOSClient/Images.xcassets/folder_external.imageset/folder_external.svg delete mode 100644 iOSClient/Images.xcassets/folder_group.imageset/folder_group.svg delete mode 100644 iOSClient/Images.xcassets/folder_public.imageset/folder_link.svg delete mode 100644 iOSClient/Images.xcassets/folder_shared_with_me.imageset/Contents.json delete mode 100644 iOSClient/Images.xcassets/folder_shared_with_me.imageset/folder_shared_with_me.svg rename iOSClient/Images.xcassets/{media.imageset => grid.imageset}/Contents.json (86%) create mode 100644 iOSClient/Images.xcassets/grid.imageset/Untitled.pdf create mode 100644 iOSClient/Images.xcassets/icon-calendar.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-calendar.imageset/icons8-calendario.svg create mode 100644 iOSClient/Images.xcassets/icon-confirm.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-confirm.imageset/icon-confirm.svg create mode 100644 iOSClient/Images.xcassets/icon-contacts.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-contacts.imageset/icons8-gruppo-utente-uomo-uomo.svg create mode 100644 iOSClient/Images.xcassets/icon-deck.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-deck.imageset/deck.svg create mode 100644 iOSClient/Images.xcassets/icon-mail.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-mail.imageset/icons8-nuovo-messaggio.svg create mode 100644 iOSClient/Images.xcassets/icon-pages.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-pages.imageset/icon-pages.svg create mode 100644 iOSClient/Images.xcassets/icon-talk.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/icon-talk.imageset/app-dark.svg delete mode 100644 iOSClient/Images.xcassets/lock.imageset/lock-outline.svg delete mode 100644 iOSClient/Images.xcassets/lock_open.imageset/lock-open-variant-outline.svg create mode 100644 iOSClient/Images.xcassets/loginPassword.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud.png create mode 100644 iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@2x.png create mode 100644 iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@3x.png create mode 100644 iOSClient/Images.xcassets/loginURL.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud.png create mode 100644 iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@2x.png create mode 100644 iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@3x.png create mode 100644 iOSClient/Images.xcassets/loginUser.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/loginUser.imageset/userNextcloud.png create mode 100644 iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@2x.png create mode 100644 iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@3x.png create mode 100644 iOSClient/Images.xcassets/mediaPlay.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/mediaPlay.imageset/play.png create mode 100644 iOSClient/Images.xcassets/menuLogoUser.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser.png create mode 100644 iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@2x.png create mode 100644 iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@3x.png create mode 100644 iOSClient/Images.xcassets/moreBig.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/moreBig.imageset/moreBig.png create mode 100644 iOSClient/Images.xcassets/moreBig.imageset/moreBig@2x.png create mode 100644 iOSClient/Images.xcassets/moreBig.imageset/moreBig@3x.png create mode 100644 iOSClient/Images.xcassets/moreEmpty.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty.png create mode 100644 iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@2x.png create mode 100644 iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@3x.png create mode 100644 iOSClient/Images.xcassets/navigationMore.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/navigationMore.imageset/more-round.png rename iOSClient/Images.xcassets/{folder_public.imageset => navigationSort.imageset}/Contents.json (86%) create mode 100644 iOSClient/Images.xcassets/navigationSort.imageset/Untitled.pdf create mode 100644 iOSClient/Images.xcassets/networkInProgress.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/networkInProgress.imageset/networkInProgress.pdf create mode 100644 iOSClient/Images.xcassets/noPreview.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/noPreview.imageset/noPreview.pdf create mode 100644 iOSClient/Images.xcassets/noPreviewAudio.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/noPreviewAudio.imageset/noPreviewAudio.pdf create mode 100644 iOSClient/Images.xcassets/noPreviewVideo.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/noPreviewVideo.imageset/noPreviewVideo.pdf create mode 100644 iOSClient/Images.xcassets/nonetwork.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/nonetwork.imageset/nonetwork.pdf create mode 100644 iOSClient/Images.xcassets/notaMusic.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/notaMusic.imageset/notaMusic.png create mode 100644 iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@2x.png create mode 100644 iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@3x.png create mode 100644 iOSClient/Images.xcassets/offOutlineAudio.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/offOutlineAudio.imageset/Untitled.pdf create mode 100644 iOSClient/Images.xcassets/offOutlineImage.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/offOutlineImage.imageset/image.pdf create mode 100644 iOSClient/Images.xcassets/offOutlineVideo.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/offOutlineVideo.imageset/Untitled.pdf create mode 100644 iOSClient/Images.xcassets/palette.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/palette.imageset/palette.svg create mode 100644 iOSClient/Images.xcassets/passcode.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/passcode.imageset/passcode.png create mode 100644 iOSClient/Images.xcassets/passcode.imageset/passcode@2x.png create mode 100644 iOSClient/Images.xcassets/passcode.imageset/passcode@3x.png create mode 100644 iOSClient/Images.xcassets/pip.enter.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/pip.enter.imageset/pip.enter.svg create mode 100644 iOSClient/Images.xcassets/printer.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/printer.imageset/print.svg create mode 100644 iOSClient/Images.xcassets/search.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/search.imageset/search.pdf create mode 100644 iOSClient/Images.xcassets/share.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/share.imageset/share.pdf create mode 100644 iOSClient/Images.xcassets/shareAdd.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/shareAdd.imageset/shareAdd.pdf create mode 100644 iOSClient/Images.xcassets/shareFill.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/shareFill.imageset/share.pdf create mode 100644 iOSClient/Images.xcassets/shareInternalLink.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/shareInternalLink.imageset/shareInternalLink.pdf create mode 100644 iOSClient/Images.xcassets/shareMenu.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/shareMenu.imageset/shareMenu.pdf create mode 100644 iOSClient/Images.xcassets/shareMounted.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/shareMounted.imageset/shareMounted.pdf create mode 100644 iOSClient/Images.xcassets/sharePhotoBrowser.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share.png create mode 100644 iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share@3x.png create mode 100644 iOSClient/Images.xcassets/sharePhotoBrowser.imageset/sharePhotoBrowser@2x.png create mode 100644 iOSClient/Images.xcassets/sharebylink.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sharebylink.imageset/sharebylink.pdf create mode 100644 iOSClient/Images.xcassets/sortDateLessRecent.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent.png create mode 100644 iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@2x.png create mode 100644 iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@3x.png create mode 100644 iOSClient/Images.xcassets/sortDateMoreRecent.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess.png create mode 100644 iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@2x.png create mode 100644 iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@3x.png create mode 100644 iOSClient/Images.xcassets/sortFileNameAZ.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ.png create mode 100644 iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@2x.png create mode 100644 iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@3x.png create mode 100644 iOSClient/Images.xcassets/sortFileNameZA.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA.png create mode 100644 iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@2x.png create mode 100644 iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@3x.png create mode 100644 iOSClient/Images.xcassets/sortLargest.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortLargest.imageset/sortLargest.png create mode 100644 iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@2x.png create mode 100644 iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@3x.png create mode 100644 iOSClient/Images.xcassets/sortSmallest.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest.png create mode 100644 iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@2x.png create mode 100644 iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@3x.png create mode 100644 iOSClient/Images.xcassets/speaker0.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg create mode 100644 iOSClient/Images.xcassets/speaker1.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg create mode 100644 iOSClient/Images.xcassets/speaker2.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg create mode 100644 iOSClient/Images.xcassets/speaker3.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg create mode 100644 iOSClient/Images.xcassets/square.and.arrow.down.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/square.and.arrow.down.imageset/Unknown-1.svg delete mode 100644 iOSClient/Images.xcassets/star.fill.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/statusdownload.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/statusdownload.imageset/statusdownload.png create mode 100644 iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@2x.png create mode 100644 iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@3x.png create mode 100644 iOSClient/Images.xcassets/statuserror.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/statuserror.imageset/statuserror.png create mode 100644 iOSClient/Images.xcassets/statuserror.imageset/statuserror@2x.png create mode 100644 iOSClient/Images.xcassets/statuserror.imageset/statuserror@3x.png create mode 100644 iOSClient/Images.xcassets/statusupload.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/statusupload.imageset/statusupload.png create mode 100644 iOSClient/Images.xcassets/statusupload.imageset/statusupload@2x.png create mode 100644 iOSClient/Images.xcassets/statusupload.imageset/statusupload@3x.png rename iOSClient/Images.xcassets/{folderAutomaticUpload.imageset => tabBarFiles.imageset}/Contents.json (85%) rename iOSClient/Images.xcassets/{star.fill.imageset/tabBarFavorites.pdf => tabBarFiles.imageset/tabBarFiles.pdf} (95%) create mode 100644 iOSClient/Images.xcassets/tabBarMore.imageset/Contents.json rename iOSClient/Images.xcassets/{media.imageset/tabBarMedia.pdf => tabBarMore.imageset/tabBarMore.pdf} (96%) create mode 100644 iOSClient/Images.xcassets/talk-template.imageset/talk.png create mode 100644 iOSClient/Images.xcassets/talk.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/talk.imageset/talk.png create mode 100644 iOSClient/Images.xcassets/talk_bar.imageset/Contents.json create mode 100644 iOSClient/Images.xcassets/talk_bar.imageset/talk.png create mode 100644 iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 1.png create mode 100644 iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 2.png create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/bars.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/chevronLeft.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/cloud.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/deleted.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/offline.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/recent.svg create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/settings.svg create mode 100644 iOSClient/IonosImages.xcassets/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileFolderCell/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/star.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_light.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/grid_item_selected.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/list_item_deselected.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/list_item_selected.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/list_item_some_selected.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_light.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/view_mode_grid.svg create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/view_mode_list.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/IONOSEasyStorageLogo.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/allowEdit.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/createFolder.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/details.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/goToPage.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/item.lock.svg rename iOSClient/{Images.xcassets/folder_group.imageset => IonosImages.xcassets/IONOS_icons/item.lock.open.imageset}/Contents.json (85%) create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/item.lock.open.svg rename iOSClient/{Images.xcassets/folder.imageset => IonosImages.xcassets/IONOS_icons/media.imageset}/Contents.json (87%) create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/media.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/menu.add.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/menu.search.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/menu.share.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/modifyWithQuickLook.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/moveOrCopy.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/offline.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/photoOrVideo.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/qrcode.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/readOnly.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/rename.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/scan.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/star.filled.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/star.hollow.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/synced.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/trash_icon.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/unshare.svg create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/viewInFolder.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/CloseFullscreen.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Forward.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Fullscreen.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Message.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Pause.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Play.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Rewind.svg create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Sound.svg create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/copy.svg create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/trash-can.svg rename iOSClient/{Images.xcassets/folderEncrypted.imageset => IonosImages.xcassets/SelectTabBar/download.imageset}/Contents.json (84%) create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/cloud-arrow-down.svg create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/unlock.svg create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/rotate-left.svg create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/Contents.json create mode 100644 "iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/\356\202\232.svg" create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/lock.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/AutoUpload/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/400-folder.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/400-folder-open.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/autoupload.folder.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/bulletlist.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/calendar.user.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/camera.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/camera.imageset/camera.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/dataprivacy.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/folder.gear.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/gear.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/gear.imageset/gear.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/github.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/github.imageset/github.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/handshake.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/handshake.imageset/handshake.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/shield.halved.svg create mode 100644 iOSClient/IonosImages.xcassets/Settings/xmark.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Settings/xmark.imageset/xmark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/copy.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/error.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/move.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/rename.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/stop.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/trash.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/upload.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_light.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_light.svg create mode 100644 iOSClient/IonosImages.xcassets/accountCheckmark.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/accountCheckmark.imageset/accountCheckmark.svg create mode 100644 iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/checkmarkIcon.svg create mode 100644 iOSClient/IonosImages.xcassets/contactsIcon.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_light.svg create mode 100644 iOSClient/IonosImages.xcassets/delete.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/delete.imageset/delete.svg create mode 100644 iOSClient/IonosImages.xcassets/deleted.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/deleted.imageset/deleted.svg create mode 100644 iOSClient/IonosImages.xcassets/favorites.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/favorites.imageset/favorites.svg create mode 100644 iOSClient/IonosImages.xcassets/file_unsupported.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_light.svg create mode 100644 iOSClient/IonosImages.xcassets/folder.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_dark_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_light_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_light.svg create mode 100644 iOSClient/IonosImages.xcassets/folderEncrypted.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_dark_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_light_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folder_external.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_dark_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_light_mode.svg create mode 100644 iOSClient/IonosImages.xcassets/folder_group.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_light.svg create mode 100644 iOSClient/IonosImages.xcassets/home.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/home.imageset/home.svg create mode 100644 iOSClient/IonosImages.xcassets/local.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/local.imageset/local.svg create mode 100644 iOSClient/IonosImages.xcassets/more.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/more.imageset/more_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/more.imageset/more_light.svg create mode 100644 iOSClient/IonosImages.xcassets/offlineFlag.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_light.svg create mode 100644 iOSClient/IonosImages.xcassets/restore.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/restore.imageset/restore.svg create mode 100644 iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/restoreFromDeleted.svg create mode 100644 iOSClient/IonosImages.xcassets/share/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/canShare.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_light.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/internally.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/internally.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon 1.svg create mode 100644 iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon.svg create mode 100644 iOSClient/IonosImages.xcassets/share/internalLink.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_light.svg create mode 100644 iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_d.svg create mode 100644 iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_l.svg create mode 100644 iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_light.svg create mode 100644 iOSClient/IonosImages.xcassets/share/plus.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/plus.imageset/plus_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/plus.imageset/plus_light.svg create mode 100644 iOSClient/IonosImages.xcassets/share/shared.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/shared.imageset/shared_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/shared.imageset/shared_light.svg create mode 100644 iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_drk.svg create mode 100644 iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_l.svg create mode 100644 iOSClient/IonosImages.xcassets/share/threeDots.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_lights.svg create mode 100644 iOSClient/IonosImages.xcassets/share/userContacts.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_light.svg create mode 100644 iOSClient/IonosImages.xcassets/shares.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/shares.imageset/shares.svg create mode 100644 iOSClient/IonosImages.xcassets/uploadFile.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/uploadFile.imageset/uploadFile.svg create mode 100644 iOSClient/IonosImages.xcassets/userAvatar.imageset/Contents.json create mode 100644 iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_dark.svg create mode 100644 iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_light.svg create mode 100644 iOSClient/Login/NCLoginPoll.swift create mode 100644 iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.swift create mode 100644 iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.xib create mode 100644 iOSClient/Main/Collection Common/NCCollectionViewCommon+FileActionsHeader.swift delete mode 100644 iOSClient/Main/Collection Common/NCCollectionViewCommonSelectTabBar.swift create mode 100644 iOSClient/Main/HiDriveMainNavigationController.swift delete mode 100644 iOSClient/Main/NCMainNavigationController.swift create mode 100644 iOSClient/Main/UITabBarGuideline.swift create mode 100644 iOSClient/Menu/NCSortMenu.swift delete mode 100644 iOSClient/More/NCMoreNavigationController.swift create mode 100644 iOSClient/NCImagesRepository.swift create mode 100644 iOSClient/Settings/AutoUpload/Albums.swift create mode 100644 iOSClient/Settings/SelectAlbum/AlbumModel.swift create mode 100644 iOSClient/Settings/SelectAlbum/PHAssetCollectionThumbnailLoader.swift create mode 100644 iOSClient/Settings/SelectAlbum/SelectAlbumView.swift create mode 100644 iOSClient/Share/ShareSearchField.swift create mode 100644 iOSClient/Style/CircleItemSpinner.swift create mode 100644 iOSClient/Toolbar/HiDriveCollectionViewCommonSelectToolbar.swift create mode 100644 iOSClient/Toolbar/HiDriveCollectionViewCommonSelectToolbarDelegate.swift create mode 100644 iOSClient/Toolbar/HiDriveCollectionViewCommonSelectToolbarView.swift create mode 100644 iOSClient/Transfers/TransfersListener.swift delete mode 100644 iOSClient/Trash/NCTrashSelectTabBar.swift create mode 100644 iOSClient/Utility/AccountButtonFactory.swift create mode 100644 iOSClient/Utility/UIDevice+VirtualOrientation.swift diff --git a/.github/workflows/xcode.xxx b/.github/workflows/xcode.xxx new file mode 100644 index 0000000000..4a1c9ee743 --- /dev/null +++ b/.github/workflows/xcode.xxx @@ -0,0 +1,72 @@ +name: Build main target + +on: + push: + branches: + - master + - develop + pull_request: + types: [synchronize, opened, reopened, ready_for_review] + branches: + - master + - develop + +jobs: + build-and-test: + name: Build and Test + runs-on: macos-latest + if: github.event.pull_request.draft == false + env: + PROJECT: Nextcloud.xcodeproj + DESTINATION: platform=iOS Simulator,name=iPhone 14 + SCHEME: Nextcloud + steps: + - name: Set env var + run: echo "DEVELOPER_DIR=$(xcode-select --print-path)" >> $GITHUB_ENV + - uses: actions/checkout@v3 + - name: Setup Bundler and Install Gems + run: | + gem install bundler + bundle install + bundle update + - name: Restore Carhage Cache + uses: actions/cache@v3 + id: carthage-cache + with: + path: Carthage + key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }} + restore-keys: | + ${{ runner.os }}-carthage- + - name: Carthage + if: steps.carthage-cache.outputs.cache-hit != 'true' + run: carthage bootstrap --use-xcframeworks --platform iOS + - name: Download GoogleService-Info.plist + run: wget "https://raw.githubusercontent.com/firebase/quickstart-ios/master/mock-GoogleService-Info.plist" -O GoogleService-Info.plist + - name: Install docker + run: | + brew install colima + brew install docker + colima start + - name: Create docker test server and export enviroment variables + run: | + source ./create-docker-test-server.sh + if [ ! -f ".env-vars" ]; then + touch .env-vars + echo "export TEST_SERVER_URL=$TEST_SERVER_URL" >> .env-vars + echo "export TEST_USER=$TEST_USER" >> .env-vars + echo "export TEST_APP_PASSWORD=$TEST_APP_PASSWORD" >> .env-vars + fi + - name: Build & Test Nextcloud iOS + run: | + set -o pipefail && xcodebuild test -project $PROJECT \ + -scheme "$SCHEME" \ + -destination "$DESTINATION" \ + -enableCodeCoverage YES \ + -test-iterations 3 \ + -retry-tests-on-failure \ + | xcpretty + - name: Upload coverage to codecov + run: | + bundle exec slather + bash <(curl -s https://codecov.io/bash) -f ./cobertura.xml -X coveragepy -X gcov -X xcode -t ${{ secrets.CODECOV_TOKEN }} + diff --git a/.gitignore b/.gitignore index 8e65697610..2dc70ad0f4 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,8 @@ Package.resolved *.generated.swift /.env-vars + +## CI artifacts +BuildForSimulator/ +ipaDerivedData/ +build/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..7e3e535cb2 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,150 @@ +variables: + outputDirPath: "./build/sym" + IPA_PATH: "${outputDirPath}/${scheme}.ipa" + DSYM_PATH: "*.dSYM.zip" + scheme: "Nextcloud" + dev_configuration: "Release" + beta_configuration: "Beta" + archive_path: "${outputDirPath}/${scheme}" + export_method: "ad-hoc" + +stages: +- build +- deploy + +.mac_general_scripts: &mac_general_scripts + - security unlock-keychain -p $PASSWORD_BUILDE ~/Library/Keychains/login.keychain-db + - brew install jq + - fastlane -v + - xcodebuild -version + - date + +.download_google_info_plist: &download_google_info_plist + - curl + --fail + --location + --request GET + --url $FB_PLIST_PATH + --header "Authorization:Bearer ${FB_PLIST_PROJECT_TOKEN}" | jq -r '.content' | base64 --decode >> "./GoogleService-Info.plist" + +.download_google_info_plist_beta: &download_google_info_plist_beta + - curl + --fail + --location + --request GET + --url $FB_BETA_PLIST_PATH + --header "Authorization:Bearer ${FB_PLIST_PROJECT_TOKEN}" | jq -r '.content' | base64 --decode >> "./GoogleService-Info.plist" + + +.build_general_script: &build_general_script + - fastlane gym + --scheme $scheme + --configuration $dev_configuration + --output_directory $outputDirPath + --derived_data_path ./ipaDerivedData + --output_name $scheme + --archive_path $archive_path + --export_method $export_method + --silent + --clean + +.build_general_script_beta: &build_general_script_beta + - fastlane gym + --scheme $scheme + --configuration $beta_configuration + --output_directory $outputDirPath + --derived_data_path ./ipaDerivedData + --output_name $scheme + --archive_path $archive_path + --export_method $export_method + --silent + --clean + +.build_simulator_general_script: &build_simulator_general_script + - xcodebuild -configuration Debug -scheme $scheme -sdk iphonesimulator -derivedDataPath ./BuildForSimulator -quiet + +############## build ############## + +.build_general_params: &build_general_params + retry: 1 + stage: build + tags: + - xcode16 + before_script: + - *mac_general_scripts + artifacts: + paths: + - $IPA_PATH + - $DSYM_PATH + expire_in: 1 week + +build_develop_feature: + <<: *build_general_params + script: + - *download_google_info_plist + - *build_general_script + only: + - develop + - /^feature/ + - /^release/ + +build_beta: + <<: *build_general_params + when: manual + script: + - *download_google_info_plist_beta + - *build_general_script_beta + only: + - develop + - /^feature/ + - /^release/ + +build_simulator: + <<: *build_general_params + when: manual + script: + - *download_google_info_plist + - *build_simulator_general_script + - zip -r ./${scheme}.zip ./BuildForSimulator/Build/Products/Debug-iphonesimulator/${scheme}.app + + only: + - develop + - /^feature/ + - /^hotfix/ + - /^release/ + artifacts: + paths: + - Nextcloud.zip + expire_in: 1 week + +############ deploy ########### + +.deploy_general_params: &deploy_general_params + stage: deploy + image: ruby + tags: + - docker + +deploy_develop_feature: + <<: *deploy_general_params + script: + - curl $STORE_UPLOAD_URL -F token=$DEV_STORE_TOKEN -F bundle=@"${IPA_PATH}" -F comment=$CI_PIPELINE_ID + dependencies: + - build_develop_feature + needs: [build_develop_feature] + only: + - develop + - /^feature/ + - /^release/ + +deploy_beta: + <<: *deploy_general_params + script: + - curl $STORE_UPLOAD_URL -F token=$DEV_STORE_TOKEN -F bundle=@"${IPA_PATH}" -F comment=$CI_PIPELINE_ID + dependencies: + - build_beta + needs: [build_beta] + only: + - develop + - /^feature/ + - /^release/ diff --git a/.slather.yml b/.slather.yml new file mode 100644 index 0000000000..ef19883f11 --- /dev/null +++ b/.slather.yml @@ -0,0 +1,3 @@ +coverage_service: cobertura_xml +xcodeproj: Nextcloud.xcodeproj +scheme: Nextcloud diff --git a/Brand/AppStore/File_Provider_Extension.entitlements b/Brand/AppStore/File_Provider_Extension.entitlements new file mode 100755 index 0000000000..9af7946e13 --- /dev/null +++ b/Brand/AppStore/File_Provider_Extension.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/File_Provider_Extension.plist b/Brand/AppStore/File_Provider_Extension.plist new file mode 100755 index 0000000000..d95aa09ed4 --- /dev/null +++ b/Brand/AppStore/File_Provider_Extension.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionFileProviderDocumentGroup + group.com.ionos.hidrivenext + NSExtensionFileProviderSupportsEnumeration + + NSExtensionPointIdentifier + com.apple.fileprovider-nonui + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).FileProviderExtension + + + diff --git a/Brand/AppStore/File_Provider_Extension_UI.entitlements b/Brand/AppStore/File_Provider_Extension_UI.entitlements new file mode 100644 index 0000000000..9af7946e13 --- /dev/null +++ b/Brand/AppStore/File_Provider_Extension_UI.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/File_Provider_Extension_UI.plist b/Brand/AppStore/File_Provider_Extension_UI.plist new file mode 100644 index 0000000000..cdaaf4dd7a --- /dev/null +++ b/Brand/AppStore/File_Provider_Extension_UI.plist @@ -0,0 +1,44 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSExtension + + NSExtensionFileProviderActions + + + NSExtensionFileProviderActionActivationRule + TRUEPREDICATE + NSExtensionFileProviderActionIdentifier + com.mycompany.FileProviderUI.CustomAction + NSExtensionFileProviderActionName + Custom Action + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.fileprovider-actionsui + + NSHumanReadableCopyright + + + diff --git a/Brand/AppStore/Notification_Service_Extension.entitlements b/Brand/AppStore/Notification_Service_Extension.entitlements new file mode 100644 index 0000000000..3f397ad76f --- /dev/null +++ b/Brand/AppStore/Notification_Service_Extension.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/Notification_Service_Extension.plist b/Brand/AppStore/Notification_Service_Extension.plist new file mode 100644 index 0000000000..7cba1da5f6 --- /dev/null +++ b/Brand/AppStore/Notification_Service_Extension.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Notification Service Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/Brand/AppStore/Share.entitlements b/Brand/AppStore/Share.entitlements new file mode 100755 index 0000000000..3f397ad76f --- /dev/null +++ b/Brand/AppStore/Share.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/Share.plist b/Brand/AppStore/Share.plist new file mode 100755 index 0000000000..45d00bfa98 --- /dev/null +++ b/Brand/AppStore/Share.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + SUBQUERY (extensionItems, $extensionItem, SUBQUERY ($extensionItem.attachments,$attachment,(ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data")).@count == $extensionItem.attachments.@count).@count > 0 + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/Brand/AppStore/Widget.entitlements b/Brand/AppStore/Widget.entitlements new file mode 100644 index 0000000000..3f397ad76f --- /dev/null +++ b/Brand/AppStore/Widget.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/Widget.plist b/Brand/AppStore/Widget.plist new file mode 100644 index 0000000000..d4e598ee31 --- /dev/null +++ b/Brand/AppStore/Widget.plist @@ -0,0 +1,16 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/Brand/AppStore/WidgetDashboardIntentHandler.entitlements b/Brand/AppStore/WidgetDashboardIntentHandler.entitlements new file mode 100644 index 0000000000..3f397ad76f --- /dev/null +++ b/Brand/AppStore/WidgetDashboardIntentHandler.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/WidgetDashboardIntentHandler.plist b/Brand/AppStore/WidgetDashboardIntentHandler.plist new file mode 100644 index 0000000000..9b9988eb82 --- /dev/null +++ b/Brand/AppStore/WidgetDashboardIntentHandler.plist @@ -0,0 +1,30 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionAttributes + + IntentsRestrictedWhileLocked + + IntentsRestrictedWhileProtectedDataUnavailable + + IntentsSupported + + AccountIntent + DashboardIntent + + + NSExtensionPointIdentifier + com.apple.intents-service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).IntentHandler + + + diff --git a/Brand/AppStore/iOSClient.entitlements b/Brand/AppStore/iOSClient.entitlements new file mode 100755 index 0000000000..0d00dc85a2 --- /dev/null +++ b/Brand/AppStore/iOSClient.entitlements @@ -0,0 +1,28 @@ + + + + + aps-environment + development + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.ionos.hidrivenext + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.network.client + + com.apple.security.personal-information.location + + com.apple.security.personal-information.photos-library + + keychain-access-groups + + $(AppIdentifierPrefix)com.ionos.hidrivenext + + + diff --git a/Brand/AppStore/iOSClient.plist b/Brand/AppStore/iOSClient.plist new file mode 100755 index 0000000000..31871e43f4 --- /dev/null +++ b/Brand/AppStore/iOSClient.plist @@ -0,0 +1,195 @@ + + + + + NSUserTrackingUsageDescription + In order to measure the quality of the programming of the app and to find crashes and errors and their cause, anonymized data from the program flow is evaluated. At no time are individual users identified, your identity remains protected. + BGTaskSchedulerPermittedIdentifiers + + com.nextcloud.refreshTask + com.nextcloud.processingTask + + CFBundleAllowMixedLocalizations + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + it.twsweb.Nextcloud + CFBundleURLSchemes + + nextcloud + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + + LSApplicationQueriesSchemes + + nextcloudtalk + nextcloudnotes + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSCameraUsageDescription + Camera access is required to scan documents and make photo and video. + NSFaceIDUsageDescription + Face ID is required to authenticate using face recognition. + NSLocationAlwaysAndWhenInUseUsageDescription + The app will show your location on a map. + NSLocationAlwaysUsageDescription + The app will show your location on a map. + NSLocationWhenInUseUsageDescription + The app will show your location on a map. + NSMicrophoneUsageDescription + Microphone access is required to create voice notes. + NSPhotoLibraryAddUsageDescription + Photo library access is required to upload your photos and videos to your cloud. + NSPhotoLibraryUsageDescription + Photo library access is required to upload your photos and videos to your cloud. + NSUserActivityTypes + + AccountIntent + DashboardIntent + + PHPhotoLibraryPreventAutomaticLimitedAccessAlert + + UIAppFonts + + Inconsolata-Light.ttf + Inconsolata-Regular.ttf + Inconsolata-ExtraLight.ttf + Inconsolata-Medium.ttf + Inconsolata-Bold.ttf + Inconsolata-ExtraBold.ttf + Inconsolata-Black.ttf + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UIBackgroundModes + + audio + fetch + processing + remote-notification + + UIFileSharingEnabled + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleLightContent + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UIViewControllerBasedStatusBarAppearance + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.movie + + UTTypeDescription + Matroska Video File + UTTypeIconFiles + + UTTypeIdentifier + com.apple.quicktime.mkv + UTTypeReferenceURL + http://www.matroska.org/ + UTTypeTagSpecification + + public.filename-extension + + mkv + + + + + UTTypeConformsTo + + public.text + + UTTypeDescription + SRT Subtitle Format + UTTypeIconFiles + + UTTypeIdentifier + com.company.srt + UTTypeReferenceURL + + UTTypeTagSpecification + + public.filename-extension + + srt + + + + + + diff --git a/Brand/Beta/File_Provider_Extension.entitlements b/Brand/Beta/File_Provider_Extension.entitlements new file mode 100755 index 0000000000..ac861b128b --- /dev/null +++ b/Brand/Beta/File_Provider_Extension.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/File_Provider_Extension.plist b/Brand/Beta/File_Provider_Extension.plist new file mode 100755 index 0000000000..180107953c --- /dev/null +++ b/Brand/Beta/File_Provider_Extension.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionFileProviderDocumentGroup + group.de.strato.ionos.easystorage.beta + NSExtensionFileProviderSupportsEnumeration + + NSExtensionPointIdentifier + com.apple.fileprovider-nonui + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).FileProviderExtension + + + diff --git a/Brand/Beta/File_Provider_Extension_UI.entitlements b/Brand/Beta/File_Provider_Extension_UI.entitlements new file mode 100644 index 0000000000..ac861b128b --- /dev/null +++ b/Brand/Beta/File_Provider_Extension_UI.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/File_Provider_Extension_UI.plist b/Brand/Beta/File_Provider_Extension_UI.plist new file mode 100644 index 0000000000..cdaaf4dd7a --- /dev/null +++ b/Brand/Beta/File_Provider_Extension_UI.plist @@ -0,0 +1,44 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSExtension + + NSExtensionFileProviderActions + + + NSExtensionFileProviderActionActivationRule + TRUEPREDICATE + NSExtensionFileProviderActionIdentifier + com.mycompany.FileProviderUI.CustomAction + NSExtensionFileProviderActionName + Custom Action + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.fileprovider-actionsui + + NSHumanReadableCopyright + + + diff --git a/Brand/Beta/Notification_Service_Extension.entitlements b/Brand/Beta/Notification_Service_Extension.entitlements new file mode 100644 index 0000000000..6b405d1193 --- /dev/null +++ b/Brand/Beta/Notification_Service_Extension.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/Notification_Service_Extension.plist b/Brand/Beta/Notification_Service_Extension.plist new file mode 100644 index 0000000000..7cba1da5f6 --- /dev/null +++ b/Brand/Beta/Notification_Service_Extension.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Notification Service Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/Brand/Beta/Share.entitlements b/Brand/Beta/Share.entitlements new file mode 100755 index 0000000000..6b405d1193 --- /dev/null +++ b/Brand/Beta/Share.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/Share.plist b/Brand/Beta/Share.plist new file mode 100755 index 0000000000..567991a236 --- /dev/null +++ b/Brand/Beta/Share.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Nextcloud + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + SUBQUERY (extensionItems, $extensionItem, SUBQUERY ($extensionItem.attachments,$attachment,(ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data")).@count == $extensionItem.attachments.@count).@count > 0 + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/Brand/Beta/Widget.entitlements b/Brand/Beta/Widget.entitlements new file mode 100644 index 0000000000..6b405d1193 --- /dev/null +++ b/Brand/Beta/Widget.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/Widget.plist b/Brand/Beta/Widget.plist new file mode 100644 index 0000000000..d4e598ee31 --- /dev/null +++ b/Brand/Beta/Widget.plist @@ -0,0 +1,16 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/Brand/Beta/WidgetDashboardIntentHandler.entitlements b/Brand/Beta/WidgetDashboardIntentHandler.entitlements new file mode 100644 index 0000000000..6b405d1193 --- /dev/null +++ b/Brand/Beta/WidgetDashboardIntentHandler.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/WidgetDashboardIntentHandler.plist b/Brand/Beta/WidgetDashboardIntentHandler.plist new file mode 100644 index 0000000000..9b9988eb82 --- /dev/null +++ b/Brand/Beta/WidgetDashboardIntentHandler.plist @@ -0,0 +1,30 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionAttributes + + IntentsRestrictedWhileLocked + + IntentsRestrictedWhileProtectedDataUnavailable + + IntentsSupported + + AccountIntent + DashboardIntent + + + NSExtensionPointIdentifier + com.apple.intents-service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).IntentHandler + + + diff --git a/Brand/Beta/iOSClient.entitlements b/Brand/Beta/iOSClient.entitlements new file mode 100755 index 0000000000..fee0b15832 --- /dev/null +++ b/Brand/Beta/iOSClient.entitlements @@ -0,0 +1,28 @@ + + + + + aps-environment + development + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.de.strato.ionos.easystorage.beta + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.network.client + + com.apple.security.personal-information.location + + com.apple.security.personal-information.photos-library + + keychain-access-groups + + $(AppIdentifierPrefix)de.strato.ionos.easystorage.beta + + + diff --git a/Brand/Beta/iOSClient.plist b/Brand/Beta/iOSClient.plist new file mode 100755 index 0000000000..4c5f059a8b --- /dev/null +++ b/Brand/Beta/iOSClient.plist @@ -0,0 +1,197 @@ + + + + + NSUserTrackingUsageDescription + In order to measure the quality of the programming of the app and to find crashes and errors and their cause, anonymized data from the program flow is evaluated. At no time are individual users identified, your identity remains protected. + BGTaskSchedulerPermittedIdentifiers + + com.nextcloud.refreshTask + com.nextcloud.processingTask + + CFBundleAllowMixedLocalizations + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + it.twsweb.Nextcloud + CFBundleURLSchemes + + nextcloud + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + + ITSEncryptionExportComplianceCode + 8e9f9874-938e-460b-a9be-f82cb3393971 + LSApplicationQueriesSchemes + + nextcloudtalk + nextcloudnotes + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSCameraUsageDescription + Camera access is required to scan documents and make photo and video. + NSFaceIDUsageDescription + Face ID is required to authenticate using face recognition. + NSLocationAlwaysAndWhenInUseUsageDescription + The app will show your location on a map. + NSLocationAlwaysUsageDescription + The app will show your location on a map. + NSLocationWhenInUseUsageDescription + The app will show your location on a map. + NSMicrophoneUsageDescription + Microphone access is required to create voice notes. + NSPhotoLibraryAddUsageDescription + Photo library access is required to upload your photos and videos to your cloud. + NSPhotoLibraryUsageDescription + Photo library access is required to upload your photos and videos to your cloud. + NSUserActivityTypes + + AccountIntent + DashboardIntent + + PHPhotoLibraryPreventAutomaticLimitedAccessAlert + + UIAppFonts + + Inconsolata-Light.ttf + Inconsolata-Regular.ttf + Inconsolata-ExtraLight.ttf + Inconsolata-Medium.ttf + Inconsolata-Bold.ttf + Inconsolata-ExtraBold.ttf + Inconsolata-Black.ttf + + UIBackgroundModes + + audio + fetch + processing + remote-notification + + UIFileSharingEnabled + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleLightContent + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UIViewControllerBasedStatusBarAppearance + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.movie + + UTTypeDescription + Matroska Video File + UTTypeIconFiles + + UTTypeIdentifier + com.apple.quicktime.mkv + UTTypeReferenceURL + http://www.matroska.org/ + UTTypeTagSpecification + + public.filename-extension + + mkv + + + + + UTTypeConformsTo + + public.text + + UTTypeDescription + SRT Subtitle Format + UTTypeIconFiles + + UTTypeIdentifier + com.company.srt + UTTypeReferenceURL + + UTTypeTagSpecification + + public.filename-extension + + srt + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + + diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/AppIcon.png b/Brand/Custom.xcassets/AppIcon.appiconset/AppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..32154cc06f2555920105e8d8a1fee46a47153865 GIT binary patch literal 10876 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon1024@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon1024@1x.png deleted file mode 100644 index 686085377da82c3c0020330278b413ead571af0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92806 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%0A#BjjEh%lt>qC&>7J@}0 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%0Do-pR@Kflx6pb+Hnu_bP$h;q~+aH<%8q` z&pzJ^rs2BEY$Vhd@pWU!6}BS;u?z@#Rf=(644{QRC!qnPJ4Q z^n?rAcQ_8i`H9*WZvD$QNHJ{4vv(R90p!l*ai z7SV$wqnR2CD72SXsmcptZEyyj*#e@!BKD8SKgq0hMQ#48LR#nd+c^Mze1hcSQIKQY zhegE@E@1Yz;$+1=eJH-ToS-Kz*w(MUn>?EtBBLYi*;uBG01z?s{xw$98{M70 zL*-HRw=4a(tPd985A?h1`%=!N%m@l`aaOxPh#YVS5)8Y&ToH>SuKpB?D8}V^tyDQ8v zVQ(+gTLB4_EFwnf1bqz0uCu5xLr@MR1dei&uW~YRGtEb}601`f(CVlP@2)Po4mpqZ zC-u??`yJ__FwtK6d600DrmuZ`myI)rZ>DXJZAbYX*9D~h@t*$9#rvxa_!qCMOV#iG z*bEp5F(Ybr+99<1!EpXMIoMjT2N_sQSy5LewfupaXQE(igbB70$K8Fzugq%+;i;jT zbUy{dkNRk9-k1;drDxmE*)lSelb%yw6vQSPr?R)(LBv9pjH zC@*7n@YI*tbURAjVJ^c`0Eu4~0BRn7wPBQgIUahHf%~YN^=B*#_2`Z+dZ7Mv0&87& zWt&kvaXylU|GZg(*y))zltDwNH2-GrzInjHGz+YeY8g(LC5fR z9Tt%SLU$X`^qr*{A(mKVs!#Ji&~}YNy!JsvU)!r5g@-M7mF!q28Op;Z9+R$6t>HND zBQfD0mG8hS#L|0-693+1Ed#uhkQEX;=)k4T!Iq?cgoBSuD#TRgG5XTtJZS!8L4HpN zi|L`A57#d8h!L7?-8$9;OW)PciPr5trj$B=`kFh;hG~d<2fCQpu*d7A zqxw9TK6l;8y6p_}q2_|K{p|lnSOlzdBj~O#X>GtpVX6sY=zb@`Wj>ILe}6s;5Nwq| z3+H2p(wSyS&OaGWhxt$f4SD-sDCiPgpU5CGQu$sGHQ!GIrrgUWI8Fxw(&la*N%|C()FCh)OW&^y`R|wn#_Sd6F#xL z<(7j2kFWk?1CH3&`D9?i0a^e7_9gLPh%s)$Iq&;^45=3Lon+WT-FuiPt&x?dcGz0n z#)qkHu50hU)j!?%ZduZf-v*r*L+ zo-u>zTkiv~mPSJ!!olzcn)& zO3 ze{7|jI`zU~o9)1?`aFNa8xz|EY7t7tALjYrDO0Na#m`-&e4l~&1ERWBg(!Ul1$%Ej zo1a=gyC%}CigM%NJSj{iyMZ#c-{tvi?gek#v)0kYsl;GqkhnhH>wl{Z zwn%k?9hvu>j}IB@Nm=%*|-O))7@Z`UXP6{#oFoR)rL zf_Yx_R{Cd7fy5W{)eRffZx*!~Fm3r0|ElQ)#kbu8VcK_x0w>WQJ^OT<3_z5qaQRn1Pp+>dr2jF z1$g<&?Sbm7C(;tlH7#1h{x4jq#q{~T%kF_5qqfrqRRfd3cbNG+;dd$Q)ECNKw?N-w z2~0)d9Y-F`?{=IlrJ{S7V!BnF37?t>&?@Xe+kj?#5Num`WlE1_v3WxHkMECFuYY~H zE-Spk6RUqD+?+LSe|~jWI>Hw>eJZ6{Bh4x($&ug96MX zrFs>9$ox0OX$W`!YPu_;SD;RSX8$Vim6n*Gz|;FsNX6T{z!&W~uP165w20c_c91rr z6r`RN6TXy`tFI2ke|&Z)EUme!l!k7~?eOgCQz=P?9FHfpc1%UNZ>oO6xpD1J>bUKB zZdQPZtz)2@ho1=L*f|=xjc1+5eYQ+pNBY}yiuKPy!%5iJTgI}OuiM{i&%UbKcfKJg zUnG}f9zhX5KM&^YPBSQt_Mw_#ZI;B%KNtLYIS-2cC8a{bUSCt+g-hNSt!kJq51D)G z`fo;mlo<8}3_@5}1Wz?IH1GS>aUiG7zaj73HKYPg0dA=>_o(vKA5fQ&o`6jQ)A3P9 z8!$-$#aQ)tGMwJ9*JQf(gm1-Gbhw?X=D4~3y#aSsmtWe7cg}T=9GYml&X&P z(HkeUon3m}!HVH>|Il)Um98f0?B$&>Q}OCrFp5Sa*I+ZG>*!q+W6(WVzV&kub*b^V zZ)MO;u1Sl@m$G1{3wT-p@jEA*&z&P#D=H+60ny90tMc7zjuow6DyY0t!lu`GrwV>V zrdHYzSzJ8t;NqEh?I)wXML&&{Zmlf#Ivkk_=G=7W3x&9lx2_G67Pk5A(x~J2Ava5w zla!(&r#~khsiE4Sp0GD@*Zp`ZoSu60CSWq`{Lzi<{BgR#^X*+Kx*&}{p27Q0#O4BM(P5 zo&CCc!|w|2*%Qwg6jVL{z%)PI*bfDg7f-(~e_UAT`_uSr$>s)(0%$nl|1*IVg4Xnc z;?e=6GH+}VZvPuIC!Cri&yS*JBEWA!52$S|zCnfhL}5%xFvAN6iKiT63w|E1R5W8R zgEV^r7R0MR=5eC>H6)P1vj5?6d`PqgQ^bVS3e9igkRO!~u9y93yVk8lNt5V@*Xt5r zC|WGE2wHH!L1?Y*|M8>w}`(pF4B-Qm*1VfO<+7MF$PN)eZ{_AVIW zwD-Ys6 z?#+E}WV_VCwOgOhEpsI*L;fp4yD|WN^L3gfNP(#R+3nz*AQm2nXvC~)4T=)sV=s4K zG1?109c1C9eTxJ*sv7|EH&h^FG-LZo3)a}Bep5^diU>hGMC}`}Yd={E>?@0N$FOt@ z(y>?DTT^MfG?T1Vx-~U7A55`Ae&;3HX`ODNKXgdjF{I;5lXA0o)d)duZAz>y7LryX z)2&*uz2XY#M5xJG1qt^_xr(+oVlM5kcDEG6_+u2{*Iu${?_m$+2nL2=L$B zuwFkvS_s@5@!Z6lh~X{%(l$dLMoBwQqF{)yY4h7%N!!K}-)H#>Ck&$n?MY?EQ{V`S zDlh@2M5|)pO*Awf{^?dh=3X7we{%kjb+KKBE`vF6^kl1|Ts1zZU|~wCSatPa?xS~_ z3wu|rUxTkh=3w#muJ1#T=D&4GL@=nh1eRLBUR?}t2;h*v5(;e#{B{GET;6JYDbHV5 zKaP$gV*|F?{`vk=9*6(Lf$arT8l{t37jWS#P zQCm4HC&b@i83YpbDekRl8P|%8C{=5(8S=FN=~3|) z6k8w+;~eO3zYCbi=8VOzvp71uJj98gFNluYuIJi=Uv1o}ys5#6G3Zl- zHL&nQeHV8c%q?3=-RUux&Uzx_bz6nLtqJiz3c8TA`)0)Yo|P%q-^->0@_L3LLk2Vy zxD!(zcsAdC5HKb$x9MH_esDpy`TbN*0}lUsKECmQ8B+*3elAS9`-k^|!bxN7JOf;J z#~Tb>{JLDi&>3Ti#8MC5JGTPJAZrPpD#dQ$L>yZ8Kh}sRt z3Rv-&kQkAvMKVF4c}`SsgwBSw$j z{a_5@dS{LQQe4ev;8=B~%&Qcgijs{Ml5w;4ydS^YY&^ePDR2(5DMdRM*(K2M&-F|e z(8dLiFG4jma{=`SI%?h<^-FUN)c)jVwv~=Hb@u6%9oe62zqYYn*?pt*Z|3>Bbexj4 zc6wzyXUY(@GYJUYuax*-s~9Ea)JRTxJe*hwTC8vlZMGGu*w z>xRZ7A3-OrHvGCKdEK6*(@`RQjF>53j~7M#YD}&^s+MCWr3GK;q}&b41a0iJQl;4D z$~D}nsDH2iCF&ESm@@{UuAKCxy>O^~ZWjAHQQb~USI@lc$b45QCpma%*|z)nof2G3 zS+{_5P28aqy_e2^mu{h#G`hGrZZ8R0JGJo)b(cgjm!%s9o9K7x{@9XYmbtlK{NkdA# zXOHt1_7&rs+~@P@gDX5+pGPuBe!q~)6>q^t3&@Cq{-;96$|jQUAfb``s2i(l&h!qP z`5ErVjcwaUcQK#+(k`@4K}mc=1b7^4?N4(2ocKNu0S`1KEqM2SS;xf% zo2Uqa8#LGMjp&>(+4J(o=RQ~=$b0y0hY-aI4|jEMf|F?97B7?gbEyb$Jo&BP$r9pM zgaB57-HdDmKYZ}98rrH`lGxa&?{z*YWIiU|d74+;$-=vzC~KHU_Xt7kh$Fc$d|Ls znVje=WhZaIF@0bST16mIF8f{sH$DjAL`*?J*77Zmiwk3#h)><97PzLlGQnc~uaT^3 zOBKL5Me@wC&A-*sJ?*5`@|4F4VZHqZ==rm=oz-jlY+w7(ojX1%Jf7Bl}VDXcP8kJduAFjN4DYQ>__bc zMdB=PICTilkTJoCi7}NhVQ>;m;{1Na4+4}g_f-lv7mQ94pR0S075R@YY1?h&v?>=)r_ z6o~3cy{g{++J{df4`C#PyEc!Z=9QoYe}l>RfXkEJ@+U5jQqX$tZ$3ZkWoF~R9&_@n zcc}D7FRUcH#L8zA%eTE(FSto2!ged@n(Z+snsKD#>vO6}^G+)nm$9HXvy-x)TTuH& z1wVCkel&6KrRVlPdS3G9S8O1cJnT#l%_LE-=Z`Ste2AxaQKKK)@-T9X7c4YjN## z)9yI^I>Jr%i;;+6DXYri}fH``J<$i;6b_`&70-N{}LmQs2T+0BhdeV_IAT^8x4 zcXX7wds%esJws|V-5VzLc&z0+?BnzO+xG9s8>xbbO@mJ)J!vHU5LQU0n?~xl*?m&W zMn88r7VRWZkjQ>&j zNQ+4NFSAMEOTPx!6`M$q9Ixu{yF(T{04&^ zrZPT(=C`6Ch)_3fCi2@ZA2V4JBnI*r{aZQ6sH^(4vKSu`Y!<)@DaGQp?=FeP5G?B< zH@Nb=7VTNJg$|C)ey4Ws<_S1OfH&bhBG-pp%kv#xi*>`S>{z&ycXrcn#DvJ}nMDAd3Zv1v z=cXD@%H81`nFYFFtp=_Vbk^^|(w^{8qGA1rb?t5;*{R(X+B9!`nznPI@$H! zYU$}jhJ&o*yPT2!0#ey+7U`)<_Io_Dl0j6<&3I$8b0&+-l)d&C1by~C)>GVsk%<-ZS6&yn+2Y1Vm7$6iU*4PG zzag(phZ2Z5b(hAZ>}Vu!8dEA-#xvAjzrXAdQb<*+2TRErK(5>2ubnFtPOcI@4ZB)9 z@EZA{FsZO>`X3j-xhq%AUFvqvz7yyBZZaHW|9PQhvlGod7}~|(fc&oDJYoJlJtyhK zUva*893EfX`fW!Y@!26gR(vsu3t1h?+mugY+RjrXNlN3|E8nP>_saq>)hP(Jqk%CojUPcv)?G|8J`q) z;JNfRM9I=;`>IuDMYFHz`uLgQoCwv0Q;(fmr@Z>=#+5lge;y*oL_DM`rLwh9aU)tF z12!$r7me8THuU;K|2s)hd*Sp{V99S$lRBHtMK!Is`mgvl(@6KqR@WW6oC75#-`y{F zvt)B#sZ$rM^EGe1Z8;rsq^We`P(nGIkzn%b()N8IaJNckc35w=>gFoGoTjs6CPSCV z1l^|**@08HQuRb_T>;KP|4R(EbahyJdTvmM$TWz#?q+81l3MV_6-ykQTD{2NyI-U$$$2Ee&*-NZ+pF~w?)#U|7EhL(DeFjmSl=op!A>{C z6p$D7)IHs=KED^LDhfAMg!e0?XFz0mf>D9ZHvDyavDX~GB!s9t3Oz-RQ9hu#_xDqs zH|>3k6+-+f+*?b3l-QRz@{iva!|<2drGx(?fFVEqFr?39SQ?dyRpF0t?pSk0vTh)w zeF592S5n*_M~H)QOz1>))m>+&Cnu6QF#P?`qjzrJsw0-c$`L1i5|0X+N7s zN3K^-tt>I|dszq^l2OLJvSkoZ1yH8yWjcear@J#ae7)fy`RSB4l$Am z*7GKJ$m#6L{MHsF=GIZRT%uDkN~5m?E=q=-`0YUnU;OWV&uwmA8y7HkU$_0M+chs$ zY%yU<5U}4|E9`H?;}GCSoZ`yhiNgE_#f}R`&E$jbJ)~E>SM;QAwPzmVDM(%3q8@c) zU(`sy)>EE6Q9Ii9j1v_^8L%3sN+{%ie^n=@T63dZ?tOT^--V4%BI0-GW0Z?DaG}4c8h@I^1cV#vCGtfI&Hhok_)!w zTO$0pF+_c0n4k6G*>z=PffrS(UcWXkBLX@7P7@w9@1~pG;6MCa z-3VpZ)nU-Jc-=9siLbrOKAKx8a(Nlg)bKLzCrz5923!{#LDheNA5-i`Z#r7u@c= zaWA5bkVT*A0L7{5#Qb z*b?FMP*FPz(Jt2AJZW_uvH%-jsX&e-RM#H46tDTCu7*J2Lv#D58t@sM2}#8j8Ym#t z);%qRIA1(N+#By2ad+OCukC)c7w>~C#EFAwTwtSl!~49D%CzcRi#t^>fn{y~6Nm80 zuw{GOB7cn3)f6GVcPw;k@bFS0;7eSNZ7=r-?7LH@T$ZaIp|8a2&~@q@rxJDnrHy53 zvoVmmMs&t|{Xq{*l;7AF`49Y^B4_1{)ie@M1aLgR#zKYDmo}+-|9%OIDPbl~?>>V%y~? z;q~UIrpnmGt7NR)9(1LkgZiU2o`5&?x(2_N19=ln8ux6@f{Dv(NfnG2=fkDE_k5Z! zHtn7QLLl+x9(i?X=@fc-PB_Syntuh9KnX_SNYH zj^OG-d^1(hec;P!1CgbgelF7%KeS$=+}aXv8D;FCOBr*wH0HOcQKa{-gN-Jprv?4TPmmS-dV}himMlO5P0!&rZS?Q*1Ofo8~}x+sViSYR!uyW+gVDn8FXDf*>0jf#*6(Koco)efJ?r%9uzIUE6u{?XEpPh@B)}iNUysyb0Kh8eIYFVokWL8EH8!&TwcSQlrp_Rr>2P zove4cQ~Kewcj=3iG6nYSu5lV~4`K#Q1)F;S@t5ZQlQpInDHS-YBy3OPXk-UZaizGv zK4$P+5mR^|X}2B_Nbu@s34w_l@%0w})Bv91vso$0$iPNd#0QvyOJMavdjx5W>tJ0Q zSw2oX=a_D|Nx-P6p%X`-9@AZXmEpBdd2@-OcVc!ert(Kcoeza1E$?0*_G~$GwDngJ zQRim&<@sCV(k+WrA~gq5>q(U%0|rtQES#Wla7qO*XhGD)K21ow4aeT{oHmMLU%YHX zMm6-6iIaFlqN7MiWQ4VfVHe_AUiGa3S+CEDDRfvVhkxuoRf)Kn5sA3DxnS}#^;!?R zdHb`+^p8W3ho%lt=ThtP4ju_>n$cflXDssQE2Y!aon)R0ry?_ylVBHH8|!g){de>) z_p7I?>b|h^AG9m%h(xqCUy(-?s(WRo|6~Wylk~9+=(ooH!>0l7clk4Ce0dxzxMnmq z6BH02BW-_r4xrO+L05zQ4VJv&>%xZf?4$SFC=J)Dh4~pL+^h=dD_e=GtL7(ht6wns z9(-M0gJI>WcM-458eHs6s2haV=eFFUdCtr`>>!AG7_r>^@^|!2Ik$VdLw<8|efds@ zW1A`0lJ^ef;r`RlXa^KdJ)tS5vGaWuc3yj8sV<`dA@ebhaxAT9H#fLgV301`=OJk< z`mxNd3#61uGn$n5l4xtc(i;Go5o4|1#P~68^mtpcAI1=W%?$LuDl;2Fn#~)!;6yI zm;}GkUgPH7OLwpB6rH^$9%2?0r=zYEubXZ2h7HA~4A$vSqi|qk;sNCis?gBL_+&S` zj2XYkZ~lW4&Z)hud#+q!1wF zQ+ajwm7T7MhRa}Q!^$o49lEO1SaO=r8t{_Mtxgu}vQDbJM#^$w|GVhkC%XG8BbKK; zI@Ik(k?NNX!;J1lwX076BTdTp?6Q^w7VUiXLF@Ejz8BddSGM(ns830C-w=dkG_raS zq)j$S{3r$b);S|wVQv4n@5Za+ar4?ss*0FAbN(SA+N}0v00`{pL?ey|fNH&H0T*?t zN;z{(9q;7=>EC#VMuD8g=&iK-to6=1DvH?D-bBb4BrcXtCw~BkTin1i8F#YC7e}!C zU=E?VNjg~>;zoJ)GRt>wYs@H8NZj(S6s2kEtoKSaf$FN9Cv_K%8pC=>Eh$S-d(t@^ z`rMeG9z=&VZoc)0_OjDeaCIZMg~;IfUY0!E^L*T8xLk?sJTyv1E>eD22{vOsy{wn9$${nlXQFtLV+J% z`##qKu6M5i#~BV+~Hn%uZ4l+AJYxh$(6(mD2?C-`%o6(g-tgvl29%MM*eo`SwB>RV}=(= zLr^Ld9`cE{JMm6IRaqOABd~Y@=M+@P&h5~2tGD95i6g5iVhVe7Ckd-dU5Flv+hy}l zpR5+-c@YQhlpx|phSzcd0KMqP-H{ZJ_e~f!ogT+MrpYRPjGK+jHlCl3XD#3D@&@ub z%ys2;zAky|)zwV;JgKrq9Tx?{0vqj0x-s30s@+h+6PnHK2?AD2w7uqMi=CJ585h1@ zaJ3-4*=WTwY_x+%hVJ;VV{eu8lzF7vOF3#YLy&TiEC@?iBh5LiOLn`m#*8EDbDQwT zM51?NNX;yKX!8P*I%L4qd36UcqERlCMVB^ z-_YcAUGIrdXJ&UL51g@HJK`%8u0JqY(Knfx4j)00n5p_gWq|Hm;avefnw;kvjk7CT z$qLK2dMLJhD!r3JVrup?jn=$Q@D#!xo0qak?%$!w^?XVP9_WYHRSHI>IiA#Ot+0zo zYv;4jl!nz{rN1RV$xQw{wT3lQ(W^yaqd`fHs1RwP*#$Ed&Z>IWW_C*vouh~^jq%B3 zt=H%P%9NEu%)26Q!>g4ChOKtECQA|tMOEeJ>OsWPZCiQGZu|k;XH>BS(v)N4lbvFk zz)j!FJ52~iY@$7=s4K_uUo`r?1D`tKX?|n!V?G?V#H4~66Q+%M<0n*z3(4R$E^?Eb&6 z;SXUqL1NJ>lf_t_oUfGS;;wkylKyytNRO8b-Zt34btG)j()NL{?L}Sxd>{|m|Cogo9dH!HWalzp7oy_(%^F2oyJ22Ai#YQO} z%HruC1GOHJtn-*YmM}v3b^aCBaxq}NGoQtEiazoCiBBVl@3v+scD~0{h`Vz8Su^6l z>9ClqGHQ9c)IqUO6^L%)>xV70n}yXF`kGi8t_+nDK1PK!uIF(rtQh#wd|Bt52&Lf6 z?Jhn|O~{f`6t7M8V&rSB=ZMQ~6c859@#Obf^ZVVbkhE4i5--n6MH?Key%@8(nm+McG}JL{sdY$k}yDzOb~@+N6o5Wl@RtzO16^Sz=BfGS)<*@%_m7kU=%WFwG~%`a3AXc5*zq zUo8=2(z$g-Wa`TcvHa6VopaA0ie#AqBflfb7u%FDypsE&8h{O4{L<6jfLWyjU)Z25 z7ClX8J{XV8tfOb?;nPfu5Cbfpa$`B)vMO zRv%z7JW9$sQA4=rNri1vi`f7DRXRX87yLposCg7c!bsTPo?ujWITS2^W!SxCrnP{o zuw5z0N7@FV&I zoJ-ZDJRBn3PuB!vy5J<(w<1l#BFze-PO}430zrafQ=>p3bl;|NH0qnx4(*mj^52`C zlZFw|v*D^%RMzFa|<6tVB!esrR04UX?XXD-py8Lsn;0)G+Ck&CIeiY zPc$}`Tgs_Z>@(*#_05vnZUxfUP!9Ru?auR7?vkzD-o{q$SJb})R&^9fuP>xM$!?e6 zBiVI&r_Gd4FvZM+_D#+huV@Mac}L2(@pSoDfeMys>^>b?ef3{k*L1W0yZ%7&g0+CC z%Gy(DtR!g9<+-CL8Mp6+B2@|5Xk}2(Zjk>bVoUrkX z4ff@eH!*!ev$(iOq>!Hj4@kD(O;o^SfL)G`$esQTz4HVwcr$@Ge~!LG?AaX_>7g1+ zJ1=DjiwzbNq4)@b9^lw=Rb~Ir*0I41;|q{YG2U7FHq(&`R(o@tCojA>R$^JO7(POQ z&hwbpd!v<8H(=uplNyNWJ5&w7PQ6D>3L?%|j0yw#o(iG;0|@RZLzZ%-@&`NUkC0FcK;CWJ-$&MrFA?!LI6yF$48b0!vPbT=w} zcK|N_{jCBeh<>vPhAr{W`$(y7z5I>!>cH^icwi~3#&)c)GU+!;?G@x0{m;!%W3LSd22{b*kHu;YNO|upcqrO zg>RZp97M?24Z!IhzYuls3Ety%X6V+hv4ef7VtB7nC>raDa$0dn1c`Ct)B9s3(cI{S znQDfR3s=OFq(iwmr7}Pyon5BV2&lW7+PvD^bXmg)F@(fLqw7sPg)i6SgIR(D8oy|j zT3Y`CaY$mh((Rt0sg!eX-{W@&&Q9t)6z=`o?vBrb-pFj$SsOsQV`!*Ux)K#xSt0a?e z?<+wLYOCPIpMdK^iRod3%LVIQfeT_WCg+140t7@1AD=obi5+#v0va6gE*_b3kZmaH zu7+wV#5Iv#ieQH^=c77(%elC&&bf<0SeQS>Jah)09RSuYSB_NZ$ExSu1Hsy)GP)*f zlD55CxtFxGvWhGVHJ;dxjpy{e*6PF5sZhG?8&Ty?EYcxOsV=4RSoAO!Y1+jnp;o2D z?W12%@=@6c?;p_z2x!9DsBF33dI|+OOb0fbqwapqHNjQH+#H^!&FVC0O*&Z(BvOW+ zFsRUc`p)t=#P=C0md2u{S&p_2)_BYQ&B(q94>Jafbnxx!KD;D`6we)kWD~2}YN!ug zr#^}GA$NGdup=x6hca&qxZ_!;40YCKD(h`dWjr90T%3<3s900*5s9ufmoh{(l%A>N zX{R+MS`&X4Ll#SeUiXj8C9>ILfw+BK|5lHotL&ppqdsIE&tH?{Ok-J0y%nvK#5I~} z8vK3&_t(&%$OHXNX)FzjR0vCBRo3r)agJq1mQn(wOPNZXub-Y<04_qu|H~N85@c;{ zrvYaU3K(rXMmRSkzW9@8aqpEbg(d0l@tnjVtlRt=+G%82T%SvOUZolr>JRnzr$S|q zX9+c(CiSp#?*%ZovqS0VpHM&NekP{h8(}BERRoajgE#uP-JF}>@md4pUTtECgOUmk zJeR3@$^*7-qVsUM^u$q>p{piXs#5dld(_|3+bob>si765LsDKLwD82d5eoMnn^4_X5Cc}V}n=Nhm&83W=PsY?kbu3f% zu%Zvo&fWb&vb=y;Z7aYmHj=C@j*JKysv`arUA?gtHiM4-NcsK2Xf6LxIv1R9+`j*ltk+-3tpEhFb}9 z7#)NzXX_JI3(FT1&H0sR>17r1^OhbaOdGm`0`!ZUeT9MSyW>Vu=0A$2`1t-)32OJ} zA%#U)bXaU`|6eh)XfkfyBEKFgr0eQpx(tV8pIU*M0y3-1Yb*ob{6*cDFr6x|d{jja zOcrSjTOOFM-6wjOGG@>x8Fttg>rE9WSK_|^*G2Bv7rC#NbxnB9S|%cjeecEeFoZoD z{Cy}M@Mli$bbdF1T*-BhIcUd6&pJAB;Stt2pZ%=0L#@Imwc6)z)Ct^1fDA9)>4lkSYcHOsxR}iZZX5< z^@suz$3#*W!POl`Xd-ztjv8>tf8n$|uJS|6S^9s1W=p5$b|;Y@_C*XB(dR5dNsume z>i=o&%fq2;+yCzwBgPVqqLQVIC`**eQjDdnF{OkeEg~wigpwv&sK`#Xs4Qhkp|XUK zr6LJQg=C9lDWxL6^S)FeR~(Y04bgB}T&-qTJxSFz}1io6OB=*nX56#_gvACE=2ZvuZL;ogmpVmKk+ zLG(kL^^$SRb#a*rj{5U&X7!@rmVkoW4Iv2SmKzJ`iigMV2kqNFdadHnyPBKrH`y1q zgQ8xVdPAA^<+#na%>zo_C8|ft{4%b=v625yIUT4q3Y>8u(`o_358x++io_JL|_9q zND40EaJ`;YS0qT$MKy)aJiVJxw9m@-v=z&4GR3gFk#+y&#zu%r9xtrrc^e4ho+aT+!j)uTwF z=qnb-)fGbMg#yD4n)q18u9hUBrnU)Y7J$Eb zA@*|TqRvaKE5#{CP=xj79XZcWI}m9Qn$wkbolGI)5NXv1=41+skxK&=FIk6foqh$` z_j_M+^Geuo8&$tu`&^`01)2jGd?>0maeTn?cJz%=e<=*%_k%iJ(!fSV^W0c^4)gYH z=bqK#m_U%!Hz$c+Moh1EKC|;*^K^?QP`_tnB=FN~@@^z-7DZ_5h|~)g2xSAP zX1^#d`sOzLT=R3wUfCCtgCbsIy~oB5A{zKA#B;cCxBF1y(L?=We5~3% zul8JmLT)r~7c+*9YOSf2V5s!y$7{r5T;y(kN$Ja+_XB5>$|U9YiS<=0@kO0jWYtlO zw=_PaRt8wTD)!d6>u9xH_r}i=;hL{va(2cG7Ja$AVf3qw1H~=4;#{En`}t81Zg}?l zR`mZ+trxe!-5d`8@#dO-dZGZ?yDs1V+z#&!>-+GnSB9KXMQtoh^WU0WP( zvHA0EEG)1g6*;|~wMOCAr$h6;re2ZtIERiaW9@4Iov1f*Byr?S3EX*hBwiJu)Hphp z)}ch9%Ql?d_fnRj#mjSQUR8Sw`d{Vj6JD-CXj-xAjM~>mUe%i)O+Oq@COE1ydfkzw zL`z;+F)MxiToQ85B}eww35h&AN!;vxa8*L^9N3WGEOy*IfE+(|-=x6tC1psRUHAOZ zMJ~`IWip9N33zUKs_#Z;`#5 zz~F7?=Wm`^=FLNcWU9Oi%P&5m=?|!#ZY{EAhvY-S_l@|w@o3CPg%>6gz?yi^nqbr0 zK$h#f(GG!85RnV-U~=x40SB5)aaFPhdk?Hd|Iu6-D_>V`ysR^%phM44IbKDaGNKM_p;m!doAhE;gD&!x@!f-M zNuuU+#n|`(sjr3?AZqD`py2?ok7NGs&!0W_5vE-&ueq{fG|PeKZ5GdY&Ai&n1jmg) ziY0Mn+DQb*l@Cw*uD2LASqY6C?QEfaONsE~uf9`@XvCxM)rMoE_e7e{ua3)E{JKWk8KdxAk4)un*|2umn!{YS3 z1qkRk2t$Z)*%B-m>SoVQfR7&q(o>PWu+fX!GdtWrgY$f`PrmZWjKH(G9|sjw$Hr%E zKRlthxBG1cvnX?~)Mw}8?8bwTt~4q!FcL96IXQbb;E}4cQ0wCvvbWPefSu>Y;`PBy zFf(ac6^kCJtMQoeX!O9$x6NlH!jF{~MRhM^6lONdM!X9RWmw(Pmu8XXfSCAUM&=f( zz$FcfRT3<0u0fkfqE?7Lio)*2KE zk+WWE12vj*j^N9;a0E3sSU|~$Kf0Py!d&*46$$es@#|+wx2=Tf)0;r39ccDD5hq*F zRh2sQ!6vN&#Irh1t@#!A{glQkcmm!)Ms3%Zp7#$YY^80kMGS9vWOm{;;4dDOJ|^kX zR#o4A8iM$7GG^vwU7GFA^9xLAq~h1Mu)oGL3N_WfT*aZU7u{YvT^)kiBImZ{vn3DR zaJ$eR@}JhbRvnDc;5R5d zn`C^}q9yw#)@a+Atkom$2;`jhCWF(D+=NOe3higNu2t-BeQH|Mu8qeE1F|6U520^S z@E$}eAEVMZAsPoN$xJ%$-7;$dmC8O0qAB=|=Zoa1p-uU+6j)u`|9~LK`74;pZ87I{^(Fw*7G)QoAd_|PO4k;p6ts4`Ij-xw|C$FIP_|4 zlw5z%M&ktbg04S?cL$~hdhtAhPJ4T$I69g)$4yHFAEC}nb~8A%6D`upfTjVfl(DmCJ?-`Gl zzcp@JyL7aATpr%y&!)K%pKTv1s5-y;v6&PrE$eu&_M$U+I!N&@b&LHR!0WN*dBx0) zrRkB`CX$uXT8rWpw?9FWM5qjnNwL11F&cEj8@21cvn3z;*s=tY?4&#Iqf2@|`L(u0 zK=ffLd=+evmb}_%7sc)ym}PLSmSD88^6EDFA1uKgUtC*qWC>%~S8qd0qVvqmzMF+b zf=`<2E_BDfg8#3fb;l~uoL7yUXqCEKR{3eo2cifnsOcVSlK`+JU8NF1b}{{R8D$ z@YM>ck15*k7O81zIs<>~&H0ggIX@np@Zod5JJ7>*n7ew{^Fgi;aNn>B&xYO5DobWr ztM}V&1|ARl_MTiQ5{3$Wu@e3K$bkx-VcU*cI)cnJqnWn^U{267ZE!>9a*JTht* zAyR;ve%<@G^RgtT_dQr*e>C&h1|Gw0FV7uFJz8sT%FDH(`t8u}tfm#pXYN&W4L030 z17LZdMKkN}aoZVUGIs`V0IxZ4MH#+#?;>2gmJZ5BdjMA~x+~H0)yL1wa^h7v!OXPc zYy&wrn-sDtvt=Di!<^mAH#X*HFXD4gdoj+-ViZV)I`&%e*dug2vD0dW%_$z43?POv_?~ARl$wlG%!fx-C zCXL_Us-E>~HP~b891JV*@Q8EGNlVe5GxE+>I0qu_)tPyq-unSDq0urVTkbupeN$R4 zmD0V!YJhLq-AA`1SxzT~7fJ0H=ktS?xO+AMNalO~f;Ki%ZMIX* zWdDBW;6y`GvE|gASu(J+#v^oAkU+q_n1dwFb1rxlaK>fl>?Q{qA^oB6Bg&hK2 zRp2B>An!laJwv25{^+02x93fXeGsB6`-J(#eU}MnzppLG$F;llE9@VweQXw7se=gG z6HBNd%C>nk(7#JFN?R~#V&sw88@!eEgrUD*a8AbJs?HZuDd#qvhz?Q2qy%*E7Nw4% z588t)=dbUd-vAv2bnDp~YtJ7HYzw-WMc2=7#B4D@q(2*dvRJ8hs}X8cA)3{7bhat= z+*^;_JaJk=&gia`_?fVQ(8o!qBnIUQipoQ6=ph0ilA@l{-Wn$qrfM8>GC2gw#%YJ$ z-g_SX$gtJpf=5-(c7l?~lvL+h(6o+2A9+&KsG|VzsmCo$B#JdhArv_v*bsDl{qrR@ zb7I`BwvLyU#)zvfcMiw&UME>oIO56E$%U&pJ-cgH>8<#1 zbQ|uT4ga|8TF$3Ov%92+nBOtza7*wkgqBO6QHSlPYg)PrHY<(rO(78=%xMy9Z_9HG zCwhJxxGn=M7Gw)S^5~N0vX}-?u{fhi@pGN#d=!Jc<$5-3_vVx{$YLy$fe=7!$VCm;u>(h|XojTX;n0cKqkv|EdxcHsO&ZP;Ly#G4A>{FlD3P&?6wbax5Rg7Pxncs+1FE_Zgt)!7eog2L z&ANVkk? z39~vU`-V!*Rqy6Au`W(1X9eo-o zdGF`cFWjRvaTfDP7-b;4Zn6xB;>E+|c8!Zf8V;%p%|Ov*GfC9;Q=O93eNGM3rLz^! zK#*XWlyTq^h%|rwgQVhW-32IiQUa@mGL|u1y4*&$&Xi~+IXTShH!dAlR=v-;$eSSN zs&+#gw8IQ-u$`$!EOu*<#07KL1(oX|oo)>pARjO#n_j04 zm^^K8joMk&#D`GoSY2)S<95lAM5hh`5QTxKjP0%THaEtfycsU~%fcVL zT=2;rtn5>Fl^!MivhpxVXxF@zQ5z~_SaXGqZZNJ=FJkVhM$*ZI7#K^J4M~)*1g)bN z=~mhzmuR(-)2k#rZdo7Ssvv&4+FRL^LptTb5Ue`gKw&n1FuVnw*leKgA~lYh{k$7x=Q6lga6khdmkN%(p}LT=OPXb) zhN;IQfaeF!dwVXqv5i_GW|*FM+&wZ2opj!xR@`a6a(SzL`shsLV{%JV7nu{PvRZMv z^;#!QL`*}cj1&gbz%1N|@(qv89(trg1fWwNslIe%cXWs}%u?*&7?T~(_S!1nx<%^c z7B5q1;q#?%=1CT>Pi^>#1?oGadKL?-<0CgEh)X<+UG4qV_>!%9e?`ethd+Xgw0zwA z&a_=mNbtBlWSV~tVP^`oAbMSW&JkYY#Mha)19j*tyV5=!7K>DcwOlNOVS+VSeb(=D zUaoF-3@P&!w$+G6e+FNuTq?O5GWEniPOw@`{dW21=+!O%9S$lX6=!9woa`-o)n&LD z8>eD8R}IcT_?1+gxKTN0ZfWh$7BkK2-?Fdz!D(xC86soM-1RlKe;2Xju~|D43}10? zabl;9&4SN|E++U!E!mdS{aKW#h9I9i#6c{iGOBCG2aA;|puhw4m_hV9yGq_B$6(v% z5<{rIS;$whNVSpj$w5P(4NtC7@te=JZh7pTw}0!`ofosn`_c$h*%Zyd3+56Y^OB`d zDY6}S*E04_bE%cYT6Lu3g4K_D33KZAn~tBh{W>7fHBcBh2)>aDx1cJzpvy_c<>uaU zo58lFvqu;>v4=?oqKkBBy#acrHN(8fhgk-&5P~5ynRwwUYU!_n8HK?*CH>&HBpPc@ z>P8_3Xt6Ca;1Xu8<`1Pu#>ic5xnsS2UR$eqei+1`8rg)GYzMrV6*3)f!m>4}1qD3u zW3bv4dVT8r`jDXOBU3Rg|85%umq`vY>Ct+8q=_bXtfO9+h!iDwkjirQGW~~PB2Qi zQStAUz3JzYjL#_@&&^-gNi>gLTYVctpH#>8^{d`Wckh^mrh9l8b&*&(Sr-We(-zZe z^NuTxx|Zed^Z>^Mwx!;1snHwsre@@%>Cz5rAHAkted)6nr=1#5SLEE(85Gb3t`p#^ zOc?e+Z00@$aR5ULa;~9zMFB=k8X_g;rqZm>o!7MMTfJa&WQUpJx8DYl%rnEcB}u3R zy02+40ZLX$7RO;E;ctJBRTB-eW9C8jjgdBHs3&uF?#ri^cGQ~-b9C>v6EV`av0JT>r7(~mFr>?F1u?u)~0+rlZ?g67`!P^$%{4K zD4EhR=%9p{s18$#PD+M>h#KR`b5IX-WjNA*d`2Kl`bdB%CXM+ni|;D= zy{{fNa z7!EHtgh2_3q8-N)olP*BI_JBu3+jnr&-zalu}f%<8V*U(L7pYI)RvQ<{9zc`UOYTs zU=^A>H!MAk;*zREM5?>;zU_T7bFYK5g{iy=$I{stA-jd=ix6b9;jMSZmmJmm*_e{m z5*Zv<`U3$?4ELe36^d@%%Xcy~p>?rj+Az`AL>b!UdTuf$5Qj8Lh%jnb()ADaS+WRn z;=K;h3d)zW&mu3aH(P!lgw7ZNv3~%jI;Qy9z?aZ}neQYjoJ7=|96ovZp6Y6Fp&X|5 z2iWOnpF7^%X-3tDhCt`1aD<+_T^BrXI$7oi4}89MVhk$bzw#$)fJVCF57CMs@N7MF zG3^&6IU>2T9#WP-lTudcIPQB@7Lyor=jsJL57cM6E68{CSIwi;2tR1CQjfOB$K~ox zQoMC@gGJMnu3(Yjcd&gHnO1MR9FI_gkR+pHB`7ov@H$7(aq?iI8$+sWjgj(lHFg>p>DVxw?w|ceUeI zUCuoe-7v^5J4cW^;FTTrttqCla%nmYYHtmJghPe^Jd87wlK2*DE^(& zXP9BKN%^tb+k8H{w|gtqt^l{@FkF+F`s2;c8Yb*1VG+V*`VRX2>p7$`8v$RHHiYZj~5xG2dZ-#7Tx_&zjQGnk3?HBpOMgsCP zQ{)dbYU<;uFyyE5FGiA>dJp{qO2qG2pqeDV)3!Yr4#HxvUv~cE|vNds~ zfM7Ul4qdOH5Ze|3N!gLa1h=!fH^zc<%A7I(3XEQI-LL24j*ct{CL29n+?5u-?~!Gb zM8M{IjK1>sqSvI_!JI9Q z&oZ&5fXW^}844r-^U8EE*s&aWoisC`M0Ztoo(b1~6~0U(5BjU?Kh+`z_T<}nF}1T< zPaZYI#!eqB8OAl&fB3n0^8ccE)Bzo^mh4Wm272k@sCTKO5hjwX$iL?&pnZ^*rD(>} zXUsEy`izN#B-8r!sHO@(KktUjRaQ*Q5)-G%pyJi)>sVy{G^!F{w(qc}ww@$6>bgKf zr%NAefl{?{#~ZYxE6Jj#B-O2tJUhBo=4w_#Sm$ogvQN>+&F^i1a^FuX$!`}bIWYze z%AZ4LOi7J?nJ??M^Ul{fh$fpaR$O%2%KKYdbP;FoEf~tyHNhuIRvx=o+6PVY6A(de z6w)=Y%*Niq6|~bcQ9l^q%l{5JcpsVx5hyp+8>oTEX_Mz?6a01KPF-nTgbUst$Lvwh z7(uH2DE^N<%`Fmz@ss#Lm%6)++kO%q4W=gAQ>KZW$iy2xwfV-(k1Rz2DpJ-|j)X?I)Fh@N=qoWgxO@;cI)%_i~CGbeuD&^vnU$d~vq zXl8Z>fqyTG(Lf+mzzhv~I2aSfzNF>oaUeEV?dZjz_y3JPR1`SavF9mPL2<$JazxC2 z3AdySaEsRRqm>fb&bMf1`TSk2@W`zPGMCU0Rj+LOP{1x!Bu$!ISDHto8g_2N|vx^Kqn7YEAHQkVjtxBZn4UwFGwV z62GB_G#jbWX`n7u>2iZ^=*fjX^uuZ3X%f)eAc?9yX;FYQ$3uolSLKWjxX2U2%* zOrx)fWc!)SfpB~|0VTupY^E#cQE+1Y+;A`{{s^Y#sjE6c?x_IACCXgu?)oX&zsR1$ zTD(g^3`5Po!Bep0y7KLQIxujqCN+O*Y$R_x-|MnVk+*IkruV9ZVKqzt>ETda3DWrHmkJLeERVZu(k>l?`$SYb*!#8mncm4)$I-i8` zwcYYhU8Xp$;3^?Sn9g$P@nDAhK^mK#?os13!2#b-89g7>(4*gsfr zT+sqrMM7D3*?&BP(#o^3^_f_RH@M8O*h`A=8ER&pGm(DTVEYA&)C-Y_ye1P4)p9U zbf8c9hv%>I{AtC$HFvoG)7S5}U+dmcMyA}+X+nDeNF8X2{tK-`H!WV)f2t89B?LzZ z9mm9wP~^nlp^kH;vf>l01ja5^do6Mm$;Ysuhsx%2arYh}nTNvR$y1hS8QO;rKI<+Y@KOz9+%R9!FNMJ{$dAXcFYF;&lAg2P> zV=kOi_>s9P&z1iGJ74J3n17xHGQuG}>x!|O(~H&0~ddmedAb4!Fj0q4FndnG)GLAR%YY^QLz7pFiK)NN9WLL^m(sM@G&dvzo3kBZXbZv1bvu6t)Sj!VA0Ef z9XYj&*5S#ybTbXi-ef;gF~lo0vLK8ck#%;heqF@TD{3*0w&x>*LI7s3LiQxuAH_06u%)4Bd1o&g zDzG-gyR#!jaJUN(u_K*7$9{gZVV0!yZ|_?UR_SSGzoF%TQW4}7o{S6%hLS`BH$6A> zve8U^RPiU8gEbtBtC@ts_xt@PX$}aQXy9g}5Ee5tx$nnzxIqou;o6mEIDD}~tqY9n z^9wyMbEivVy!xM&5MFr0?oqoM%)gyEqXZd(PL%76&6pE}_+9G3LPK_)@1#Ehk{j53nDpDz;Fg6QL zVH4ZWcqjZDb!2f1ciVHicMIn?vQO<8tn^mWry$ug&EL}>qz#9bFArS*djAqJ8x0Sy z`;&WXsFeCmqHf3x?Zs%!Y@-A*-V=X0G31*rvJjW)RNH=`R=C)JSMC20pWLFLWHr-{T;-wwZ z_R0)z>?1FG>jKAxRdu+C@nnSG&t)}D`Sh(*koN(>iv(#Q(_c-tP(-J*#yMWm3FDCAbE1FuUeIZHxn{q(iqJU89d^Bmmh>Zk4KQd|G zhG!Fe0hu4sMKtI6Fcs8)>C!Ry%T}Q0n+3Iie~2Q;rBs6s|NhCrbS;FCxs`e*aQgW~ zKr3d{h<-Zc3`HIZrkb7etXHmjq-X)hK)6YsBTB;CgWw#WA)H$}K?f^f=R9EO@R%;F z4R<^ELLQ0{7~$%i5*bu_?)ZSd{Qp;o)mn&)9gd?=aPYIjwyx>q?bPp+O+xS2>>z6T z#vO`+yWe(9jSkk`k0Zz}LhT7wJqLq7sANVbSaTHNXyJE&n7<*Fk_+?_ctT+K_@?%L z7h-U)Z^wZx)jr8wGg}fLon_78Ku_fx)AJ^vezedl2u+MK%~`Tb#|Mpjn_+?ET&&Rh zCH}KCrW;TI7g87-_3FThe?B2JHy{rO#M1Vco7EI8!Vdg0*sK0cSrU>dxeONh4CWPg zh&>l~ctDSY49WO!^H<4jPYm3T#gMZN^7A09N(T^I zL=wlA;S@&70#p3|`Ea>VQ%sT9qZFwVpfPU)<1$X$PM zVg-%?&zaJ350|c$T0usPN!=&LWf-3>p6qqm2Mx2*Ra19*G!?tMqYiQ* zMwZY(7`YIAnsR44y%*dXO&bwF&fR-l>k%?%N$%f5)ya(dAHj$m4w?Jvyx42*_<#hT z>vZ<=-;Fuj8ASM4kw} zD*wl?5kI=m3w**VJxtr}o%)8gH<#ebHs0M(UE4c6#q6)EG1K3=K6cgO{~;+BTY2jO z0za2ol0e{1o|g95@OaxPkzH_#7qfHmc}vk#2GS|wbfFwlPlxPe#+RQ`vR9ITyRW~o zj^KmHv~N+r88MwXe@cJ6N5i?yG&;kCLGzjU8 zLv%8@p(`eiSY2mk2(>PX3VF?_ZRy&K?!DQoB+#}{TmHAMESg0=xr6gGd^dUu=&WU* z5TUrem{oqHED7GZA4&A7Tf^977C9~=RYheUoH9qlt@KkosChch_ij`=>hNkBlbxWk zRDFq^>T3v;(fCako#^^~Dz8@t^{;a`oK=z7_StQn@vf_}S>YL6{PjzJqpmT3Mi^h; zEI~?UguP!1QRL~qob9fbrDMGGP}e%R9%#$Hr5nqlm|1}82V}}e4!aG%1CDu`N>UVL zlxOMdEpgy^XtIS*g&a{iO6%@3Z{J{?RCu%v!icD^hDM8+Oc*_naZ&UHkS3~s#;{A_ zL#>vkRZf?$OqPc?-|F8K_pv`^)tTia0ljE#hg3(DsUcQ@}h(N|KQJ+xTZ(&B9GVtTDO4k zaA-DH&cD>j_WcS!_0EK;69|;P_?vkT;SveMcm7Kz4kFK{Akcl?X^B!k{|ol$-D*!H z(!zYo|5O{ldvk(lz7itFSa$G+s~(ag3aoHnZIeak@A%`gWpoH}dSv4-y;`_=<;^vt z8WKOk>0|PAOPmfVUOk!*5Ee54lEu7PZ1Q3s3o>GL6Sgr^d%dtdqF@f1+`nHThKm8~-#YT)2cZ?1l~^YTMf0qi)&UxtIyPEtt-MTnzUe9^Q)GgT&o-b}w+ z1tkxI(F-~4HV}ESG-?HUQO4Cn>31fh01HpTbrxmJHuHNCpy3aL$z(C+^?pBuU1x@l z8hS2_$}tPRnaS#8M>uAW{RflA+4*eLg+;Hkpf{Sy+^F_Lv)-NWw}Xp{9av(XR0y$5 zp95E}V3LcHV=Db3`yijxpj^qV-Aw1v8L!BsIV2_VYgqi9+%&c(@O5BL=c@s^^&1l!s!0%{Xu(ZgT! zqxxBYRSBCHAvERL^_(to=PO+VL7AMM1gdL_IZqfu$&xJx7%~Ib!x&74sefRiDX)|k zxWFlz>i4v+=Hu$+U8r+@vtyR^qxl#edPeLdTzz7-%x2EfaJW!ndPa;kcj406$hoGM zF=yefr+}Yw$DZ_5T_=xy-Ovx${YeqqQSlOu6VWFQ1lCzg=JI0i9FE)*q4Vj+I(w`;|tVg!J-u#>O+1MCs1Nv_ECFAD1M9-h>38=ntGPZij2~jV1JsR^2Wm*>; zOF`vZMq0f9``In^f|v#ZvG%}6C96povVXFsKtJEto&IYmd3snK@}I5(w;9~FPZpOa zw&4mQF1yA#`p{oi1^uLCgM%TFb?6F1HN~b5Gb=Q`I1oSH*TNUB%{>}zEDsxeqg*{B z8^XrSnuDW+kfZO=5d=MhT3eQn8)KZ3q^{DsQ?Z-N%GsIY42c5iB$`(1mXDJ;l$0%nF~9 zL6$g}9`;=dIedv_6}@>ai4|Ic+Ye`htnY1vTN^)`yumKaoWer(1Ky)A;q;ukgofhr z8MRGE#UJSu#aqTh*t7OTB9n`tPCtJ=TuwN>96UgDVYu@QQ^vC9x(}h}!|aMK=i-*~ z&F5>jUaS;+$=w_?nIVM~iT@vXZ_uP`t3k{xxEYlL=Vn6+&Ock}O04bYgU5-Edmr&r zh6X@jC4xSbPX6r#1Dqv611w#(zX@Lq*Z3{3SHh_z$=upEs)^raCYEGV${ls_1~f&1Q@Z5dcV=Z z*PH6%+q6fYe_Q{tg(W81SS1*76m~G^p6Po_N;6yOjZ$IZkCVYc`FoF~&_y4y z*}W>bQCgQanlzfh){y33V;+n|+;<$j6K!YGx6Z$4P1CF&TU5dbk-lUkrlMgZiN>jm zgnORRqY3qye9`wE9t_UjtBWsN{lIN)O8oxKS!A57k7gi2a>y}#wH|FW87JpCE zEcOs_JZRXTM#lNdrjaQ!k-X@0)CNw@tapqd#g8q&yrzJhZuVW5R^!JO?pJtlOIDx` ze*26wvgWL%+-v(xo`qWA$5hUcaigo= zhQ-YgRVT&s8&obO6`voXyk5;Jl!CraZ9pr2;H6wbFdoJ`@?MY1jQz6-f(Kn#oizLmspmZa zKcRTzhFZd&jtsM4jv@89%&orb0?+}=|>aJe74bZ^=Q2n}hC=jI>xXkPEgPSZ;c zM)-mVw2ya{_3(}hiN%2fHfHH$9J}m$L0y`8AP1v#(nlDjvrq>g>VCH|L=Q=ZceIo! z7ZgTDo}LOLq_FZWA{GY^bjPyC)n+v}f7fGW&ID^N;G#X5y&t6w(Q8FJr#V{iHxq)Dl=p z!ShGQyxh_YE6REq!iGwP53VfjHrS!SVY4_##52w}A zrLdd91kt;h4sgytOI}bH{UhjS^J)CH-bO~3_Q*dnEH`9 zPGh#q(dHzji(Ka9Y>Dw*jy0zsf>o7U3ZbcoasXXe(K*2g_XZ!Q4}B&i#1C6UO){nA z&c1pxsUO1yN7y)MM#*jo10si7SibVqFN2>hnrsD7Xq$Zh&|8qgtZ;I%C)T5i^=VzT3%l7L##!0_}x4Dc*UnOY~5DGOlD{UJ8yxgDtHKTiSB#1R1v} zse)N$heHu9wqE|vN9S94KFdG>)?H!#fCBkgK5X0@a%mv;$8dB3ZrBorU>Q+v7PJKwJ=)cxEgusu5cgDWC5iHOJEd=xm_Api)f^(HZPItg&Cr>#5n5SF z&{jNwleRh-*{-V#{m$LMUowBWRy1GS+rB;{$$7cA-D_+DdB2qaQYmsQy9>-dU(7zSMDPOI% zJlu87vp$C)o@hmWoi&8?glJ^aA+w0yRY>f*qKJO0oRevm0&T%6d8 z__S6+W0`S>5Gjc~J|b-V_8yz!>g2;eo5C696Jj3aSjNIA&~S-AsE*Z6UzlCvnBY4H zeic>jHqO&xM5@nLya7Mr(A;9%a+K!mY^O~^YTo+4dxhJ0*xGlM#F~od&o5DzJ3UW( z^04-V^2uM9KPqQ(`41ac+uci%5es5RR_M}fHVnb&^w=&Wj=LMk*!njQx)z<37 z2;nZ*X`dp#%~|HldcWw0{N=Jw>G(q%hAeo@`vlQVFbO2xbZA=m;xui%V+-5l;E-Z$ zck$LID(J^ZCP)^Y$7-k13%YOn3G2%@wm~OE@$AAj@!~^*5AQ1y0}UAao$`ZaPmIhV=}H6tDgPk+Hdl4KGq^-XPlP?BhEuI54MnL^WH-LvQni#N82*-p#L>9A}j48 znf7!+%8pk?GnT)e+A;uxe%YYTW~UeoqMVQ_oYuJxkWi>2{D64zzUGhox1lAEMuq)c z?-^^kd1pRd$BltVUC;Q!Zr2eblBo3&`qWm@LoTzpau&|(r2toJ{&hgi+LlG)M6!f6 ztB>+9;iz0az)^V8=R={-^tC^rt+?_aAlu%l01|}{BJzq(`@B=2w(5OT&8k?7qi?T{ zg2H(f(+qt%E1Dp8r8#DBflXr2@|;(&4`EoG$iq6uFW@n&QQnA!?31$h4GJGq&wX3= zu0c|iSR57#Xhyr?=Bvp6d0wF19^LT??}~bjHo-&>tJfpZdP=-kOI&{ZFz|q(DFDCW z@dCd4eDh5Vb!5{nZo`w0nY=Toi^{n~=!tP}n?D6QxDy>;opz$B*pH|FAj|ZVXe&OV z6vBsGygoYQB7A=zBH)iDWz!4bg+4w~J`PH;ON{6^Zvoz`V@of8(q8l#EBhUm+jMyf z8jE~MK3e(p_+%Zy7<76LTM=&LwNqc}nQB_JyIEwudj^Zj$vw{$7=PGxth|F3)IV5#WA!u9X`P+k|JB?Uf)7a)^`Zv}85W zD*X0AI%z|9zTC44f+bsN5FzEM+PmW;pO@UwIt6vG+L^KS{|YdW*TUbWGe49-Ox6H= zn4aiQ-9^ZL$N0}D7pO&Xb$8VVKq1g7>VGGq<*=%4C57+8k(%=TzyO1h={*1#Nl%!a z$;+}Q$607S{^eqfs`_g(s-VFAF!#nbU4*{(fyWIR6~NoJ?|)|LKk-x+r?}$D@pvzJ z9sJ2|gTu)v&qEjA%<__(2JBn7pwMd`20+rr$w=#z&5t#a6ApFOIO>5*!+NuATVoVg zbia)Jc6Wz$pzGa9Mq(0--ArNoEE^ z+0J{tcTLYenxn6*9gQIR@WbQbmHN!K&1ePF5yK{Y|qzX1noZ-wjZuDM|V)V_D@uX%ER})zzwVJgcdHAA-?|D{J;$ zLfr4{7^CzPr!!M$Hmw(73(@YfW5;ogs!EG2RVhujUfy501WV($OsA4VV!9v&l-_SW z*w-jsgrt1gh#@_xB`C{Hy+TF=f)VMjGs6&-#`F&nyx8CevD$WisPm3H@QUfUPZWNv z;m%+-C(TWy&`P6O9I@#_i36;bmVgOL|3Tx>FZ@#x?0{FrAd>V(G8pA@2^r1)Lg1?_ zR64Y`=8pWxp`wSPMNKWX&dUMZ9Fbdy?rXo0Ka7--ne|tq+w-?nYb+uT3dMwQdeysj zSQjDgIbUX=6#34)8=n*qB8(3!4QwIVdJC8IP`I_>BVOHIl#D9}u?4`)o^3?R<~wBE z!!>-!-pvln3!0W`vIK{)~vKG%BPLnA_omrQcin{{{k1YvafJG7cR4)Ls}*`K;wlOyfT;GVuaxqf z8y}%Mi-pis*9B)HyV0Vb=pF75iBZm#BuecYECHs{k2gm^($OMNq4 zhI+q6y!c5g5=fwAf$aIK3bprZR3d}k2MUQJPfz5Xx)(R2E!FIpo1Yy&={%vWGLd*W zs}aKVpR^HiTy3_X-7ow7pC-o6y%ledS2%-=wXxb9enVZ2l>$F;@CVp%C?-qyqB%Bp ze(xK?o3l#JyfN#GOvVMPZ_a{pZn%Jpamsi21vzLx%J~lv5|td{jI*xet=bmE_$)5i zc}@rKD4qkNRbFOWwV!0xa>05~*1mFuA%a3F)dr+^;j0>?_=J7bnx93m)0e<*Fkpfd z{9_Sx$JU;hA7G3R-LXFO3>3LNdJ)@C3DTV?mvJzcKxrEl!ahrOQB};vj|U8ny>hq} zDE4J)Ep%jTn+`;W(%VZ?b+jy17zM%5BF9p8lWE%!f`6-$ZHeIRO8DK?-({yq&!vwU zh-wys^vlp9>7usV>)URykqKfrlmzsog>A$u5NWg_5w57gy)w7X66AKjnnED6T&kC= z=+d@IE~N94Ulph0B&&*KoacSVTe`HpI7E2jO+3+|aZ&$;YeSPgL7N!(>5ko`uHC*p zgV7Ms&BCxC26rkperuHm^nBlOxh_o>Hz<63wDWb_bOeFBaBY_L*3-7mCC;A5#);x$ zZq?t?&cg(}f9lvX8C;D23mtRN=Fr(BoZYw@MaUR{cq+d#bsK_oBl8vBaBl;(=-*+8 zU2baXn2NWU`pns)yd zPkX7-99>%OsEPb%%36U!pmRS5$*zvhi65LaKtO-w5mP3?BBGTU|7R~Fmh+R^!R;^v zRD<Zl<4VbT`i9?xA(7a;Z<0);fo+j}vVTr3qDh><^NC6u~6x~`W4bViL>yEb+~ z$pCbKT_H%A8eWoEyl&^4*JPG=|dlHy!hm~-Ti?DHe8i%_)yq*zQYmTE}* zy1K4a`mpExVgar*uuz^H@P$MUI4C%Dp>%(WiIwH@bE5pShqY}-b>7#x#oZ(;w1Do| z#Rb0A4tYZ-w;$be>4wJdq9ay_b3*+=RY$FZEb(H0#Qh6Mxp!?NkeG|k|J}yw@z+E= zztmkIBT=8L{pb|*i;8%Mz{`IG5lx5VyG~CB5#N3sYXVzjEtkFj0!B4Etgw8y4IanQt_~Ya2-eopcs`IsEu4AAHlsJ+RlsMin zoA@3{`L_D%dOB?gAhjv;!1n&BQ*K%O z9>9>Mw2?pPP?IPUwC~}qhv;=+bCu9D8woQ!le2y%^rQ5;+e(vtq@U3U(6DA<#f8PCbg-y#VuR2mYbGjfp^3@8%$srC>UO6ND{!-59!f{AJOg6ehHkigs|!2 zZ+RHzM}-7SyyuZIw{I`51lVBT@3aiYBjP3~uXyq<+M3ruM|-S| zDWhYRH-v#4Qy3KH5%^={dqkhTo_q@6r9u|h*4dzpf}qP;_a+3hRHx07_v}RK4>1~@ zbuNkls*oq(B?u_jq7HW8*ix1prT((?`2onB#jUfFRpX#Q%sKh zx1vqwLri}34kcHyOWU&dh>rLyo2iYW05%{0(Izz1t4J+^e E2Z61$Bme*a diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon114@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon114@2x.png deleted file mode 100644 index 742f9b5c11d00cb69a120705cb685d4c1bf3061d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6523 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon152@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon152@2x.png deleted file mode 100644 index 20b3bdf67b71712d2a15f8b7b3217d7a989a27ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8981 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon180@3x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon180@3x.png deleted file mode 100644 index 11b972dd5169caa526144e60e20eb0c19e884b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10742 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon20@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon20@1x.png deleted file mode 100644 index 21320f1f5b4708a435c05a2898c611f17fc7c382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmV;s0!00ZP)`+z9QnL(PJ>YV7w~G;YKU?7W*DQI}5-6B;#SN8hYCz z#9hG>Wgr>j;i;W8h7EDoaQApEgULD^1NDy3v(KTk*~Y>{)!(+NVt|3J2D)1#0Hl`w z@nn3FWQ$Ah@H}sRWf6pq7MH=!dTt#F)3d*ZhOpn=@JybbkwtW+!-KI9-K`O>zxz$w zvuPYlxP7dS(Nvz-KbFvC7Q<6nKF#I1*&ZRhLuh|7&y5d%Nj8T#9J4@mr9)rGqAEqt zD`}!7Io1ll`Yc6HDR}<3!9QzMJ;qWQhJL2$@7Tq+YY7UTa_7qeM;jc@CtOq&R5{b^ zaI(qa(byuHqB3zMPXFmBBQtqMQw2~(oClMN2(}R}?5(9KV)N>InuVP5@?s5;lWWGK>|l hiuM((n^)GI{sU9)Hp}~EP455z002ovPDHLkV1o71IZglo diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x-1.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x-1.png deleted file mode 100644 index 3dc918c35a3e2d8050fbc2d12cb76fd578154db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 zcmV+$1?2jPP)`kVoeM!m5NFQ14U>0pqLQ=IhFs-)70mW)nd`TzP37?)?B&5X{GZ&9^u=OZJCSllm z0WC-+4Vy(5sX$c`5zKdKC=C*3J%-ZW!;updgl;8_OXH?~)w4 zbi_!R2M3{R(d#2m+H>d{cH^KOhb%#d38WNaEre((Cp3ZMM4 zz`u)n$0;RUpZ%tZ>SC*tC(v{%)s_`mhF|ETuhS#_H&az!K0VFI&AJH~1kaNQ?sRnu za5(Jk@Ol676%6%v(GdvWPnJ3OV~P1X93SeXuhV0^ROish9OKh<2J!(1wl3qL-VDbE z^E`IEhzJ~dw41@TSt<=UbG6F5=ga(4(I};)^V10h$oL-TURlGomAQl$f6mr9Ix){X z+w=Tds4oGz*Wbyu zl{v1@H`sOb8auzd#_uyV`g;Q2-kt~G&`-0JYt1M?6s6WsJ{Xw;;EgR^Y%KUp-fFPx z>ms|qDe?DwlP!1q46VyVLFbvMgZm2^0M1-l;OD7D#)=h&FE4--`j@6_PK3sWFBWSF z&rV&bFj}l}p;+U)zbXK1%KIiu05433iD`53*>#<4UY=z`Pr&mVx)RC;@a`W`>Lx{e3?lAKP?)j4+Q76-N$7%NtJ z;@EW-n_-{}fhU~ayON!&vV1W%&y#C%+?P*2V!Tx6so`lVO+^s=VDQcN0Gdr0zI=0f`oh-Be)OF5XU1a~}Zr1l?7+T-Sjrj%&JhCdsk*8O%V^x;vN|V>lmiTI- z%s?TazdK;Dp`5x>;q`Mf%vLpwJ|y?inA#+Yy1(y1;CWOXj~?jFadO{kmUkp06JV~| zWZ#LKoS&)@P6t_EXeu;_Cyj7|knG`64GTcKBH6 z;gMOU%FPxX(Fh|c!`TlnBr8%|!;T!zJ8fp4b~<9iv21Iv+fCxu7T04t2jPqzw&S!L zad32~-E+H?7v>tNE)sW>xWh#2xVdV(QMA^YQt2+0sJ*RYhxMhUf2KzeI~@=r)jDao zJvdN{i#V+<*`#Aw5>Vp6-a^OiCkjN#k(|=+%^u<9J+KU8qU4#IRs~nylqM)OX=LM=k++ RLHGaw002ovPDHLkV1l7vZV3PY diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x.png deleted file mode 100644 index 3dc918c35a3e2d8050fbc2d12cb76fd578154db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 zcmV+$1?2jPP)`kVoeM!m5NFQ14U>0pqLQ=IhFs-)70mW)nd`TzP37?)?B&5X{GZ&9^u=OZJCSllm z0WC-+4Vy(5sX$c`5zKdKC=C*3J%-ZW!;updgl;8_OXH?~)w4 zbi_!R2M3{R(d#2m+H>d{cH^KOhb%#d38WNaEre((Cp3ZMM4 zz`u)n$0;RUpZ%tZ>SC*tC(v{%)s_`mhF|ETuhS#_H&az!K0VFI&AJH~1kaNQ?sRnu za5(Jk@Ol676%6%v(GdvWPnJ3OV~P1X93SeXuhV0^ROish9OKh<2J!(1wl3qL-VDbE z^E`IEhzJ~dw41@TSt<=UbG6F5=ga(4(I};)^V10h$oL-TURlGomAQl$f6mr9Ix){X z+w=Tds4oGz*Wbyu zl{v1@H`sOb8auzd#_uyV`g;Q2-kt~G&`-0JYt1M?6s6WsJ{Xw;;EgR^Y%KUp-fFPx z>ms|qDe?DwlP!1q46VyVLFbvMgZm2^0M1-l;OD7D#)=h&FE4--`j@6_PK3sWFBWSF z&rV&bFj}l}p;+U)zbXK1%KIiu05433iD`53*>#<4UY=z`Pr&mVx)RC;@a`W`>Lx{e3?lAKP?)j4+Q76-N$7%NtJ z;@EW-n_-{}fhU~ayON!&vV1W%&y#C%+?P*2V!Tx6so`lVO+^s=VDQcN0Gdr0zI=0f`oh-Be)OF5XU1a~}Zr1l?7+T-Sjrj%&JhCdsk*8O%V^x;vN|V>lmiTI- z%s?TazdK;Dp`5x>;q`Mf%vLpwJ|y?inA#+Yy1(y1;CWOXj~?jFadO{kmUkp06JV~| zWZ#LKoS&)@P6t_EXeu;_Cyj7|knG`64GTcKBH6 z;gMOU%FPxX(Fh|c!`TlnBr8%|!;T!zJ8fp4b~<9iv21Iv+fCxu7T04t2jPqzw&S!L zad32~-E+H?7v>tNE)sW>xWh#2xVdV(QMA^YQt2+0sJ*RYhxMhUf2KzeI~@=r)jDao zJvdN{i#V+<*`#Aw5>Vp6-a^OiCkjN#k(|=+%^u<9J+KU8qU4#IRs~nylqM)OX=LM=k++ RLHGaw002ovPDHLkV1l7vZV3PY diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x-1.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x-1.png deleted file mode 100644 index db726b23927d3fc06a39aab27e21134d8b007a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x.png deleted file mode 100644 index db726b23927d3fc06a39aab27e21134d8b007a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@2x.png deleted file mode 100644 index db726b23927d3fc06a39aab27e21134d8b007a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon50@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon50@1x.png deleted file mode 100644 index 3424f05526a8e065c1046244d94694bab704b3b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2458 zcmV;L31#+)P)<9{0WcvCrABv(LR} zB(dkmAulVC{5s7|T+gN}1?Wld}`!RYoKeZh>n4~7EDqJXglLI$kJ&`|juwuH!f!}U0GEo4|6x3L!^}e{yWOuRB^V_bIT~blgl)vygR1!&8)u zV47eYTkgy6qkstpq7kceZqG_RgtccUXiP@h2IfO)&ka~5z$wUIK$isb2sr-#c+{oHZJ zJp110PDI{F@7V-EO!^+ZII4mHh_L{ewbvxD>*HB$>PR8xK)Y%L9Dl!r zhfmMo$WTcHMb{4ijI$v017Hk#&>2+US>};Z(4}^J{k=K0PN^Y z;hEcWNV$?>S#SJLYsx{=k*4ak=NLkApAo~hl})&J%{<)FmIMPZT_(J8v4A~2lQ=b8 z^cZH?y>=eHusp3f+H)?O7&>z?+|`-Ft?fx6vwm>``!_UW=PQ%K{+d=7 zyVhiI+tLKGaRvg=J6geS&J^+2^F`DYe|ZUTFf4uG9C6m%XqYR0?a!KdTe7W?!KuR0B}vl)gt!vz_j+Tw6$jtz!>4FbF%`7!=Qn9_Iv^N z9GygsCq2G?V+sd0H2ZF2+wvsd9G&(ui0cmwjjLN^n#@)RkDs29qX7Z?UY|hN)i+jd zFs^W0L_q&oIaJRhr)N;D2_<-9pn%H-v4B+zTu;5!Zy6dDKj4oC>YSqp7#D@KXKl{% zG}pq_h{u3BnyBJTb=0$|4UGiCz?G8NkclyTQxrXSWar0np$@EC5EqKgcWQHJ^rLFK z?pd9YH9>^!D^h4p$X-{-dO>dXi|pB*d)#ub*_*H7jn|FP~ieCy`$$otoK|8WW3*QT+3rF`Dpdw3L2^iO-LMBmcR zk2iLt@VC#k3X>;4DB;o5Q+R6g!iF}VIbXncj^uq+VytrXahk_x*WnSoI5-`ui~v0N zuQ5D%CXf9+<66G&?`px9Z*1}eMX8JX?v5n>ut_ow0Q=s|+A=Oaxg?GDtP92%hG(jH^@AcVOjYadjq;0_eA!Zhp4ju2HZ+Dh9tuVp zHd!@?Mro#gAk0EG2TmIp$99%#Jx@~FGcONyr17T%wcetgQc4wi?wfn%HhnblZOP|I zK$+eI!d`=gC#0;YbC&OhZCnvHqaUQ(4if?8>^I8!s_v8uCdjG^#>Q&kl+p?&>e;gx z8r7)R2ctVmintAojaA)olT`u6U{$qm1LK6BugXYA1rw|{gn+5fYQS;Jk*f*Dku)pD zL}W~3zKoed;jBiF7!WN^H)a;shu5BU$5mUrYZ=PS zLKbUk?wj=x027_nM!6rBq9pY5wZPEG9XBIvv}ccUNtR;F!m1)@Wt9Sf2m_-AMGwS( Y0WgWycN}Ttv;Y7A07*qoM6N<$g4av5bN~PV diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon57@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon57@1x.png deleted file mode 100644 index 6bc2dfd64bfa1fa9a3b1372cf41a9b351651a9f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 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 X-|2njv+t6W00000NkvXXu0mjfQ@=6J diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x.png deleted file mode 100644 index f1180065d65ad7f32288e11a3179dbabf20d81a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2769 zcmV;?3NH1DP) zK~!jg)mm+ERYw_q_S~=Bo0}UF!lyKZR9ae#QV@%@s8FU;f(1L&I-}ER#~FVx9Xe&y zT9qGFsC6uY&^op4SbylyQO7ZAETYijk0PbTLV(g~$`D9vh9u;Jo8*RjbI5ZVg176^dz0TQmg3KFh`8^TY5he6&oRmR}95im%>3&SAqn%j~qRB*xt zL?Egc>pEAQ1TaL~h!_E}AsDh)=ffhwKysrY%Iig215rOXL=4i~hKltuNaUp2s$wPI zZs?lD%0zwl6~vMWLl6)FLoZgv@E9p#6M<&%A4`1P zI->lp;Lx{~iOS<6Tx=i=C!K43jIi`$i9Mqu>f7tY%0zwl6~vMmBXX`KlUOJi&b0-_ zSVuG<)<{&v@EuMl{b-1qFrua(E08+ig`w<35?g`jHK!j9(J+iC>BsVMWTJjMxpz%s z|JTzG4_zJ6pjcOchNuZcM>G(IA!4U0{RrDMiZ0ebl-Ex>{Y*u!6+@Z09t(;w8ODc6 zEWayaC{8AmepI5@nttL0fPnz=w&!jQk$>Vq1Tf~@A?H4~CFVAjF$fHdfS5(Nt1*qW z^HNwkGl7|D3l@OBF~X_-5?=kVh_=omiZ*dPFpsE%;eI$`nRgDM*pheZ;no8nMvg53 zEVK6<1&<*7Yw37JJnpD?i~)RQVFueiokL?y3}L0GU}N{mQM`C|6gCGR?JG^m6mB}sIs_k-He<|GNj{dLg^>& zjX&R*NwM9Si{a5*r{Rmu8O*JALU7=!jlW+gVDHI1+WU&mxOFl1uByXlXQu)pj$JCE zt#b?=L*pO<8f)UXyD^2;^HO3EV&SwnezhitFYO;h*&|O3jWrgwEY4tKQ_}4SptoS- zm98S5IeitK`7%T;1OgN043^&0;S62nI1>zb;HDb<>RmvheWY z40ha>jm%@m@(h}4ydIIoO4~HAa?7V`k%{|Hk^ubj^cAf7-G8wBF?obk|nPATJm(bQZCShz_mX&yv3E0y z7VyX|RsMu3OtNt|wY%#CXEJJOu9h7B`kg!;Io!wd_LIc1!xWnV`@NGZS}1A$-@(3O{a_RBX2 z6M{Qo-G4(h%=0m@AeRt2MiC4B&SgO^e5rWf^tEulS&0^~(Gnki+ zp)ni7cb8UU%i@e=bD*mz3`IZgSZdc$qxer&%#ChCYAIH`uHMpm#3Tbx{F;XHN=(>vC zCx&r)pv>FrwrQ?VZlM(m0G0*J&LohqfbNkpN+g>2OtYyN4%|BjOJ)RjFj30I{5bAv z?M3%!St9CPCu0n=GBJ$XKyRUpvUYFmsu1P@mfU%Um}ci9Pa5GndsS>rGKPIEv#{p6 ziS0>G_7!pe{yub%lmkSK2LWzHC9&?gt~~8as~{nv2No7W>JTyV#WFUucH_~*edrnW zL&{XH6m4ujHiR{Qxa5j-P^a>wktKJY;dgXT*11yBfoiKg#&B#?afVGFug2QO43^DG zVRm&43=BPmGEVgsaj0tyzwa19-W?03^rNc}9Iu3=FqVA!H0d^~(ZmLwm@u>g0vLjT zNsHBEXt!wygp8)%Yo=L+=rE-GNhS>5TJjx+L6GruDGUHC?O_;{mpO)9>k&0!=w4EV z9lr5;e)y)x(26o(cn$*Fw7`jjPOJu4he5syh`n1;EW$BNV#D73=(lM`v1Xzs44Ejr z5b&r?LaZx*+g8RPXtrtM;|_|IiB2T_sMCI6%z448MAcNi=n8DpjBly;;=BkDIZh>d{ZHz)lz&2J+*5d;K6 z#w1oHN_tzBD1~EaJH~+FHJ7$&q&Shq3eL6TLlB@4o$~Y}i49`tY=bX?6(=UKKuE5w zgmJCu$HgE6hE8nYZCWI;|A*BrNk=@?b4l79XR X-|2njv+t6W00000NkvXXu0mjfQ@=6J diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon60@3x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon60@3x.png deleted file mode 100644 index 5e976420cae27ac3529ed5a374921780aa04cc97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3008 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 Z{{@#|Pm%F9<-Gs^002ovPDHLkV1oTP@6-SQ diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon76@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon76@1x.png deleted file mode 100644 index 644b00d94947c53600d1e7cdd321bfde89d6d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4054 zcmV;{4=M18P)^VksbB#@8F$z<^QwvOnBr7$9d2x!+Ju8Bhj;c1f~^L1!}P zyao)#6hl&Pkke3(sb)jzX7rL_G6sW;G9m0kQT*wCxJ?Lm8mEg zp@EZ4<}bWs5rODKnxxz0Ji^h@ZgA6PjG}bPH!1yhpB^eJ%Ui62%db|LBptY(kQr7Rd$$u9^sDl zAdLklK;ik3CiOcWAy1)u1Qn$umPVRnVF_i2NyGz5qij=L6kN%q5xJ8nJA`f{OPZoP zY}sLIY%*a)@d|Ci@T7(J2uHSL(k#g!(iq)g$_{A_lY=h=X=FkVa3TntwN`q7)AiEO zFO4)AydP;wzruwnpD&*@4jctT;FeQ%Fk!@!M!4WHK-hsVPbrjPDrv=IQyoY%ogPME zNISJI#WQ>X(2!3l*&9h@V=fb-UC0q_VTf71NJXgJFb)3v)q(h#Cn zW5Eef@VW;KPuZbI$8eM#PDloYk&up6Fl1CH(uj$QToAaEEjysu$dab$wn;N(2{&Wu zq`CGnYXUiSGNgs~2uHRY(ij^x(iq)B2>MK)>es^v@@E**1gIQG+K4GT5BF(U-;`O>+g6I`w+s(r2KoT&7 zyzS<4AuK(z-l#jhY=jF&Bh6(}vRCM&IXvp%9K8T0*O|C+W;HIIP>ETM6)=@8Q2_W? zUmlw}Gx)=v6yEL1NqQlH_am(c-j6gm7elpKz@be5M%C&zLHAzujaWF~OWEMHdf3fT zU_wn4tLE2X*^~rJl2_YyID;R)Ie_=Ob95f(%WvaY>DO#F6bOd$Wx%Lfy-)b>{JKB1 z-ECz;Lo>itD(k&rW;IqVs7Fmj2~0^XR{$P*KZ$$aO(O3sH99!SD8-}z(ufGvE0q=U zqOC8i08YB>Fd(qoywz#@CpbR1-ne zG;l0cz^DBMqzkHv^di!CFp58-bioGXOb1xYo3%im(_DeuKhuEACnZo9GiBX4Fp$Gj zdy-hQvmd=f1vm3rs;{1wz;}JfIy9Ka`u%Ba?i|9AQ~}unFg9Ug-q;wHO^IWAeUz2^ z!o*74J+~UG-brdnrmDigEoUci-Sjx7)#rLp6fwH^vfmd&8WD`F%b z-YaxAK?Gx_fqNG<;hVGT0vG7+bOGOa{W#X|PdVzEt0H)BMT(Nhxf?r==bUT**_Id{T~ddZDt)}%1c2w-hH%IB zL2G`B9iZHpt{}hm#3Ke?{L(mldrmM}0MHmW@zm1MxOrBMqi*H-^(M`Ou^MBv1#5f3hEMC*h&8sjEzIJ;UKlgbHPyWu$AJ(huAl93nf zj$|I!Z0N?}!Gfl5;kXzs98-aFnj&~~NgblWT#W`R4qA{li{3WA?)|V)U74! z_|l10STUofw3)4D8o-*18*$xPHHa~;`STrpc<1O)aAu|-IF!ue_N^z_Ij=u6fz^xZ zq|8}bTY7p7S5A)kW>6#X&?oL0rKWoID-&?hxVWacCtbkL-s-_yM}|;UVd9$U)wtp8 zTD95%0Avb6BdjY`z^o@bk#fS&P?ilnJE`m1#w(j~{^$y#w;hwp)VtF zZgUiO&8=eB!?wOW=B@4Ztkr1hkuv6KwNcDt$m$%(VbSv)IFige#=m|rg;&~Bcw*@o zZ9L~)Fa3KEsjQGlVeUbddt3Kzr+ECQwv`&w6D@Ngr zdYV0_)kQG7F@g`f^AIv=7B{ByoWOCxg)IrzWA55=9ES(;mXsStFSaG|!oDPLvC_77 z4nbX5Y2gge5S3=LKDKsdLd~_gGlSoKl+vDd^rQvu*xt{|%pYrA2&TX_-6e~X)>1>6 zw?}OFGzl4*yq*5ir-PwDbSCre3RT7?3j}azP|ucJ`}+aw;z*g!R=Bk@i)2=4G9sE%fcFE*KL&CWDyzD}lBSD`Xxj&YjQG@5cI6kytYCAfZ$78$tvGT$Ot?%wPy79

w?ba>*cye!Ad)i@tSg$+jYXktS z+c$u9Z3AUZECAg4S{EMsun##V8~kWq17^xsSh|vK230f)U{u`1BNvZi=luPiL40pZ zFLEIhg4(tm%HWxODaoGV4>tg%Z8k5`ZrX4dJC5+{nP2327!EIZ5LuYKeebSr5jT`%{CB&ng zfwIlUkv5Pm;PcNPz;k=}B2R6}Yyr2taug5j=yCM?^vxc&-kDSz#cNl$;QATWAP-KN zWN_KUI5u5978i|+X?g^JmD^4@BtNld5MTdCH+qM{x!TL^L%3{RH@b)Nf#r-*`M_@L zl)Gl=Ye@0O;t5r_b6z8sOh}+Yxew{f6!7%N{kZ?_UUVjv4GIJJ#;jVbY1P*qyM5A= z#oD$(Y&w`mXEKLu9vEL6#YJN)apklGE*x9wDf_Dr25|Sb6SAoQ3^c_}+&;GkUpuo3 zO>tUT<^{0*a0U;*pTsK%GTM5nZHCy~xP+-Bd2b}t$4$&>j$?dv6q$lRdw&)mbY-2j zsyLi(EWiMM+1iYoX4QEDFQ;wl7{cnD_-tGe@2x2v_n2w z3TY<$?i8uj_+%j8F1UlGy9VVL5XcLG+g|I!kGFMWh%3-SHUZ$VT?4r4ugB1zDL6Kh z+1?uv-M`B@WiVmn9{G71=?L(&;@O!^F+8}q35!d7n!CF@i#xaW zU`t0@vypwSrr6ASnq?#R{7Y6~7@&j|PwE5RFAvfj{iTrx12}I?CB8Mg4xgKtz-cvn z!P%WIU~@+rkMAD9s|QmM_P=vk|-RL!s@*d4Q9q3rU*N?*YypHKjg=$#qeT zsfr+C80bpp(cYiK-rg(b&wHY^}}@YgBBm9`r+}WjHPb>i469i$a;ViAi#$4g&6g1A8)BNplzRLMr}Fom>$3~K8MN1AH0Y=)YBMX+A_AseY>UNekG zgfBZJFsfb!3`<%VaE^oOq!GQ0&4k)ANpqfuX@41^)gycu5tV9)mP{H4j?wFg@zLRY zdXgsf3s5(_cGxNaH;MHaL1FG-<&Z)Jv~!qjT0HjHnq5X)JaZg>XL{ zNmD2T-3e823~8R=yu(P>OZ!K9*5t5b>Qg)a^87K?- zlg5LC4UV1(CXEG0J#QqG9j09Nt6}6zniERggkebY4x{0#)ugj3X_C#Jq(Lt`oPWch z1VAupj;%f(5fDb@mmPc=MzT6wh>cy zFnS#^{z5yS3Kyn2&@n%NG(qHOSW(dc(j?s{Q+9ZHgsYd2j#A4GQ!oRaX}An3_j`a- zd@X=94jiMG1xLduR0d_Dqm;741pLG3|GVsv2-h6OwOJKwC5&!@I diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x-1.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x-1.png deleted file mode 100644 index 7b73dead05231ba6c2ac9a3749f13fe719d8e7c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4339 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon80@2x.png deleted file mode 100644 index 7b73dead05231ba6c2ac9a3749f13fe719d8e7c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4339 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 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon87@3x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon87@3x.png deleted file mode 100644 index 65d972a7b9489ed91dc9bef879b922eb29586bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4544 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 + + + + + + + + diff --git a/Brand/Custom.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg b/Brand/Custom.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg new file mode 100644 index 0000000000..af13dc0786 --- /dev/null +++ b/Brand/Custom.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Brand/Custom.xcassets/logo.imageset/Contents.json b/Brand/Custom.xcassets/logo.imageset/Contents.json index ad42a58df2..6ea4b04156 100644 --- a/Brand/Custom.xcassets/logo.imageset/Contents.json +++ b/Brand/Custom.xcassets/logo.imageset/Contents.json @@ -8,5 +8,9 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "compression-type" : "lossless", + "preserves-vector-representation" : true } } diff --git a/Brand/Custom.xcassets/logo.imageset/logo.svg b/Brand/Custom.xcassets/logo.imageset/logo.svg index 076f295e4d..e6f53a02d3 100644 --- a/Brand/Custom.xcassets/logo.imageset/logo.svg +++ b/Brand/Custom.xcassets/logo.imageset/logo.svg @@ -1 +1,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Brand/Database.swift b/Brand/Database.swift index 697bce9187..6262da0725 100644 --- a/Brand/Database.swift +++ b/Brand/Database.swift @@ -27,4 +27,4 @@ import Foundation // let databaseName = "nextcloud.realm" let tableAccountBackup = "tableAccountBackup.json" -let databaseSchemaVersion: UInt64 = 379 +let databaseSchemaVersion: UInt64 = 380 diff --git a/Brand/File_Provider_Extension.entitlements b/Brand/File_Provider_Extension.entitlements index 4ecc3f0d13..2078b93e0e 100755 --- a/Brand/File_Provider_Extension.entitlements +++ b/Brand/File_Provider_Extension.entitlements @@ -4,11 +4,11 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/File_Provider_Extension.plist b/Brand/File_Provider_Extension.plist index da5bbb7398..c3068c30cc 100755 --- a/Brand/File_Provider_Extension.plist +++ b/Brand/File_Provider_Extension.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Nextcloud + HiDrive Next CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -28,7 +28,7 @@ NSExtension NSExtensionFileProviderDocumentGroup - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage NSExtensionFileProviderSupportsEnumeration NSExtensionFileProviderSupportsPickingFolders diff --git a/Brand/File_Provider_Extension_UI.entitlements b/Brand/File_Provider_Extension_UI.entitlements index 4ecc3f0d13..2078b93e0e 100644 --- a/Brand/File_Provider_Extension_UI.entitlements +++ b/Brand/File_Provider_Extension_UI.entitlements @@ -4,11 +4,11 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/File_Provider_Extension_UI.plist b/Brand/File_Provider_Extension_UI.plist index 5e27de9fde..cdaaf4dd7a 100644 --- a/Brand/File_Provider_Extension_UI.plist +++ b/Brand/File_Provider_Extension_UI.plist @@ -2,8 +2,24 @@ + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Nextcloud + HiDrive Next + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) NSExtension NSExtensionFileProviderActions @@ -22,23 +38,7 @@ NSExtensionPointIdentifier com.apple.fileprovider-actionsui - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleName - $(PRODUCT_NAME) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) NSHumanReadableCopyright - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) diff --git a/Brand/LaunchScreen.storyboard b/Brand/LaunchScreen.storyboard index 26840f6195..2025cf8651 100755 --- a/Brand/LaunchScreen.storyboard +++ b/Brand/LaunchScreen.storyboard @@ -1,10 +1,9 @@ - - + + - - + @@ -12,22 +11,46 @@ + + + + - + + + + - + + + + - - + - - - - + + + + + + + + + + + + + + + + + + + @@ -36,6 +59,7 @@ - + + diff --git a/Brand/NCBrand.swift b/Brand/NCBrand.swift index 0a3ba484a3..b5f5a32d6d 100755 --- a/Brand/NCBrand.swift +++ b/Brand/NCBrand.swift @@ -26,22 +26,22 @@ import UIKit let userAgent: String = { let appVersion: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String // Original Nextcloud useragent "Mozilla/5.0 (iOS) Nextcloud-iOS/\(appVersion)" - return "Mozilla/5.0 (iOS) Nextcloud-iOS/\(appVersion)" + return "Mozilla/5.0 (iOS) IONOS HiDrive Next/\(appVersion)" }() -final class NCBrandOptions: @unchecked Sendable { +class NCBrandOptions: @unchecked Sendable { static let shared = NCBrandOptions() - var brand: String = "Nextcloud" - var textCopyrightNextcloudiOS: String = "Nextcloud Hydrogen for iOS %@ © 2025" + var brand: String = "IONOS HiDrive Next" + var textCopyrightNextcloudiOS: String = "HiDrive Next iOS %@ © 2025" var textCopyrightNextcloudServer: String = "Nextcloud Server %@" - var loginBaseUrl: String = "https://cloud.nextcloud.com" + var loginBaseUrl: String = "https://storage.ionos.fr" var pushNotificationServerProxy: String = "https://push-notifications.nextcloud.com" var linkLoginHost: String = "https://nextcloud.com/install" var linkloginPreferredProviders: String = "https://nextcloud.com/signup-ios" var webLoginAutenticationProtocol: String = "nc://" // example "abc://" - var privacy: String = "https://nextcloud.com/privacy" - var sourceCode: String = "https://github.com/nextcloud/ios" + var privacy: String = "https://wl.hidrive.com/easy/ios/privacy.html" + var sourceCode: String = "https://wl.hidrive.com/easy/0181" var mobileconfig: String = "/remote.php/dav/provisioning/apple-provisioning.mobileconfig" var appStoreUrl: String = "https://apps.apple.com/in/app/nextcloud/id1125420102" @@ -123,19 +123,35 @@ final class NCBrandOptions: @unchecked Sendable { #if DEBUG pushNotificationServerProxy = "https://c0004.customerpush.nextcloud.com" #endif + + disable_intro = true + disable_request_login_url = true + disable_crash_service = true + +#if BETA + capabilitiesGroup = "group.de.strato.ionos.easystorage.beta" +#elseif APPSTORE + capabilitiesGroup = "group.com.ionos.hidrivenext" +#else + capabilitiesGroup = "group.com.viseven.ionos.easystorage" +#endif } @objc func getUserAgent() -> String { return userAgent } + + var acknowloedgements: String { + "https://wl.hidrive.com/easy/0171" + } } -final class NCBrandColor: @unchecked Sendable { +class NCBrandColor: @unchecked Sendable { static let shared = NCBrandColor() /// This is rewrited from customet theme, default is Nextcloud color /// - let customer: UIColor = UIColor(red: 0.0 / 255.0, green: 130.0 / 255.0, blue: 201.0 / 255.0, alpha: 1.0) // BLU NC : #0082c9 + let customer: UIColor = UIColor(red: 20.0 / 255.0, green: 116.0 / 255.0, blue: 196.0 / 255.0, alpha: 1.0) var customerText: UIColor = .white // INTERNAL DEFINE COLORS @@ -335,3 +351,43 @@ final class NCBrandColor: @unchecked Sendable { return .white } } + +extension NCBrandColor { + var brandElement: UIColor { + return customer + } + +#if !EXTENSION || EXTENSION_SHARE + var menuIconColor: UIColor { + UIColor(resource: .FileMenu.icon) + } + + var menuFolderIconColor: UIColor { + UIColor(resource: .FileMenu.folderIcon) + } + + var appBackgroundColor: UIColor { + UIColor(resource: .AppBackground.main) + } + + var formBackgroundColor: UIColor { + UIColor(resource: .AppBackground.form) + } + + var formRowBackgroundColor: UIColor { + UIColor(resource: .AppBackground.formRow) + } + + var formSeparatorColor: UIColor { + UIColor(resource: .formSeparator) + } +#endif + + var switchColor: UIColor { + return UIColor { traits in + let light = self.brandElement + let dark = UIColor(red: 17.0 / 255.0, green: 199.0 / 255.0, blue: 230.0 / 255.0, alpha: 1.0) + return traits.userInterfaceStyle == .dark ? dark : light + } + } +} diff --git a/Brand/Notification_Service_Extension.entitlements b/Brand/Notification_Service_Extension.entitlements index 9cf2061f89..2e5c24b65c 100644 --- a/Brand/Notification_Service_Extension.entitlements +++ b/Brand/Notification_Service_Extension.entitlements @@ -6,13 +6,13 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage com.apple.security.network.client keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/Share.entitlements b/Brand/Share.entitlements index 9cf2061f89..2e5c24b65c 100755 --- a/Brand/Share.entitlements +++ b/Brand/Share.entitlements @@ -6,13 +6,13 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage com.apple.security.network.client keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/Share.plist b/Brand/Share.plist index 567991a236..248b825a4d 100755 --- a/Brand/Share.plist +++ b/Brand/Share.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Nextcloud + HiDrive Next CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/Brand/Widget.entitlements b/Brand/Widget.entitlements index 9cf2061f89..2e5c24b65c 100644 --- a/Brand/Widget.entitlements +++ b/Brand/Widget.entitlements @@ -6,13 +6,13 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage com.apple.security.network.client keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/Widget.plist b/Brand/Widget.plist index 32ce55cfb4..d4e598ee31 100644 --- a/Brand/Widget.plist +++ b/Brand/Widget.plist @@ -2,15 +2,15 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSExtension NSExtensionPointIdentifier com.apple.widgetkit-extension - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - diff --git a/Brand/WidgetDashboardIntentHandler.entitlements b/Brand/WidgetDashboardIntentHandler.entitlements index 9cf2061f89..2e5c24b65c 100644 --- a/Brand/WidgetDashboardIntentHandler.entitlements +++ b/Brand/WidgetDashboardIntentHandler.entitlements @@ -6,13 +6,13 @@ com.apple.security.application-groups - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage com.apple.security.network.client keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/iOSClient.entitlements b/Brand/iOSClient.entitlements index f4b9c9dcce..e564d0c656 100755 --- a/Brand/iOSClient.entitlements +++ b/Brand/iOSClient.entitlements @@ -8,8 +8,7 @@ com.apple.security.application-groups - group.com.nextcloud.apps - group.it.twsweb.Crypto-Cloud + group.com.viseven.ionos.easystorage com.apple.security.device.audio-input @@ -23,7 +22,7 @@ keychain-access-groups - $(AppIdentifierPrefix)it.twsweb.Crypto-Cloud + $(AppIdentifierPrefix)com.viseven.ionos.easystorage diff --git a/Brand/iOSClient.plist b/Brand/iOSClient.plist index dae6de5543..ef1fd63940 100755 --- a/Brand/iOSClient.plist +++ b/Brand/iOSClient.plist @@ -2,6 +2,8 @@ + NSUserTrackingUsageDescription + In order to measure the quality of the programming of the app and to find crashes and errors and their cause, anonymized data from the program flow is evaluated. At no time are individual users identified, your identity remains protected. BGTaskSchedulerPermittedIdentifiers com.nextcloud.refreshTask @@ -14,7 +16,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Nextcloud + HiDrive Next CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -95,6 +97,23 @@ Inconsolata-ExtraBold.ttf Inconsolata-Black.ttf + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + UIBackgroundModes audio @@ -176,22 +195,5 @@ - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - - - - diff --git a/File Provider Extension/FileProviderItem.swift b/File Provider Extension/FileProviderItem.swift index 52ba12150c..21d08d314a 100644 --- a/File Provider Extension/FileProviderItem.swift +++ b/File Provider Extension/FileProviderItem.swift @@ -127,6 +127,9 @@ class FileProviderItem: NSObject, NSFileProviderItem { } } /// Sharing + var isShared: Bool { + return !metadata.shareType.isEmpty + } /// Managing Metadata var tagData: Data? { if let tableTag = NCManageDatabase.shared.getTag(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) { diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..6a513b38fd --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' +gem 'slather' +gem 'xcpretty' \ No newline at end of file diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index ee34afa1ec..4da1aac76d 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -3,10 +3,16 @@ archiveVersion = 1; classes = { }; - objectVersion = 70; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + 0F08D6B92C94270600136502 /* ButtonStyleGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F08D6B82C94270600136502 /* ButtonStyleGuide.swift */; }; + 0F08D6BB2C94275600136502 /* CircleItemSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F08D6BA2C94275600136502 /* CircleItemSpinner.swift */; }; + 0F5090CE2C786F04009348D9 /* FileActionsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F5090CD2C786F04009348D9 /* FileActionsHeader.swift */; }; + 0F5219412DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F5219402DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift */; }; + 0F8615AC2CBE6AC20056B4F2 /* UITabBarGuideline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F8615AB2CBE6AC20056B4F2 /* UITabBarGuideline.swift */; }; + 0F8B9A5B2C7887F60041C17D /* FileActionsHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0F8B9A5A2C7887F60041C17D /* FileActionsHeader.xib */; }; 2C1D5D7623E2DE3300334ABB /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; 2C1D5D7923E2DE9100334ABB /* NCBrand.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76B3CCD1EAE01BD00921AC9 /* NCBrand.swift */; }; 2C33C48223E2C475005F963B /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C33C48123E2C475005F963B /* NotificationService.swift */; }; @@ -15,6 +21,40 @@ 370D26AF248A3D7A00121797 /* NCCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D26AE248A3D7A00121797 /* NCCellProtocol.swift */; }; 371B5A2E23D0B04500FAFAE9 /* NCMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371B5A2D23D0B04500FAFAE9 /* NCMenu.swift */; }; 3781B9B023DB2B7E006B4B1D /* AppDelegate+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3781B9AF23DB2B7E006B4B1D /* AppDelegate+Menu.swift */; }; + 3CEA5F122BFBBCAF0097E536 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 420113DC2D1303E00063BF54 /* NCMediaSelectTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420113DB2D1303E00063BF54 /* NCMediaSelectTabBar.swift */; }; + 421657AB2D2AF2BF003BC9D5 /* HiDriveCollectionViewCommonSelectToolbarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 421657AA2D2AF2BF003BC9D5 /* HiDriveCollectionViewCommonSelectToolbarDelegate.swift */; }; + 422CA3EF2C932F7200241F29 /* AccountButtonFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 422CA3EE2C932F7200241F29 /* AccountButtonFactory.swift */; }; + 4232DC0A2C9D7C44008D546D /* UIView+GridSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4232DC092C9D7C44008D546D /* UIView+GridSelection.swift */; }; + 4232DC0B2C9D7C44008D546D /* UIView+GridSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4232DC092C9D7C44008D546D /* UIView+GridSelection.swift */; }; + 4240DB4E2C5646B400E72FC0 /* BurgerMenuAttachController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4240DB4D2C5646B400E72FC0 /* BurgerMenuAttachController.swift */; }; + 4240DB502C5648E300E72FC0 /* BurgerMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4240DB4F2C5648E300E72FC0 /* BurgerMenuViewController.swift */; }; + 4240DB522C5649A900E72FC0 /* BurgerMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4240DB512C5649A900E72FC0 /* BurgerMenuView.swift */; }; + 425AD0C32DB8CC240063F2ED /* TransfersListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 425AD0C22DB8CC040063F2ED /* TransfersListener.swift */; }; + 425F57AF2D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 425F57AE2D2E83DA006D5FD1 /* IonosImages.xcassets */; }; + 425F57B02D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 425F57AE2D2E83DA006D5FD1 /* IonosImages.xcassets */; }; + 425F57B12D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 425F57AE2D2E83DA006D5FD1 /* IonosImages.xcassets */; }; + 42678ABE2C57C5FB00307DEF /* BurgerMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42678ABD2C57C5FB00307DEF /* BurgerMenuViewModel.swift */; }; + 426D0F892D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 426D0F872D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbar.swift */; }; + 426D0F8A2D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 426D0F882D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbarView.swift */; }; + 428C41682D15862700F3A917 /* NCAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428C41672D15862700F3A917 /* NCAccount.swift */; }; + 4294B88B2CA5550B002E6FED /* LinkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4294B88A2CA5550B002E6FED /* LinkButton.swift */; }; + 42C684B42CA1806000DD46F0 /* SecondaryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C684B32CA1806000DD46F0 /* SecondaryButton.swift */; }; + 42C684B72CA1A20100DD46F0 /* CommonButtonConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C684B62CA1A20100DD46F0 /* CommonButtonConstants.swift */; }; + 42D34FD92D79A5B00020C106 /* ShareSearchField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D34FD82D79A5B00020C106 /* ShareSearchField.swift */; }; + 42D3D0972C94284C008A5AD4 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; + 42D6C0AD2C6B8FA800DF5543 /* NCKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76882132C0DD1E7001CF441 /* NCKeychain.swift */; }; + 42E5D36B2D678F9C007150DE /* HiDriveMainNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42E5D36A2D678F95007150DE /* HiDriveMainNavigationController.swift */; }; + 42F504802C6F553D001AA432 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; + 42F89EB12D71F30C00550A07 /* NCCollectionViewCommon+FileActionsHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F89EB02D71F30C00550A07 /* NCCollectionViewCommon+FileActionsHeader.swift */; }; + 42F907DE2D2C424900BCDC36 /* View+Design.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F907DD2D2C424100BCDC36 /* View+Design.swift */; }; + 6256F5442C98466D0032A1CF /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */; }; + 6256F5452C98467B0032A1CF /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */; }; + 6256F5462C9846DE0032A1CF /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */; }; + 625EC26E2C6CA285006411D1 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 625EC26D2C6CA285006411D1 /* FirebaseAnalytics */; }; + 625EC2712C6CAABD006411D1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 625EC2702C6CAABD006411D1 /* GoogleService-Info.plist */; }; + 62A63F2E2C8AF5320048653E /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */; }; + 62A63F302C8AF7730048653E /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; 8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8491B1CC273BBA82001C8C5B /* UIViewController+Menu.swift */; }; AA3C85E82D36B08C00F74F12 /* UITestBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3C85E72D36B08C00F74F12 /* UITestBackend.swift */; }; AA3C85EB2D36BBFB00F74F12 /* OCSResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3C85EA2D36BBF400F74F12 /* OCSResponse.swift */; }; @@ -93,15 +133,27 @@ AFCE353727E4ED7B00FEA6C2 /* NCShareCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353627E4ED7B00FEA6C2 /* NCShareCells.swift */; }; AFCE353927E5DE0500FEA6C2 /* Shareable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353827E5DE0400FEA6C2 /* Shareable.swift */; }; D575039F27146F93008DC9DC /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; + D59793B62CF7A73A00C44F4E /* DataProtectionAgreementManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59793B52CF7A73A00C44F4E /* DataProtectionAgreementManager.swift */; }; D5B6AA7827200C7200D49C24 /* NCActivityTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6AA7727200C7200D49C24 /* NCActivityTableViewCell.swift */; }; + D5C2D21F2C9DC0EF00E7579D /* PrimaryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C2D21E2C9DC0EF00E7579D /* PrimaryButton.swift */; }; + D5C5133B2C91970B00AE35CA /* NCImagesRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C5133A2C91970B00AE35CA /* NCImagesRepository.swift */; }; + D5C5133E2C919B8500AE35CA /* NCImagesRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C5133A2C91970B00AE35CA /* NCImagesRepository.swift */; }; + D5E1D4FC2CF4A99300813AB6 /* DataProtectionAgreementScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1D4FB2CF4A99200813AB6 /* DataProtectionAgreementScreen.swift */; }; + D5E1D4FE2CF4E7C600813AB6 /* DataProtectionSettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1D4FD2CF4E7C600813AB6 /* DataProtectionSettingsScreen.swift */; }; + D5E1D5002CF4EB3900813AB6 /* DataProtectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1D4FF2CF4EB3900813AB6 /* DataProtectionModel.swift */; }; + D5E1D5042CF665C100813AB6 /* DataProtectionHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1D5032CF665C100813AB6 /* DataProtectionHostingController.swift */; }; F310B1EF2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F310B1EE2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift */; }; F314F1142A30E2DE00BC7FAB /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */; }; - F321DA8A2B71205A00DDA0E6 /* NCTrashSelectTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F321DA892B71205A00DDA0E6 /* NCTrashSelectTabBar.swift */; }; F32FADA92D1176E3007035E2 /* UIButton+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F32FADA82D1176DE007035E2 /* UIButton+Extension.swift */; }; F3374A812D64AB9F002A38F9 /* StatusInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3374A802D64AB9E002A38F9 /* StatusInfo.swift */; }; F3374A842D64AC31002A38F9 /* AssistantLabelStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3374A832D64AC2C002A38F9 /* AssistantLabelStyle.swift */; }; F3374A942D674454002A38F9 /* AssistantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3374A932D674454002A38F9 /* AssistantUITests.swift */; }; F3374A962D6744A4002A38F9 /* BaseUIXCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3374A952D6744A4002A38F9 /* BaseUIXCTestCase.swift */; }; + F3374AF02D78B01B002A38F9 /* BitCollections in Frameworks */ = {isa = PBXBuildFile; productRef = F3374AEF2D78B01B002A38F9 /* BitCollections */; }; + F3374AF22D78B01B002A38F9 /* Collections in Frameworks */ = {isa = PBXBuildFile; productRef = F3374AF12D78B01B002A38F9 /* Collections */; }; + F3374AF42D78B01B002A38F9 /* DequeModule in Frameworks */ = {isa = PBXBuildFile; productRef = F3374AF32D78B01B002A38F9 /* DequeModule */; }; + F3374AF62D78B01B002A38F9 /* HashTreeCollections in Frameworks */ = {isa = PBXBuildFile; productRef = F3374AF52D78B01B002A38F9 /* HashTreeCollections */; }; + F3374AF82D78B01B002A38F9 /* HeapModule in Frameworks */ = {isa = PBXBuildFile; productRef = F3374AF72D78B01B002A38F9 /* HeapModule */; }; F33918C42C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */; }; F33918C52C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */; }; F33918C62C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */; }; @@ -115,6 +167,7 @@ F3391B102B4C52E6001C0C4B /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = F3391B0F2B4C52E6001C0C4B /* SVGKit */; }; F3391B142B4C52EF001C0C4B /* JGProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = F3391B132B4C52EF001C0C4B /* JGProgressHUD */; }; F3391B162B4C52F6001C0C4B /* FirebaseDatabase in Frameworks */ = {isa = PBXBuildFile; productRef = F3391B152B4C52F6001C0C4B /* FirebaseDatabase */; }; + F33D303E2D8B129600531D64 /* AutoUploadUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33D303D2D8B129600531D64 /* AutoUploadUITests.swift */; }; F33EE6E12BF4BDA500CA1A51 /* NIOSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F33EE6E02BF4BDA500CA1A51 /* NIOSSL */; }; F33EE6E32BF4C00700CA1A51 /* NIOSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F33EE6E22BF4C00700CA1A51 /* NIOSSL */; }; F33EE6E52BF4C02000CA1A51 /* NIOSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F33EE6E42BF4C02000CA1A51 /* NIOSSL */; }; @@ -180,7 +233,7 @@ F37208C62BAB63F0006B5430 /* LRUCache in Frameworks */ = {isa = PBXBuildFile; productRef = F37208C52BAB63F0006B5430 /* LRUCache */; }; F37208C82BAB63F1006B5430 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F37208C72BAB63F1006B5430 /* KeychainAccess */; }; F3754A7D2CF87D600009312E /* SetupPasscodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3754A7C2CF87D600009312E /* SetupPasscodeView.swift */; }; - F38F71252B6BBDC300473CDC /* NCCollectionViewCommonSelectTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38F71242B6BBDC300473CDC /* NCCollectionViewCommonSelectTabBar.swift */; }; + F389C9F52CEE383300049762 /* SelectAlbumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F389C9F42CEE383300049762 /* SelectAlbumView.swift */; }; F39170A92CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */; }; F39170AA2CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */; }; F39170AB2CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */; }; @@ -189,6 +242,7 @@ F39170AE2CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */; }; F39170AF2CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */; }; F39298972A3B12CB00509762 /* BaseNCMoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39298962A3B12CB00509762 /* BaseNCMoreCell.swift */; }; + F39A1EE22D0AF8A400DAD522 /* Albums.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39A1EE12D0AF8A200DAD522 /* Albums.swift */; }; F3A047972BD2668800658E7B /* NCAssistantEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A0478F2BD2668800658E7B /* NCAssistantEmptyView.swift */; }; F3A047982BD2668800658E7B /* NCAssistantCreateNewTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A047912BD2668800658E7B /* NCAssistantCreateNewTask.swift */; }; F3A047992BD2668800658E7B /* NCAssistantModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A047932BD2668800658E7B /* NCAssistantModel.swift */; }; @@ -198,6 +252,8 @@ F3BB464D2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3BB464C2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib */; }; F3BB46522A39EC4900461F6E /* NCMoreAppSuggestionsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3BB46512A39EC4900461F6E /* NCMoreAppSuggestionsCell.swift */; }; F3BB46542A3A1E9D00461F6E /* CCCellMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3BB46532A3A1E9D00461F6E /* CCCellMore.swift */; }; + F3C587AE2D47E4FE004532DB /* PHAssetCollectionThumbnailLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C587AD2D47E4FE004532DB /* PHAssetCollectionThumbnailLoader.swift */; }; + F3CA337D2D0B2B6C00672333 /* AlbumModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3CA337C2D0B2B6A00672333 /* AlbumModel.swift */; }; F3E173B02C9AF637006D177A /* ScreenAwakeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E173AF2C9AF637006D177A /* ScreenAwakeManager.swift */; }; F3E173C02C9B1067006D177A /* AwakeMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E173BF2C9B1067006D177A /* AwakeMode.swift */; }; F3E173C12C9B1067006D177A /* AwakeMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E173BF2C9B1067006D177A /* AwakeMode.swift */; }; @@ -294,7 +350,6 @@ F71F6D0B2B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71F6D062B6A6A5E00F1EB15 /* ThreadSafeArray.swift */; }; F71F6D0C2B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71F6D062B6A6A5E00F1EB15 /* ThreadSafeArray.swift */; }; F71F6D0D2B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71F6D062B6A6A5E00F1EB15 /* ThreadSafeArray.swift */; }; - F722133B2D40EF9D002F7438 /* NCFilesNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F722133A2D40EF8C002F7438 /* NCFilesNavigationController.swift */; }; F7226EDC1EE4089300EBECB1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F7226EDB1EE4089300EBECB1 /* Main.storyboard */; }; F722F0112CFF569500065FB5 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F722F0102CFF569500065FB5 /* MainInterface.storyboard */; }; F723985C253C95CE00257F49 /* NCViewerRichdocument.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F723985B253C95CE00257F49 /* NCViewerRichdocument.storyboard */; }; @@ -463,7 +518,6 @@ F7411C552D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7411C532D7B26C600F57358 /* NCNetworking+ServerError.swift */; }; F7411C562D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7411C532D7B26C600F57358 /* NCNetworking+ServerError.swift */; }; F7411C572D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7411C532D7B26C600F57358 /* NCNetworking+ServerError.swift */; }; - F741C2242B6B9FD600E849BB /* NCMediaSelectTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F741C2232B6B9FD600E849BB /* NCMediaSelectTabBar.swift */; }; F74230F32C79B57200CA1ACA /* NCNetworking+Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = F74230F22C79B57200CA1ACA /* NCNetworking+Task.swift */; }; F7434B3620E23FE000417916 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; F7434B3820E2400600417916 /* NCBrand.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76B3CCD1EAE01BD00921AC9 /* NCBrand.swift */; }; @@ -599,6 +653,7 @@ F76882282C0DD1E7001CF441 /* NCEndToEndInitialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = F768820F2C0DD1E7001CF441 /* NCEndToEndInitialize.swift */; }; F76882292C0DD1E7001CF441 /* NCManageE2EEModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76882102C0DD1E7001CF441 /* NCManageE2EEModel.swift */; }; F768822A2C0DD1E7001CF441 /* NCSettingsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76882112C0DD1E7001CF441 /* NCSettingsModel.swift */; }; + F768822B2C0DD1E7001CF441 /* (null) in Resources */ = {isa = PBXBuildFile; }; F768822C2C0DD1E7001CF441 /* NCKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76882132C0DD1E7001CF441 /* NCKeychain.swift */; }; F768822D2C0DD1E7001CF441 /* Acknowledgements.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F76882142C0DD1E7001CF441 /* Acknowledgements.rtf */; }; F768822E2C0DD1E7001CF441 /* NCSettingsBundleHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76882152C0DD1E7001CF441 /* NCSettingsBundleHelper.swift */; }; @@ -787,9 +842,6 @@ F79EDAA526B004980007D134 /* NCPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79EDAA126B004980007D134 /* NCPlayer.swift */; }; F79FFB262A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79FFB252A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift */; }; F79FFB272A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79FFB252A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift */; }; - F7A03E2F2D425A14007AA677 /* NCFavoriteNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A03E2E2D425A14007AA677 /* NCFavoriteNavigationController.swift */; }; - F7A03E332D426115007AA677 /* NCMoreNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A03E322D426115007AA677 /* NCMoreNavigationController.swift */; }; - F7A03E352D427312007AA677 /* NCMainNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A03E342D427308007AA677 /* NCMainNavigationController.swift */; }; F7A0D1352591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; F7A0D1362591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; F7A0D1372591FBC5008F8A13 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; @@ -827,7 +879,7 @@ F7A8D74228F18261008BBE1C /* NCUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70BFC7320E0FA7C00C67599 /* NCUtility.swift */; }; F7A8D74328F1826F008BBE1C /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; F7A8D74428F1827B008BBE1C /* ThreadSafeDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */; }; - F7A8FD522C5E2557006C9CF8 /* NCAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A8FD512C5E2557006C9CF8 /* NCAccount.swift */; }; + F7A8FD522C5E2557006C9CF8 /* (null) in Sources */ = {isa = PBXBuildFile; }; F7AC1CB028AB94490032D99F /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7AC1CAF28AB94490032D99F /* Array+Extension.swift */; }; F7AC934A296193050002BC0F /* Reasons to use Nextcloud.pdf in Resources */ = {isa = PBXBuildFile; fileRef = F7AC9349296193050002BC0F /* Reasons to use Nextcloud.pdf */; }; F7AE00F5230D5F9E007ACF8A /* NCLoginProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7AE00F4230D5F9E007ACF8A /* NCLoginProvider.swift */; }; @@ -846,7 +898,6 @@ F7B769AC2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B769A72B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift */; }; F7B769AD2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B769A72B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift */; }; F7B769AE2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B769A72B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift */; }; - F7B8B83025681C3400967775 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F7B8B82F25681C3400967775 /* GoogleService-Info.plist */; }; F7B934FE2BDCFE1E002B2FC9 /* NCDragDrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B934FD2BDCFE1E002B2FC9 /* NCDragDrop.swift */; }; F7BAADCB1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; F7BAADCC1ED5A87C00B7EAD4 /* NCManageDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */; }; @@ -1008,6 +1059,8 @@ F7FA80012C0F4F3B0072FC60 /* NCUploadAssetsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FA7FFF2C0F4F3B0072FC60 /* NCUploadAssetsView.swift */; }; F7FAFD3A28BFA948000777FE /* NCNotification+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */; }; F7FF2CB12842159500EBB7A1 /* NCSectionHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */; }; + FC930DC52CEDE33000C9B237 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FC930DC42CEDE33000C9B237 /* Colors.xcassets */; }; + FC930DC72CEE377700C9B237 /* WidgetCommon.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC930DC62CEE377700C9B237 /* WidgetCommon.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -1197,6 +1250,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0F08D6B82C94270600136502 /* ButtonStyleGuide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyleGuide.swift; sourceTree = ""; }; + 0F08D6BA2C94275600136502 /* CircleItemSpinner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleItemSpinner.swift; sourceTree = ""; }; + 0F4374A82D8442BA0081F7C3 /* config */ = {isa = PBXFileReference; lastKnownFileType = text; path = config; sourceTree = ""; }; + 0F5090CD2C786F04009348D9 /* FileActionsHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileActionsHeader.swift; sourceTree = ""; }; + 0F5219402DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+VirtualOrientation.swift"; sourceTree = ""; }; + 0F85B8942DB7D61100D089AE /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 0F8615AB2CBE6AC20056B4F2 /* UITabBarGuideline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITabBarGuideline.swift; sourceTree = ""; }; + 0F8B9A5A2C7887F60041C17D /* FileActionsHeader.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FileActionsHeader.xib; sourceTree = ""; }; + 0FAEC1B32DBA3F2A001A60D9 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; 2C33C47F23E2C475005F963B /* Notification Service Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Notification Service Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 2C33C48123E2C475005F963B /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 2C33C48A23E2CC26005F963B /* Notification_Service_Extension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Notification_Service_Extension-Bridging-Header.h"; sourceTree = ""; }; @@ -1204,6 +1266,28 @@ 370D26AE248A3D7A00121797 /* NCCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCellProtocol.swift; sourceTree = ""; }; 371B5A2D23D0B04500FAFAE9 /* NCMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMenu.swift; sourceTree = ""; }; 3781B9AF23DB2B7E006B4B1D /* AppDelegate+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Menu.swift"; sourceTree = ""; }; + 420113DB2D1303E00063BF54 /* NCMediaSelectTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMediaSelectTabBar.swift; sourceTree = ""; }; + 421657AA2D2AF2BF003BC9D5 /* HiDriveCollectionViewCommonSelectToolbarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiDriveCollectionViewCommonSelectToolbarDelegate.swift; sourceTree = ""; }; + 422CA3EE2C932F7200241F29 /* AccountButtonFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountButtonFactory.swift; sourceTree = ""; }; + 4232DC092C9D7C44008D546D /* UIView+GridSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+GridSelection.swift"; sourceTree = ""; }; + 4240DB4D2C5646B400E72FC0 /* BurgerMenuAttachController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurgerMenuAttachController.swift; sourceTree = ""; }; + 4240DB4F2C5648E300E72FC0 /* BurgerMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurgerMenuViewController.swift; sourceTree = ""; }; + 4240DB512C5649A900E72FC0 /* BurgerMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurgerMenuView.swift; sourceTree = ""; }; + 425AD0C22DB8CC040063F2ED /* TransfersListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransfersListener.swift; sourceTree = ""; }; + 425F57AE2D2E83DA006D5FD1 /* IonosImages.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = IonosImages.xcassets; sourceTree = ""; }; + 42678ABD2C57C5FB00307DEF /* BurgerMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurgerMenuViewModel.swift; sourceTree = ""; }; + 426D0F872D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiDriveCollectionViewCommonSelectToolbar.swift; sourceTree = ""; }; + 426D0F882D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiDriveCollectionViewCommonSelectToolbarView.swift; sourceTree = ""; }; + 428C41672D15862700F3A917 /* NCAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCAccount.swift; sourceTree = ""; }; + 4294B88A2CA5550B002E6FED /* LinkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkButton.swift; sourceTree = ""; }; + 42C684B32CA1806000DD46F0 /* SecondaryButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondaryButton.swift; sourceTree = ""; }; + 42C684B62CA1A20100DD46F0 /* CommonButtonConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonButtonConstants.swift; sourceTree = ""; }; + 42D34FD82D79A5B00020C106 /* ShareSearchField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSearchField.swift; sourceTree = ""; }; + 42E5D36A2D678F95007150DE /* HiDriveMainNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiDriveMainNavigationController.swift; sourceTree = ""; }; + 42F5047F2C6F553D001AA432 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; + 42F89EB02D71F30C00550A07 /* NCCollectionViewCommon+FileActionsHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+FileActionsHeader.swift"; sourceTree = ""; }; + 42F907DD2D2C424100BCDC36 /* View+Design.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Design.swift"; sourceTree = ""; }; + 625EC2702C6CAABD006411D1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; 8491B1CC273BBA82001C8C5B /* UIViewController+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Menu.swift"; sourceTree = ""; }; AA3C85E72D36B08C00F74F12 /* UITestBackend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestBackend.swift; sourceTree = ""; }; AA3C85EA2D36BBF400F74F12 /* OCSResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OCSResponse.swift; sourceTree = ""; }; @@ -1257,9 +1341,6 @@ AA517BB02D660F8900F8D37C /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "es-UY"; path = "Supporting Files/es-UY.lproj/Localizable.stringsdict"; sourceTree = ""; }; AA517BB12D660F8A00F8D37C /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv; path = "Supporting Files/sv.lproj/Localizable.stringsdict"; sourceTree = ""; }; AA517BB22D660F8B00F8D37C /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = "Supporting Files/tr.lproj/Localizable.stringsdict"; sourceTree = ""; }; - AA52EB2C2D4297570089C348 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Intent.strings; sourceTree = ""; }; - AA52EB2D2D4297570089C348 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; - AA52EB2E2D4297570089C348 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/InfoPlist.strings; sourceTree = ""; }; AA52EB452D42AC5A0089C348 /* Placeholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Placeholder.swift; sourceTree = ""; }; AA74AA962D3172CE00BE3458 /* UITestError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestError.swift; sourceTree = ""; }; AA8D31522D41052300FE2775 /* NCManageDatabase+DownloadLimit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+DownloadLimit.swift"; sourceTree = ""; }; @@ -1278,15 +1359,6 @@ AABD0C862D5F58C400F009E6 /* Server.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = Server.sh; sourceTree = ""; }; AABD0C892D5F67A200F009E6 /* XCUIElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCUIElement.swift; sourceTree = ""; }; AABD0C9A2D5F73FA00F009E6 /* Placeholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Placeholder.swift; sourceTree = ""; }; - AACCAB522CFE041F00DA1786 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Intent.strings; sourceTree = ""; }; - AACCAB532CFE041F00DA1786 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = ""; }; - AACCAB542CFE041F00DA1786 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/InfoPlist.strings; sourceTree = ""; }; - AACCAB5E2CFE04C200DA1786 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Intent.strings; sourceTree = ""; }; - AACCAB5F2CFE04C200DA1786 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; - AACCAB602CFE04C200DA1786 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/InfoPlist.strings; sourceTree = ""; }; - AACCAB622CFE04F700DA1786 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/Intent.strings; sourceTree = ""; }; - AACCAB632CFE04F700DA1786 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/Localizable.strings; sourceTree = ""; }; - AACCAB642CFE04F700DA1786 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/InfoPlist.strings; sourceTree = ""; }; AAE330032D2ED1FF00B04903 /* NCShareNavigationTitleSetting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareNavigationTitleSetting.swift; sourceTree = ""; }; AF1A9B6327D0CA1E00F17A9E /* UIAlertController+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+Extension.swift"; sourceTree = ""; }; AF22B20B277C6F4D00DAB0CC /* NCShareCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareCell.swift; sourceTree = ""; }; @@ -1321,15 +1393,22 @@ AFCE353827E5DE0400FEA6C2 /* Shareable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shareable.swift; sourceTree = ""; }; C0046CDA2A17B98400D87C9D /* NextcloudUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NextcloudUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; C04E2F202A17BB4D001BAD85 /* NextcloudIntegrationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NextcloudIntegrationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + D59793B52CF7A73A00C44F4E /* DataProtectionAgreementManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataProtectionAgreementManager.swift; sourceTree = ""; }; D5B6AA7727200C7200D49C24 /* NCActivityTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCActivityTableViewCell.swift; sourceTree = ""; }; + D5C2D21E2C9DC0EF00E7579D /* PrimaryButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimaryButton.swift; sourceTree = ""; }; + D5C5133A2C91970B00AE35CA /* NCImagesRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCImagesRepository.swift; sourceTree = ""; }; + D5E1D4FB2CF4A99200813AB6 /* DataProtectionAgreementScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataProtectionAgreementScreen.swift; sourceTree = ""; }; + D5E1D4FD2CF4E7C600813AB6 /* DataProtectionSettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataProtectionSettingsScreen.swift; sourceTree = ""; }; + D5E1D4FF2CF4EB3900813AB6 /* DataProtectionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataProtectionModel.swift; sourceTree = ""; }; + D5E1D5032CF665C100813AB6 /* DataProtectionHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataProtectionHostingController.swift; sourceTree = ""; }; F310B1EE2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCViewerMedia+VisionKit.swift"; sourceTree = ""; }; - F321DA892B71205A00DDA0E6 /* NCTrashSelectTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCTrashSelectTabBar.swift; sourceTree = ""; }; F32FADA82D1176DE007035E2 /* UIButton+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extension.swift"; sourceTree = ""; }; F3374A802D64AB9E002A38F9 /* StatusInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusInfo.swift; sourceTree = ""; }; F3374A832D64AC2C002A38F9 /* AssistantLabelStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantLabelStyle.swift; sourceTree = ""; }; F3374A932D674454002A38F9 /* AssistantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantUITests.swift; sourceTree = ""; }; F3374A952D6744A4002A38F9 /* BaseUIXCTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUIXCTestCase.swift; sourceTree = ""; }; F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileNameValidator+Extensions.swift"; sourceTree = ""; }; + F33D303D2D8B129600531D64 /* AutoUploadUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoUploadUITests.swift; sourceTree = ""; }; F33EE6F12BF4C9B200CA1A51 /* PKCS12.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PKCS12.swift; sourceTree = ""; }; F343A4B22A1E01FF00DDA874 /* PHAsset+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAsset+Extension.swift"; sourceTree = ""; }; F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Optional+Extension.swift"; sourceTree = ""; }; @@ -1338,9 +1417,10 @@ F36E64F62B9245210085ABB5 /* NCCollectionViewCommon+SelectTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+SelectTabBar.swift"; sourceTree = ""; }; F37208742BAB4AB0006B5430 /* TestConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestConstants.swift; sourceTree = ""; }; F3754A7C2CF87D600009312E /* SetupPasscodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupPasscodeView.swift; sourceTree = ""; }; - F38F71242B6BBDC300473CDC /* NCCollectionViewCommonSelectTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCollectionViewCommonSelectTabBar.swift; sourceTree = ""; }; + F389C9F42CEE383300049762 /* SelectAlbumView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectAlbumView.swift; sourceTree = ""; }; F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileAutoRenamer+Extensions.swift"; sourceTree = ""; }; F39298962A3B12CB00509762 /* BaseNCMoreCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNCMoreCell.swift; sourceTree = ""; }; + F39A1EE12D0AF8A200DAD522 /* Albums.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Albums.swift; sourceTree = ""; }; F3A0478F2BD2668800658E7B /* NCAssistantEmptyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCAssistantEmptyView.swift; sourceTree = ""; }; F3A047912BD2668800658E7B /* NCAssistantCreateNewTask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCAssistantCreateNewTask.swift; sourceTree = ""; }; F3A047932BD2668800658E7B /* NCAssistantModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCAssistantModel.swift; sourceTree = ""; }; @@ -1349,6 +1429,8 @@ F3BB464C2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCMoreAppSuggestionsCell.xib; sourceTree = ""; }; F3BB46512A39EC4900461F6E /* NCMoreAppSuggestionsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMoreAppSuggestionsCell.swift; sourceTree = ""; }; F3BB46532A3A1E9D00461F6E /* CCCellMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCCellMore.swift; sourceTree = ""; }; + F3C587AD2D47E4FE004532DB /* PHAssetCollectionThumbnailLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PHAssetCollectionThumbnailLoader.swift; sourceTree = ""; }; + F3CA337C2D0B2B6A00672333 /* AlbumModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumModel.swift; sourceTree = ""; }; F3E173AF2C9AF637006D177A /* ScreenAwakeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenAwakeManager.swift; sourceTree = ""; }; F3E173BF2C9B1067006D177A /* AwakeMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwakeMode.swift; sourceTree = ""; }; F700222B1EC479840080073F /* Custom.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Custom.xcassets; sourceTree = ""; }; @@ -1374,7 +1456,6 @@ F70753F62542A9C000972D44 /* NCViewerMediaPage.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCViewerMediaPage.storyboard; sourceTree = ""; }; F707C26421A2DC5200F6181E /* NCStoreReview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCStoreReview.swift; sourceTree = ""; }; F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCLivePhoto.swift; sourceTree = ""; }; - F70A07C8205285FB00DC1231 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; F70BFC7320E0FA7C00C67599 /* NCUtility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCUtility.swift; sourceTree = ""; }; F70CAE381F8CF31A008125FD /* NCEndToEndEncryption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NCEndToEndEncryption.h; sourceTree = ""; }; F70CAE391F8CF31A008125FD /* NCEndToEndEncryption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NCEndToEndEncryption.m; sourceTree = ""; }; @@ -1395,8 +1476,6 @@ F7148040262EBE4000693E51 /* NCShareExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCShareExtension.swift; sourceTree = ""; }; F7148046262EBE4B00693E51 /* Share-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Share-Bridging-Header.h"; sourceTree = ""; }; F7151A811D477A4B00E6AF45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - F7169A301EE59BB70086BD69 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; - F7169A4C1EE59C640086BD69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; F717402B24F699A5000C87D5 /* NCFavorite.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCFavorite.storyboard; sourceTree = ""; }; F717402C24F699A5000C87D5 /* NCFavorite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCFavorite.swift; sourceTree = ""; }; F718C24D254D507B00C5C256 /* NCViewerMediaDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewerMediaDetailView.swift; sourceTree = ""; }; @@ -1404,7 +1483,6 @@ F719D9E1288D396100762E33 /* NCColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCColorPicker.swift; sourceTree = ""; }; F71CD6C92930D7B1006C95C1 /* NCApplicationHandle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCApplicationHandle.swift; sourceTree = ""; }; F71F6D062B6A6A5E00F1EB15 /* ThreadSafeArray.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadSafeArray.swift; sourceTree = ""; }; - F722133A2D40EF8C002F7438 /* NCFilesNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCFilesNavigationController.swift; sourceTree = ""; }; F7226EDB1EE4089300EBECB1 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; F722F0102CFF569500065FB5 /* MainInterface.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainInterface.storyboard; sourceTree = ""; }; F723985B253C95CE00257F49 /* NCViewerRichdocument.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCViewerRichdocument.storyboard; sourceTree = ""; }; @@ -1425,8 +1503,6 @@ F72EA95728B7BC4F00C88F0C /* FilesData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesData.swift; sourceTree = ""; }; F72EA95928B7BD0D00C88F0C /* FilesWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesWidgetView.swift; sourceTree = ""; }; F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+E2EE.swift"; sourceTree = ""; }; - F7320934201B812F008A0888 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; - F732093B201B81E4008A0888 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = ""; }; F7327E1F2B73A42F00A462C7 /* NCNetworking+Download.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCNetworking+Download.swift"; sourceTree = ""; }; F7327E272B73A53400A462C7 /* NCNetworking+Upload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCNetworking+Upload.swift"; sourceTree = ""; }; F7327E2F2B73A86700A462C7 /* NCNetworking+WebDAV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCNetworking+WebDAV.swift"; sourceTree = ""; }; @@ -1460,7 +1536,6 @@ F73F537E1E929C8500F8678D /* NCMore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCMore.swift; sourceTree = ""; }; F7401C142C75E6F300649E87 /* NCCapabilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCapabilities.swift; sourceTree = ""; }; F7411C532D7B26C600F57358 /* NCNetworking+ServerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCNetworking+ServerError.swift"; sourceTree = ""; }; - F741C2232B6B9FD600E849BB /* NCMediaSelectTabBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCMediaSelectTabBar.swift; sourceTree = ""; }; F74230F22C79B57200CA1ACA /* NCNetworking+Task.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCNetworking+Task.swift"; sourceTree = ""; }; F745B252222D88AE00346520 /* NCLoginQRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCLoginQRCode.swift; sourceTree = ""; }; F747EB0C2C4AC1FF00F959A8 /* NCCollectionViewCommon+CollectionViewDelegateFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+CollectionViewDelegateFlowLayout.swift"; sourceTree = ""; }; @@ -1477,9 +1552,6 @@ F7501C312212E57400FB1415 /* NCMedia.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCMedia.swift; sourceTree = ""; }; F751247A2C42919C00E63DB8 /* NCPhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCPhotoCell.swift; sourceTree = ""; }; F751247B2C42919C00E63DB8 /* NCPhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCPhotoCell.xib; sourceTree = ""; }; - F753701822723D620041C76C /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Localizable.strings; sourceTree = ""; }; - F753701922723E0D0041C76C /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; - F753701A22723EC80041C76C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; F755BD9A20594AC7008C5FBB /* NCService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCService.swift; sourceTree = ""; }; F755CB3F2B8CB13C00CE27E9 /* NCMediaLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCMediaLayout.swift; sourceTree = ""; }; F757CC8129E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Groupfolders.swift"; sourceTree = ""; }; @@ -1491,8 +1563,6 @@ F75A9EE523796C6F0044CFCE /* NCNetworking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCNetworking.swift; sourceTree = ""; }; F75B0ABC244C4DBB00E58DCA /* NCActionCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCActionCenter.swift; sourceTree = ""; }; F75B91E21ECAE17800199C96 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - F75B91F71ECAE26300199C96 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; - F75B923D1ECAE55E00199C96 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; F75C0C4723D1FAE300163CC8 /* NCRichWorkspaceCommon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCRichWorkspaceCommon.swift; sourceTree = ""; }; F75CA1462962F13700B01130 /* NCHUDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCHUDView.swift; sourceTree = ""; }; F75D19E225EFE09000D74598 /* NCTrash+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCTrash+Menu.swift"; sourceTree = ""; }; @@ -1561,24 +1631,6 @@ F7725A5E251F33BB00D125E0 /* NCFiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCFiles.swift; sourceTree = ""; }; F7725A5F251F33BB00D125E0 /* NCFiles.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCFiles.storyboard; sourceTree = ""; }; F774264822EB4D0000B23912 /* NCSearchUserDropDownCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCSearchUserDropDownCell.xib; sourceTree = ""; }; - F77438EB1FCD694900662C46 /* ka-GE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ka-GE"; path = "ka-GE.lproj/Localizable.strings"; sourceTree = ""; }; - F77438F21FCD69D300662C46 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; - F77438F91FCD6A0D00662C46 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Localizable.strings"; sourceTree = ""; }; - F77439001FCD6B7F00662C46 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Localizable.strings; sourceTree = ""; }; - F77439071FCD6BF000662C46 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Localizable.strings"; sourceTree = ""; }; - F774390E1FCD6C0C00662C46 /* es-CO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CO"; path = "es-CO.lproj/Localizable.strings"; sourceTree = ""; }; - F77439151FCD6C4A00662C46 /* es-CR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CR"; path = "es-CR.lproj/Localizable.strings"; sourceTree = ""; }; - F774391C1FCD6C6700662C46 /* es-DO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-DO"; path = "es-DO.lproj/Localizable.strings"; sourceTree = ""; }; - F77439231FCD6C8700662C46 /* es-EC */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-EC"; path = "es-EC.lproj/Localizable.strings"; sourceTree = ""; }; - F774392A1FCD6CAA00662C46 /* es-GT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-GT"; path = "es-GT.lproj/Localizable.strings"; sourceTree = ""; }; - F77439311FCD6CC400662C46 /* es-HN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-HN"; path = "es-HN.lproj/Localizable.strings"; sourceTree = ""; }; - F77439381FCD6CDE00662C46 /* es-NI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-NI"; path = "es-NI.lproj/Localizable.strings"; sourceTree = ""; }; - F774393F1FCD6D0B00662C46 /* es-PA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PA"; path = "es-PA.lproj/Localizable.strings"; sourceTree = ""; }; - F77439461FCD6D2300662C46 /* es-PE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PE"; path = "es-PE.lproj/Localizable.strings"; sourceTree = ""; }; - F774394D1FCD6D3E00662C46 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/Localizable.strings"; sourceTree = ""; }; - F77439541FCD6D6100662C46 /* es-PY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PY"; path = "es-PY.lproj/Localizable.strings"; sourceTree = ""; }; - F774395B1FCD6D8200662C46 /* es-SV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-SV"; path = "es-SV.lproj/Localizable.strings"; sourceTree = ""; }; - F77439621FCD6D9C00662C46 /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-UY"; path = "es-UY.lproj/Localizable.strings"; sourceTree = ""; }; F7743A112C33F0A20034F670 /* NCCollectionViewCommon+CollectionViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+CollectionViewDelegate.swift"; sourceTree = ""; }; F7743A132C33F13A0034F670 /* NCCollectionViewCommon+CollectionViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+CollectionViewDataSource.swift"; sourceTree = ""; }; F77444F322281649000D5EB0 /* NCMediaCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCMediaCell.swift; sourceTree = ""; }; @@ -1616,15 +1668,10 @@ F78B87E62B62527100C65ADC /* NCMediaDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMediaDataSource.swift; sourceTree = ""; }; F78B87E82B62550800C65ADC /* NCMediaDownloadThumbnail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMediaDownloadThumbnail.swift; sourceTree = ""; }; F78C6FDD296D677300C952C3 /* NCContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCContextMenu.swift; sourceTree = ""; }; - F78D6F461F0B7CB9002F9619 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; - F78D6F4D1F0B7CE4002F9619 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Localizable.strings"; sourceTree = ""; }; - F78D6F541F0B7D47002F9619 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; F78E2D6429AF02DB0024D4F3 /* Database.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = ""; }; F78F74332163757000C2ADAD /* NCTrash.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCTrash.storyboard; sourceTree = ""; }; F78F74352163781100C2ADAD /* NCTrash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCTrash.swift; sourceTree = ""; }; F790110D21415BF600D7B136 /* NCViewerRichDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewerRichDocument.swift; sourceTree = ""; }; - F79131C628AFB86E00577277 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Localizable.strings; sourceTree = ""; }; - F79131C728AFB86E00577277 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = ""; }; F794E13C2BBBFF2E003693D7 /* NCMainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMainTabBarController.swift; sourceTree = ""; }; F794E13E2BBC0F70003693D7 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; F799DF812C4B7DCC003410B5 /* NCSectionFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCSectionFooter.swift; sourceTree = ""; }; @@ -1638,9 +1685,6 @@ F79EDA9F26B004980007D134 /* NCPlayerToolBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCPlayerToolBar.swift; sourceTree = ""; }; F79EDAA126B004980007D134 /* NCPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCPlayer.swift; sourceTree = ""; }; F79FFB252A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCNetworkingE2EEMarkFolder.swift; sourceTree = ""; }; - F7A03E2E2D425A14007AA677 /* NCFavoriteNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCFavoriteNavigationController.swift; sourceTree = ""; }; - F7A03E322D426115007AA677 /* NCMoreNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMoreNavigationController.swift; sourceTree = ""; }; - F7A03E342D427308007AA677 /* NCMainNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMainNavigationController.swift; sourceTree = ""; }; F7A0D1342591FBC5008F8A13 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; F7A48414297028FC00BD1B49 /* Nextcloud Hub.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Nextcloud Hub.png"; sourceTree = SOURCE_ROOT; }; F7A509242C26BD5D00326106 /* NCCreateDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCreateDocument.swift; sourceTree = ""; }; @@ -1650,49 +1694,10 @@ F7A60F85292D215000FCE1F2 /* NCShareAccounts.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCShareAccounts.storyboard; sourceTree = ""; }; F7A7FDDB2C2DBD6200E9A93A /* NCDeepLinkHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCDeepLinkHandler.swift; sourceTree = ""; }; F7A846DD2BB01ACB0024816F /* NCTrashCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCTrashCellProtocol.swift; sourceTree = ""; }; - F7A8FD512C5E2557006C9CF8 /* NCAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCAccount.swift; sourceTree = ""; }; - F7AA41B827C7CF4600494705 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41B927C7CF4B00494705 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41BA27C7CF5000494705 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41BB27C7CF5100494705 /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41BC27C7CF5300494705 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; }; F7AA41BD27C7CF5400494705 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41BE27C7CF5600494705 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/InfoPlist.strings"; sourceTree = ""; }; F7AA41BF27C7CF5700494705 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C027C7CF5800494705 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41C127C7CF5900494705 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C227C7CF5A00494705 /* ka-GE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ka-GE"; path = "ka-GE.lproj/InfoPlist.strings"; sourceTree = ""; }; F7AA41C327C7CF5B00494705 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C427C7CF5C00494705 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C527C7CF5D00494705 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C627C7CF5E00494705 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C727C7CF6000494705 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41C827C7CF6200494705 /* es-HN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-HN"; path = "es-HN.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41C927C7CF6300494705 /* es-DO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-DO"; path = "es-DO.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41CA27C7CF6400494705 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41CB27C7CF6500494705 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41CC27C7CF6600494705 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41CD27C7CF6700494705 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41CE27C7CF6800494705 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41CF27C7CF6900494705 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41D027C7CF6900494705 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D127C7CF6A00494705 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41D227C7CF6C00494705 /* es-CO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CO"; path = "es-CO.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D327C7CF6D00494705 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/InfoPlist.strings"; sourceTree = ""; }; F7AA41D427C7CF6E00494705 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41D527C7CF6F00494705 /* es-CR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CR"; path = "es-CR.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D627C7CF7100494705 /* es-GT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-GT"; path = "es-GT.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D727C7CF7200494705 /* es-SV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-SV"; path = "es-SV.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D827C7CF7300494705 /* es-EC */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-EC"; path = "es-EC.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41D927C7CF7500494705 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41DA27C7CF7600494705 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = ""; }; - F7AA41DB27C7CF7800494705 /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-UY"; path = "es-UY.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41DC27C7CF7900494705 /* es-PE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PE"; path = "es-PE.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41DD27C7CF7B00494705 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41DE27C7CF7D00494705 /* es-PA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PA"; path = "es-PA.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41DF27C7CF7E00494705 /* es-PY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PY"; path = "es-PY.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41E027C7CF8000494705 /* es-NI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-NI"; path = "es-NI.lproj/InfoPlist.strings"; sourceTree = ""; }; - F7AA41E127C7CF8100494705 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/InfoPlist.strings"; sourceTree = ""; }; F7AC1CAF28AB94490032D99F /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; F7AC9349296193050002BC0F /* Reasons to use Nextcloud.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "Reasons to use Nextcloud.pdf"; sourceTree = SOURCE_ROOT; }; F7AE00F4230D5F9E007ACF8A /* NCLoginProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCLoginProvider.swift; sourceTree = ""; }; @@ -1705,59 +1710,18 @@ F7B6B70327C4E7FA00A7F6EB /* NCScan+CollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCScan+CollectionView.swift"; sourceTree = ""; }; F7B7504A2397D38E004E13EC /* UIImage+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; F7B769A72B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+Metadata+Session.swift"; sourceTree = ""; }; - F7B8B82F25681C3400967775 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; F7B934FD2BDCFE1E002B2FC9 /* NCDragDrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCDragDrop.swift; sourceTree = ""; }; F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCManageDatabase.swift; sourceTree = ""; }; - F7BB04851FD58ACB00BBFD2A /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Localizable.strings"; sourceTree = ""; }; F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCViewCertificateDetails.storyboard; sourceTree = ""; }; F7BC287F26663F85004D46C5 /* NCViewCertificateDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCViewCertificateDetails.swift; sourceTree = ""; }; F7BD09FF2C468925003A4A6D /* NCMedia+CollectionViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCMedia+CollectionViewDataSource.swift"; sourceTree = ""; }; F7BD0A012C4689A4003A4A6D /* NCMedia+CollectionViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCMedia+CollectionViewDelegate.swift"; sourceTree = ""; }; F7BD0A032C4689E9003A4A6D /* NCMedia+MediaLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCMedia+MediaLayout.swift"; sourceTree = ""; }; F7BE7C25290AC8C9002ABB61 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C27290ADEFD002ABB61 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C29290ADEFD002ABB61 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C2B290ADEFE002ABB61 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C2D290ADEFF002ABB61 /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C2F290ADF00002ABB61 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Intent.strings"; sourceTree = ""; }; F7BE7C31290ADF00002ABB61 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C33290ADF01002ABB61 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C35290ADF03002ABB61 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C37290ADF03002ABB61 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C39290ADF04002ABB61 /* es-UY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-UY"; path = "es-UY.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C3B290ADF04002ABB61 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C3D290ADF05002ABB61 /* es-PE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PE"; path = "es-PE.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C3F290ADF06002ABB61 /* es-PY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PY"; path = "es-PY.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C41290ADF06002ABB61 /* es-PA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PA"; path = "es-PA.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C43290ADF06002ABB61 /* es-NI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-NI"; path = "es-NI.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C45290ADF07002ABB61 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C47290ADF07002ABB61 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C49290ADF08002ABB61 /* es-HN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-HN"; path = "es-HN.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C4B290ADF09002ABB61 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C4D290ADF0A002ABB61 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C4F290ADF0A002ABB61 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Intent.strings"; sourceTree = ""; }; F7BE7C51290ADF0B002ABB61 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C53290ADF0B002ABB61 /* es-CL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CL"; path = "es-CL.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C55290ADF0C002ABB61 /* es-CO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CO"; path = "es-CO.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C57290ADF0C002ABB61 /* es-CR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-CR"; path = "es-CR.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C59290ADF0D002ABB61 /* es-DO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-DO"; path = "es-DO.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C5B290ADF0D002ABB61 /* es-EC */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-EC"; path = "es-EC.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C5D290ADF0E002ABB61 /* es-SV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-SV"; path = "es-SV.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C5F290ADF0E002ABB61 /* es-GT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-GT"; path = "es-GT.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C61290ADF10002ABB61 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Intent.strings"; sourceTree = ""; }; F7BE7C63290ADF10002ABB61 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C65290ADF10002ABB61 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C67290ADF11002ABB61 /* ka-GE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ka-GE"; path = "ka-GE.lproj/Intent.strings"; sourceTree = ""; }; F7BE7C69290ADF11002ABB61 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C6B290ADF12002ABB61 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C6D290ADF12002ABB61 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C6F290ADF13002ABB61 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C71290ADF13002ABB61 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C73290ADF14002ABB61 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C75290ADF14002ABB61 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C77290ADF15002ABB61 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Intent.strings; sourceTree = ""; }; - F7BE7C79290ADF16002ABB61 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Intent.strings"; sourceTree = ""; }; - F7BE7C7B290ADF16002ABB61 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Intent.strings"; sourceTree = ""; }; F7BF9D812934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+LayoutForView.swift"; sourceTree = ""; }; F7BFFD272C8846020029A201 /* NCHud.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCHud.swift; sourceTree = ""; }; F7C1EEA425053A9C00866ACC /* NCCollectionViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCollectionViewDataSource.swift; sourceTree = ""; }; @@ -1820,22 +1784,16 @@ F7D4BF282CA2E8D800A5E746 /* TOPasscodeSettingsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOPasscodeSettingsViewController.m; sourceTree = ""; }; F7D4BF292CA2E8D800A5E746 /* TOPasscodeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TOPasscodeViewController.h; sourceTree = ""; }; F7D4BF2A2CA2E8D800A5E746 /* TOPasscodeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOPasscodeViewController.m; sourceTree = ""; }; - F7D532461F5D4123006568B1 /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Localizable.strings; sourceTree = ""; }; F7D5324D1F5D4137006568B1 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; - F7D532541F5D4155006568B1 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Localizable.strings"; sourceTree = ""; }; - F7D5328F1F5D443B006568B1 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; - F7D532A41F5D4461006568B1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; F7D60CAE2C941ACB008FBFDD /* NCMediaPinchGesture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMediaPinchGesture.swift; sourceTree = ""; }; F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+DashboardWidget.swift"; sourceTree = ""; }; F7D890742BD25C570050B8A6 /* NCCollectionViewCommon+DragDrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCCollectionViewCommon+DragDrop.swift"; sourceTree = ""; }; - F7DE9AB01F482FA5008DFE10 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; F7E0710028B13BB00001B882 /* DashboardData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardData.swift; sourceTree = ""; }; F7E0CDCE265CE8610044854E /* NCUserStatus.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCUserStatus.storyboard; sourceTree = ""; }; F7E402282BA85D1D007E5609 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; F7E402302BA891EB007E5609 /* NCTrash+SelectTabBarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCTrash+SelectTabBarDelegate.swift"; sourceTree = ""; }; F7E402322BA89551007E5609 /* NCTrash+Networking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCTrash+Networking.swift"; sourceTree = ""; }; F7E41315294A19B300839300 /* UIView+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extension.swift"; sourceTree = ""; }; - F7E45E6D21E75BF200579249 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/Localizable.strings"; sourceTree = ""; }; F7E4D9C322ED929B003675FD /* NCShareCommentsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareCommentsCell.swift; sourceTree = ""; }; F7E7AEA42BA32C6500512E52 /* NCCollectionViewDownloadThumbnail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCollectionViewDownloadThumbnail.swift; sourceTree = ""; }; F7E7AEA62BA32D0000512E52 /* NCCollectionViewUnifiedSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCollectionViewUnifiedSearch.swift; sourceTree = ""; }; @@ -1866,12 +1824,10 @@ F7FA7FFF2C0F4F3B0072FC60 /* NCUploadAssetsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCUploadAssetsView.swift; sourceTree = ""; }; F7FAFD3928BFA947000777FE /* NCNotification+Menu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NCNotification+Menu.swift"; sourceTree = ""; }; F7FF2CB02842159500EBB7A1 /* NCSectionHeader.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCSectionHeader.xib; sourceTree = ""; }; + FC930DC42CEDE33000C9B237 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; + FC930DC62CEE377700C9B237 /* WidgetCommon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetCommon.swift; sourceTree = ""; }; /* End PBXFileReference section */ -/* Begin PBXFileSystemSynchronizedRootGroup section */ - AA517BB42D66149900F8D37C /* .tx */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = .tx; sourceTree = ""; }; -/* End PBXFileSystemSynchronizedRootGroup section */ - /* Begin PBXFrameworksBuildPhase section */ 2C33C47C23E2C475005F963B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; @@ -2002,20 +1958,27 @@ F7D56B1A2972405500FA46C4 /* Mantis in Frameworks */, F7ED547C25EEA65400956C55 /* QRCodeReader in Frameworks */, F788ECC7263AAAFA00ADC67F /* MarkdownKit in Frameworks */, + 3CEA5F122BFBBCAF0097E536 /* (null) in Frameworks */, + F3374AF02D78B01B002A38F9 /* BitCollections in Frameworks */, F77BC3EB293E5268005F2B08 /* Swifter in Frameworks */, F7BB7E4727A18C56009B9F29 /* Parchment in Frameworks */, F33EE6E12BF4BDA500CA1A51 /* NIOSSL in Frameworks */, F734B06628E75C0100E180D5 /* TLPhotoPicker in Frameworks */, + 625EC26E2C6CA285006411D1 /* FirebaseAnalytics in Frameworks */, F787AC09298BCB4A0001BB00 /* SVGKitSwift in Frameworks */, F760DE032AE66EA80027D78A /* KeychainAccess in Frameworks */, + F3374AF62D78B01B002A38F9 /* HashTreeCollections in Frameworks */, F33EE6F02BF4C0FF00CA1A51 /* NIO in Frameworks */, F3A0479E2BD268B500658E7B /* PopupView in Frameworks */, + F3374AF82D78B01B002A38F9 /* HeapModule in Frameworks */, F770768E263A8C3400A1BA94 /* FloatingPanel in Frameworks */, F758A01227A7F03E0069468B /* JGProgressHUD in Frameworks */, F77333882927A72100466E35 /* OpenSSL in Frameworks */, F753BA93281FD8020015BFB6 /* EasyTipView in Frameworks */, + F3374AF42D78B01B002A38F9 /* DequeModule in Frameworks */, F7160A822BE933390034DCB3 /* RealmSwift in Frameworks */, F76DA963277B760E0082465B /* Queuer in Frameworks */, + F3374AF22D78B01B002A38F9 /* Collections in Frameworks */, F72AD70D28C24B93006CB92D /* NextcloudKit in Frameworks */, F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */, F7A1050E29E587AF00FFD92B /* TagListView in Frameworks */, @@ -2042,6 +2005,31 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0F08D6B52C9426B800136502 /* Style */ = { + isa = PBXGroup; + children = ( + 0F08D6BA2C94275600136502 /* CircleItemSpinner.swift */, + ); + path = Style; + sourceTree = ""; + }; + 0F4374A92D8442BA0081F7C3 /* .tx */ = { + isa = PBXGroup; + children = ( + 0F4374A82D8442BA0081F7C3 /* config */, + ); + path = .tx; + sourceTree = ""; + }; + 0F5090CC2C786EC8009348D9 /* ActionsHeader */ = { + isa = PBXGroup; + children = ( + 0F5090CD2C786F04009348D9 /* FileActionsHeader.swift */, + 0F8B9A5A2C7887F60041C17D /* FileActionsHeader.xib */, + ); + path = ActionsHeader; + sourceTree = ""; + }; 2C33C48023E2C475005F963B /* Notification Service Extension */ = { isa = PBXGroup; children = ( @@ -2071,6 +2059,47 @@ path = Menu; sourceTree = ""; }; + 4240DB4C2C56446D00E72FC0 /* BurgerMenu */ = { + isa = PBXGroup; + children = ( + 4240DB4D2C5646B400E72FC0 /* BurgerMenuAttachController.swift */, + 4240DB4F2C5648E300E72FC0 /* BurgerMenuViewController.swift */, + 42678ABD2C57C5FB00307DEF /* BurgerMenuViewModel.swift */, + 4240DB512C5649A900E72FC0 /* BurgerMenuView.swift */, + ); + path = BurgerMenu; + sourceTree = ""; + }; + 426D0F862D2826B200F76A65 /* Toolbar */ = { + isa = PBXGroup; + children = ( + 426D0F872D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbar.swift */, + 421657AA2D2AF2BF003BC9D5 /* HiDriveCollectionViewCommonSelectToolbarDelegate.swift */, + 426D0F882D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbarView.swift */, + ); + path = Toolbar; + sourceTree = ""; + }; + 42C684B52CA1A17300DD46F0 /* Buttons */ = { + isa = PBXGroup; + children = ( + 42C684B62CA1A20100DD46F0 /* CommonButtonConstants.swift */, + D5C2D21E2C9DC0EF00E7579D /* PrimaryButton.swift */, + 42C684B32CA1806000DD46F0 /* SecondaryButton.swift */, + 4294B88A2CA5550B002E6FED /* LinkButton.swift */, + 0F08D6B82C94270600136502 /* ButtonStyleGuide.swift */, + ); + path = Buttons; + sourceTree = ""; + }; + 42F89EA82D71AD5400550A07 /* Recovered References */ = { + isa = PBXGroup; + children = ( + 625EC2702C6CAABD006411D1 /* GoogleService-Info.plist */, + ); + name = "Recovered References"; + sourceTree = ""; + }; AA3C85E92D36BBDE00F74F12 /* UITestBackend */ = { isa = PBXGroup; children = ( @@ -2142,6 +2171,7 @@ AA3C85E92D36BBDE00F74F12 /* UITestBackend */, AA8E03DB2D2FBAAD00E7E89C /* DownloadLimitUITests.swift */, F3374A932D674454002A38F9 /* AssistantUITests.swift */, + F33D303D2D8B129600531D64 /* AutoUploadUITests.swift */, AA74AA962D3172CE00BE3458 /* UITestError.swift */, ); path = NextcloudUITests; @@ -2155,6 +2185,26 @@ path = NextcloudIntegrationTests; sourceTree = ""; }; + D5C2D21D2C9DC0D800E7579D /* Components */ = { + isa = PBXGroup; + children = ( + 42C684B52CA1A17300DD46F0 /* Buttons */, + ); + path = Components; + sourceTree = ""; + }; + D5E1D4FA2CF4A86F00813AB6 /* DataProtection */ = { + isa = PBXGroup; + children = ( + D5E1D4FB2CF4A99200813AB6 /* DataProtectionAgreementScreen.swift */, + D5E1D4FD2CF4E7C600813AB6 /* DataProtectionSettingsScreen.swift */, + D5E1D4FF2CF4EB3900813AB6 /* DataProtectionModel.swift */, + D5E1D5032CF665C100813AB6 /* DataProtectionHostingController.swift */, + D59793B52CF7A73A00C44F4E /* DataProtectionAgreementManager.swift */, + ); + path = DataProtection; + sourceTree = ""; + }; F30A962A2A27A9C800D7BCFE /* Tests */ = { isa = PBXGroup; children = ( @@ -2177,6 +2227,16 @@ path = Components; sourceTree = ""; }; + F389C9F32CEE381E00049762 /* SelectAlbum */ = { + isa = PBXGroup; + children = ( + F3CA337C2D0B2B6A00672333 /* AlbumModel.swift */, + F389C9F42CEE383300049762 /* SelectAlbumView.swift */, + F3C587AD2D47E4FE004532DB /* PHAssetCollectionThumbnailLoader.swift */, + ); + path = SelectAlbum; + sourceTree = ""; + }; F3A0478E2BD2668800658E7B /* Assistant */ = { isa = PBXGroup; children = ( @@ -2242,10 +2302,11 @@ F75B0ABC244C4DBB00E58DCA /* NCActionCenter.swift */, F7B934FD2BDCFE1E002B2FC9 /* NCDragDrop.swift */, F7682FDF23C36B0500983A04 /* NCMainTabBar.swift */, + 0F8615AB2CBE6AC20056B4F2 /* UITabBarGuideline.swift */, F794E13C2BBBFF2E003693D7 /* NCMainTabBarController.swift */, F737DA9C2B7B893C0063BAFC /* NCPasscode.swift */, F77444F7222816D5000D5EB0 /* NCPickerViewController.swift */, - F7A03E342D427308007AA677 /* NCMainNavigationController.swift */, + 42E5D36A2D678F95007150DE /* HiDriveMainNavigationController.swift */, ); path = Main; sourceTree = ""; @@ -2364,6 +2425,7 @@ AF2D7C7D2742559100ADF566 /* NCShareUserCell.swift */, AF93471727E2361E002537EE /* NCShareHeader.xib */, AF93471527E2361E002537EE /* NCShareHeader.swift */, + 42D34FD82D79A5B00020C106 /* ShareSearchField.swift */, AFCE353827E5DE0400FEA6C2 /* Shareable.swift */, AA8E03D92D2ED83300E7E89C /* TransientShare.swift */, ); @@ -2404,6 +2466,7 @@ isa = PBXGroup; children = ( F7346E2228B0FEBA006CE2D2 /* Assets.xcassets */, + FC930DC42CEDE33000C9B237 /* Colors.xcassets */, F72EA95528B7BAD100C88F0C /* Dashboard */, F72EA95628B7BAE700C88F0C /* Files */, F76DEE9A28F808BC0041B1C9 /* Lockscreen */, @@ -2411,6 +2474,7 @@ F75DD764290AB369002EB562 /* Intent */, F7346E2028B0FA3A006CE2D2 /* Widget-Brinding-header.h */, F7346E1528B0EF5C006CE2D2 /* Widget.swift */, + FC930DC62CEE377700C9B237 /* WidgetCommon.swift */, ); path = Widget; sourceTree = ""; @@ -2506,9 +2570,11 @@ F7603298252F0E550015A421 /* Collection Common */ = { isa = PBXGroup; children = ( + 0F5090CC2C786EC8009348D9 /* ActionsHeader */, F75FE06B2BB01D0D00A0EFEF /* Cell */, F78ACD50219046AC0088454D /* Section Header Footer */, F70D7C3525FFBF81002B9E34 /* NCCollectionViewCommon.swift */, + 42F89EB02D71F30C00550A07 /* NCCollectionViewCommon+FileActionsHeader.swift */, F7743A132C33F13A0034F670 /* NCCollectionViewCommon+CollectionViewDataSource.swift */, F74D50342C9855A000BBBF4C /* NCCollectionViewCommon+CollectionViewDataSourcePrefetching.swift */, F7743A112C33F0A20034F670 /* NCCollectionViewCommon+CollectionViewDelegate.swift */, @@ -2519,7 +2585,6 @@ F778231D2C42C07C001BB94F /* NCCollectionViewCommon+MediaLayout.swift */, F36E64F62B9245210085ABB5 /* NCCollectionViewCommon+SelectTabBar.swift */, F7D4BF002CA1831600A5E746 /* NCCollectionViewCommonPinchGesture.swift */, - F38F71242B6BBDC300473CDC /* NCCollectionViewCommonSelectTabBar.swift */, F7C1EEA425053A9C00866ACC /* NCCollectionViewDataSource.swift */, F7E7AEA42BA32C6500512E52 /* NCCollectionViewDownloadThumbnail.swift */, F7E7AEA62BA32D0000512E52 /* NCCollectionViewUnifiedSearch.swift */, @@ -2561,6 +2626,7 @@ children = ( F768820B2C0DD1E7001CF441 /* Settings */, F76882162C0DD1E7001CF441 /* AutoUpload */, + F389C9F32CEE381E00049762 /* SelectAlbum */, F768821C2C0DD1E7001CF441 /* Display */, F76882052C0DD1E7001CF441 /* Advanced */, F768821F2C0DD1E7001CF441 /* Helpers */, @@ -2615,6 +2681,7 @@ F76882162C0DD1E7001CF441 /* AutoUpload */ = { isa = PBXGroup; children = ( + F39A1EE12D0AF8A200DAD522 /* Albums.swift */, F76882172C0DD1E7001CF441 /* NCAutoUploadModel.swift */, F768821B2C0DD1E7001CF441 /* NCAutoUploadView.swift */, ); @@ -2701,7 +2768,6 @@ children = ( F7725A5F251F33BB00D125E0 /* NCFiles.storyboard */, F7725A5E251F33BB00D125E0 /* NCFiles.swift */, - F722133A2D40EF8C002F7438 /* NCFilesNavigationController.swift */, ); path = Files; sourceTree = ""; @@ -2752,7 +2818,6 @@ AF3FDCC12796ECC300710F60 /* NCTrash+CollectionView.swift */, F7E402322BA89551007E5609 /* NCTrash+Networking.swift */, F7E402302BA891EB007E5609 /* NCTrash+SelectTabBarDelegate.swift */, - F321DA892B71205A00DDA0E6 /* NCTrashSelectTabBar.swift */, ); path = Trash; sourceTree = ""; @@ -2841,8 +2906,10 @@ F77BB747289985270090FC19 /* UITabBarController+Extension.swift */, AFCE353227E4ED1900FEA6C2 /* UIToolbar+Extension.swift */, F7E41315294A19B300839300 /* UIView+Extension.swift */, + 4232DC092C9D7C44008D546D /* UIView+GridSelection.swift */, F77BB745289984CA0090FC19 /* UIViewController+Extension.swift */, F7E8A390295DC5E0006CB2D0 /* View+Extension.swift */, + 42F907DD2D2C424100BCDC36 /* View+Design.swift */, ); path = Extensions; sourceTree = ""; @@ -2852,7 +2919,6 @@ children = ( F717402B24F699A5000C87D5 /* NCFavorite.storyboard */, F717402C24F699A5000C87D5 /* NCFavorite.swift */, - F7A03E2E2D425A14007AA677 /* NCFavoriteNavigationController.swift */, ); path = Favorites; sourceTree = ""; @@ -2951,6 +3017,7 @@ F702F2FC25EE5D2C008F8E80 /* NYMnemonic */, F7D4BF2B2CA2E8D800A5E746 /* TOPasscodeViewController */, F76D364528A4F8BF00214537 /* NCActivityIndicator.swift */, + 422CA3EE2C932F7200241F29 /* AccountButtonFactory.swift */, F733598025C1C188002ABA72 /* NCAskAuthorization.swift */, F77C97382953131000FDDD09 /* NCCameraRoll.swift */, F765608E23BF813500765969 /* NCContentPresenter.swift */, @@ -2968,6 +3035,7 @@ F33EE6F12BF4C9B200CA1A51 /* PKCS12.swift */, F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */, F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */, + 0F5219402DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift */, ); path = Utility; sourceTree = ""; @@ -3061,7 +3129,6 @@ F3BB46502A39EC2D00461F6E /* Cells */, F7CB68992541676B0050EC94 /* NCMore.storyboard */, F73F537E1E929C8500F8678D /* NCMore.swift */, - F7A03E322D426115007AA677 /* NCMoreNavigationController.swift */, ); path = More; sourceTree = ""; @@ -3172,6 +3239,7 @@ F7E9C41320F4CA870040CF18 /* Transfers */ = { isa = PBXGroup; children = ( + 425AD0C22DB8CC040063F2ED /* TransfersListener.swift */, F760329D252F0F8E0015A421 /* NCTransferCell.swift */, F760329E252F0F8E0015A421 /* NCTransferCell.xib */, F74DE14225135B6800917068 /* NCTransfers.storyboard */, @@ -3196,7 +3264,7 @@ F7D60CAE2C941ACB008FBFDD /* NCMediaPinchGesture.swift */, F78B87E82B62550800C65ADC /* NCMediaDownloadThumbnail.swift */, F755CB3F2B8CB13C00CE27E9 /* NCMediaLayout.swift */, - F741C2232B6B9FD600E849BB /* NCMediaSelectTabBar.swift */, + 420113DB2D1303E00063BF54 /* NCMediaSelectTabBar.swift */, ); path = Media; sourceTree = ""; @@ -3237,7 +3305,6 @@ isa = PBXGroup; children = ( AA8E041E2D3114E200E7E89C /* README.md */, - F7B8B82F25681C3400967775 /* GoogleService-Info.plist */, F7C1CDD91E6DFC6F005D92BE /* Brand */, F7F67BAA1A24D27800EE80DA /* iOSClient */, F7F67BAB1A24D27800EE80DA /* Supporting Files */, @@ -3258,24 +3325,33 @@ F70716E32987F81500E72C1D /* File Provider Extension UI.appex */, C04E2F202A17BB4D001BAD85 /* NextcloudIntegrationTests.xctest */, C0046CDA2A17B98400D87C9D /* NextcloudUITests.xctest */, + 42F89EA82D71AD5400550A07 /* Recovered References */, ); sourceTree = ""; }; F7F67BAA1A24D27800EE80DA /* iOSClient */ = { isa = PBXGroup; children = ( - AA517BB42D66149900F8D37C /* .tx */, + 426D0F862D2826B200F76A65 /* Toolbar */, + D5E1D4FA2CF4A86F00813AB6 /* DataProtection */, + D5C2D21D2C9DC0D800E7579D /* Components */, + 0F4374A92D8442BA0081F7C3 /* .tx */, F702F2CC25EE5B4F008F8E80 /* AppDelegate.swift */, F794E13E2BBC0F70003693D7 /* SceneDelegate.swift */, F77DD6A72C5CC093009448FB /* NCSession.swift */, - F7A8FD512C5E2557006C9CF8 /* NCAccount.swift */, F7401C142C75E6F300649E87 /* NCCapabilities.swift */, F76B649B2ADFFAED00014640 /* NCImageCache.swift */, + D5C5133A2C91970B00AE35CA /* NCImagesRepository.swift */, F702F2CE25EE5B5C008F8E80 /* NCGlobal.swift */, + 428C41672D15862700F3A917 /* NCAccount.swift */, F7E402282BA85D1D007E5609 /* PrivacyInfo.xcprivacy */, F73CB5771ED46807005F2A5A /* NCBridgeSwift.h */, F70F96AF2874394B006C8379 /* Nextcloud-Bridging-Header.h */, F7F67BB81A24D27800EE80DA /* Images.xcassets */, + 425F57AE2D2E83DA006D5FD1 /* IonosImages.xcassets */, + 42F5047F2C6F553D001AA432 /* Colors.xcassets */, + 0F08D6B52C9426B800136502 /* Style */, + 4240DB4C2C56446D00E72FC0 /* BurgerMenu */, F769CA1B2966EF4F00039397 /* GUI */, F70211F31BAC56E9003FC03E /* Main */, F7CA213725F1372B00826ABB /* Account Request */, @@ -3587,6 +3663,7 @@ F77B0F981D118A16002130FE /* Embed Foundation Extensions */, AFBFD01327551A54002244BC /* ShellScript */, F76DA934277B75710082465B /* Embed Frameworks */, + D5FE6AC22C88A5AC0071802E /* Run Script Firebase dSYM upload */, ); buildRules = ( ); @@ -3627,6 +3704,12 @@ F33EE6E02BF4BDA500CA1A51 /* NIOSSL */, F33EE6EF2BF4C0FF00CA1A51 /* NIO */, F7D4BF532CA2ED9D00A5E746 /* VLCKitSPM */, + 625EC26D2C6CA285006411D1 /* FirebaseAnalytics */, + F3374AEF2D78B01B002A38F9 /* BitCollections */, + F3374AF12D78B01B002A38F9 /* Collections */, + F3374AF32D78B01B002A38F9 /* DequeModule */, + F3374AF52D78B01B002A38F9 /* HashTreeCollections */, + F3374AF72D78B01B002A38F9 /* HeapModule */, ); productName = "Crypto Cloud"; productReference = F7CE8AFA1DC1F8D8009CAE48 /* Nextcloud.app */; @@ -3664,12 +3747,11 @@ attributes = { BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1620; - ORGANIZATIONNAME = "Marino Faggiana"; + LastUpgradeCheck = 1400; + ORGANIZATIONNAME = "STRATO GmbH"; TargetAttributes = { 2C33C47E23E2C475005F963B = { CreatedOnToolsVersion = 11.3.1; - ProvisioningStyle = Automatic; }; AF8ED1F82757821000B8DBC4 = { CreatedOnToolsVersion = 13.1; @@ -3703,11 +3785,9 @@ F771E3CF20E2392D00AFB62D = { CreatedOnToolsVersion = 9.4.1; LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; }; F77B0DEB1D118A16002130FE = { LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.Push = { enabled = 1; @@ -3731,51 +3811,51 @@ Base, de, fr, - "pt-BR", - ru, - it, - tr, - "es-MX", - "nb-NO", - pl, - sv, es, - is, nl, - "sk-SK", - "en-GB", + eu, + ca, "zh-Hans", + "zh-Hant-TW", + hr, + "cs-CZ", + da, + "en-GB", + gl, "ka-GE", + el, hu, - "zh-Hant-TW", + is, + it, + "ja-JP", + ko, + lo, + "nb-NO", + pl, + "pt-PT", + "pt-BR", + ru, sr, + "sk-SK", + sl, "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", + "es-SV", "es-GT", "es-HN", + "es-419", + "es-MX", "es-NI", "es-PA", + "es-PY", "es-PE", "es-PR", - "es-PY", - "es-SV", "es-UY", - "cs-CZ", - ko, - "es-419", - "pt-PT", - "ja-JP", - gl, - ca, - da, - eu, - sl, - hr, - lo, - el, + sv, + tr, ); mainGroup = F7F67B9F1A24D27800EE80DA; packageReferences = ( @@ -3806,6 +3886,7 @@ F33EE6DF2BF4BDA500CA1A51 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */, F33EE6EE2BF4C0FF00CA1A51 /* XCRemoteSwiftPackageReference "swift-nio" */, F7D4BF4E2CA2ECCB00A5E746 /* XCRemoteSwiftPackageReference "vlckit-spm" */, + F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */, ); productRefGroup = F7F67B9F1A24D27800EE80DA; projectDirPath = ""; @@ -3830,6 +3911,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 62A63F302C8AF7730048653E /* Colors.xcassets in Resources */, F7E4022F2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, F746EC53273906C50052598D /* NCViewCertificateDetails.storyboard in Resources */, ); @@ -3872,6 +3954,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 42D3D0972C94284C008A5AD4 /* Colors.xcassets in Resources */, + 425F57B12D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */, F714803B262EBE3900693E51 /* MainInterface.storyboard in Resources */, F7148054262ED51000693E51 /* NCListCell.xib in Resources */, F7D57C8626317BDA00DE301D /* NCAccountRequest.storyboard in Resources */, @@ -3896,7 +3980,9 @@ files = ( F7C7B25128B8B0C400E7115D /* Images.xcassets in Resources */, F7C7B25028B8AD4500E7115D /* Localizable.strings in Resources */, + FC930DC52CEDE33000C9B237 /* Colors.xcassets in Resources */, F7E4022A2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, + 425F57B02D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */, AA517B832D660EFE00F8D37C /* Localizable.stringsdict in Resources */, F7346E2328B0FEBA006CE2D2 /* Assets.xcassets in Resources */, ); @@ -3934,6 +4020,7 @@ F765F73225237E3F00391DBE /* NCRecent.storyboard in Resources */, F78F74342163757000C2ADAD /* NCTrash.storyboard in Resources */, F702F30225EE5D2C008F8E80 /* english.txt in Resources */, + 0F8B9A5B2C7887F60041C17D /* FileActionsHeader.xib in Resources */, F757CC8C29E82D0500F31428 /* NCGroupfolders.storyboard in Resources */, F79A65C32191D90F00FF6DCC /* NCSelect.storyboard in Resources */, F7226EDC1EE4089300EBECB1 /* Main.storyboard in Resources */, @@ -3948,7 +4035,6 @@ F7A48415297028FC00BD1B49 /* Nextcloud Hub.png in Resources */, F74C0437253F1CDC009762AB /* NCShares.storyboard in Resources */, F7F4F10C27ECDBDB008676F9 /* Inconsolata-Regular.ttf in Resources */, - F7B8B83025681C3400967775 /* GoogleService-Info.plist in Resources */, F7381EE5218218C9000B1560 /* NCOffline.storyboard in Resources */, F768822D2C0DD1E7001CF441 /* Acknowledgements.rtf in Resources */, F7E0CDCF265CE8610044854E /* NCUserStatus.storyboard in Resources */, @@ -3974,6 +4060,7 @@ F7E402292BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, F7C9555321F0C4CA0024296E /* NCActivity.storyboard in Resources */, F7BC287E26663F6C004D46C5 /* NCViewCertificateDetails.storyboard in Resources */, + 625EC2712C6CAABD006411D1 /* GoogleService-Info.plist in Resources */, F78ACD54219047D40088454D /* NCSectionFooter.xib in Resources */, F751247E2C42919C00E63DB8 /* NCPhotoCell.xib in Resources */, F704B5E32430AA6F00632F5F /* NCCreateFormUploadConflict.storyboard in Resources */, @@ -3988,6 +4075,9 @@ F774264A22EB4D0000B23912 /* NCSearchUserDropDownCell.xib in Resources */, F7CB689A2541676B0050EC94 /* NCMore.storyboard in Resources */, F77B0F7D1D118A16002130FE /* Images.xcassets in Resources */, + 425F57AF2D2E83DB006D5FD1 /* IonosImages.xcassets in Resources */, + 42F504802C6F553D001AA432 /* Colors.xcassets in Resources */, + F768822B2C0DD1E7001CF441 /* (null) in Resources */, F73CB3B222E072A000AD728E /* NCShareHeaderView.xib in Resources */, F7AE00FA230E81EB007ACF8A /* NCBrowserWeb.storyboard in Resources */, F7EDE514262DC2CD00414FE6 /* NCSelectCommandViewSelect+CreateFolder.xib in Resources */, @@ -4027,6 +4117,25 @@ shellPath = /bin/sh; shellScript = "if test -d \"/opt/homebrew/bin/\"; then\n PATH=\"/opt/homebrew/bin/:${PATH}\"\nfi\n\nexport PATH\n\nif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; + D5FE6AC22C88A5AC0071802E /* Run Script Firebase dSYM upload */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run Script Firebase dSYM upload"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "${BUILD_DIR%Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -4122,6 +4231,7 @@ AA3C85F22D394B3A00F74F12 /* DownloadLimitResponse.swift in Sources */, F3374A962D6744A4002A38F9 /* BaseUIXCTestCase.swift in Sources */, F37208812BAB5979006B5430 /* TestConstants.swift in Sources */, + F33D303E2D8B129600531D64 /* AutoUploadUITests.swift in Sources */, AABD0C9B2D5F73FC00F009E6 /* Placeholder.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -4174,6 +4284,7 @@ F7490E6C29882AEA009DCE94 /* String+Extension.swift in Sources */, F7490E6B29882A92009DCE94 /* NCGlobal.swift in Sources */, F7490E7529882BE2009DCE94 /* NCManageDatabase+Directory.swift in Sources */, + 6256F5452C98467B0032A1CF /* View+Extension.swift in Sources */, F7864AD12A78FE73004870E0 /* NCManageDatabase+LocalFile.swift in Sources */, F73EF7EC2B0226B90087E6E9 /* NCManageDatabase+UserStatus.swift in Sources */, F7490E8729882CA8009DCE94 /* ThreadSafeDictionary.swift in Sources */, @@ -4203,6 +4314,7 @@ F7245925289BB59100474787 /* ThreadSafeDictionary.swift in Sources */, F7BF9D852934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */, F79EC78926316AC4004E59D6 /* NCPopupViewController.swift in Sources */, + 62A63F2E2C8AF5320048653E /* View+Extension.swift in Sources */, F7C30DFB291BCF790017149B /* NCNetworkingE2EECreateFolder.swift in Sources */, F73EF7DA2B0226080087E6E9 /* NCManageDatabase+Tip.swift in Sources */, F79ED0F32D2FCA7100A389D9 /* NCRecommendationsCell.swift in Sources */, @@ -4225,6 +4337,8 @@ F73EF7EA2B0226B90087E6E9 /* NCManageDatabase+UserStatus.swift in Sources */, F359D86A2A7D03420023F405 /* NCUtility+Exif.swift in Sources */, F7B769AB2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */, + 6256F5442C98466D0032A1CF /* View+Extension.swift in Sources */, + D5C5133E2C919B8500AE35CA /* NCImagesRepository.swift in Sources */, F7E98C1727E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */, F79ED0F12D2FCA5B00A389D9 /* NCSectionFirstHeader.swift in Sources */, F79B646126CA661600838ACA /* UIControl+Extension.swift in Sources */, @@ -4293,6 +4407,7 @@ F757CC8529E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */, F768823A2C0DD230001CF441 /* NCKeychain.swift in Sources */, F737DA9E2B7B893C0063BAFC /* NCPasscode.swift in Sources */, + 4232DC0B2C9D7C44008D546D /* UIView+GridSelection.swift in Sources */, F7817D0129802D5F00FFBC65 /* NCViewCertificateDetails.swift in Sources */, F7D57C8B26317BDE00DE301D /* NCAccountRequest.swift in Sources */, F7C30DF7291BC0D30017149B /* NCNetworkingE2EEUpload.swift in Sources */, @@ -4341,6 +4456,7 @@ F713FBE62C31646400F10760 /* NCNetworking+AsyncAwait.swift in Sources */, F711A4E92AF9327600095DD8 /* UIImage+animatedGIF.m in Sources */, F73EF7D02B0225BA0087E6E9 /* NCManageDatabase+Tag.swift in Sources */, + FC930DC72CEE377700C9B237 /* WidgetCommon.swift in Sources */, F783030228B4C4B800B84583 /* NCUtility.swift in Sources */, F7F3E58C2D3BB65600A32B14 /* NCNetworking+Recommendations.swift in Sources */, F711D63128F44801003F43C8 /* IntentHandler.swift in Sources */, @@ -4458,6 +4574,7 @@ F73EF7C32B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */, F7C9B9212B582F550064EA91 /* NCManageDatabase+SecurityGuard.swift in Sources */, F359D86B2A7D03420023F405 /* NCUtility+Exif.swift in Sources */, + 6256F5462C9846DE0032A1CF /* View+Extension.swift in Sources */, F7864AD02A78FE73004870E0 /* NCManageDatabase+LocalFile.swift in Sources */, F7327E402B73B92800A462C7 /* NCNetworking+Synchronization.swift in Sources */, AF4BF61B27562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */, @@ -4528,16 +4645,19 @@ F73EF7D72B0226080087E6E9 /* NCManageDatabase+Tip.swift in Sources */, F3374A842D64AC31002A38F9 /* AssistantLabelStyle.swift in Sources */, F74BAE172C7E2F4E0028D4FA /* FileProviderDomain.swift in Sources */, + 4232DC0A2C9D7C44008D546D /* UIView+GridSelection.swift in Sources */, + D5E1D5002CF4EB3900813AB6 /* DataProtectionModel.swift in Sources */, F76882402C0DD30B001CF441 /* ViewOnAppear.swift in Sources */, F790110E21415BF600D7B136 /* NCViewerRichDocument.swift in Sources */, F78ACD4021903CC20088454D /* NCGridCell.swift in Sources */, + 422CA3EF2C932F7200241F29 /* AccountButtonFactory.swift in Sources */, F7D890752BD25C570050B8A6 /* NCCollectionViewCommon+DragDrop.swift in Sources */, F7BD0A042C4689E9003A4A6D /* NCMedia+MediaLayout.swift in Sources */, F761856B29E98543006EB3B0 /* NCIntroViewController.swift in Sources */, F7743A142C33F13A0034F670 /* NCCollectionViewCommon+CollectionViewDataSource.swift in Sources */, F75B0ABD244C4DBB00E58DCA /* NCActionCenter.swift in Sources */, + 4240DB4E2C5646B400E72FC0 /* BurgerMenuAttachController.swift in Sources */, AF935067276B84E700BD078F /* NCMenu+FloatingPanel.swift in Sources */, - F321DA8A2B71205A00DDA0E6 /* NCTrashSelectTabBar.swift in Sources */, F76882282C0DD1E7001CF441 /* NCEndToEndInitialize.swift in Sources */, F702F2CD25EE5B4F008F8E80 /* AppDelegate.swift in Sources */, F769454022E9F077000A798A /* NCSharePaging.swift in Sources */, @@ -4572,27 +4692,32 @@ F70753F12542A9A200972D44 /* NCViewerMedia.swift in Sources */, F799DF822C4B7DCC003410B5 /* NCSectionFooter.swift in Sources */, F76B649C2ADFFAED00014640 /* NCImageCache.swift in Sources */, + 0F5219412DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift in Sources */, F78A18B823CDE2B300F681F3 /* NCViewerRichWorkspace.swift in Sources */, F768822E2C0DD1E7001CF441 /* NCSettingsBundleHelper.swift in Sources */, F7A60F86292D215000FCE1F2 /* NCShareAccounts.swift in Sources */, F72408332B8A27C900F128E2 /* NCMedia+Command.swift in Sources */, F755CB402B8CB13C00CE27E9 /* NCMediaLayout.swift in Sources */, + 426D0F892D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbar.swift in Sources */, + 426D0F8A2D2826D600F76A65 /* HiDriveCollectionViewCommonSelectToolbarView.swift in Sources */, F73EF7B72B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */, AF4BF61927562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */, F73EF7E72B0226B90087E6E9 /* NCManageDatabase+UserStatus.swift in Sources */, F78A18B623CDD07D00F681F3 /* NCViewerRichWorkspaceWebView.swift in Sources */, AFA2AC8527849604008E1EA7 /* NCActivityCommentView.swift in Sources */, AFCE353727E4ED7B00FEA6C2 /* NCShareCells.swift in Sources */, + 0F5090CE2C786F04009348D9 /* FileActionsHeader.swift in Sources */, AF36077127BFA4E8001A243D /* ParallelWorker.swift in Sources */, F75A9EE623796C6F0044CFCE /* NCNetworking.swift in Sources */, AA8D31552D41052300FE2775 /* NCManageDatabase+DownloadLimit.swift in Sources */, F758B460212C56A400515F55 /* NCScan.swift in Sources */, + 42D6C0AD2C6B8FA800DF5543 /* NCKeychain.swift in Sources */, F76882262C0DD1E7001CF441 /* NCSettingsView.swift in Sources */, F78ACD52219046DC0088454D /* NCSectionFirstHeader.swift in Sources */, + 42D34FD92D79A5B00020C106 /* ShareSearchField.swift in Sources */, F72944F52A8424F800246839 /* NCEndToEndMetadataV1.swift in Sources */, F710D2022405826100A6033D /* NCViewer+Menu.swift in Sources */, F765E9CD295C585800A09ED8 /* NCUploadScanDocument.swift in Sources */, - F741C2242B6B9FD600E849BB /* NCMediaSelectTabBar.swift in Sources */, F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */, F7BF9D822934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */, AA8D31662D411FA100FE2775 /* NCShareDateCell.swift in Sources */, @@ -4604,6 +4729,7 @@ F78A10BF29322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */, F7743A122C33F0A20034F670 /* NCCollectionViewCommon+CollectionViewDelegate.swift in Sources */, F7D60CAF2C941ACB008FBFDD /* NCMediaPinchGesture.swift in Sources */, + 0F08D6B92C94270600136502 /* ButtonStyleGuide.swift in Sources */, F704B5E92430C0B800632F5F /* NCCreateFormUploadConflictCell.swift in Sources */, F7327E3D2B73B92800A462C7 /* NCNetworking+Synchronization.swift in Sources */, F72D404923D2082500A97FD0 /* NCViewerNextcloudText.swift in Sources */, @@ -4649,13 +4775,17 @@ F7F3E58E2D3BB65600A32B14 /* NCNetworking+Recommendations.swift in Sources */, F7A0D1352591FBC5008F8A13 /* String+Extension.swift in Sources */, F7CEE6012BA9A5C9003EFD89 /* NCTrashGridCell.swift in Sources */, + 42678ABE2C57C5FB00307DEF /* BurgerMenuViewModel.swift in Sources */, + 0F08D6BB2C94275600136502 /* CircleItemSpinner.swift in Sources */, F7F9D1BB25397CE000D9BFF5 /* NCViewer.swift in Sources */, F7E7AEA52BA32C6500512E52 /* NCCollectionViewDownloadThumbnail.swift in Sources */, AF730AF827834B1400B7520E /* NCShare+NCCellDelegate.swift in Sources */, F70460522499061800BB98A7 /* NotificationCenter+MainThread.swift in Sources */, + F3C587AE2D47E4FE004532DB /* PHAssetCollectionThumbnailLoader.swift in Sources */, F78F74362163781100C2ADAD /* NCTrash.swift in Sources */, F39298972A3B12CB00509762 /* BaseNCMoreCell.swift in Sources */, AF2D7C7C2742556F00ADF566 /* NCShareLinkCell.swift in Sources */, + 428C41682D15862700F3A917 /* NCAccount.swift in Sources */, F73EF7C72B0225610087E6E9 /* NCManageDatabase+PhotoLibrary.swift in Sources */, F7E41316294A19B300839300 /* UIView+Extension.swift in Sources */, F7C30E00291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */, @@ -4663,25 +4793,32 @@ AFCE353327E4ED1900FEA6C2 /* UIToolbar+Extension.swift in Sources */, 8491B1CD273BBA82001C8C5B /* UIViewController+Menu.swift in Sources */, F73EF7BF2B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */, + F39A1EE22D0AF8A400DAD522 /* Albums.swift in Sources */, F71F6D072B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */, + D5C2D21F2C9DC0EF00E7579D /* PrimaryButton.swift in Sources */, F761856C29E98543006EB3B0 /* NCIntroCollectionViewCell.swift in Sources */, + 4240DB522C5649A900E72FC0 /* BurgerMenuView.swift in Sources */, F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */, F7D4BF012CA1831900A5E746 /* NCCollectionViewCommonPinchGesture.swift in Sources */, F74B6D952A7E239A00F03C5F /* NCManageDatabase+Chunk.swift in Sources */, - F7A8FD522C5E2557006C9CF8 /* NCAccount.swift in Sources */, + F7A8FD522C5E2557006C9CF8 /* (null) in Sources */, F310B1EF2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift in Sources */, F702F2F725EE5CED008F8E80 /* NCLogin.swift in Sources */, + 425AD0C32DB8CC240063F2ED /* TransfersListener.swift in Sources */, F7EB9B132BBC12F300EDF036 /* UIApplication+Extension.swift in Sources */, F75D90212D2BE26F003E740B /* NCRecommendationsCell.swift in Sources */, F7E98C1627E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */, F7F4F11227ECDC52008676F9 /* UIFont+Extension.swift in Sources */, + D5C5133B2C91970B00AE35CA /* NCImagesRepository.swift in Sources */, F76882222C0DD1E7001CF441 /* NCCapabilitiesView.swift in Sources */, + F3CA337D2D0B2B6C00672333 /* AlbumModel.swift in Sources */, AF93471A27E2361E002537EE /* NCShareHeader.swift in Sources */, F7F878AE1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */, F7A7FDDD2C2DBD6200E9A93A /* NCDeepLinkHandler.swift in Sources */, F778231E2C42C07C001BB94F /* NCCollectionViewCommon+MediaLayout.swift in Sources */, 3781B9B023DB2B7E006B4B1D /* AppDelegate+Menu.swift in Sources */, F710D1F52405770F00A6033D /* NCViewerPDF.swift in Sources */, + F389C9F52CEE383300049762 /* SelectAlbumView.swift in Sources */, F7B6B70427C4E7FA00A7F6EB /* NCScan+CollectionView.swift in Sources */, F7816EF22C2C3E1F00A52517 /* NCPushNotification.swift in Sources */, F76882342C0DD1E7001CF441 /* NCDisplayView.swift in Sources */, @@ -4695,16 +4832,19 @@ F713FF002472764100214AF6 /* UIImage+animatedGIF.m in Sources */, AFCE353527E4ED5900FEA6C2 /* DateFormatter+Extension.swift in Sources */, F718C24E254D507B00C5C256 /* NCViewerMediaDetailView.swift in Sources */, + D5E1D5042CF665C100813AB6 /* DataProtectionHostingController.swift in Sources */, F33EE6F22BF4C9B200CA1A51 /* PKCS12.swift in Sources */, F7145610296433C80038D028 /* NCDocumentCamera.swift in Sources */, F76882312C0DD1E7001CF441 /* NCFileNameView.swift in Sources */, F7381EE1218218C9000B1560 /* NCOffline.swift in Sources */, F751247C2C42919C00E63DB8 /* NCPhotoCell.swift in Sources */, F7A509252C26BD5D00326106 /* NCCreateDocument.swift in Sources */, + 0F8615AC2CBE6AC20056B4F2 /* UITabBarGuideline.swift in Sources */, F7FA80002C0F4F3B0072FC60 /* NCUploadAssetsModel.swift in Sources */, F719D9E2288D396100762E33 /* NCColorPicker.swift in Sources */, F73EF7DF2B02266D0087E6E9 /* NCManageDatabase+Trash.swift in Sources */, F79B646026CA661600838ACA /* UIControl+Extension.swift in Sources */, + 42C684B42CA1806000DD46F0 /* SecondaryButton.swift in Sources */, F768823E2C0DD305001CF441 /* LazyView.swift in Sources */, F3E173B02C9AF637006D177A /* ScreenAwakeManager.swift in Sources */, F7CA212D25F1333300826ABB /* NCAccountRequest.swift in Sources */, @@ -4714,7 +4854,6 @@ F7FA7FFC2C0F4EE40072FC60 /* NCViewerQuickLookView.swift in Sources */, F3A0479B2BD2668800658E7B /* NCAssistant.swift in Sources */, F359D8672A7D03420023F405 /* NCUtility+Exif.swift in Sources */, - F7A03E352D427312007AA677 /* NCMainNavigationController.swift in Sources */, F738D4902756740100CD1D38 /* NCLoginNavigationController.swift in Sources */, F769CA192966EA3C00039397 /* ComponentView.swift in Sources */, F7C9B91D2B582F550064EA91 /* NCManageDatabase+SecurityGuard.swift in Sources */, @@ -4724,12 +4863,15 @@ AF93474E27E3F212002537EE /* NCShareNewUserAddComment.swift in Sources */, F7C30DFD291BD0B80017149B /* NCNetworkingE2EEDelete.swift in Sources */, F76882302C0DD1E7001CF441 /* NCFileNameModel.swift in Sources */, + 420113DC2D1303E00063BF54 /* NCMediaSelectTabBar.swift in Sources */, F72FD3B5297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */, F73EF7CF2B0225BA0087E6E9 /* NCManageDatabase+Tag.swift in Sources */, F7BD0A022C4689A4003A4A6D /* NCMedia+CollectionViewDelegate.swift in Sources */, + 42F89EB12D71F30C00550A07 /* NCCollectionViewCommon+FileActionsHeader.swift in Sources */, F3A047982BD2668800658E7B /* NCAssistantCreateNewTask.swift in Sources */, AF93471227E2341B002537EE /* NCShare+Menu.swift in Sources */, F7EFA47825ADBA500083159A /* NCViewerProviderContextMenu.swift in Sources */, + 42E5D36B2D678F9C007150DE /* HiDriveMainNavigationController.swift in Sources */, F755BD9B20594AC7008C5FBB /* NCService.swift in Sources */, F7E8A391295DC5E0006CB2D0 /* View+Extension.swift in Sources */, F79B869B265E19D40085C0E0 /* NSMutableAttributedString+Extension.swift in Sources */, @@ -4742,6 +4884,7 @@ F76882322C0DD1E7001CF441 /* NCAutoUploadView.swift in Sources */, F36E64F72B9245210085ABB5 /* NCCollectionViewCommon+SelectTabBar.swift in Sources */, F79A65C62191D95E00FF6DCC /* NCSelect.swift in Sources */, + 42F907DE2D2C424900BCDC36 /* View+Design.swift in Sources */, F75D19E325EFE09000D74598 /* NCTrash+Menu.swift in Sources */, F70CAE3A1F8CF31A008125FD /* NCEndToEndEncryption.m in Sources */, AA8D316E2D4123B200FE2775 /* NCShareDownloadLimitTableViewControllerDelegate.swift in Sources */, @@ -4752,9 +4895,9 @@ F77BC3ED293E528A005F2B08 /* NCConfigServer.swift in Sources */, F7A560422AE1593700BE8FD6 /* NCOperationSaveLivePhoto.swift in Sources */, F7D1C4AC2C9484FD00EC6D44 /* NCMedia+CollectionViewDataSourcePrefetching.swift in Sources */, - F7A03E332D426115007AA677 /* NCMoreNavigationController.swift in Sources */, F7401C152C75E6F300649E87 /* NCCapabilities.swift in Sources */, F7E402312BA891EB007E5609 /* NCTrash+SelectTabBarDelegate.swift in Sources */, + D5E1D4FE2CF4E7C600813AB6 /* DataProtectionSettingsScreen.swift in Sources */, F70753EB2542A99800972D44 /* NCViewerMediaPage.swift in Sources */, F7817CF829801A3500FFBC65 /* Data+Extension.swift in Sources */, F749B651297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */, @@ -4770,10 +4913,10 @@ F343A4B32A1E01FF00DDA874 /* PHAsset+Extension.swift in Sources */, F70968A424212C4E00ED60E5 /* NCLivePhoto.swift in Sources */, F7C30DFA291BCF790017149B /* NCNetworkingE2EECreateFolder.swift in Sources */, - F722133B2D40EF9D002F7438 /* NCFilesNavigationController.swift in Sources */, F7BC288026663F85004D46C5 /* NCViewCertificateDetails.swift in Sources */, F78B87E92B62550800C65ADC /* NCMediaDownloadThumbnail.swift in Sources */, F73EF7AF2B0224350087E6E9 /* NCManageDatabase+DirectEditing.swift in Sources */, + 4240DB502C5648E300E72FC0 /* BurgerMenuViewController.swift in Sources */, D5B6AA7827200C7200D49C24 /* NCActivityTableViewCell.swift in Sources */, F745B253222D88AE00346520 /* NCLoginQRCode.swift in Sources */, F769454822E9F20D000A798A /* NCShareNetworking.swift in Sources */, @@ -4786,8 +4929,8 @@ F765608F23BF813600765969 /* NCContentPresenter.swift in Sources */, F7327E352B73AEDE00A462C7 /* NCNetworking+LivePhoto.swift in Sources */, F76687072B7D067400779E3F /* NCAudioRecorderViewController.swift in Sources */, + 421657AB2D2AF2BF003BC9D5 /* HiDriveCollectionViewCommonSelectToolbarDelegate.swift in Sources */, AA8E03DA2D2ED83300E7E89C /* TransientShare.swift in Sources */, - F7A03E2F2D425A14007AA677 /* NCFavoriteNavigationController.swift in Sources */, F343A4BB2A1E734600DDA874 /* Optional+Extension.swift in Sources */, F76882232C0DD1E7001CF441 /* NCCapabilitiesModel.swift in Sources */, F7D68FCC28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */, @@ -4796,22 +4939,25 @@ AA8E041D2D300FDE00E7E89C /* NCShareNetworkingDelegate.swift in Sources */, F78E2D6529AF02DB0024D4F3 /* Database.swift in Sources */, F70CEF5623E9C7E50007035B /* UIColor+Extension.swift in Sources */, + 42C684B72CA1A20100DD46F0 /* CommonButtonConstants.swift in Sources */, F76882242C0DD1E7001CF441 /* NCSettingsAdvancedView.swift in Sources */, F785129C2D7989B30087DDD0 /* NCNetworking+TermsOfService.swift in Sources */, F75CA1472962F13700B01130 /* NCHUDView.swift in Sources */, F77BB748289985270090FC19 /* UITabBarController+Extension.swift in Sources */, F763D29D2A249C4500A3C901 /* NCManageDatabase+Capabilities.swift in Sources */, F76882252C0DD1E7001CF441 /* NCSettingsAdvancedModel.swift in Sources */, + 4294B88B2CA5550B002E6FED /* LinkButton.swift in Sources */, F7C7B489245EBA4100D93E60 /* NCViewerQuickLook.swift in Sources */, F758B45E212C569D00515F55 /* NCScanCell.swift in Sources */, + D5E1D4FC2CF4A99300813AB6 /* DataProtectionAgreementScreen.swift in Sources */, F78B87E72B62527100C65ADC /* NCMediaDataSource.swift in Sources */, F76882272C0DD1E7001CF441 /* NCManageE2EEView.swift in Sources */, F7864ACC2A78FE73004870E0 /* NCManageDatabase+LocalFile.swift in Sources */, F7327E302B73A86700A462C7 /* NCNetworking+WebDAV.swift in Sources */, + D59793B62CF7A73A00C44F4E /* DataProtectionAgreementManager.swift in Sources */, F79FFB262A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift in Sources */, F70D8D8124A4A9BF000A5756 /* NCNetworkingProcess.swift in Sources */, F3A0479A2BD2668800658E7B /* NCAssistantTaskDetail.swift in Sources */, - F38F71252B6BBDC300473CDC /* NCCollectionViewCommonSelectTabBar.swift in Sources */, F7E4D9C422ED929B003675FD /* NCShareCommentsCell.swift in Sources */, F7327E202B73A42F00A462C7 /* NCNetworking+Download.swift in Sources */, F76882332C0DD1E7001CF441 /* NCDisplayModel.swift in Sources */, @@ -4998,53 +5144,11 @@ isa = PBXVariantGroup; children = ( F72685E827C78E490019EF5E /* en */, - F7AA41B827C7CF4600494705 /* ca */, - F7AA41B927C7CF4B00494705 /* zh-Hans */, - F7AA41BA27C7CF5000494705 /* zh-Hant-TW */, - F7AA41BB27C7CF5100494705 /* cs-CZ */, - F7AA41BC27C7CF5300494705 /* da */, F7AA41BD27C7CF5400494705 /* nl */, - F7AA41BE27C7CF5600494705 /* ja-JP */, F7AA41BF27C7CF5700494705 /* fr */, - F7AA41C027C7CF5800494705 /* en-GB */, - F7AA41C127C7CF5900494705 /* gl */, - F7AA41C227C7CF5A00494705 /* ka-GE */, F7AA41C327C7CF5B00494705 /* de */, - F7AA41C427C7CF5C00494705 /* hu */, - F7AA41C527C7CF5D00494705 /* is */, - F7AA41C627C7CF5E00494705 /* it */, - F7AA41C727C7CF6000494705 /* tr */, - F7AA41C827C7CF6200494705 /* es-HN */, - F7AA41C927C7CF6300494705 /* es-DO */, - F7AA41CA27C7CF6400494705 /* ko */, - F7AA41CB27C7CF6500494705 /* nb-NO */, - F7AA41CC27C7CF6600494705 /* pl */, - F7AA41CD27C7CF6700494705 /* pt-BR */, - F7AA41CE27C7CF6800494705 /* pt-PT */, - F7AA41CF27C7CF6900494705 /* ru */, - F7AA41D027C7CF6900494705 /* sk-SK */, - F7AA41D127C7CF6A00494705 /* sr */, - F7AA41D227C7CF6C00494705 /* es-CO */, - F7AA41D327C7CF6D00494705 /* es-CL */, F7AA41D427C7CF6E00494705 /* es */, - F7AA41D527C7CF6F00494705 /* es-CR */, - F7AA41D627C7CF7100494705 /* es-GT */, - F7AA41D727C7CF7200494705 /* es-SV */, - F7AA41D827C7CF7300494705 /* es-EC */, - F7AA41D927C7CF7500494705 /* es-PR */, - F7AA41DA27C7CF7600494705 /* sv */, - F7AA41DB27C7CF7800494705 /* es-UY */, - F7AA41DC27C7CF7900494705 /* es-PE */, - F7AA41DD27C7CF7B00494705 /* es-419 */, - F7AA41DE27C7CF7D00494705 /* es-PA */, - F7AA41DF27C7CF7E00494705 /* es-PY */, - F7AA41E027C7CF8000494705 /* es-NI */, - F7AA41E127C7CF8100494705 /* es-MX */, - F79131C728AFB86E00577277 /* eu */, - AACCAB542CFE041F00DA1786 /* sl */, - AACCAB602CFE04C200DA1786 /* hr */, - AACCAB642CFE04F700DA1786 /* lo */, - AA52EB2E2D4297570089C348 /* el */, + 0FAEC1B32DBA3F2A001A60D9 /* it */, ); name = InfoPlist.strings; path = "Supporting Files"; @@ -5055,53 +5159,10 @@ children = ( F75DD768290ABB25002EB562 /* Base */, F7BE7C25290AC8C9002ABB61 /* en */, - F7BE7C27290ADEFD002ABB61 /* eu */, - F7BE7C29290ADEFD002ABB61 /* ca */, - F7BE7C2B290ADEFE002ABB61 /* zh-Hans */, - F7BE7C2D290ADEFF002ABB61 /* cs-CZ */, - F7BE7C2F290ADF00002ABB61 /* zh-Hant-TW */, F7BE7C31290ADF00002ABB61 /* nl */, - F7BE7C33290ADF01002ABB61 /* da */, - F7BE7C35290ADF03002ABB61 /* tr */, - F7BE7C37290ADF03002ABB61 /* sv */, - F7BE7C39290ADF04002ABB61 /* es-UY */, - F7BE7C3B290ADF04002ABB61 /* es-PR */, - F7BE7C3D290ADF05002ABB61 /* es-PE */, - F7BE7C3F290ADF06002ABB61 /* es-PY */, - F7BE7C41290ADF06002ABB61 /* es-PA */, - F7BE7C43290ADF06002ABB61 /* es-NI */, - F7BE7C45290ADF07002ABB61 /* es-MX */, - F7BE7C47290ADF07002ABB61 /* es-419 */, - F7BE7C49290ADF08002ABB61 /* es-HN */, - F7BE7C4B290ADF09002ABB61 /* ru */, - F7BE7C4D290ADF0A002ABB61 /* sr */, - F7BE7C4F290ADF0A002ABB61 /* sk-SK */, F7BE7C51290ADF0B002ABB61 /* es */, - F7BE7C53290ADF0B002ABB61 /* es-CL */, - F7BE7C55290ADF0C002ABB61 /* es-CO */, - F7BE7C57290ADF0C002ABB61 /* es-CR */, - F7BE7C59290ADF0D002ABB61 /* es-DO */, - F7BE7C5B290ADF0D002ABB61 /* es-EC */, - F7BE7C5D290ADF0E002ABB61 /* es-SV */, - F7BE7C5F290ADF0E002ABB61 /* es-GT */, - F7BE7C61290ADF10002ABB61 /* en-GB */, F7BE7C63290ADF10002ABB61 /* fr */, - F7BE7C65290ADF10002ABB61 /* gl */, - F7BE7C67290ADF11002ABB61 /* ka-GE */, F7BE7C69290ADF11002ABB61 /* de */, - F7BE7C6B290ADF12002ABB61 /* hu */, - F7BE7C6D290ADF12002ABB61 /* is */, - F7BE7C6F290ADF13002ABB61 /* it */, - F7BE7C71290ADF13002ABB61 /* ja-JP */, - F7BE7C73290ADF14002ABB61 /* ko */, - F7BE7C75290ADF14002ABB61 /* nb-NO */, - F7BE7C77290ADF15002ABB61 /* pl */, - F7BE7C79290ADF16002ABB61 /* pt-BR */, - F7BE7C7B290ADF16002ABB61 /* pt-PT */, - AACCAB522CFE041F00DA1786 /* sl */, - AACCAB5E2CFE04C200DA1786 /* hr */, - AACCAB622CFE04F700DA1786 /* lo */, - AA52EB2C2D4297570089C348 /* el */, ); name = Intent.intentdefinition; sourceTree = ""; @@ -5112,51 +5173,9 @@ F7151A811D477A4B00E6AF45 /* en */, F7B1A7761EBB3C8000BFB6D1 /* de */, F75B91E21ECAE17800199C96 /* fr */, - F75B91F71ECAE26300199C96 /* pt-BR */, - F75B923D1ECAE55E00199C96 /* ru */, - F7169A301EE59BB70086BD69 /* it */, - F7169A4C1EE59C640086BD69 /* tr */, - F78D6F461F0B7CB9002F9619 /* es-MX */, - F78D6F4D1F0B7CE4002F9619 /* nb-NO */, - F78D6F541F0B7D47002F9619 /* pl */, - F7DE9AB01F482FA5008DFE10 /* sv */, F7CC04E61F5AD50D00378CEF /* es */, - F7D532461F5D4123006568B1 /* is */, F7D5324D1F5D4137006568B1 /* nl */, - F7D532541F5D4155006568B1 /* sk-SK */, - F7D5328F1F5D443B006568B1 /* en-GB */, - F7D532A41F5D4461006568B1 /* zh-Hans */, - F77438EB1FCD694900662C46 /* ka-GE */, - F77438F21FCD69D300662C46 /* hu */, - F77438F91FCD6A0D00662C46 /* zh-Hant-TW */, - F77439001FCD6B7F00662C46 /* sr */, - F77439071FCD6BF000662C46 /* es-CL */, - F774390E1FCD6C0C00662C46 /* es-CO */, - F77439151FCD6C4A00662C46 /* es-CR */, - F774391C1FCD6C6700662C46 /* es-DO */, - F77439231FCD6C8700662C46 /* es-EC */, - F774392A1FCD6CAA00662C46 /* es-GT */, - F77439311FCD6CC400662C46 /* es-HN */, - F77439381FCD6CDE00662C46 /* es-NI */, - F774393F1FCD6D0B00662C46 /* es-PA */, - F77439461FCD6D2300662C46 /* es-PE */, - F774394D1FCD6D3E00662C46 /* es-PR */, - F77439541FCD6D6100662C46 /* es-PY */, - F774395B1FCD6D8200662C46 /* es-SV */, - F77439621FCD6D9C00662C46 /* es-UY */, - F7BB04851FD58ACB00BBFD2A /* cs-CZ */, - F7320934201B812F008A0888 /* ko */, - F732093B201B81E4008A0888 /* es-419 */, - F70A07C8205285FB00DC1231 /* pt-PT */, - F7E45E6D21E75BF200579249 /* ja-JP */, - F753701822723D620041C76C /* gl */, - F753701922723E0D0041C76C /* ca */, - F753701A22723EC80041C76C /* da */, - F79131C628AFB86E00577277 /* eu */, - AACCAB532CFE041F00DA1786 /* sl */, - AACCAB5F2CFE04C200DA1786 /* hr */, - AACCAB632CFE04F700DA1786 /* lo */, - AA52EB2D2D4297570089C348 /* el */, + 0F85B8942DB7D61100D089AE /* it */, ); name = Localizable.strings; path = "Supporting Files"; @@ -5170,15 +5189,17 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Notification_Service_Extension.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, EXTENSION_NOTIFICATION_SERVICE, ); INFOPLIST_FILE = "$(SRCROOT)/Brand/Notification_Service_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.Notification-Service-Extension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.Notification-Service-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Dev ionos.easystorage.NotificationServiceExtension"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Dev ionos.easystorage.NotificationServiceExtension"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5194,15 +5215,16 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Notification_Service_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, EXTENSION_NOTIFICATION_SERVICE, ); INFOPLIST_FILE = "$(SRCROOT)/Brand/Notification_Service_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.Notification-Service-Extension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.Notification-Service-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Notification-Service-Extension"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5218,12 +5240,12 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; IPHONEOS_DEPLOYMENT_TARGET = 15.0; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudTests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5242,12 +5264,12 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; IPHONEOS_DEPLOYMENT_TARGET = 15.0; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudTests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5274,10 +5296,8 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 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 = NKUJUXUJ3B; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -5293,7 +5313,7 @@ MTL_FAST_MATH = YES; OTHER_CFLAGS = "-v"; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudUITests.NextcloudUITests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudUITests.NextcloudUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5323,10 +5343,8 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 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 = NKUJUXUJ3B; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -5338,7 +5356,7 @@ MTL_FAST_MATH = YES; OTHER_CFLAGS = "-v"; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudUITests.NextcloudUITests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudUITests.NextcloudUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5369,10 +5387,8 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 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 = NKUJUXUJ3B; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -5387,7 +5403,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudIntegrationTests.NextcloudIntegrationTests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudIntegrationTests.NextcloudIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5417,126 +5433,893 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 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 = NKUJUXUJ3B; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudIntegrationTests.NextcloudIntegrationTests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudIntegrationTests.NextcloudIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; VALIDATE_PRODUCT = YES; }; name = Release; }; - F70716EE2987F81600E72C1D /* Debug */ = { + D5C2D2122C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = R7V5Z67X53; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_TESTING_SEARCH_PATHS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NC, + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-v"; + OTHER_SWIFT_FLAGS = "-D BETA"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) NC"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D2132C9AC00B00E7579D /* Beta */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension_UI.entitlements"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/iOSClient.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + CURRENT_PROJECT_VERSION = 10; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", - EXTENSION, - EXTENSION_FILE_PROVIDER_EXTENSION_UI, + NC, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension_UI.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension-UI"; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/iOSClient.plist"; + PRODUCT_BUNDLE_IDENTIFIER = de.strato.ionos.easystorage.beta; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = Debug; + name = Beta; }; - F70716EF2987F81600E72C1D /* Release */ = { + D5C2D2142C9AC00B00E7579D /* Beta */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension_UI.entitlements"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/Widget.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, - EXTENSION_FILE_PROVIDER_EXTENSION_UI, + EXTENSION_WIDGET, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension_UI.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/Widget.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Nextcloud; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension-UI"; + PRODUCT_BUNDLE_IDENTIFIER = de.strato.ionos.easystorage.beta.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta Widget"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_WIDGET"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Widget/Widget-Brinding-header.h"; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; }; - name = Release; + name = Beta; }; - F7145A261D12E3B700CAFEEC /* Debug */ = { + D5C2D2152C9AC00B00E7579D /* Beta */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Share.entitlements"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta//WidgetDashboardIntentHandler.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, - EXTENSION_SHARE, + EXTENSION_WIDGETDASHBOARDINTENTHANDLER, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/Share.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/WidgetDashboardIntentHandler.plist"; + INFOPLIST_KEY_CFBundleDisplayName = WidgetDashboardIntentHandler; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = de.strato.ionos.easystorage.beta.WidgetDashboardIntentHandler; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta WidgetDashboard"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_SHARE"; - SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Share/Share-Bridging-Header.h"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_WIDGETDASHBOARDINTENTHANDLER"; + SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = Beta; }; - F7145A271D12E3B700CAFEEC /* Release */ = { + D5C2D2162C9AC00B00E7579D /* Beta */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Share.entitlements"; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/Share.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, EXTENSION_SHARE, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/Share.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/Share.plist"; + PRODUCT_BUNDLE_IDENTIFIER = de.strato.ionos.easystorage.beta.Share; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta Share"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_SHARE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Share/Share-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D2172C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/File_Provider_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/File_Provider_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "de.strato.ionos.easystorage.beta.File-Provider-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta File-Provider-Extension"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D2182C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/File_Provider_Extension_UI.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION_UI, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/File_Provider_Extension_UI.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "de.strato.ionos.easystorage.beta.File-Provider-Extension-UI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta File-Provider-Extension-U"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D2192C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/Notification_Service_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_NOTIFICATION_SERVICE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Beta/Notification_Service_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "de.strato.ionos.easystorage.beta.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Beta Notification-Service"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_NOTIFICATION_SERVICE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Notification Service Extension/Notification_Service_Extension-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D21A2C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; + }; + name = Beta; + }; + D5C2D21B2C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudIntegrationTests.NextcloudIntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; + VALIDATE_PRODUCT = YES; + }; + name = Beta; + }; + D5C2D21C2C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-v"; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudUITests.NextcloudUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; + VALIDATE_PRODUCT = YES; + }; + name = Beta; + }; + D5C617962CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = R7V5Z67X53; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_TESTING_SEARCH_PATHS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NC, + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "-v"; + OTHER_SWIFT_FLAGS = "-D APPSTORE"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) NC"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C617972CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/iOSClient.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CURRENT_PROJECT_VERSION = 10; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NC, + ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/iOSClient.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.ionos.hidrivenext; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C617982CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/Widget.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_WIDGET, + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/Widget.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Nextcloud; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.ionos.hidrivenext.Widget; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.Widget"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_WIDGET"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Widget/Widget-Brinding-header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + D5C617992CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore//WidgetDashboardIntentHandler.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_WIDGETDASHBOARDINTENTHANDLER, + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/WidgetDashboardIntentHandler.plist"; + INFOPLIST_KEY_CFBundleDisplayName = WidgetDashboardIntentHandler; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.ionos.hidrivenext.WidgetDashboardIntentHandler; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.WidgetDashboard"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_WIDGETDASHBOARDINTENTHANDLER"; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + D5C6179A2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/Share.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_SHARE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/Share.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.ionos.hidrivenext.Share; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.Share"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_SHARE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Share/Share-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C6179B2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/File_Provider_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/File_Provider_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.ionos.hidrivenext.File-Provider-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.File-Provider-Ext"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C6179C2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/File_Provider_Extension_UI.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION_UI, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/File_Provider_Extension_UI.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ionos.hidrivenext.File-Provider-Extension-UI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.File-Provider-ExtUI"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C6179D2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/Notification_Service_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_NOTIFICATION_SERVICE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/AppStore/Notification_Service_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.ionos.hidrivenext.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "AppStore com.ionos.hidrivenext.Notification"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_NOTIFICATION_SERVICE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Notification Service Extension/Notification_Service_Extension-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = AppStore; + }; + D5C6179E2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; + }; + name = AppStore; + }; + D5C6179F2CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudIntegrationTests.NextcloudIntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + D5C617A02CABE20500105DC6 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-v"; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudUITests.NextcloudUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + F70716EE2987F81600E72C1D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension_UI.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION_UI, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension_UI.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.File-Provider-Extension-UI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Dev ionos.easystorage.File-Provider-Extension-UI"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Dev ionos.easystorage.File-Provider-Extension-UI"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F70716EF2987F81600E72C1D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension_UI.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION_UI, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension_UI.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.File-Provider-Extension-UI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage File-Provider-Extension-UI"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_FILE_PROVIDER_EXTENSION_UI"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + F7145A261D12E3B700CAFEEC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Share.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_SHARE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Share.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Share; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Develop com.viseven.ionos.easystorage.Share"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Develop com.viseven.ionos.easystorage.Share"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION EXTENSION_SHARE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Share/Share-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F7145A271D12E3B700CAFEEC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Share.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_SHARE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Share.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Share; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Share"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5557,6 +6340,7 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Widget.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, @@ -5565,11 +6349,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/Widget.plist"; INFOPLIST_KEY_CFBundleDisplayName = Nextcloud; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Widget; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Develop com.viseven.ionos.easystorage.Widget"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Develop com.viseven.ionos.easystorage.Widget"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5591,6 +6377,7 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Widget.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, @@ -5599,11 +6386,12 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/Widget.plist"; INFOPLIST_KEY_CFBundleDisplayName = Nextcloud; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Widget; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Widget"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5621,15 +6409,17 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, EXTENSION_FILE_PROVIDER_EXTENSION, ); INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.File-Provider-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Dev ionos.easystorage.File-Provider-Extension"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Dev ionos.easystorage.File-Provider-Extension"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5644,15 +6434,16 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/File_Provider_Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, EXTENSION_FILE_PROVIDER_EXTENSION, ); INFOPLIST_FILE = "$(SRCROOT)/Brand/File_Provider_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.File-Provider-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage File-Provider-Extension"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5668,13 +6459,13 @@ ALWAYS_SEARCH_USER_PATHS = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/iOSClient.entitlements"; - DEVELOPMENT_TEAM = NKUJUXUJ3B; + CURRENT_PROJECT_VERSION = 10; GCC_SYMBOLS_PRIVATE_EXTERN = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/iOSClient.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Develop com.viseven.ionos.easystorage"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Develop com.viseven.ionos.easystorage"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5691,13 +6482,13 @@ ALWAYS_SEARCH_USER_PATHS = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/iOSClient.entitlements"; - DEVELOPMENT_TEAM = NKUJUXUJ3B; + CODE_SIGN_IDENTITY = "Apple Distribution"; + CURRENT_PROJECT_VERSION = 10; GCC_SYMBOLS_PRIVATE_EXTERN = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/iOSClient.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5721,6 +6512,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand//WidgetDashboardIntentHandler.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -5732,11 +6524,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/WidgetDashboardIntentHandler.plist"; INFOPLIST_KEY_CFBundleDisplayName = WidgetDashboardIntentHandler; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.WidgetDashboardIntentHandler; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.WidgetDashboardIntentHandler; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Develop ionos.easystorage.WidgetDashboardIntentHan"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Develop ionos.easystorage.WidgetDashboardIntentHan"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5760,6 +6554,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand//WidgetDashboardIntentHandler.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -5772,11 +6567,12 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "$(SRCROOT)/Brand/WidgetDashboardIntentHandler.plist"; INFOPLIST_KEY_CFBundleDisplayName = WidgetDashboardIntentHandler; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Nextcloud. All rights reserved."; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.WidgetDashboardIntentHandler; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.WidgetDashboardIntentHandler; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage WidgetDashboardIntentHandler"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; @@ -5814,10 +6610,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = NKUJUXUJ3B; + DEVELOPMENT_TEAM = R7V5Z67X53; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_TESTING_SEARCH_PATHS = YES; @@ -5842,10 +6639,9 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.5.0; + MARKETING_VERSION = 1.0.0; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "-v"; - OTHER_LDFLAGS = ""; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) NC DEBUG"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -5880,9 +6676,10 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 5; - DEVELOPMENT_TEAM = NKUJUXUJ3B; + CURRENT_PROJECT_VERSION = 10; + DEVELOPMENT_TEAM = R7V5Z67X53; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_TESTING_SEARCH_PATHS = YES; @@ -5905,10 +6702,9 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.5.0; + MARKETING_VERSION = 1.0.0; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "-v"; - OTHER_LDFLAGS = ""; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) NC"; SWIFT_COMPILATION_MODE = wholemodule; @@ -5926,6 +6722,8 @@ buildConfigurations = ( 2C33C48723E2C475005F963B /* Debug */, 2C33C48823E2C475005F963B /* Release */, + D5C2D2192C9AC00B00E7579D /* Beta */, + D5C6179D2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5935,6 +6733,8 @@ buildConfigurations = ( AF8ED1FF2757821000B8DBC4 /* Debug */, AF8ED2002757821000B8DBC4 /* Release */, + D5C2D21A2C9AC00B00E7579D /* Beta */, + D5C6179E2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5944,6 +6744,8 @@ buildConfigurations = ( C0046CE22A17B98400D87C9D /* Debug */, C0046CE32A17B98400D87C9D /* Release */, + D5C2D21C2C9AC00B00E7579D /* Beta */, + D5C617A02CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5953,6 +6755,8 @@ buildConfigurations = ( C04E2F272A17BB4E001BAD85 /* Debug */, C04E2F282A17BB4E001BAD85 /* Release */, + D5C2D21B2C9AC00B00E7579D /* Beta */, + D5C6179F2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5962,6 +6766,8 @@ buildConfigurations = ( F70716EE2987F81600E72C1D /* Debug */, F70716EF2987F81600E72C1D /* Release */, + D5C2D2182C9AC00B00E7579D /* Beta */, + D5C6179C2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5971,6 +6777,8 @@ buildConfigurations = ( F7145A261D12E3B700CAFEEC /* Debug */, F7145A271D12E3B700CAFEEC /* Release */, + D5C2D2162C9AC00B00E7579D /* Beta */, + D5C6179A2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5980,6 +6788,8 @@ buildConfigurations = ( F7346E1D28B0EF5E006CE2D2 /* Debug */, F7346E1E28B0EF5E006CE2D2 /* Release */, + D5C2D2142C9AC00B00E7579D /* Beta */, + D5C617982CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5989,6 +6799,8 @@ buildConfigurations = ( F771E3F020E2392E00AFB62D /* Debug */, F771E3F120E2392E00AFB62D /* Release */, + D5C2D2172C9AC00B00E7579D /* Beta */, + D5C6179B2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5998,6 +6810,8 @@ buildConfigurations = ( F77B0F9B1D118A16002130FE /* Debug */, F77B0F9C1D118A16002130FE /* Release */, + D5C2D2132C9AC00B00E7579D /* Beta */, + D5C617972CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6007,6 +6821,8 @@ buildConfigurations = ( F7C9739B28F17132002C43E2 /* Debug */, F7C9739C28F17132002C43E2 /* Release */, + D5C2D2152C9AC00B00E7579D /* Beta */, + D5C617992CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6016,6 +6832,8 @@ buildConfigurations = ( F7F67BC91A24D27800EE80DA /* Debug */, F7F67BCA1A24D27800EE80DA /* Release */, + D5C2D2122C9AC00B00E7579D /* Beta */, + D5C617962CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6023,6 +6841,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-collections.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.4; + }; + }; F33EE6DF2BF4BDA500CA1A51 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-nio-ssl"; @@ -6052,7 +6878,7 @@ repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 8.9.0; + minimumVersion = 11.7.0; }; }; F710FC78277B7CFF00AA9FBF /* XCRemoteSwiftPackageReference "realm-swift" */ = { @@ -6236,12 +7062,42 @@ repositoryURL = "https://github.com/1024jp/GzipSwift"; requirement = { kind = exactVersion; - version = 6.0.0; + version = 6.0.1; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 625EC26D2C6CA285006411D1 /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + F3374AEF2D78B01B002A38F9 /* BitCollections */ = { + isa = XCSwiftPackageProductDependency; + package = F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = BitCollections; + }; + F3374AF12D78B01B002A38F9 /* Collections */ = { + isa = XCSwiftPackageProductDependency; + package = F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = Collections; + }; + F3374AF32D78B01B002A38F9 /* DequeModule */ = { + isa = XCSwiftPackageProductDependency; + package = F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = DequeModule; + }; + F3374AF52D78B01B002A38F9 /* HashTreeCollections */ = { + isa = XCSwiftPackageProductDependency; + package = F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = HashTreeCollections; + }; + F3374AF72D78B01B002A38F9 /* HeapModule */ = { + isa = XCSwiftPackageProductDependency; + package = F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = HeapModule; + }; F3391B072B4C52C5001C0C4B /* FirebaseDatabase */ = { isa = XCSwiftPackageProductDependency; package = F70B86732642CE3B00ED5349 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; diff --git a/Nextcloud.xcodeproj/xcshareddata/xcschemes/File Provider Extension.xcscheme b/Nextcloud.xcodeproj/xcshareddata/xcschemes/File Provider Extension.xcscheme index ee3063c871..2fee26c9f8 100755 --- a/Nextcloud.xcodeproj/xcshareddata/xcschemes/File Provider Extension.xcscheme +++ b/Nextcloud.xcodeproj/xcshareddata/xcschemes/File Provider Extension.xcscheme @@ -120,11 +120,6 @@ debugServiceExtension = "internal" allowLocationSimulation = "YES" launchAutomaticallySubstyle = "2"> - - + + + + + + + + + + diff --git a/Notification Service Extension/NotificationService.swift b/Notification Service Extension/NotificationService.swift index 347de6572a..f58bea2039 100644 --- a/Notification Service Extension/NotificationService.swift +++ b/Notification Service Extension/NotificationService.swift @@ -34,7 +34,7 @@ class NotificationService: UNNotificationServiceExtension { if let bestAttemptContent = bestAttemptContent { bestAttemptContent.title = "" - bestAttemptContent.body = "Nextcloud notification" + bestAttemptContent.body = "HiDrive Next notification" do { if let message = bestAttemptContent.userInfo["subject"] as? String { for tableAccount in NCManageDatabase.shared.getAllTableAccount() { @@ -78,7 +78,7 @@ class NotificationService: UNNotificationServiceExtension { // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { bestAttemptContent.title = "" - bestAttemptContent.body = "Nextcloud Notification Time Will Expire" + bestAttemptContent.body = "HiDrive Next notification" contentHandler(bestAttemptContent) } } diff --git a/Share/NCShareCell.swift b/Share/NCShareCell.swift index ba27c71da8..74e727e436 100644 --- a/Share/NCShareCell.swift +++ b/Share/NCShareCell.swift @@ -47,7 +47,7 @@ class NCShareCell: UITableViewCell { self.account = account let resultInternalType = NextcloudKit.shared.nkCommonInstance.getInternalType(fileName: fileName, mimeType: "", directory: false, account: account) - backgroundColor = .systemBackground + backgroundColor = NCBrandColor.shared.appBackgroundColor imageCell?.layer.cornerRadius = 6 imageCell?.layer.masksToBounds = true diff --git a/Share/NCShareExtension+DataSource.swift b/Share/NCShareExtension+DataSource.swift index 0589dd9f27..a0a55ed21f 100644 --- a/Share/NCShareExtension+DataSource.swift +++ b/Share/NCShareExtension+DataSource.swift @@ -139,11 +139,11 @@ extension NCShareExtension: UICollectionViewDataSource { if metadata.e2eEncrypted { cell.imageItem.image = NCImageCache.shared.getFolderEncrypted(account: metadata.account) } else if isShare { - cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe(account: metadata.account) + cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe() } else if !metadata.shareType.isEmpty { metadata.shareType.contains(3) ? (cell.imageItem.image = NCImageCache.shared.getFolderPublic(account: metadata.account)) : - (cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe(account: metadata.account)) + (cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe()) } else if metadata.mountType == "group" { cell.imageItem.image = NCImageCache.shared.getFolderGroup(account: metadata.account) } else if isMounted { diff --git a/Share/NCShareExtension.swift b/Share/NCShareExtension.swift index 262664628e..885151c78c 100644 --- a/Share/NCShareExtension.swift +++ b/Share/NCShareExtension.swift @@ -95,7 +95,7 @@ class NCShareExtension: UIViewController { collectionView.refreshControl = refreshControl refreshControl.tintColor = NCBrandColor.shared.iconImageColor - refreshControl.backgroundColor = .systemBackground + refreshControl.backgroundColor = NCBrandColor.shared.appBackgroundColor refreshControl.addTarget(self, action: #selector(reloadDatasource), for: .valueChanged) commandView.backgroundColor = .secondarySystemBackground diff --git a/Tests/NextcloudSnapshotTests/Extensions/SwiftUIView+Extensions.swift b/Tests/NextcloudSnapshotTests/Extensions/SwiftUIView+Extensions.swift new file mode 100644 index 0000000000..c9fc8ed243 --- /dev/null +++ b/Tests/NextcloudSnapshotTests/Extensions/SwiftUIView+Extensions.swift @@ -0,0 +1,33 @@ +// +// SwiftUIView+Extensions.swift +// Nextcloud +// +// Created by Milen on 06.06.23. +// Copyright © 2023 Marino Faggiana. All rights reserved. +// +// Author Marino Faggiana +// +// 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 . +// + +import Foundation +import SwiftUI + +extension SwiftUI.View { + func toVC() -> UIViewController { + let vc = UIHostingController (rootView: self) + vc.view.frame = UIScreen.main.bounds + return vc + } +} diff --git a/Tests/NextcloudSnapshotTests/NextcloudSnapshotTests.swift b/Tests/NextcloudSnapshotTests/NextcloudSnapshotTests.swift new file mode 100644 index 0000000000..9b3e56fcd8 --- /dev/null +++ b/Tests/NextcloudSnapshotTests/NextcloudSnapshotTests.swift @@ -0,0 +1,37 @@ +// +// NextcloudSnapshotTests.swift +// NextcloudSnapshotTests +// +// Created by Milen on 06.06.23. +// Copyright © 2023 Marino Faggiana. All rights reserved. +// +// 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 . +// + +import XCTest +import SnapshotTesting +import SnapshotTestingHEIC +import PreviewSnapshotsTesting +import SwiftUI +@testable import Nextcloud + +final class NextcloudSnapshotTests: XCTestCase { + func test_HUDView() { + HUDView_Previews.snapshots.assertSnapshots(as: .imageHEIC) + } + + func test_CapalitiesView() { + NCCapabilitiesView_Previews.snapshots.assertSnapshots(as: .imageHEIC) + } +} diff --git a/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_CapalitiesView.DefaultPreviewConfiguration.heic b/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_CapalitiesView.DefaultPreviewConfiguration.heic new file mode 100644 index 0000000000000000000000000000000000000000..7b099a3dfe0dbccdbbfa1e6875ad6c3aa692cb10 GIT binary patch literal 32097 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 YBiY|R^Vj~(*?tgEjDOhpKVs~E1Ezi}z5oCK literal 0 HcmV?d00001 diff --git a/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_HUDView.DefaultPreviewConfiguration.heic b/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_HUDView.DefaultPreviewConfiguration.heic new file mode 100644 index 0000000000000000000000000000000000000000..d0c5ba1c50f84af8e316c03952385d7aa3ae2790 GIT binary patch literal 18202 zcmeIZb#NU&*Cu$)%p5bt5Ibg$nPTRc9mjUeOfkgF%*-(}Gc!A8W;#0syvVhK~Qn|Bk7Q%&d*U3Xzfh*WdB)00F*{o$M{i z{$f;HGe;{h1^}?Yi5X`9D)C1H;DD8{kiW}-OPM+wvi#2WA0#;CzbB#oiG=(|DOC~2NQcUqu(w6 z!R$ZG$ZTY0Wdb%CCfGEP04M-700saHfCIn-5CDh(Bmgo11%L`b1E2#izm8&eblLLUsPz&8M(bpd#JeRu!>(4exx zufY?7K!yN;erJICodaxXD1a6NLJl~MN(ACh$^Vp)4GjtK)*Ou$^LhVvQ%GpmTj&Qk zBfJD0q0V z`2l`rwpRb{3|IgNC_f)x0OTJD^+!VgkuZNG>>mmDN5cP+2!ABvABprwBL9&neYJ0QOY?x|z`zaNS@aVGw`U6++0&(#G(29~1j+y5Hb;_W{6Q z0|1!l|N6w=Ivy4Hvw**w@L%cV6yUfTY{h@;GhmPlw&`D;!ugN>`;C8|M@ayVtHJjE zw>|;}xnS%6)v3T;8fF;m3x9QbPB5qjd&a-@eK5!c`^jJZT_^y6>j?Imzq&9G464CC z^j8Yv{87n$s&rF9vN5>7DmqU;W+O1d7K0N&Dl%P;LMKEW;E5 zC#yCH1Oo0~$LoPWo1}*)PBC|QMT5|$+c*4bx42KDJs{AL%?;93?#31KZ2r$XWNvLS zFM-s-RYLIuX-<|0lU(n2Uj(*eR*zd0OBXz((hL@Rj>k!D;Us`$SajMb43~nRI5&AFbs9Il1eZ9Q* zIGJ>jOCFurOcRK<9Vpj9LwL3#Qv6I3GK{>y) zi%xS|G4yDP^I4__`gF^+c(*&bDI51toA@8cZZWr*6#Rm>63t?TlvheCqpFSEfft`3 zwoEm8vzx0{vt&-5gyEZe}{ zp!Ii>+3d(jzf$(SFpft2qOqPw0EohQ>g&@qmm+9enV+#&eQnl4paE%3>14uK*BsY) z1f>zZ9Tpb*i$_9im#w5j!0Ec+sl)h>VRYt!beC}8UaqB1(#Q1Ni7=YP0MGK)%KPKH zRElq|^hs^^I%%JhC`2YW4A?gY&P_G$CvAj%OclQmLLBuwmH?7RB?Cj@T{%ngH z%H)oe##t*_t)9PRE39AQ1maPC->3Wz%}lJ#c++elff@1x zD3Ma1QX>3#V*Kfd*yjBRNV9Y7X8LDE#srCkhTcHDtO!G10(`&V+tQiNTM^;4vchT6 zdB4-K)jP%Pmu!ZhtUZ2;8_v^`k2e18za|Fd>M+D=G1WhWZa1JZp$3sJxvfmJusP63 zHKB4FDCsC&VtQF699dR7iS$`p3%_S)ZL@jdpYZo)BWZYZz3#q^d55^3X|LeblM_6- zn(hV6e-%b$|C}6JkANSB6zRRCQg$p@p7;TRNXAXrx9c zW+7oKJx66-q+j0dI#cpsI{XQGH#w|`-I;UM16;2Y_+U0E$e;1 z7|DF;Ed>|aTlVIaPC-^zOF<$Dt+1}4Es`p?m7)yG){@#g5PlHF_~-r`hbvlv>YN2- zlXvy{4vgR7-o#nH^tnUiwRHOyn2-4gh|z&x`iX&ZEl z>!w`5ZkWl7w!Qh*o80cjVRZ*L<6f5U0+c){(jk3x)vZpK^CRaqlM+kXe(_(V85cT+ zhGW&Cn^Xa);F;^i2grE~&y10RjQq6k9Mcc3b?t0)*2MW^^P)u>$S}!*&{rN(iq%_Z z#-I4t-+#TMwn`P+tn+SOQ9QK>Wiv@2Z}F!nPhEw#>BgeBl^v(9Kdv|KPWgFsVaN^< z_fzPx7vK$)Ywk+AxnDSb#ep($8fh5@D*9eezo`8jRWh6Jy^zo;=JRe*3Ix|WVQ696Wl+I38@eqXRaH6KRexP6SH47N7YzN)Nub+Yi69qKNA&a_T z5-E9+L6V>UK zHn1cmzFK4M2{A^Cl-4T2k@Bb__#^I(QP1$oC?1W6QcxJDcV_^K$iZsrz}90@K9Eyx z{>H=Uqaf_&ji7_XiwmKUWm?C(YXIo$XLsmEkHO*=IbawO4U7jlk*8{;l}Cqiv}JL` z*AE1fB@K&;lE$m7rfd=0KXot%3WvR|-@bEawz{~zxZ!n4>`-(~K$l6^B&e}g%!*S3 z?w3gn+a`0;eiU!CFV??WZ*MLdcvs~$*wNC(9}F+~>k-p~r~Q+8G3UceQb9x7kCWoA zA@#+c5S}Z^LLW|zxQ0EJwJS+2px=w#eS4;|Qx^U5en4$%_jc9CeO{6b@zA|P{4#wl z$2bc$>D0!p2)f=o_#T(;81?O}T!lKI;H|$5rGJpmGvZFYPGiJ&Tp*#$qIU(?E1i`1 zyj3v$p|OGv8|}|84NM=yhq*2&S~fgX?zI-K;^Pyzd{DfL0@Ko}t#kquC2qV}bww0a zte$Gc&OOJ>SxTOFn?8Ig9Pwl}_*&!W$r(8CW0G|q64$soL0Y=}WT z6FX=7ykpIU5TuiYT-%QEE2V|hl3`eT+oj~hGGY+Bm+vqITr%SvZY*&5F}X% zyuA>j3nMz8$RQe$eWFaGK_V9NH+8%B1q6!lZ-k20W&QnL%})%*%$E8;W7!QzLNw04 zQi#`B54&Q~4FcZ2(yY8H&vMB+EBQ#%39C<+a7GdPh8H&E`V;amU>aJG+@-k{?%%QGc9L7D?Z0MVftH)PS?6q}L9W@+! z=}ZAD;mz*AWcf}5yi)wuR#}1?8Cb@{^HAKhUX}tI6DdbD94;G{V}}S;FgJEnWL?&+UN!zjRU+dTduYHsT7b*YLFTQmZy>v>WrlH@}u# z#i$FS?)H3He`wclw915Tm12Sc!;OdMj(N$IWc4bkrqd)v6~Krw-yi%=N@_-y!%rus zT@{7Al|)s<#~NanQ~DuVi~-s``9MSp$7cob5jgHIhAK`jl5|#?5%xrxtyu z@FQ`*ozI}He_E@33Ctw+BfNMz7K3DJ6kX9?7NtvdHd}&Cbv9^+AF8C@8Q-~RJCV%S zCzE}O;eLTPOcYCLF_FB}CeI7*`hq@x9l-SSL92_oJjo^wbL!AA=+jTBMZt)hR>$&2 z6X`P5T^PV+!m$T-_>ItjG1qv-XN@2BcVRM862+uuyyYJ!;{zrZQIyTB0*DW`7Tqi4 zx_{XG`CU<1S=1r$V{*e#QGv@X<$Au{EWhW3y33`xrQMBmJ z+C&Z^HdKqakqnW=nIss%0xF`sr&99xjawFB|zFi}YX@ zbB#0FE)1(b(4KHh1Wxv(jvY)Q-6HO!FJG*x`m1fWtf3gw+p{HqAhd4YH{6~0f)v~* z#ZWVY5a|K~gMc507Zjj6-t6Xr;WTY&)6^VdJP336yhH zl`cv@^QZ#B@z9XsgqkHG)@O%Eghzr@Kd$X|c>;Vs8PBM(^M@DKO|~YVg1yZkBsp=T z613Oe?n1+-o!EId@|wiV=T0Y%xggChEcvfw&WqpA@{!+5CZ!C*$GwmVydTWSN~}Em zpgbYS8rZE%V^vq638w(_NcrQ}{quVTU#yuz%Bu=O)>LH5$m62eojtVon^r5L4+oc3 zy*kfBN;6MLRguvHdBmKDGlv{b^}~d(HrXR%DzkJ}jJIFT>T-#eNv{rQxLF$pKa^Ce zI+xNohQBaB7Tj;tj5L&c6jw%JZ-Bz0s~yDP*p?l9E&`*RnBCR;ldQvi zo9nld#OyXAH-J$&Cihqn8g4mfc#X=Z*Zcy|BxgJe%mQ0PxvUc(E|H|``n*SpmR*~s z#GxKIgt*B>1$Euewv;=rr_nW;tGE^xD_3WEwP(nVM9?O|{B_QC}ayYD6oz4vOy)2l#R3bhjB-w3Vy7JEkzP%Y+v6P_%RUtu51_nTU zlE*IaCe-3+g_$#EfF&DD2!CNRKMli?vbLJfD9vJWFt(zO>Z!!L*@?~1=7IM5Wo_Fn z)n84>=)}_ln$8J`OIU#QZ&tzDd>Q6rNxgr3kh6hbZfL3d@n5%Ur)hE7PIBzA^4eP@!z{8n6{rz+tdwGB93>Y#MBi><1kT zaZD&kd2n;kC|#Pr;LVS(-%9IizG2RU(*WKF0s`)-}D^2RHlQgpHNdMkw;*Q_RiVITn zR0*vdAJI`1e?j;&^9yCILe%v=f#lv)I!vvK%^7f@yO`86}$Yph0 zK!+w&hh=>qs(rY>U_n%R(jYsquCzV$Eq_I}f>K9JGIX`@tAoK{+hO+)ZYrtLC3)9a zHeu2*V`PY9>8o_QxN%2Xn0dQZ|uZSeg)O)bgE`F-*@%4`$_J`?r#O`ZI)nQ0FM?S33(z#cYi3Ws*Ml^KAf+A5 zyrVH8$^M^M4uZgEbrM&T1%YlsEqA;>>tPhc`LWgfrW9fk!?jd)HT>xgH_$mdNa#H| zpUVbX3K8;O!kK_3ph>p<<9#;C!;s<=bo*^CV%E;r*zoPZf-^(XQlszDc?~V0(e_D= z{f7R?CG)okOusr>DY)Ow+I12aOFnw9FTyb4`M04e4Pe$_7C8SfJP8%1f}04z8QYKIS?oW4d3q$?%el@&B(FO$oA}4 zdyKHcp5&hYBI~zW@@f8-U1sQ@mKJu%H}EPKHFP2+q*R|eslMA)!|fb31DAHyD@fN8 za8Ma#JSl`T)JLl&t@Grog3<)ecHX@>kExl~Z5wu8K9%=Qri<{yXWO^S2OX+rx4xF} zU5izo57y!EDMZ>{uW-iRbKT=eKTm!I*H>*mK-JwkYDL>J0Q=BUMfaLWMHqIyR0d2l zY+ieaLkF2;^$bT?8GS?%^Ix=+B5<4d;&H~&g5I7q(Ofj_=}byzki>ufypfz=|LsEq zW^M{fLP&h`o6lH)9}mP=AW7Ar>m6;&Yz0aH_EmmBkpfT_h*85U?mZ47@GkSsGTU4q z{5ciVUl>CqdTCI5d7u%35{eX6xX8QmJqAO0`phXeaz1tq0D=6=CD-!YFV0hI@Re?x z3p~jUy+%ZsfoCv2Go2SwL%_m+I(z$Ert+@$A;6k_I2bo=0|K#+(JiElOm&+Xwl_*$ zf~n8$hqdv-RqJkZECIQ(1lKN#bhQ?Zn~%vi@5J^OR%xB^F4*QF1es^kN4f?-pSIuK zfH@m2)qyE*rSir!5gvu?k}P6d`F(+D@(!(b$pO5zRQa=5`0iR|swm7G5S*>7QweRt zz_5Cn;CvqyT&&ZX2b%zBz)$c6!2dG0AyYD&pu-+`srXW_h9A8Yf>Bk&$yPSwbp~Ra z_cJDX&>=}^vX0#Q_#NojDy$`F!Pvr$EbVQFrD9 zI(b#0(ob-a9)Ta~P3IIG5L=3{7YkyTdri<^$X8PGuMB5DHq+;&3U2koNMu zwc~#lde4!Opo!sp`x2qF;iYgkCMZ9V%@y`5uioX%oSmSe4iGi8H;=xU$58Vy#gxYeOscs~tEzWoJFwc!j$r{a0iJ2Um zIy;zN2fS8)T;A(^oe^**gLDwdz1vwMbR`SMqIp1rFW?QFIG`&|4#t|FH7`T-&<*2e zBv|3s)8>neo&$Y};I5s%;mN`|J?^qFIIuJH9vN%gAPVn$_!6c7>jekPH&&Tq{?eRjeJ z>Q6sr+B>Z%skrkdBC``ha9>lLh${_>R6c`5Cq8xzOO>;6|?6q?LNVs^%-k5iszQ^%6_3k zMcW+;Jhi9{=&@t*8J(Y531RC5DAXi~h)Y}fFM70M$6~nyv$q_nRgpFJacoDkgpbID zrq{z>ZwX5*q~pc)n@kRs24%Go47Ff0A=5aj;%WwMmB_AP$DkmUvfE zHYH*=33t%8xHWs8xUoXqA+sJ)tEG`5Lgw~Vx3*3ydRh@rsK@0t13eugI;^dv8fF6Z zlSq|Hu2~X8XF)K7XRmm1fJ`pl^>bZ(%d9$Cw*A-Lq8ZGo3qN%5WP$9-T^WQFc3SRE z7Vn$o6B0MBeg#F%+b-~Oey=)nY(gEAkP&rK#(~T_nV@yK0=VxDx*mT^Z$L1gQh3vQ z8OU4aC5f&`>#K-M77)dp@Mg^bcT6`m&@P1RC3D}i%fMKw^L^M*aOI~*IsVhqExctB zlpozuc}BJ#Nf}_n4b*gA~n6U z5Qd9Oey6B0J+KbgUpDTVtW^!Hc8*Z@+!Ek#`;f2a^$>);O!NNfP!EdwyYKjlMFmy# zPdGL_5x*!l7iysbE~aN5%U=r0Sygcn!mD%}PdGNJX}Vf97e4vhDJ17bME<4S=?Hqc zOKQ>+bGM3^+6~MVA{~*+I|2p1v-gWGeCE-*UGUCk5V&2Zx9UMimulm@_kA9cVx3v* zpQDE7wSHM!ZhYC*RM2mkCP?wuN*ELr*|*~NE&YPu(K{3gzgu)1U?id%eQD+o!Uwo^ zkeyxKh6%@=IP7lqw)JtAA~L`Vnyk2Sl8w_(irN_-VHvPThGJKLFMglDS(0O#5e9z& z;-B24y(0H`>=c>*;_WN7YRk`lRH}8(@9I1vgXyX|)lb_6xD%26IX0q9XQ40QzW*xcGZagEVm8Ha`5lNe6lMcd7?q zBm0Y>w*LbB-+PPYzh{59L*bZYLN5PfGe1N~%T|6Mv)65yR%>dUYCr@kJNM*{XjZ## zB=YYnK=}Np{Xt|@Ftz@h{(V7+uY&gp|0pQv-caBjQ1G^Urw}Z7(-aCIKLmLEQ+|mI zJ{bUj?h(R^1^@tAzbkx!fQm~c6#PF{;XkkbU4j3Loy-544h6uk`ct_-49dT!&j5Vp zzbw?=UqGS%7w8H7?@`77WA^_rEZ7x(Z&?4&njNP9|C^pkQW4L?--$nx1@5D#sSUjn zsp;f7U-!~bLTGNncp!YY-3f z5)i?OP;h^97zF=0seU}Ip`{1k3#0>4+V$Y+>fry@Ruw{@V0$q-v9=qJde;Q+EU=vC zJfAE8WJ$i)I4nxrD4KB};ub2N*W{C`=9DtA@px-UWz+#(qTdfZW~G$082mJ2FQG+~ zzpq}`d4Ae?Td@p`iE8b@r4yd6d}onIGD=HWAMw?hz=H&_39rM2ZPit_u}*3|WZbKCmOkb@+cT`y_2T;yrmu>KU=&62-AEJrsX}0M zj~)#KJK{GBhIdIm1>~WAv{(*(x1`}J_%v^>O*aZegF%P_HAT7Hu4;&rFS^rp4#;92 z1brEb53aC!pIy|+JQec&TJU-MwfsK$2$lbr4U=nGZbb0ZGdU3tj}Sor6IV{OoxQ_` zRBkY$em~}xt$%n55C}Zu!8v@_om1|DqzQbkKY8=)@^%9qkcpKTw+Xz3<$R4V zjJdeQd<>nQ&&|nRRTtx;`dZx2r7|PtqUbX%Jq%X~nZG(N|KqNfD<#Z7PiH)u1+ z2Yx1Yeocp)l4LfqFKzjwj7a4}4%aBBf`^4c ziGw3fS^Xw!=>vm}Tf>!d>EB=)y752mb;(%MU%ta4%A^=cxVCv!c>Ha+}jxX8qC)$P|2nR$Nb<{~z^m?bf`m3+oxN>9F;aD-%6TSQPr@Wv9Yu}cO z%n}@q;#b(?&7hDC_|eW+gVmeXJWPs4%Bz_wzFOVi%>7T6in2Zk7!|EJR~)*mou0-jEt&V}7Oj`IfJu?!jS0#Xo|&=zW$e zGUe{Tr!M;CaRgBXKVC`E1?HCnbNN-vAHx2F@v<<)lzLGwG0ND56ysO(0r0us2DiV* z8du1WlD?Y_$y2cqk00^Y%CvCfn9-@*gAkK)Da5Q5+|F9P<)It~WxI_Kf7pO@fFyuB zQY7%bf66NOvW>MMgbH)ip6{!hW?XulZK-|w>89rJF2)1i?MaJ2IErUG2RcvFE-EqaqeNqYmJ z2A*-wl7v~EISfC6FERg*e=ooAg;age-oo+`l-!qWj*l`FpKU;(Gxgx~Fey>8%lLCK zw{#O}710P!i`v2!-qr&ugA+W&H3~T{(z9B_qOf65yi;#vjQH;KyZa}>lslW8N-q$o zOdhMuB?QB9CPQTN`uGJo3Zv^@JZ{Os$oF71ni7CqTK@Z@w-crZ%M6O6D=NPP}1% zNGnZj@oxk&_3uhRwy^tYQM{K>`6MS+03xC|p(>9MoOWk1n=?m7C>KpA**jw@6xe`L z3V1%(Ja#&P2rE`AQUfD74HlMl!p*yN>a-3rEQLYk5evuY7%-$k*Jc3U%c@3 z_$-^u_dWC-tinkmi(ymtG(y9`;Mssua9=g&lnxq9B!<>u>Bq+f{$iSk$LFZWE2>_E`Q$M;dW-EO9%x+YCz17+_??avePc{9}w|! z>z59-_x>7|KF@2<%#|-mU!Ltd>>~@MK1maMm`MxS$bW=;EedV+KiYfCf4I7sUClG@ zZ^#u7)9NL1uO8b8yDlH@)qPSYt3c@ecH$!;O{Iu}0NNDmiE6 z3s#{l6r+pPLOFzv;g*s(2^*scX}-oS!k47%SGGs>;Z7QA2cvIj$GxXa4<@oyp;m{T zz{VwQ?nQIzr=puY9NVy17u+ikC>;}Ifu0(*O){j-pX3K92RbfiuW`eS^T;Id2Z9r!&)Wp- z2L2o}3s3S-79EiM{UcfWPi?2pI;AINM&l5N+^_40`v@Ohf2I* zx}7-6Gpx+{{GHzL6jX5NO^TWq&TDcO_<(*^Bz5L#R?T6qoQOmN8E*~}FP`TeGN>J` zvnM^((=2gCH;}Vv5|8r?h%0gh=$%~TvG>0zS&al8c&U4Tu78hp(QfoS;3O-lnglux z0Bu+CQJJcUmhz1v0m-MBE_(gVRBERci>8k}$l#r3T{m=>*D!eVxAu0(Hn}d7VPbV= z-{nFFoP!P+K%n6`qniP^Gr0n+P$z`N3};T~w`e`Vx}b_qwPzxB;vmW=g@^{zee3Tk z4Fx+5&iZKqh5G2rdK0kEk~pfOL_ajj>4)yYhe$fS6srqj&C1FZmvEL;B{`zDse9Lo z;%`;n%6@vSme3sH*PoFA;qdRLp!1mQzev|8<41B4*RLtWw2@TmX>KuGhjm6Jw^_A) zlp8?0mE=ZFwn;e{cSAm@Yq8eCgrOY2P(BEnzCN^JO0F9WJ_o|tKtz0q2pb`TYWE8L zs@pJe&`f>M@rz+#7g<3L2IRAFa{7tj#v%umNh@ezB43Bnh=X?Gqv3Mt{KzF*Vi9_m zIdOT;ES9ih0Z<_&L)8GgXB7AisCaV4TuSB3MLt@{an0J!Fw8|-{TyF}l1yt%%rL=Z z1dBAjThHRnBE*?rQ@4@w!cTO&QA=8C6-dwl{~Z9JVf5-Sv>DhzCl}ztmX^bZC)6oH z%Z4>a`OXr-|4AsmKk|G3R_iX|aDaFxQ2qrMz-UIocD(Buq&xL>m%@aeF0 zB$<95KwK@IX{aHgTQZG$K-VMZQFNxc-b{VHEx;r69J(@ag4Pbw!%r3-50hZ)*BlOBaGwT26i0}MLC(n- zKY?CHQt-lO8@XO)B%hCj2IjjUXhR4M=z1gtzO8;=uk+Q-mRrkf9^0NS@{Z}J#lIo5=v=(d%>GKacdsM7g{8VA-q&lYY=D> zEXY~3g${@f^s?#g-QXcokg@WgXv!!?v1x{Rxb&TLHs8QLq=5SBL23%f-D;hk=DVK9 z)`-LWW)5s*yyF7YMB21ue5y_AK0T>@blY#Q!Gswsvf55U#6vJmkNnm}cfl7b_AuD} z7WbLS_I_w%rR>|pbCOes(>$7Q_08#5LppcqwlW!+Mmx#U`_G0WxMUk+Z_ z;%tveBEmfNM)VhqDa8**bke@W;Prpf0JK~yOw6SGl)|<;wiL?5wd2b*|Ei(t;Dgug zp8^SOBC83Mq}*Qh>KPKF0QLfcisVpd9U~DIwAhl6?+9#6OMJwUH44=OK7#bS9-W|BfdS`SLX`~@s ztA}^1mCk%Q{8E(vx)YV>3?==`0pQ_NTTLInC6kgt${Evo7HsS{LmuGK9inZlbG zdhX=e*PP2jKhnwYA=~=8Gjz|h_|y*f!{Z${oM(y-(qPLg$Nk3st#1d{&x{n@T`iE> zrP(O>_WhlG2(i_$4Nm@8op+TLB;F=#(Vf~XYU6>l6_}S~O>A41^8n%Uj9xFV{>id; z7!yyvL8vsKJE>OEP+Q#BUX7hz9ggT-eF?xRWF&-tA)$&+-*j++P#HB$G()6jeKZAJ z)5RM*yu4ks);GB75y*4a7bI%kpgWqeCe_Ab$mn92mCM;nR}3i7E1O>O+pu3qzNT+P zOyByHfs>Yt@HZ!MKrPyED0|h26v0+(0PIgf;FlO z0t1qU9bhSSBW=srgX$%|k0upiVLMv&o^qUR>pyOJa`ar!yPM9pPu6U$POo`KF}RwG z;|9JTn?6zI{t5z8z6f4$dF+iH>Z}h{EmvJotu9$ct643^blCA(m5BCz@N^p6z4&6p z?+&q1C)Z<4rYFiq7*nw~U7dV|R#!7^LsSDd_c-?t?Fzn@ z0?$F4w-vnXF3(!UuQ9q9zM9GD9A`B~KtRYhkuNqsL_ZD7B08uEup?A-@PB&@ zS{Jn;#>%m?34I=Vi^DDkybPfXNq7l9iy)!Lz&O;|vzm#*HazVg6_%?ofw#l$rBuXh6(X@+KTc*DloV?vIYt+Y^R6vv_zbj-uU`LyqqGR5d?IKtrMg~;+=RYTj7#* zDAo|(v_QP<0tk_;b(9^xz)mz;rqS--rsw6|^a>Ww3o@F3o)bBSDm!7+^AA>DZn38*T1 zQazX&PGrNURa9wfoh5SXEBGc^gPm6wSCoXHexoS&D=pakbAX4yE)LhXkh{!$A@#gS zDmtjiGGvcVm$S%c|DVCb%8+kzqhbf5soqGMa_|NyDmfC}*XP`j8Wg0ApCNl+^pS2K zxd-tHP}FXFF~ER~qcL|A&($E;SY<1|?|zNRlly*_n^!p4YxJq`wA3TkLa$$t=N7|2 zPa5J^VXh!`lC~^QKJI*;($PstJ*=0#inTs>{0g0;oqq(!4L~8IPV00X%?r)wIgGgC6QwF*i5eTo!b^gil2|H zhO+j$Z1WdyfviE7SeVW*;wGOOAEFL-5pqqraeY-xZ>B3h*90dBIz{;a_`Ir3hp7pD zKkAN}VI0f_$N8YO+P6(>tGG9)CkjqQngFU#)4M&1E@JzZ*nk=fb5XI?W-lEebcC59 zyi*tzcJh0N+8hM~HLjYQ4CrHdat$`I>AKgCgJi4mkC&j`ETX}oUYME(QM4}K>E?t4 zd6*#3LE6omNBaxDE=wv&b>P_gqlYD`)`Sy9?i&1=+FDs-XfVl$Il3Vo97dg&RtfZ? zJR>O=hGP7qG&-@}#a`YXwA7_$U7)rfOZuJ<)2q)~Z}rr*Wbd zxSr)F(1c&gg%?%O{3MF&p|9#10i_deS9+B7)iBMHK*f3+&n{T9@)iiI0XXdmMFSpQ zp$&^%!ItHiMjWE8Psp-)b&NR%(i}!j&5?Drb;Ec&_bwX~xY z>QSgrUP^TjBgv2R@@Aw3hd;Cx3Em&z)9k9-nIs8jgu>t9=5Hx^#L>N}k0@!N6+&dT ztBvRqtpYT4`dfz`-AKd94D|Mr+3#7-G%&6e_`aFi3B^)zKEJx=Y3%O^v~KzwqUxL| zeQB*d`PlZ6*zQMWe=a0~& znh*P@Us~23QMhy_oOoe^dgK@)SZp4A*hW?LvyIWU(L3U>cT1?hhA9f+hA!fmap|5! zmfQuM-Bp?{aUd_D=&s=0M{SjkIaGpfoq{s6Ed$(12CGjzgGd7=cMkL&01$aUd{}2F zv9oA~ufEqq=?r9BDC8k-*fTE3UlhnbL5$>l3k11u_lxdG(FKI6F+iC(f9p5wbMUO- z*5P_=`61^@1|iv=!uqjB-c)^0T>8j4mh+|79<%W6&Vo)y)7AtRXkdsp!2J1Fyb6<{ zMI7SQ>v%~Engx)Ee78eWP#{R7eP=L=*lBB#Y3~zT<;K06MCnpG{!}-%4g3k$V2g8H z&&;m_%X875_QQ3zj^aYBm63f=pGF%jKTG7EMbI+S@m`F{(-ok;b{5i{SAXOax*dm& z;HmEh;#l$I3YS;$Vc_YjwY3^CYh(N1dQZ!hfeHL zxXN7g%3cOJr}|@(56~qEY-mu5t;}qMY)rfJ@N~D5-*Q6y`@bP2W*$@FN^gg{HbJUq z;=a5SGn=nO%@1uM8Qy7}AyCdGQ?pLinDKkBbZ@gt%Xg3|oQp(UQQlZiD54TmqWv6c zMd^!eg*57G83a^-0m&T6^kZbZDUGg97D(4297U~98fyH+#-;fTgt4F&a4CQfocYQq zthbN3%DVOh&ym5JdelF&fMix0S(aioYXx)GiAjMM&4HRWm*Kn>Zt2TOC|$9qlPDN0 zQH|VPHEMV(-Sd**@n)UDZ$0D3CR^%kg1}>o9O+}zL$c1MvYYU@s$|}WqJCE3rXM{p ztI9Q>(zXLOThntYje>btE2v|CVhGoP9MW!gr8k07Hx;gZLy1*3n*daor9>E{40>*Y zrSl5+Uqs!d1bwBLuUt=@Z=@O_I5x!H&cRBvmw8u2*%4{d)nPxF(0$Si)BZZi9E|PO zpMeUC+q%rXGkN)be}_A{Y4sd^N9IB~2o?^rjWQRiYSa~pHDkVyb7>j)YWjjTV+&ii z&ELAncc!N9I4!qH8pqXOs6R4&)|Ygq=l#pD5xu(@U(|GUMN7|I=`&ztj!r0%kSNc3}Rgy`^d$ZeW(!Z;Cb_kkv2QU4cV?C#LQ#H52a_1_*(z z;KI`|e+};&;h@@idQ8&vpM7VP8vO(B%z_YQM=-s^x!yN0goF&AN9FFa*rXG538T*y zCtm`GhGoZvxt1P3Ok+Zo5%vC6W(YKSvR`C!8@`8+ZH^M5Iy%IbS-*Azzj`PgCDskO zFZi4bIZbOpU*`G&I%@=xO^*otN3voFM3a52BRc@1@9)Ah3jTky0u3Nm{0|)h{EPIz z_G;n5|B?Mckn(>4-oNvyb^V`p{C_vozc;r3SFGdz?{NI$f4l9Qfxia_jQ-y_(gNLB zOnZY|2?ApNsmxV<(iMCv1QG0RS5O9}6u4AXNU^<)19| FUjQK_yB+`l literal 0 HcmV?d00001 diff --git a/Tests/NextcloudUITests/AutoUploadUITests.swift b/Tests/NextcloudUITests/AutoUploadUITests.swift new file mode 100644 index 0000000000..8c487e6f28 --- /dev/null +++ b/Tests/NextcloudUITests/AutoUploadUITests.swift @@ -0,0 +1,127 @@ +// SPDX-FileCopyrightText: Nextcloud GmbH +// SPDX-FileCopyrightText: 2025 Iva Horn +// SPDX-License-Identifier: GPL-3.0-or-later + +import XCTest + +/// +/// User interface tests for the download limits management on shares. +/// +@MainActor +final class AutoUploadUITests: BaseUIXCTestCase { + // MARK: - Lifecycle + override func setUp() async throws { + try await super.setUp() + continueAfterFailure = false + + // Handle alerts presented by the system. + addUIInterruptionMonitor(withDescription: "Allow Notifications", for: "Allow") + addUIInterruptionMonitor(withDescription: "Save Password", for: "Not Now") + + // Launch the app. + app = XCUIApplication() + app.launchArguments = ["UI_TESTING"] + app.launch() + + try await logIn() + + // Set up test backend communication. + backend = UITestBackend() + } + + private func goToAutoUpload() async throws { + addUIInterruptionMonitor(withDescription: "Are you sure you want to upload all photos?", for: "Confirm") + + app.tabBars["Tab Bar"].buttons["More"].tap() + + app.tables/*@START_MENU_TOKEN@*/.staticTexts["Settings"]/*[[".cells.staticTexts[\"Settings\"]",".staticTexts[\"Settings\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + + let collectionViewsQuery = app.collectionViews + collectionViewsQuery/*@START_MENU_TOKEN@*/.staticTexts["Auto upload"]/*[[".cells",".buttons[\"Auto upload\"].staticTexts[\"Auto upload\"]",".staticTexts[\"Auto upload\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.tap() + + try await aSmallMoment() + + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let allowButton = springboard.buttons["Allow Full Access"] + + if allowButton.await() { + allowButton.tap() + } + } + + func testAutoUploadAllPhotos() async throws { + try await goToAutoUpload() + + let collectionViewsQuery = app.collectionViews + + let turnOnAutoUploadingSwitch = collectionViewsQuery.switches["Turn on auto uploading"] + + collectionViewsQuery/*@START_MENU_TOKEN@*/.switches["Auto upload photos"]/*[[".cells.switches[\"Auto upload photos\"]",".switches[\"Auto upload photos\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.swipeUp() + + if turnOnAutoUploadingSwitch.await() { + turnOnAutoUploadingSwitch.tap() + } + + app.tabBars["Tab Bar"].buttons["Files"].tap() + + try await aSmallMoment() + + pullToRefresh() + + let photosItem = app.collectionViews["NCCollectionViewCommon"]/*@START_MENU_TOKEN@*/.staticTexts["Photos"]/*[[".cells[\"Photos\"].staticTexts[\"Photos\"]",".cells[\"Cell\/Photos\"].staticTexts[\"Photos\"]",".staticTexts[\"Photos\"]"],[[[-1,2],[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/ + if photosItem.await() { + photosItem.tap() + } + + try await aSmallMoment() + + XCTAssertTrue(app.collectionViews.cells.count == 6) + } + + func testAutoUploadNewPhotos() async throws { + try await goToAutoUpload() + + let backUpNewPhotosVideosOnlySwitch = app.collectionViews.switches["NewPhotosToggle"] + + if backUpNewPhotosVideosOnlySwitch.await() { + backUpNewPhotosVideosOnlySwitch.switches.firstMatch.tap() + } + + let collectionViewsQuery = app.collectionViews + + let turnOnAutoUploadingSwitch = collectionViewsQuery.switches["Turn on auto uploading"] + + collectionViewsQuery/*@START_MENU_TOKEN@*/.switches["Auto upload photos"]/*[[".cells.switches[\"Auto upload photos\"]",".switches[\"Auto upload photos\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.swipeUp() + + if turnOnAutoUploadingSwitch.await() { + turnOnAutoUploadingSwitch.tap() + } + + app.tabBars["Tab Bar"].buttons["Files"].tap() + + try await aSmallMoment() + + pullToRefresh() + + let photosItem = app.collectionViews["NCCollectionViewCommon"]/*@START_MENU_TOKEN@*/.staticTexts["Photos"]/*[[".cells[\"Photos\"].staticTexts[\"Photos\"]",".cells[\"Cell\/Photos\"].staticTexts[\"Photos\"]",".staticTexts[\"Photos\"]"],[[[-1,2],[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/ + + // Does not seem possible to take a screenshot on Simulator or easily transfer a new photo in Simulator. + // Thus for now we can only rely on the Photos folder not existing at all to test this. + XCTAssertFalse(photosItem.exists) + } + + override func tearDown() async throws { + let tabBar = app.tabBars["Tab Bar"] + tabBar.buttons["Files"].tap() + let nccollectionviewcommonCollectionView = app.collectionViews["NCCollectionViewCommon"] + let cell = nccollectionviewcommonCollectionView/*@START_MENU_TOKEN@*/.cells["Cell/Photos"]/*[[".cells[\"Photos\"]",".cells[\"Cell\/Photos\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/ + if !cell.exists { return } + + cell.otherElements.containing(.button, identifier:"Cell/Photos/shareButton").children(matching: .button).element(boundBy: 1).tap() + let tablesQuery = app.tables + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Delete folder"]/*[[".cells.staticTexts[\"Delete folder\"]",".staticTexts[\"Delete folder\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + app.alerts["Delete folder?"].scrollViews.otherElements.buttons["Yes"].tap() + + cell.awaitInexistence() + } +} diff --git a/Tests/NextcloudUITests/BaseUIXCTestCase.swift b/Tests/NextcloudUITests/BaseUIXCTestCase.swift index 5b54c30c5c..5dd1a21de8 100644 --- a/Tests/NextcloudUITests/BaseUIXCTestCase.swift +++ b/Tests/NextcloudUITests/BaseUIXCTestCase.swift @@ -72,34 +72,61 @@ class BaseUIXCTestCase: XCTestCase { let serverAddressTextField = app.textFields["serverAddress"].firstMatch guard serverAddressTextField.await() else { return } + try await aSmallMoment() + serverAddressTextField.tap() serverAddressTextField.typeText(TestConstants.server) app.buttons["submitServerAddress"].tap() + try await aSmallMoment() + let webView = app.webViews.firstMatch guard webView.await() else { throw UITestError.waitForExistence(webView) } +// try await aSmallMoment() + let loginButton = webView.buttons["Log in"] +// try await aSmallMoment() + if loginButton.await() { loginButton.tap() } +// try await aSmallMoment() + let usernameTextField = webView.textFields.firstMatch if usernameTextField.await() { + + try await aSmallMoment() + guard usernameTextField.await() else { return } usernameTextField.tap() + + try await aSmallMoment() + usernameTextField.typeText(TestConstants.username) + try await aSmallMoment() + let passwordSecureTextField = webView.secureTextFields.firstMatch + + try await aSmallMoment() + passwordSecureTextField.tap() + + + try await aSmallMoment() + passwordSecureTextField.typeText(TestConstants.password) + try await aSmallMoment() + webView.buttons.firstMatch.tap() } diff --git a/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Cloud_Checkmark.svg b/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Cloud_Checkmark.svg new file mode 100644 index 0000000000..82e33eef4e --- /dev/null +++ b/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Cloud_Checkmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Contents.json b/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Contents.json new file mode 100644 index 0000000000..e50bbe2113 --- /dev/null +++ b/Widget/Assets.xcassets/Cloud_Checkmark.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Cloud_Checkmark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Assets.xcassets/Cloud_Xmark.imageset/Cloud_Xmark.svg b/Widget/Assets.xcassets/Cloud_Xmark.imageset/Cloud_Xmark.svg new file mode 100644 index 0000000000..5a462aedb8 --- /dev/null +++ b/Widget/Assets.xcassets/Cloud_Xmark.imageset/Cloud_Xmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/Cloud_Xmark.imageset/Contents.json b/Widget/Assets.xcassets/Cloud_Xmark.imageset/Contents.json new file mode 100644 index 0000000000..7aabf1d99a --- /dev/null +++ b/Widget/Assets.xcassets/Cloud_Xmark.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Cloud_Xmark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/Contents.json b/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/Contents.json new file mode 100644 index 0000000000..f1df926fcf --- /dev/null +++ b/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "file_unsupported_widget.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/file_unsupported_widget.svg b/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/file_unsupported_widget.svg new file mode 100644 index 0000000000..7303b08a56 --- /dev/null +++ b/Widget/Assets.xcassets/FileUnsupported_NoPadding.imageset/file_unsupported_widget.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/Media.imageset/Contents.json b/Widget/Assets.xcassets/Media.imageset/Contents.json new file mode 100644 index 0000000000..ba2d9e1ce8 --- /dev/null +++ b/Widget/Assets.xcassets/Media.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Media.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Assets.xcassets/Media.imageset/Media.svg b/Widget/Assets.xcassets/Media.imageset/Media.svg new file mode 100644 index 0000000000..6afd5adc83 --- /dev/null +++ b/Widget/Assets.xcassets/Media.imageset/Media.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/AccentColor.colorset/Contents.json b/Widget/Assets.xcassets/Mic.imageset/Contents.json similarity index 70% rename from Widget/Assets.xcassets/AccentColor.colorset/Contents.json rename to Widget/Assets.xcassets/Mic.imageset/Contents.json index eb87897008..4526994e79 100644 --- a/Widget/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/Widget/Assets.xcassets/Mic.imageset/Contents.json @@ -1,6 +1,7 @@ { - "colors" : [ + "images" : [ { + "filename" : "Mic.svg", "idiom" : "universal" } ], diff --git a/Widget/Assets.xcassets/Mic.imageset/Mic.svg b/Widget/Assets.xcassets/Mic.imageset/Mic.svg new file mode 100644 index 0000000000..475621d6a2 --- /dev/null +++ b/Widget/Assets.xcassets/Mic.imageset/Mic.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/Widget/Assets.xcassets/Note.imageset/Contents.json similarity index 70% rename from Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json rename to Widget/Assets.xcassets/Note.imageset/Contents.json index eb87897008..6fa66e29e3 100644 --- a/Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json +++ b/Widget/Assets.xcassets/Note.imageset/Contents.json @@ -1,6 +1,7 @@ { - "colors" : [ + "images" : [ { + "filename" : "Note.svg", "idiom" : "universal" } ], diff --git a/Widget/Assets.xcassets/Note.imageset/Note.svg b/Widget/Assets.xcassets/Note.imageset/Note.svg new file mode 100644 index 0000000000..e3df93daef --- /dev/null +++ b/Widget/Assets.xcassets/Note.imageset/Note.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Assets.xcassets/Scan.imageset/Contents.json b/Widget/Assets.xcassets/Scan.imageset/Contents.json new file mode 100644 index 0000000000..065c7beaa5 --- /dev/null +++ b/Widget/Assets.xcassets/Scan.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Scan.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Assets.xcassets/Scan.imageset/Scan.svg b/Widget/Assets.xcassets/Scan.imageset/Scan.svg new file mode 100644 index 0000000000..f5c9dda684 --- /dev/null +++ b/Widget/Assets.xcassets/Scan.imageset/Scan.svg @@ -0,0 +1,3 @@ + + + diff --git a/Widget/Colors.xcassets/Background.colorset/Contents.json b/Widget/Colors.xcassets/Background.colorset/Contents.json new file mode 100644 index 0000000000..4eea21fecd --- /dev/null +++ b/Widget/Colors.xcassets/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x10", + "red" : "0x02" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/BottomElementForeground.colorset/Contents.json b/Widget/Colors.xcassets/BottomElementForeground.colorset/Contents.json new file mode 100644 index 0000000000..76547d8302 --- /dev/null +++ b/Widget/Colors.xcassets/BottomElementForeground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/Contents.json b/Widget/Colors.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Widget/Colors.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/Divider.colorset/Contents.json b/Widget/Colors.xcassets/Divider.colorset/Contents.json new file mode 100644 index 0000000000..531e0c9336 --- /dev/null +++ b/Widget/Colors.xcassets/Divider.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/Subtitle.colorset/Contents.json b/Widget/Colors.xcassets/Subtitle.colorset/Contents.json new file mode 100644 index 0000000000..3288e04f17 --- /dev/null +++ b/Widget/Colors.xcassets/Subtitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/Text.colorset/Contents.json b/Widget/Colors.xcassets/Text.colorset/Contents.json new file mode 100644 index 0000000000..fafa476721 --- /dev/null +++ b/Widget/Colors.xcassets/Text.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Colors.xcassets/Title.colorset/Contents.json b/Widget/Colors.xcassets/Title.colorset/Contents.json new file mode 100644 index 0000000000..cfbec998e7 --- /dev/null +++ b/Widget/Colors.xcassets/Title.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Widget/Dashboard/DashboardData.swift b/Widget/Dashboard/DashboardData.swift index 91fe51de87..3d65489127 100644 --- a/Widget/Dashboard/DashboardData.swift +++ b/Widget/Dashboard/DashboardData.swift @@ -68,10 +68,10 @@ let dashboardDatasTest: [DashboardData] = [ func getDashboardItems(displaySize: CGSize, withButton: Bool) -> Int { if withButton { - let items = Int((displaySize.height - 90) / 55) + let items = Int((displaySize.height - 90) / 59) return items } else { - let items = Int((displaySize.height - 50) / 55) + let items = Int((displaySize.height - 50) / 59) return items } } @@ -105,7 +105,7 @@ func getDashboardDataEntry(configuration: DashboardIntent?, isPreview: Bool, dis var activeTableAccount: tableAccount? if isPreview { - return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " dashboard", account: "")) + return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " dashboard", account: "")) } let accountIdentifier: String = configuration?.accounts?.identifier ?? "active" @@ -117,7 +117,7 @@ func getDashboardDataEntry(configuration: DashboardIntent?, isPreview: Bool, dis guard let activeTableAccount, let capabilities = NCManageDatabase.shared.setCapabilities(account: activeTableAccount.account) else { - return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", comment: ""), account: "")) + return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "Cloud_Xmark", footerText: NSLocalizedString("_no_active_account_", comment: ""), account: "")) } // Default widget @@ -125,7 +125,7 @@ func getDashboardDataEntry(configuration: DashboardIntent?, isPreview: Bool, dis let id: String = configuration?.applications?.identifier ?? (result?.id ?? "recommendations") guard capabilities.capabilityServerVersionMajor >= NCGlobal.shared.nextcloudVersion25 else { - return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "xmark.icloud", footerText: NSLocalizedString("_widget_available_nc25_", comment: ""), account: activeTableAccount.account)) + return completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: UIImage(named: "widget")!, title: "Dashboard", footerImage: "Cloud_Xmark", footerText: NSLocalizedString("_widget_available_nc25_", comment: ""), account: activeTableAccount.account)) } // NETWORKING @@ -251,9 +251,9 @@ func getDashboardDataEntry(configuration: DashboardIntent?, isPreview: Bool, dis let footerText = "Dashboard " + NSLocalizedString("_of_", comment: "") + " " + activeTableAccount.displayName + alias if error != .success { - completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: tableDashboard, buttons: buttons, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "xmark.icloud", footerText: error.errorDescription, account: account)) + completion(DashboardDataEntry(date: Date(), datas: datasPlaceholder, dashboard: tableDashboard, buttons: buttons, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "Cloud_Xmark", footerText: error.errorDescription, account: account)) } else { - completion(DashboardDataEntry(date: Date(), datas: datas, dashboard: tableDashboard, buttons: buttons, isPlaceholder: false, isEmpty: datas.isEmpty, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: footerText, account: account)) + completion(DashboardDataEntry(date: Date(), datas: datas, dashboard: tableDashboard, buttons: buttons, isPlaceholder: false, isEmpty: datas.isEmpty, titleImage: titleImage, title: title, footerImage: "Cloud_Checkmark", footerText: footerText, account: account)) } } } diff --git a/Widget/Dashboard/DashboardWidgetProvider.swift b/Widget/Dashboard/DashboardWidgetProvider.swift index 419bedda6c..811d43c9c9 100644 --- a/Widget/Dashboard/DashboardWidgetProvider.swift +++ b/Widget/Dashboard/DashboardWidgetProvider.swift @@ -35,7 +35,7 @@ struct DashboardWidgetProvider: IntentTimelineProvider { let datasPlaceholder = Array(dashboardDatasTest[0...dashboardItems]) let title = "Dashboard" let titleImage = UIImage(named: "widget")! - return Entry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " widget", account: "") + return Entry(date: Date(), datas: datasPlaceholder, dashboard: nil, buttons: nil, isPlaceholder: true, isEmpty: false, titleImage: titleImage, title: title, footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " widget", account: "") } func getSnapshot(for configuration: DashboardIntent, in context: Context, completion: @escaping (DashboardDataEntry) -> Void) { diff --git a/Widget/Dashboard/DashboardWidgetView.swift b/Widget/Dashboard/DashboardWidgetView.swift index f7cc722054..33eda47473 100644 --- a/Widget/Dashboard/DashboardWidgetView.swift +++ b/Widget/Dashboard/DashboardWidgetView.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 20/08/22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -29,39 +30,14 @@ struct DashboardWidgetView: View { var body: some View { GeometryReader { geo in if entry.isEmpty { - VStack(alignment: .center) { - Image(systemName: "checkmark") - .resizable() - .scaledToFit() - .font(Font.system(.body).weight(.light)) - .frame(width: 50, height: 50) - Text(NSLocalizedString("_no_items_", comment: "")) - .font(.system(size: 25)) - .padding() - Text(NSLocalizedString("_check_back_later_", comment: "")) - .font(.system(size: 15)) - } - .frame(width: geo.size.width, height: geo.size.height) + EmptyWidgetContentView() + .frame(width: geo.size.width, height: geo.size.height) } ZStack(alignment: .topLeading) { - HStack { - Image(uiImage: entry.titleImage) - .renderingMode(.template) - .resizable() - .scaledToFill() - .frame(width: 20, height: 20) - - Text(entry.title) - .font(.system(size: 15)) - .fontWeight(.bold) - .multilineTextAlignment(.center) - .textCase(.uppercase) - .lineLimit(1) - } - .frame(width: geo.size.width - 20) - .padding([.top, .leading, .trailing], 10) - + HeaderView(title: entry.title) + .padding(.top, 7) + if !entry.isEmpty { VStack(alignment: .leading) { @@ -74,12 +50,11 @@ struct DashboardWidgetView: View { HStack { - let subTitleColor = Color(white: 0.5) - if entry.isPlaceholder { Circle() .fill(Color(.systemGray4)) - .frame(width: 35, height: 35) + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) } else if let color = element.imageColor { Image(uiImage: element.icon) .renderingMode(.template) @@ -102,36 +77,38 @@ struct DashboardWidgetView: View { .renderingMode(.template) .resizable() .scaledToFill() - .frame(width: 25, height: 25) + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) + .foregroundStyle(Color(uiColor:NCBrandColor.shared.iconImageColor2)) .clipped() - .cornerRadius(5) } } else { if entry.dashboard?.itemIconsRound ?? false || element.avatar { Image(uiImage: element.icon) .resizable() .scaledToFill() - .frame(width: 35, height: 35) + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) .clipShape(Circle()) } else { Image(uiImage: element.icon) .resizable() .scaledToFill() - .frame(width: 35, height: 35) + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) .clipped() - .cornerRadius(5) } } - VStack(alignment: .leading, spacing: 2) { - - Text(element.title) - .font(.system(size: 12)) - .fontWeight(.regular) - - Text(element.subTitle) - .font(.system(size: CGFloat(10))) - .foregroundColor(subTitleColor) + VStack(alignment: .leading, spacing: 2) { + Text(element.title) + .font(WidgetConstants.elementTileFont) + .foregroundStyle(Color(.title)) + if !element.subTitle.isEmpty { + Text(element.subTitle) + .font(WidgetConstants.elementSubtitleFont) + .foregroundStyle(Color(.subtitle)) + } } Spacer() } @@ -140,20 +117,21 @@ struct DashboardWidgetView: View { } if element != entry.datas.last { Divider() - .padding(.leading, 54) + .overlay(Color(.divider)) } } } } - .padding(.top, 35) + .padding(.top, 40) .redacted(reason: entry.isPlaceholder ? .placeholder : []) } if let buttons = entry.buttons, !buttons.isEmpty, !entry.isPlaceholder { HStack(spacing: 10) { - let brandColor = Color(NCBrandColor.shared.getElement(account: entry.account)) - let brandTextColor = Color(NCBrandColor.shared.getText(account: entry.account)) + + let brandColor = Color(NCBrandColor.shared.brandElement) + let brandTextColor = Color(.text) ForEach(buttons, id: \.index) { element in Link(destination: URL(string: element.link)!, label: { @@ -165,31 +143,24 @@ struct DashboardWidgetView: View { .foregroundColor(brandTextColor) .border(brandColor, width: 1) .cornerRadius(.infinity) + .padding(.bottom, 12) }) } } .frame(width: geo.size.width - 10, height: geo.size.height - 25, alignment: .bottomTrailing) } - HStack { - - Image(systemName: entry.footerImage) - .resizable() - .scaledToFit() - .frame(width: 15, height: 15) - .font(Font.system(.body).weight(.light)) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - - Text(entry.footerText) - .font(.caption2) - .lineLimit(1) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - } - .padding(.horizontal, 15.0) - .frame(maxWidth: geo.size.width, maxHeight: geo.size.height - 2, alignment: .bottomTrailing) + FooterView(imageName: entry.footerImage, + text: entry.footerText, + isPlaceholder: entry.isPlaceholder) + .padding(.horizontal, 15.0) + .padding(.bottom, 10.0) + .frame(maxWidth: geo.size.width, + maxHeight: geo.size.height - 2, + alignment: .bottomTrailing) } } - .widgetBackground(Color(UIColor.systemBackground)) + .widgetBackground(Color(.background)) } } @@ -198,7 +169,7 @@ struct DashboardWidget_Previews: PreviewProvider { let datas = Array(dashboardDatasTest[0...4]) let title = "Dashboard" let titleImage = UIImage(named: "widget")! - let entry = DashboardDataEntry(date: Date(), datas: datas, dashboard: nil, buttons: nil, isPlaceholder: false, isEmpty: true, titleImage: titleImage, title: title, footerImage: "checkmark.icloud", footerText: "Nextcloud widget", account: "") + let entry = DashboardDataEntry(date: Date(), datas: datas, dashboard: nil, buttons: nil, isPlaceholder: false, isEmpty: true, titleImage: titleImage, title: title, footerImage: "Cloud_Checkmark", footerText: "Nextcloud widget", account: "") DashboardWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemLarge)) } } diff --git a/Widget/Files/FilesData.swift b/Widget/Files/FilesData.swift index 5788b0d2af..87ea34b93b 100644 --- a/Widget/Files/FilesData.swift +++ b/Widget/Files/FilesData.swift @@ -46,6 +46,7 @@ struct FilesData: Identifiable, Hashable { var subTitle: String var url: URL var useTypeIconFile: Bool = false + var color: UIColor? } let filesDatasTest: [FilesData] = [ @@ -81,7 +82,7 @@ func getTitleFilesWidget(tableAccount: tableAccount?) -> String { } func getFilesItems(displaySize: CGSize) -> Int { - let items = Int((displaySize.height - 90) / 55) + let items = Int((displaySize.height - 90) / 59) return items } @@ -93,7 +94,7 @@ func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySi var activeTableAccount: tableAccount? if isPreview { - return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: getTitleFilesWidget(tableAccount: nil), footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files")) + return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: getTitleFilesWidget(tableAccount: nil), footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " files")) } let accountIdentifier: String = configuration?.accounts?.identifier ?? "active" @@ -104,7 +105,7 @@ func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySi } guard let activeTableAccount else { - return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: getTitleFilesWidget(tableAccount: nil), footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: ""))) + return completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: getTitleFilesWidget(tableAccount: nil), footerImage: "Cloud_Xmark", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: ""))) } // NETWORKING @@ -227,6 +228,10 @@ func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySi } if image == nil { image = utility.loadImage(named: file.iconName, useTypeIconFile: true, account: file.account) + if image == UIImage(resource: .fileUnsupported) { + // Quick fix unsupported file icon size for widget + image = UIImage(resource: .fileUnsupportedNoPadding) + } useTypeIconFile = true } @@ -234,7 +239,7 @@ func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySi let metadata = NCManageDatabase.shared.convertFileToMetadata(file, isDirectoryE2EE: isDirectoryE2EE) // DATA - let data = FilesData(id: metadata.ocId, image: image ?? UIImage(), title: metadata.fileNameView, subTitle: subTitle, url: url, useTypeIconFile: useTypeIconFile) + let data = FilesData(id: metadata.ocId, image: image ?? UIImage(), title: metadata.fileNameView, subTitle: subTitle, url: url, useTypeIconFile: useTypeIconFile, color: colorByImageName(file.iconName)) datas.append(data) if datas.count == filesItems { break} } @@ -243,10 +248,27 @@ func getFilesDataEntry(configuration: AccountIntent?, isPreview: Bool, displaySi let footerText = "Files " + NSLocalizedString("_of_", comment: "") + " " + activeTableAccount.displayName + alias if error != .success { - completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: activeTableAccount.userId, url: activeTableAccount.urlBase, account: activeTableAccount.account, tile: title, footerImage: "xmark.icloud", footerText: error.errorDescription)) + completion(FilesDataEntry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: activeTableAccount.userId, url: activeTableAccount.urlBase, account: activeTableAccount.account, tile: title, footerImage: "Cloud_Xmark", footerText: error.errorDescription)) } else { - completion(FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: datas.isEmpty, userId: activeTableAccount.userId, url: activeTableAccount.urlBase, account: activeTableAccount.account, tile: title, footerImage: "checkmark.icloud", footerText: footerText)) + completion(FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: datas.isEmpty, userId: activeTableAccount.userId, url: activeTableAccount.urlBase, account: activeTableAccount.account, tile: title, footerImage: "Cloud_Checkmark", footerText: footerText)) } } } + + @Sendable func colorByImageName(_ name: String) -> UIColor { + switch name { + case NKCommon.TypeIconFile.audio.rawValue, + NKCommon.TypeIconFile.code.rawValue, + NKCommon.TypeIconFile.compress.rawValue, + NKCommon.TypeIconFile.image.rawValue, + NKCommon.TypeIconFile.movie.rawValue, + NKCommon.TypeIconFile.txt.rawValue, + NKCommon.TypeIconFile.url.rawValue: return NCBrandColor.shared.iconImageColor2 + case NKCommon.TypeIconFile.document.rawValue: return NCBrandColor.shared.documentIconColor + case NKCommon.TypeIconFile.ppt.rawValue: return NCBrandColor.shared.presentationIconColor + case NKCommon.TypeIconFile.xls.rawValue: return NCBrandColor.shared.spreadsheetIconColor + + default: return NCBrandColor.shared.brandElement + } + } } diff --git a/Widget/Files/FilesWidgetProvider.swift b/Widget/Files/FilesWidgetProvider.swift index d49e360709..a37d3a7a0c 100644 --- a/Widget/Files/FilesWidgetProvider.swift +++ b/Widget/Files/FilesWidgetProvider.swift @@ -34,7 +34,7 @@ struct FilesWidgetProvider: IntentTimelineProvider { let filesItems = getFilesItems(displaySize: context.displaySize) let datasPlaceholder = Array(filesDatasTest[0...filesItems - 1]) let title = getTitleFilesWidget(tableAccount: nil) - return Entry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: title, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " files") + return Entry(date: Date(), datas: datasPlaceholder, isPlaceholder: true, isEmpty: false, userId: "", url: "", account: "", tile: title, footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " files") } func getSnapshot(for configuration: AccountIntent, in context: Context, completion: @escaping (Entry) -> Void) { diff --git a/Widget/Files/FilesWidgetView.swift b/Widget/Files/FilesWidgetView.swift index bb9e015ddf..dfb6a09a5c 100644 --- a/Widget/Files/FilesWidgetView.swift +++ b/Widget/Files/FilesWidgetView.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 25/08/22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -30,169 +31,163 @@ struct FilesWidgetView: View { var body: some View { - let parameterLink = "&user=\(entry.userId)&url=\(entry.url)" - let linkNoAction: URL = URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink)! : URL(string: NCGlobal.shared.widgetActionNoAction)! - let linkActionUploadAsset: URL = URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink)! : URL(string: NCGlobal.shared.widgetActionUploadAsset)! - let linkActionScanDocument: URL = URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionScanDocument)! - let linkActionTextDocument: URL = URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionTextDocument)! - let linkActionVoiceMemo: URL = URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink)! : URL(string: NCGlobal.shared.widgetActionVoiceMemo)! - - GeometryReader { geo in - if entry.isEmpty { - VStack(alignment: .center) { - Image(systemName: "checkmark") - .resizable() - .scaledToFit() - .font(Font.system(.body).weight(.light)) - .frame(width: 50, height: 50) - Text(NSLocalizedString("_no_items_", comment: "")) - .font(.system(size: 25)) - .padding() - Text(NSLocalizedString("_check_back_later_", comment: "")) - .font(.system(size: 15)) - } - .frame(width: geo.size.width, height: geo.size.height) - } - - ZStack(alignment: .topLeading) { - - HStack { - Text(entry.tile) - .font(.system(size: 12)) - .fontWeight(.bold) - .multilineTextAlignment(.center) - .textCase(.uppercase) - .lineLimit(1) - } - .frame(width: geo.size.width - 20) - .padding([.top, .leading, .trailing], 10) - - if !entry.isEmpty { - VStack(alignment: .leading) { - VStack(spacing: 0) { - ForEach(entry.datas, id: \.id) { element in - Link(destination: element.url) { - HStack { - if element.useTypeIconFile { - Image(uiImage: element.image) - .resizable() - .renderingMode(.template) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor2)) - .scaledToFit() - .frame(width: 35, height: 35) - } else { - Image(uiImage: element.image) - .resizable() - .scaledToFill() - .frame(width: 35, height: 35) - .clipped() - .cornerRadius(5) - } - - VStack(alignment: .leading, spacing: 2) { - Text(element.title) - .font(.system(size: 12)) - .fontWeight(.regular) - Text(element.subTitle) - .font(.system(size: CGFloat(10))) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor2)) - } - Spacer() - } - .padding(.leading, 10) - .frame(height: 50) - } - if element != entry.datas.last { - Divider() - .padding(.leading, 54) - } - } - } - } - .padding(.top, 30) - .redacted(reason: entry.isPlaceholder ? .placeholder : []) - } - - HStack(spacing: 0) { - let sizeButton: CGFloat = 40 - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionUploadAsset, label: { - Image("addImage") - .resizable() - .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding(11) - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) - }) - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionScanDocument, label: { - Image(systemName: "doc.text.viewfinder") - .resizable() - .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding(11) - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .font(Font.system(.body).weight(.light)) - .frame(width: geo.size.width / 4, height: sizeButton) - }) - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionTextDocument, label: { - Image("note.text") - .resizable() - .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding(11) - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) - }) - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: { - Image("microphone") - .resizable() - .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding(11) - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) - }) - } - .frame(width: geo.size.width, height: geo.size.height - 22, alignment: .bottomTrailing) - .redacted(reason: entry.isPlaceholder ? .placeholder : []) + GeometryReader { geo in + if entry.isEmpty { + EmptyWidgetContentView() + .frame(width: geo.size.width, height: geo.size.height) + } + + HeaderView(title: entry.tile) + .padding(.top, 7) + + VStack(spacing: 5) { + + if !entry.isEmpty { + WidgetContentView(entry: entry) + .padding(.top, 35) + .redacted(reason: entry.isPlaceholder ? .placeholder : []) + } + + Spacer() + + LinkActionsToolbarView(entry: entry, geo: geo) + .frame(width: geo.size.width, + height: 48, + alignment: .bottom) + .redacted(reason: entry.isPlaceholder ? .placeholder : []) + + FooterView(imageName: entry.footerImage, + text: entry.footerText, + isPlaceholder: entry.isPlaceholder) + .padding(.horizontal, 15.0) + .padding(.top, 5.0) + .padding(.bottom, 5.0) + .frame(maxWidth: geo.size.width, + maxHeight: 30, + alignment: .bottomTrailing) + } + } + .widgetBackground(Color(.background)) + } +} - HStack { - Image(systemName: entry.footerImage) - .resizable() - .scaledToFit() - .frame(width: 15, height: 15) - .font(Font.system(.body).weight(.light)) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) +fileprivate struct WidgetContentView: View { + let entry: FilesDataEntry + + var body: some View { + VStack(alignment: .leading) { + VStack(spacing: 0) { + ForEach(entry.datas, id: \.id) { element in + Link(destination: element.url) { + HStack { + if element.useTypeIconFile { + Image(uiImage: element.image) + .resizable() + .renderingMode(.template) + .foregroundStyle(Color(element.color ?? NCBrandColor.shared.iconImageColor)) + .scaledToFit() + .aspectRatio(1.1, contentMode: .fit) + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) + } else { + Image(uiImage: element.image) + .resizable() + .scaledToFill() + .frame(width: WidgetConstants.elementIconWidthHeight, + height: WidgetConstants.elementIconWidthHeight) + .clipped() + } + + VStack(alignment: .leading, spacing: 2) { + Text(element.title) + .font(WidgetConstants.elementTileFont) + .foregroundStyle(Color(.title)) + Text(element.subTitle) + .font(WidgetConstants.elementSubtitleFont) + .foregroundStyle(Color(.subtitle)) + } + Spacer() + } + .padding(.leading, 10) + .frame(maxHeight: .infinity) + } + if element != entry.datas.last { + Divider() + .overlay(Color(.divider)) + } + } + } + } + } +} - Text(entry.footerText) - .font(.caption2) - .lineLimit(1) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - } - .padding(.horizontal, 15.0) - .frame(maxWidth: geo.size.width, maxHeight: geo.size.height - 2, alignment: .bottomTrailing) - } - } - .widgetBackground(Color(UIColor.systemBackground)) - } +struct LinkActionsToolbarView: View { + let entry: FilesDataEntry + let geo: GeometryProxy + + var body: some View { + let parameterLink = "&user=\(entry.userId)&url=\(entry.url)" + + let linkNoAction: URL = URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink)! : URL(string: NCGlobal.shared.widgetActionNoAction)! + let linkActionUploadAsset: URL = URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink)! : URL(string: NCGlobal.shared.widgetActionUploadAsset)! + let linkActionScanDocument: URL = URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionScanDocument)! + let linkActionVoiceMemo: URL = URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink)! : URL(string: NCGlobal.shared.widgetActionVoiceMemo)! + + HStack(spacing: -6) { + + let height: CGFloat = 48 + let width = geo.size.width / 3 + + Link(destination: entry.isPlaceholder ? linkNoAction : linkActionUploadAsset, label: { + Image(uiImage: UIImage(resource: .media)) + .resizable() + .renderingMode(.template) + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) + .clipShape(Circle()) + .scaledToFit() + .frame(width: width, height: height) + }) + + Link(destination: entry.isPlaceholder ? linkNoAction : linkActionScanDocument, label: { + Image(uiImage: UIImage(resource: .scan)) + .resizable() + .renderingMode(.template) + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) + .clipShape(Circle()) + .scaledToFit() + .font(Font.system(.body).weight(.light)) + .frame(width: width, height: height) + }) + + Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: { + Image(uiImage: UIImage(resource: .mic)) + .resizable() + .renderingMode(.template) + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) + .clipShape(Circle()) + .scaledToFit() + .frame(width: width, height: height) + }) + } + } } struct FilesWidget_Previews: PreviewProvider { static var previews: some View { let datas = Array(filesDatasTest[0...4]) - let entry = FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: true, userId: "", url: "", account: "", tile: "Good afternoon, Marino Faggiana", footerImage: "checkmark.icloud", footerText: "Nextcloud files") - FilesWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemLarge)) + let entry = FilesDataEntry(date: Date(), datas: datas, isPlaceholder: false, isEmpty: true, userId: "", url: "", account: "", tile: "Good afternoon, Marino Faggiana", footerImage: "Cloud_Checkmark", footerText: "Nextcloud files") + if #available(iOSApplicationExtension 17.0, *) { + FilesWidgetView(entry: entry) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + .containerBackground(for: .widget) { + Color.red + } + } else { + FilesWidgetView(entry: entry) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + } } } diff --git a/Widget/Toolbar/ToolbarData.swift b/Widget/Toolbar/ToolbarData.swift index d350c81e0f..c3c597e829 100644 --- a/Widget/Toolbar/ToolbarData.swift +++ b/Widget/Toolbar/ToolbarData.swift @@ -46,12 +46,12 @@ func getToolbarDataEntry(isPreview: Bool, completion: @escaping (_ entry: Toolba } if isPreview { - return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, account: account, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")) + return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, account: account, footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " toolbar")) } if NCManageDatabase.shared.getActiveTableAccount() == nil { - return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, account: account, footerImage: "xmark.icloud", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: ""))) + return completion(ToolbarDataEntry(date: Date(), isPlaceholder: true, userId: userId, url: url, account: account, footerImage: "Cloud_Xmark", footerText: NSLocalizedString("_no_active_account_", value: "No account found", comment: ""))) } - completion(ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: userId, url: url, account: account, footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar")) + completion(ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: userId, url: url, account: account, footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " toolbar")) } diff --git a/Widget/Toolbar/ToolbarWidgetProvider.swift b/Widget/Toolbar/ToolbarWidgetProvider.swift index 0c72967f4e..dac370d34b 100644 --- a/Widget/Toolbar/ToolbarWidgetProvider.swift +++ b/Widget/Toolbar/ToolbarWidgetProvider.swift @@ -29,7 +29,7 @@ struct ToolbarWidgetProvider: TimelineProvider { typealias Entry = ToolbarDataEntry func placeholder(in context: Context) -> Entry { - return Entry(date: Date(), isPlaceholder: true, userId: "", url: "", account: "", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar") + return Entry(date: Date(), isPlaceholder: true, userId: "", url: "", account: "", footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " toolbar") } func getSnapshot(in context: Context, completion: @escaping (Entry) -> Void) { diff --git a/Widget/Toolbar/ToolbarWidgetView.swift b/Widget/Toolbar/ToolbarWidgetView.swift index b16a332b50..1620b72441 100644 --- a/Widget/Toolbar/ToolbarWidgetView.swift +++ b/Widget/Toolbar/ToolbarWidgetView.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 25/08/22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -34,91 +35,71 @@ struct ToolbarWidgetView: View { let linkNoAction: URL = URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionNoAction + parameterLink)! : URL(string: NCGlobal.shared.widgetActionNoAction)! let linkActionUploadAsset: URL = URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionUploadAsset + parameterLink)! : URL(string: NCGlobal.shared.widgetActionUploadAsset)! let linkActionScanDocument: URL = URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionScanDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionScanDocument)! - let linkActionTextDocument: URL = URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionTextDocument + parameterLink)! : URL(string: NCGlobal.shared.widgetActionTextDocument)! let linkActionVoiceMemo: URL = URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink) != nil ? URL(string: NCGlobal.shared.widgetActionVoiceMemo + parameterLink)! : URL(string: NCGlobal.shared.widgetActionVoiceMemo)! GeometryReader { geo in ZStack(alignment: .topLeading) { - + HStack(spacing: 0) { - - let sizeButton: CGFloat = 65 + + let height: CGFloat = 60 + let width = geo.size.width / 3 Link(destination: entry.isPlaceholder ? linkNoAction : linkActionUploadAsset, label: { - Image("addImage") + Image(uiImage: UIImage(resource: .media)) .resizable() .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding() - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) .clipShape(Circle()) .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) + .frame(width: width, height: height) }) Link(destination: entry.isPlaceholder ? linkNoAction : linkActionScanDocument, label: { - Image(systemName: "doc.text.viewfinder") + Image(uiImage: UIImage(resource: .scan)) .resizable() .renderingMode(.template) .font(Font.system(.body).weight(.light)) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding() - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) - }) - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionTextDocument, label: { - Image("note.text") - .resizable() - .renderingMode(.template) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding() - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) .clipShape(Circle()) .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) - }) - - Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: { - Image("microphone") - .resizable() - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getText(account: entry.account))) - .padding() - .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - .clipShape(Circle()) - .scaledToFit() - .frame(width: geo.size.width / 4, height: sizeButton) + .frame(width: width, height: height) }) + + Link(destination: entry.isPlaceholder ? linkNoAction : linkActionVoiceMemo, label: { + Image(uiImage: UIImage(resource: .mic)) + .resizable() + .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(.text)) + .background(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.brandElement)) + .clipShape(Circle()) + .scaledToFit() + .frame(width: width, height: height) + }) } .frame(width: geo.size.width, height: geo.size.height, alignment: .center) + .padding(.vertical, geo.size.height / 2 * -0.25) .redacted(reason: entry.isPlaceholder ? .placeholder : []) - HStack { - Image(systemName: entry.footerImage) - .resizable() - .font(Font.system(.body).weight(.light)) - .scaledToFit() - .frame(width: 15, height: 15) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - - Text(entry.footerText) - .font(.caption2) - .padding(.trailing, 13.0) - .foregroundColor(entry.isPlaceholder ? Color(.systemGray4) : Color(NCBrandColor.shared.getElement(account: entry.account))) - } - .frame(maxWidth: geo.size.width - 5, maxHeight: geo.size.height - 2, alignment: .bottomTrailing) + FooterView(imageName: entry.footerImage, + text: entry.footerText, + isPlaceholder: entry.isPlaceholder) + .padding(.horizontal, 15.0) + .padding(.bottom, 10.0) + .frame(maxWidth: geo.size.width - 5, + maxHeight: geo.size.height - 2, + alignment: .bottomTrailing) } } - .widgetBackground(Color.black.opacity(0.9)) + .widgetBackground(Color(.background)) } } struct ToolbarWidget_Previews: PreviewProvider { static var previews: some View { - let entry = ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: "", url: "", account: "", footerImage: "checkmark.icloud", footerText: NCBrandOptions.shared.brand + " toolbar") + let entry = ToolbarDataEntry(date: Date(), isPlaceholder: false, userId: "", url: "", account: "", footerImage: "Cloud_Checkmark", footerText: NCBrandOptions.shared.brand + " toolbar") ToolbarWidgetView(entry: entry).previewContext(WidgetPreviewContext(family: .systemMedium)) } } diff --git a/Widget/Widget.swift b/Widget/Widget.swift index 372554de62..9bb2e5f504 100644 --- a/Widget/Widget.swift +++ b/Widget/Widget.swift @@ -30,10 +30,8 @@ struct NextcloudWidgetBundle: WidgetBundle { @WidgetBundleBuilder var body: some Widget { - DashboardWidget() FilesWidget() ToolbarWidget() - LockscreenWidget() } } diff --git a/Widget/WidgetCommon.swift b/Widget/WidgetCommon.swift new file mode 100644 index 0000000000..97b970d01d --- /dev/null +++ b/Widget/WidgetCommon.swift @@ -0,0 +1,76 @@ +// +// WidgetCommon.swift +// Widget +// +// Created by Oleh Shcherba on 20.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +struct WidgetConstants { + static let bottomTextFont: Font = .system(size: 16) + static let bottomImageWidthHeight = 16.0 + static let elementIconWidthHeight = 36.0 + static let titleTextFont: Font = .system(size: 24, weight: .semibold) + static let elementTileFont: Font = .system(size: 16, weight: .semibold) + static let elementSubtitleFont: Font = .system(size: 14, weight: .semibold) +} + +struct EmptyWidgetContentView: View { + var body: some View { + VStack(alignment: .center) { + Image(systemName: "checkmark") + .resizable() + .scaledToFit() + .font(Font.system(.body).weight(.light)) + .foregroundStyle(Color(.title)) + .frame(width: 50, height: 50) + Text(NSLocalizedString("_no_items_", comment: "")) + .font(.system(size: 25)) + .foregroundStyle(Color(.title)) + .padding() + Text(NSLocalizedString("_check_back_later_", comment: "")) + .font(.system(size: 15)) + .foregroundStyle(Color(.title)) + } + } +} + +struct HeaderView: View { + let title: String + + var body: some View { + Text(title.firstUppercased) + .font(WidgetConstants.titleTextFont) + .foregroundStyle(Color(.title)) + .minimumScaleFactor(0.7) + .lineLimit(1) + .padding(.horizontal, 13) + } +} + +struct FooterView: View { + let imageName: String + let text: String + let isPlaceholder: Bool + + var body: some View { + HStack(spacing: 8) { + Image(uiImage: UIImage(named: imageName) ?? UIImage()) + .resizable() + .renderingMode(.template) + .scaledToFit() + .frame(width: WidgetConstants.bottomImageWidthHeight, + height: WidgetConstants.bottomImageWidthHeight) + .font(Font.system(.body).weight(.light)) + .foregroundColor(isPlaceholder ? Color(.systemGray4) : Color(.bottomElementForeground)) + + Text(text) + .font(WidgetConstants.bottomTextFont) + .lineLimit(1) + .minimumScaleFactor(0.7) + .foregroundColor(isPlaceholder ? Color(.systemGray4) : Color(.bottomElementForeground)) + } + } +} diff --git a/iOSClient/Account Settings/NCAccountSettingsModel.swift b/iOSClient/Account Settings/NCAccountSettingsModel.swift index ba7c01434f..b1bdc48780 100644 --- a/iOSClient/Account Settings/NCAccountSettingsModel.swift +++ b/iOSClient/Account Settings/NCAccountSettingsModel.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 06/06/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -94,7 +95,7 @@ class NCAccountSettingsModel: ObservableObject, ViewOnAppearHandling { /// Triggered when the view appears. func onViewAppear() { var indexActiveAccount = 0 - let tableAccounts = database.getAllTableAccount() + let tableAccounts = getAllAccountsOrderByEmail() var alias = "" for (index, account) in tableAccounts.enumerated() { @@ -110,7 +111,11 @@ class NCAccountSettingsModel: ObservableObject, ViewOnAppearHandling { self.tblAccount = tblAccount self.alias = alias } - + + private func getAllAccountsOrderByEmail() -> [tableAccount] { + NCManageDatabase.shared.getAllAccountOrderByEmail() + } + /// Func to get the user display name + alias func getUserName() -> String { guard let tblAccount else { return "" } @@ -124,7 +129,11 @@ class NCAccountSettingsModel: ObservableObject, ViewOnAppearHandling { /// Func to set alias func setAlias(_ value: String) { guard let tblAccount else { return } - database.setAccountAlias(tblAccount.account, alias: alias) + NCManageDatabase.shared.setAccountAlias(tblAccount.account, alias: alias) { + [weak self] in + guard let self = self else { return } + self.tblAccounts = getAllAccountsOrderByEmail() + } } /// Function to update the user data @@ -170,16 +179,25 @@ class NCAccountSettingsModel: ObservableObject, ViewOnAppearHandling { if let tableAccount = database.getTableAccount(predicate: NSPredicate(format: "account == %@", account)) { self.tblAccount = tableAccount self.alias = tableAccount.alias + NCAccount().changeAccount(tableAccount.account, userProfile: nil, controller: self.controller) { } } } + + func openLogin() { + self.appDelegate.openLogin(selector: NCGlobal.shared.introLogin) + } /// Function to delete the current account func deleteAccount() { if let tblAccount { - NCAccount().deleteAccount(tblAccount.account) { - let account = database.getAllTableAccount().first?.account - setAccount(account: account) + NCAccount().deleteAccount(tblAccount.account) + if let account = getAllAccountsOrderByEmail().first?.account { + NCAccount().changeAccount(account, userProfile: nil, controller: self.controller) { + onViewAppear() + } + } else { dismissView = true + appDelegate.openLogin(selector: NCGlobal.shared.introLogin) } } } diff --git a/iOSClient/Account Settings/NCAccountSettingsView.swift b/iOSClient/Account Settings/NCAccountSettingsView.swift index 4ba6ff8379..baec857ce3 100644 --- a/iOSClient/Account Settings/NCAccountSettingsView.swift +++ b/iOSClient/Account Settings/NCAccountSettingsView.swift @@ -39,226 +39,28 @@ struct NCAccountSettingsView: View { var body: some View { NavigationView { Form { - Section(content: { - TabView(selection: $model.indexActiveAccount) { - ForEach(0.. Void + var body: some View { + Button(action: { + action() + }, label: { + HStack(spacing: 12) { + Image(image) + .buttonIconStyled() + Text(title) + Spacer() + } + .makeAllButtonSpaceTappable() + .foregroundStyle(Color(.BurgerMenu.buttonForeground)) + .frame(height: 48) + .padding(EdgeInsets(top: 0, leading: _Constants.buttonLeadingPadding, bottom: 0, trailing: 0)) + }) + .buttonStyle(CustomBackgroundOnPressButtonStyle()) + } +} + +private struct CustomBackgroundOnPressButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + configuration + .label + .font(configuration.isPressed ? _Constants.buttonPressedFont : _Constants.font) + .background { + if configuration.isPressed { + GeometryReader { geometry in + Color(.BurgerMenu.pressedButton) + .clipShape(RoundedRectangle(cornerRadius: geometry.size.height/2)) + } + } else { + EmptyView() + } + } + } +} + +private struct CustomProgressView: View { + private let height: CGFloat = 8 + private let cornerRadius: CGFloat = 13 + private let blurRadius: CGFloat = 2 + let progress: Double + var body: some View { + GeometryReader { geometry in + ZStack { + Color(.BurgerMenu.progressBarBackground) + .overlay { + RoundedRectangle(cornerRadius: cornerRadius) + .stroke(Color(.BurgerMenu.commonShadow).opacity(0.6), + lineWidth: 1) + .frame(width: geometry.size.width+blurRadius, + height: 2*geometry.size.height) + .blur(radius: blurRadius) + .offset(x: blurRadius/2, + y: geometry.size.height/2) + .clipShape(RoundedRectangle(cornerRadius: cornerRadius)) + } + } + .clipShape(RoundedRectangle(cornerRadius: cornerRadius)) + Color(NCBrandColor.shared.brandElement) + .frame(width: geometry.size.width * progress + height) + .clipShape(RoundedRectangle(cornerRadius: cornerRadius)) + .offset(x: -height) + .clipShape(RoundedRectangle(cornerRadius: cornerRadius)) + .shadow(color: Color(.BurgerMenu.commonShadow).opacity(0.25), + radius: 2, + x: 0, + y: 1) + } + .frame(height: height) + } +} + +private extension Image { + func buttonIconStyled() -> some View { + self + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 16, height: 16) + } +} + +private extension View { + func makeAllButtonSpaceTappable() -> some View { + self.contentShape(Rectangle()) + } +} + +#Preview { + class BurgerMenuViewModelMock: BurgerMenuViewModel { + override init(delegate: (any BurgerMenuViewModelDelegate)?, + controller: NCMainTabBarController?) { + super.init(delegate: delegate, controller: nil) + progressUsedSpace = 0.3 + messageUsedSpace = "62,5 MB of 607,21 GB used" + isVisible = true + } + } + + struct CustomPreviewView: View { + @StateObject var viewModel = BurgerMenuViewModelMock(delegate: nil, controller: nil) + var body: some View { + return NavigationView { + BurgerMenuView(viewModel: viewModel) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(action: { + viewModel.isVisible.toggle() + }, label: { + Image(systemName: + "line.3.horizontal") + }) + } + } + .navigationBarHidden(viewModel.isVisible) + } + } + } + + return CustomPreviewView() +} diff --git a/iOSClient/BurgerMenu/BurgerMenuViewController.swift b/iOSClient/BurgerMenu/BurgerMenuViewController.swift new file mode 100644 index 0000000000..ac6af5464d --- /dev/null +++ b/iOSClient/BurgerMenu/BurgerMenuViewController.swift @@ -0,0 +1,31 @@ +// +// BurgerMenuViewController.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 28.07.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +class BurgerMenuViewController: UIHostingController { + + private var viewModel: BurgerMenuViewModel? + + convenience init(delegate: BurgerMenuViewModelDelegate?) { + let viewModel = BurgerMenuViewModel(delegate: delegate, controller: nil) + self.init(rootView: BurgerMenuView(viewModel: viewModel)) + viewModel.controller = self.mainTabBarController + self.viewModel = viewModel + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = UIColor.clear + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + viewModel?.showMenu() + } +} diff --git a/iOSClient/BurgerMenu/BurgerMenuViewModel.swift b/iOSClient/BurgerMenu/BurgerMenuViewModel.swift new file mode 100644 index 0000000000..18815c47f5 --- /dev/null +++ b/iOSClient/BurgerMenu/BurgerMenuViewModel.swift @@ -0,0 +1,103 @@ +// +// BurgerMenuViewModel.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 29.07.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +protocol BurgerMenuViewModelDelegate: AnyObject { + func burgerMenuViewModelDidHideMenu(_ viewModel: BurgerMenuViewModel) + func burgerMenuViewModelWantsOpenRecent(_ viewModel: BurgerMenuViewModel) + func burgerMenuViewModelWantsOpenOffline(_ viewModel: BurgerMenuViewModel) + func burgerMenuViewModelWantsOpenDeletedFiles(_ viewModel: BurgerMenuViewModel) + func burgerMenuViewModelWantsOpenSettings(_ viewModel: BurgerMenuViewModel) +} + +class BurgerMenuViewModel: ObservableObject { + weak var delegate: BurgerMenuViewModelDelegate? + + @Published var progressUsedSpace: Double = 0 + @Published var messageUsedSpace: String = "" + + @Published var isVisible: Bool = false + + private let database = NCManageDatabase.shared + + weak var controller: NCMainTabBarController? + private var session: NCSession.Session { + NCSession.shared.getSession(controller: controller) + } + + let appearingAnimationIntervalInSec = 0.5 + + init(delegate: BurgerMenuViewModelDelegate?, controller: NCMainTabBarController?) { + self.delegate = delegate + } + + func showMenu() { + progressUsedSpace = getUsedSpaceProgress() + messageUsedSpace = getUsedSpaceMessage() + isVisible = true + } + + func hideMenu() { + isVisible = false + DispatchQueue.main.asyncAfter(deadline: .now().advanced(by: .milliseconds(Int(appearingAnimationIntervalInSec*1000)))) { + self.delegate?.burgerMenuViewModelDidHideMenu(self) + } + } + + func openRecent() { + delegate?.burgerMenuViewModelWantsOpenRecent(self) + } + + func openOffline() { + delegate?.burgerMenuViewModelWantsOpenOffline(self) + } + + func openDeletedFiles() { + delegate?.burgerMenuViewModelWantsOpenDeletedFiles(self) + } + + func openSettings() { + delegate?.burgerMenuViewModelWantsOpenSettings(self) + } + + private func getUsedSpaceMessage() -> String { + guard let activeAccount = getActiveAccount() else { + return "" + } + + let utilityFileSystem = NCUtilityFileSystem() + var quota = "" + switch activeAccount.quotaTotal { + case -1: + quota = "0" + case -2: + quota = NSLocalizedString("_quota_space_unknown_", comment: "") + case -3: + quota = NSLocalizedString("_quota_space_unlimited_", comment: "") + default: + quota = utilityFileSystem.transformedSize(activeAccount.quotaTotal) + } + + let quotaUsed: String = utilityFileSystem.transformedSize(activeAccount.quotaUsed) + + let messageUsed = String.localizedStringWithFormat(NSLocalizedString("_used_of_space_", tableName: nil, bundle: Bundle.main, value: "%@ of %@ used", comment: ""), quotaUsed, quota) + return messageUsed + } + + private func getUsedSpaceProgress() -> Double { + if let activeAccount = getActiveAccount(), activeAccount.quotaRelative > 0 { + return activeAccount.quotaRelative/100.0 + } + return 0 + } + + private func getActiveAccount() -> tableAccount? { + return self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)) + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/Color.colorset/Contents.json b/iOSClient/Colors.xcassets/AppBackground/Color.colorset/Contents.json new file mode 100644 index 0000000000..92ef031708 --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/Color.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/Contents.json b/iOSClient/Colors.xcassets/AppBackground/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/DataProtection.colorset/Contents.json b/iOSClient/Colors.xcassets/AppBackground/DataProtection.colorset/Contents.json new file mode 100644 index 0000000000..ba531aa92c --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/DataProtection.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x10", + "red" : "0x02" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/Form.colorset/Contents.json b/iOSClient/Colors.xcassets/AppBackground/Form.colorset/Contents.json new file mode 100644 index 0000000000..58fea2e6e4 --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/Form.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xF5", + "red" : "0xF2" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x10", + "red" : "0x02" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/FormRow.colorset/Contents.json b/iOSClient/Colors.xcassets/AppBackground/FormRow.colorset/Contents.json new file mode 100644 index 0000000000..30150f426c --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/FormRow.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/AppBackground/Main.colorset/Contents.json b/iOSClient/Colors.xcassets/AppBackground/Main.colorset/Contents.json new file mode 100644 index 0000000000..4eea21fecd --- /dev/null +++ b/iOSClient/Colors.xcassets/AppBackground/Main.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x10", + "red" : "0x02" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/Background.colorset/Contents.json new file mode 100644 index 0000000000..9aae19efec --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "66", + "green" : "45", + "red" : "29" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/ButtonForeground.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/ButtonForeground.colorset/Contents.json new file mode 100644 index 0000000000..76547d8302 --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/ButtonForeground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/CommonShadow.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/CommonShadow.colorset/Contents.json new file mode 100644 index 0000000000..7e8f38fe3b --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/CommonShadow.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/NavigationBarButton.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/NavigationBarButton.colorset/Contents.json new file mode 100644 index 0000000000..76547d8302 --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/NavigationBarButton.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/Overlay.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/Overlay.colorset/Contents.json new file mode 100644 index 0000000000..01a011cad8 --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/Overlay.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.750", + "blue" : "28", + "green" : "18", + "red" : "10" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/PressedButton.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/PressedButton.colorset/Contents.json new file mode 100644 index 0000000000..f406f3e681 --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/PressedButton.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "232", + "green" : "226", + "red" : "219" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "96", + "green" : "67", + "red" : "46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/BurgerMenu/ProgressBarBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/BurgerMenu/ProgressBarBackground.colorset/Contents.json new file mode 100644 index 0000000000..ad3491157b --- /dev/null +++ b/iOSClient/Colors.xcassets/BurgerMenu/ProgressBarBackground.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD7", + "green" : "0xCD", + "red" : "0xBD" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Contents.json b/iOSClient/Colors.xcassets/Button/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Link/Contents.json b/iOSClient/Colors.xcassets/Button/Link/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Link/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Link/Text/Contents.json b/iOSClient/Colors.xcassets/Button/Link/Text/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Link/Text/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Link/Text/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Link/Text/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..86fcec9584 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Link/Text/Disabled.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Link/Text/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Link/Text/Normal.colorset/Contents.json new file mode 100644 index 0000000000..9a25e29b6a --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Link/Text/Normal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD6", + "green" : "0x96", + "red" : "0x31" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Link/Text/Selected.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Link/Text/Selected.colorset/Contents.json new file mode 100644 index 0000000000..9ac2a3ca03 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Link/Text/Selected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB1", + "green" : "0x5B", + "red" : "0x09" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xEB", + "green" : "0xCA", + "red" : "0x95" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Background/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Background/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Background/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Background/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Background/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..15ed672f08 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Background/Disabled.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Background/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Background/Normal.colorset/Contents.json new file mode 100644 index 0000000000..7507e897dc --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Background/Normal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x2A", + "red" : "0x0B" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Background/Selected.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Background/Selected.colorset/Contents.json new file mode 100644 index 0000000000..0235ade8e3 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Background/Selected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB1", + "green" : "0x5B", + "red" : "0x09" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Text/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Text/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Text/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Text/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Text/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..6a5b0cbede --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Text/Disabled.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Text/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Text/Normal.colorset/Contents.json new file mode 100644 index 0000000000..fafa476721 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Text/Normal.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Primary/Text/Selected.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Primary/Text/Selected.colorset/Contents.json new file mode 100644 index 0000000000..fafa476721 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Primary/Text/Selected.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Background/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Background/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Background/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Background/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Background/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..0ffe309025 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Background/Disabled.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Background/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Background/Normal.colorset/Contents.json new file mode 100644 index 0000000000..05df57f13c --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Background/Normal.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Background/Selected.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Background/Selected.colorset/Contents.json new file mode 100644 index 0000000000..76547d8302 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Background/Selected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Border/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Border/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Border/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Border/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Border/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..86fcec9584 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Border/Disabled.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Border/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Border/Normal.colorset/Contents.json new file mode 100644 index 0000000000..43e189b930 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Border/Normal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x2A", + "red" : "0x0B" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Text/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Text/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Text/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Text/Disabled.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Text/Disabled.colorset/Contents.json new file mode 100644 index 0000000000..86fcec9584 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Text/Disabled.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Text/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Text/Normal.colorset/Contents.json new file mode 100644 index 0000000000..19d79bc389 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Text/Normal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x2A", + "red" : "0x0B" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "255", + "green" : "255", + "red" : "255" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Button/Secondary/Text/Selected.colorset/Contents.json b/iOSClient/Colors.xcassets/Button/Secondary/Text/Selected.colorset/Contents.json new file mode 100644 index 0000000000..3372dfac60 --- /dev/null +++ b/iOSClient/Colors.xcassets/Button/Secondary/Text/Selected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x2A", + "red" : "0x0B" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/Background.colorset/Contents.json new file mode 100644 index 0000000000..5e94fd9c0b --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/ImageTypeBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/ImageTypeBackground.colorset/Contents.json new file mode 100644 index 0000000000..9e7da42377 --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/ImageTypeBackground.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x95", + "green" : "0x80", + "red" : "0x71" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/ImageTypeText.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/ImageTypeText.colorset/Contents.json new file mode 100644 index 0000000000..fafa476721 --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/ImageTypeText.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/Text.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/Text.colorset/Contents.json new file mode 100644 index 0000000000..dd438e4fd3 --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/Text.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/TitleBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/TitleBackground.colorset/Contents.json new file mode 100644 index 0000000000..d7f5932ec0 --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/TitleBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xC8", + "red" : "0xBC" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/CameraInformation/TitleText.colorset/Contents.json b/iOSClient/Colors.xcassets/CameraInformation/TitleText.colorset/Contents.json new file mode 100644 index 0000000000..fb688699e8 --- /dev/null +++ b/iOSClient/Colors.xcassets/CameraInformation/TitleText.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Contents.json b/iOSClient/Colors.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/iOSClient/Colors.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/Contents.json b/iOSClient/Colors.xcassets/DataProtection/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/Link.colorset/Contents.json b/iOSClient/Colors.xcassets/DataProtection/Link.colorset/Contents.json new file mode 100644 index 0000000000..42e6d8fe13 --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/Link.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD6", + "green" : "0x96", + "red" : "0x31" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/ListRow.colorset/Contents.json b/iOSClient/Colors.xcassets/DataProtection/ListRow.colorset/Contents.json new file mode 100644 index 0000000000..4eea21fecd --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/ListRow.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x10", + "red" : "0x02" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/ListRowSubtitle.colorset/Contents.json b/iOSClient/Colors.xcassets/DataProtection/ListRowSubtitle.colorset/Contents.json new file mode 100644 index 0000000000..d9e6ba9b68 --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/ListRowSubtitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x95", + "green" : "0x80", + "red" : "0x71" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/ListSeparator.colorset/Contents.json b/iOSClient/Colors.xcassets/DataProtection/ListSeparator.colorset/Contents.json new file mode 100644 index 0000000000..86fcec9584 --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/ListSeparator.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DataProtection/NavigationBarTint.colorset/Contents.json b/iOSClient/Colors.xcassets/DataProtection/NavigationBarTint.colorset/Contents.json new file mode 100644 index 0000000000..76547d8302 --- /dev/null +++ b/iOSClient/Colors.xcassets/DataProtection/NavigationBarTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/DestructiveAction.colorset/Contents.json b/iOSClient/Colors.xcassets/DestructiveAction.colorset/Contents.json new file mode 100644 index 0000000000..6a76417301 --- /dev/null +++ b/iOSClient/Colors.xcassets/DestructiveAction.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0x59", + "green" : "0x61", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/ButtonTint.colorset/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/ButtonTint.colorset/Contents.json new file mode 100644 index 0000000000..23d70e9bc1 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/ButtonTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "65", + "green" : "27", + "red" : "0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "250", + "green" : "247", + "red" : "244" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/GrayButtonTint.colorset/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/GrayButtonTint.colorset/Contents.json new file mode 100644 index 0000000000..7357195116 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/GrayButtonTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "149", + "green" : "128", + "red" : "113" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "212", + "green" : "200", + "red" : "188" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeButtonBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeButtonBackground.colorset/Contents.json new file mode 100644 index 0000000000..60f618d19a --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeButtonBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "232", + "green" : "226", + "red" : "219" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "66", + "green" : "45", + "red" : "29" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeHeaderBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeHeaderBackground.colorset/Contents.json new file mode 100644 index 0000000000..7aaba07537 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/SelectionModeHeaderBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "250", + "green" : "247", + "red" : "244" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "66", + "green" : "45", + "red" : "29" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileActionsHeader/SortButtonText.colorset/Contents.json b/iOSClient/Colors.xcassets/FileActionsHeader/SortButtonText.colorset/Contents.json new file mode 100644 index 0000000000..9565e80856 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileActionsHeader/SortButtonText.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "65", + "green" : "27", + "red" : "0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "232", + "green" : "226", + "red" : "219" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Background.colorset/Contents.json new file mode 100644 index 0000000000..bef5b1fb34 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xF5", + "red" : "0xF2" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/FolderIcon.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/FolderIcon.colorset/Contents.json new file mode 100644 index 0000000000..3186f64eac --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/FolderIcon.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Grabber.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Grabber.colorset/Contents.json new file mode 100644 index 0000000000..28362f57e7 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Grabber.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC2", + "green" : "0xC4", + "red" : "0xC2" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xC8", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Icon.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Icon.colorset/Contents.json new file mode 100644 index 0000000000..3dc78f800a --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Icon.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "250", + "green" : "247", + "red" : "244" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Overlay.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Overlay.colorset/Contents.json new file mode 100644 index 0000000000..90aa6236f8 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Overlay.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.200", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.500", + "blue" : "0x1C", + "green" : "0x12", + "red" : "0x0A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/SelectedRow.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/SelectedRow.colorset/Contents.json new file mode 100644 index 0000000000..67e578b81e --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/SelectedRow.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0xD6", + "green" : "0xD1", + "red" : "0xD1" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileMenu/Text.colorset/Contents.json b/iOSClient/Colors.xcassets/FileMenu/Text.colorset/Contents.json new file mode 100644 index 0000000000..6fc4297bd8 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileMenu/Text.colorset/Contents.json @@ -0,0 +1,36 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "1.000", + "white" : "0.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/FileSelection/Contents.json b/iOSClient/Colors.xcassets/FileSelection/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/FileSelection/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/FileSelection/list_item_deselected.colorset/Contents.json b/iOSClient/Colors.xcassets/FileSelection/list_item_deselected.colorset/Contents.json new file mode 100644 index 0000000000..a06d3338c8 --- /dev/null +++ b/iOSClient/Colors.xcassets/FileSelection/list_item_deselected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x95", + "green" : "0x80", + "red" : "0x71" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xC8", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/ListCell/Contents.json b/iOSClient/Colors.xcassets/ListCell/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/ListCell/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/ListCell/Separator.colorset/Contents.json b/iOSClient/Colors.xcassets/ListCell/Separator.colorset/Contents.json new file mode 100644 index 0000000000..531e0c9336 --- /dev/null +++ b/iOSClient/Colors.xcassets/ListCell/Separator.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/ListCell/Subtitle.colorset/Contents.json b/iOSClient/Colors.xcassets/ListCell/Subtitle.colorset/Contents.json new file mode 100644 index 0000000000..1d45457642 --- /dev/null +++ b/iOSClient/Colors.xcassets/ListCell/Subtitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xC8", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/ListCell/Title.colorset/Contents.json b/iOSClient/Colors.xcassets/ListCell/Title.colorset/Contents.json new file mode 100644 index 0000000000..cfbec998e7 --- /dev/null +++ b/iOSClient/Colors.xcassets/ListCell/Title.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/MediaPlayer/Contents.json b/iOSClient/Colors.xcassets/MediaPlayer/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/MediaPlayer/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/MediaPlayer/IconTint.colorset/Contents.json b/iOSClient/Colors.xcassets/MediaPlayer/IconTint.colorset/Contents.json new file mode 100644 index 0000000000..0e8d7fe21a --- /dev/null +++ b/iOSClient/Colors.xcassets/MediaPlayer/IconTint.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/MediaPlayer/SliderMaxColor.colorset/Contents.json b/iOSClient/Colors.xcassets/MediaPlayer/SliderMaxColor.colorset/Contents.json new file mode 100644 index 0000000000..531e0c9336 --- /dev/null +++ b/iOSClient/Colors.xcassets/MediaPlayer/SliderMaxColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/MediaPlayer/SliderMinColor.colorset/Contents.json b/iOSClient/Colors.xcassets/MediaPlayer/SliderMinColor.colorset/Contents.json new file mode 100644 index 0000000000..4f15531cb5 --- /dev/null +++ b/iOSClient/Colors.xcassets/MediaPlayer/SliderMinColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF8", + "green" : "0xF5", + "red" : "0xF2" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/MediaPlayer/SliderThumb.colorset/Contents.json b/iOSClient/Colors.xcassets/MediaPlayer/SliderThumb.colorset/Contents.json new file mode 100644 index 0000000000..0e8d7fe21a --- /dev/null +++ b/iOSClient/Colors.xcassets/MediaPlayer/SliderThumb.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/NavigationBar/Contents.json b/iOSClient/Colors.xcassets/NavigationBar/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/NavigationBar/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/NavigationBar/LogoTint.colorset/Contents.json b/iOSClient/Colors.xcassets/NavigationBar/LogoTint.colorset/Contents.json new file mode 100644 index 0000000000..4d53e40479 --- /dev/null +++ b/iOSClient/Colors.xcassets/NavigationBar/LogoTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8F", + "green" : "0x3D", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/QualitySlider/Contents.json b/iOSClient/Colors.xcassets/QualitySlider/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/QualitySlider/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/QualitySlider/MaximumTrackColor.colorset/Contents.json b/iOSClient/Colors.xcassets/QualitySlider/MaximumTrackColor.colorset/Contents.json new file mode 100644 index 0000000000..f24bfec494 --- /dev/null +++ b/iOSClient/Colors.xcassets/QualitySlider/MaximumTrackColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xC8", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/QualitySlider/ThumbColor.colorset/Contents.json b/iOSClient/Colors.xcassets/QualitySlider/ThumbColor.colorset/Contents.json new file mode 100644 index 0000000000..1126a18b0a --- /dev/null +++ b/iOSClient/Colors.xcassets/QualitySlider/ThumbColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x2A", + "red" : "0x0B" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/SearchBarBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/SearchBarBackground.colorset/Contents.json new file mode 100644 index 0000000000..3897a6cbc8 --- /dev/null +++ b/iOSClient/Colors.xcassets/SearchBarBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x3F", + "green" : "0x28", + "red" : "0x1E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/SelectToolbar/CancelTint.colorset/Contents.json b/iOSClient/Colors.xcassets/SelectToolbar/CancelTint.colorset/Contents.json new file mode 100644 index 0000000000..9565e80856 --- /dev/null +++ b/iOSClient/Colors.xcassets/SelectToolbar/CancelTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "65", + "green" : "27", + "red" : "0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "232", + "green" : "226", + "red" : "219" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/SelectToolbar/Contents.json b/iOSClient/Colors.xcassets/SelectToolbar/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/SelectToolbar/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/SelectToolbar/ItemStateActive.colorset/Contents.json b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateActive.colorset/Contents.json new file mode 100644 index 0000000000..d6fad5c4ad --- /dev/null +++ b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateActive.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/SelectToolbar/ItemStateInactive.colorset/Contents.json b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateInactive.colorset/Contents.json new file mode 100644 index 0000000000..3ff1badcaa --- /dev/null +++ b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateInactive.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x95", + "green" : "0x80", + "red" : "0x71" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/SelectToolbar/ItemStateSelected.colorset/Contents.json b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateSelected.colorset/Contents.json new file mode 100644 index 0000000000..0c6a3dd673 --- /dev/null +++ b/iOSClient/Colors.xcassets/SelectToolbar/ItemStateSelected.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "66", + "green" : "45", + "red" : "29" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Background.colorset/Contents.json new file mode 100644 index 0000000000..03baf522f9 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundHighlighted.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundHighlighted.colorset/Contents.json new file mode 100644 index 0000000000..c07aaad39c --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundHighlighted.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundNormal.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundNormal.colorset/Contents.json new file mode 100644 index 0000000000..30150f426c --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Cell/BackgroundNormal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Cell/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Cell/Subtitle.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Subtitle.colorset/Contents.json new file mode 100644 index 0000000000..a3de7b2175 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Subtitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.600", + "blue" : "0.260", + "green" : "0.240", + "red" : "0.240" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Cell/Title.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Title.colorset/Contents.json new file mode 100644 index 0000000000..ffaecd67bf --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Cell/Title.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Border.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Border.colorset/Contents.json new file mode 100644 index 0000000000..cbd99b7e21 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Border.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Placeholder.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Placeholder.colorset/Contents.json new file mode 100644 index 0000000000..15dc7557b6 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/SearchField/Placeholder.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/SectionTitle.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/SectionTitle.colorset/Contents.json new file mode 100644 index 0000000000..306a907c82 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/SectionTitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.600", + "blue" : "0.260", + "green" : "0.240", + "red" : "0.240" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/SectionTitleBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/SectionTitleBackground.colorset/Contents.json new file mode 100644 index 0000000000..d6e3b6e7e5 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/SectionTitleBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Advanced/TableCellSeparator.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Advanced/TableCellSeparator.colorset/Contents.json new file mode 100644 index 0000000000..a3fbad6780 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Advanced/TableCellSeparator.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.290", + "blue" : "0.260", + "green" : "0.240", + "red" : "0.240" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x95", + "green" : "0x80", + "red" : "0x71" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Comment/Contents.json b/iOSClient/Colors.xcassets/Share/Comment/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Comment/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/Comment/TextFieldBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Comment/TextFieldBackground.colorset/Contents.json new file mode 100644 index 0000000000..4f7da9b2d6 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Comment/TextFieldBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.970", + "green" : "0.950", + "red" : "0.950" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Comment/TextFieldBorder.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/Comment/TextFieldBorder.colorset/Contents.json new file mode 100644 index 0000000000..a6dfb502b0 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Comment/TextFieldBorder.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/CommonIconTint.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/CommonIconTint.colorset/Contents.json new file mode 100644 index 0000000000..9a25e29b6a --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/CommonIconTint.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD6", + "green" : "0x96", + "red" : "0x31" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/Contents.json b/iOSClient/Colors.xcassets/Share/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Normal.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Normal.colorset/Contents.json new file mode 100644 index 0000000000..30150f426c --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Normal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Pressed.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Pressed.colorset/Contents.json new file mode 100644 index 0000000000..5c46b8d208 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/Background/Pressed.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE3", + "green" : "0xE3", + "red" : "0xE3" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x60", + "green" : "0x43", + "red" : "0x2E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/Title.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/Title.colorset/Contents.json new file mode 100644 index 0000000000..49c5cc3eb9 --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/Title.colorset/Contents.json @@ -0,0 +1,36 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "gray-gamma-22", + "components" : { + "alpha" : "1.000", + "white" : "0.330" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/SearchUserCell/UserType.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/SearchUserCell/UserType.colorset/Contents.json new file mode 100644 index 0000000000..ffaecd67bf --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/SearchUserCell/UserType.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Share/TabTitle.colorset/Contents.json b/iOSClient/Colors.xcassets/Share/TabTitle.colorset/Contents.json new file mode 100644 index 0000000000..86b9080fbc --- /dev/null +++ b/iOSClient/Colors.xcassets/Share/TabTitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xE2", + "red" : "0xDB" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Tabbar/ActiveItem.colorset/Contents.json b/iOSClient/Colors.xcassets/Tabbar/ActiveItem.colorset/Contents.json new file mode 100644 index 0000000000..78a4c616b5 --- /dev/null +++ b/iOSClient/Colors.xcassets/Tabbar/ActiveItem.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xEB", + "green" : "0xCA", + "red" : "0x95" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Tabbar/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/Tabbar/Background.colorset/Contents.json new file mode 100644 index 0000000000..d1aea6fe2d --- /dev/null +++ b/iOSClient/Colors.xcassets/Tabbar/Background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0xF7", + "red" : "0xF4" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x42", + "green" : "0x2D", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Tabbar/Contents.json b/iOSClient/Colors.xcassets/Tabbar/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Tabbar/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Tabbar/FabButton.colorset/Contents.json b/iOSClient/Colors.xcassets/Tabbar/FabButton.colorset/Contents.json new file mode 100644 index 0000000000..168cfbf5b3 --- /dev/null +++ b/iOSClient/Colors.xcassets/Tabbar/FabButton.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8F", + "green" : "0x3D", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xC4", + "green" : "0x74", + "red" : "0x14" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Tabbar/InactiveItem.colorset/Contents.json b/iOSClient/Colors.xcassets/Tabbar/InactiveItem.colorset/Contents.json new file mode 100644 index 0000000000..d6fad5c4ad --- /dev/null +++ b/iOSClient/Colors.xcassets/Tabbar/InactiveItem.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB4", + "green" : "0xA3", + "red" : "0x97" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Transfers/Cell/Contents.json b/iOSClient/Colors.xcassets/Transfers/Cell/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Transfers/Cell/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/Transfers/Cell/Subtitle.colorset/Contents.json b/iOSClient/Colors.xcassets/Transfers/Cell/Subtitle.colorset/Contents.json new file mode 100644 index 0000000000..8c8c693a3e --- /dev/null +++ b/iOSClient/Colors.xcassets/Transfers/Cell/Subtitle.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x75", + "green" : "0x5A", + "red" : "0x46" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Transfers/Cell/Title.colorset/Contents.json b/iOSClient/Colors.xcassets/Transfers/Cell/Title.colorset/Contents.json new file mode 100644 index 0000000000..a07820a935 --- /dev/null +++ b/iOSClient/Colors.xcassets/Transfers/Cell/Title.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x41", + "green" : "0x1B", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/Transfers/Contents.json b/iOSClient/Colors.xcassets/Transfers/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/Transfers/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/UserButton/Background.colorset/Contents.json b/iOSClient/Colors.xcassets/UserButton/Background.colorset/Contents.json new file mode 100644 index 0000000000..788f7540b3 --- /dev/null +++ b/iOSClient/Colors.xcassets/UserButton/Background.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "244", + "green" : "236", + "red" : "245" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/UserButton/Contents.json b/iOSClient/Colors.xcassets/UserButton/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/Colors.xcassets/UserButton/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/Colors.xcassets/UserButton/Tint.colorset/Contents.json b/iOSClient/Colors.xcassets/UserButton/Tint.colorset/Contents.json new file mode 100644 index 0000000000..b6b5c8a9ad --- /dev/null +++ b/iOSClient/Colors.xcassets/UserButton/Tint.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "153", + "green" : "77", + "red" : "169" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Colors.xcassets/formSeparator.colorset/Contents.json b/iOSClient/Colors.xcassets/formSeparator.colorset/Contents.json new file mode 100644 index 0000000000..965cbd969a --- /dev/null +++ b/iOSClient/Colors.xcassets/formSeparator.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xDD", + "green" : "0xDD", + "red" : "0xDD" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Components/Buttons/ButtonStyleGuide.swift b/iOSClient/Components/Buttons/ButtonStyleGuide.swift new file mode 100644 index 0000000000..cd778bd7af --- /dev/null +++ b/iOSClient/Components/Buttons/ButtonStyleGuide.swift @@ -0,0 +1,171 @@ +// +// ButtonStyleGuide.swift +// Nextcloud +// +// Created by Vitaliy Tolkach on 13.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +// MARK: - Primary +struct ButtonStylePrimary: ButtonStyle { + @Environment(\.isEnabled) private var isEnabled: Bool + + var maxWidth: CGFloat? = nil + + private func foregroundColor(for configuration: Configuration) -> Color { + isEnabled ? Color(.Button.Primary.Text.normal): Color(.Button.Primary.Text.disabled) + } + + private func backgroundColor(for configuration: Configuration) -> Color { + if isEnabled { + return configuration.isPressed ? Color(.Button.Primary.Background.selected) : Color(.Button.Primary.Background.normal) + } + return Color(.Button.Primary.Background.disabled) + } + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .font(CommonButtonConstants.defaultFont) + .frame(maxWidth: maxWidth, + minHeight: CommonButtonConstants.defaultHeight) + .padding([.leading, .trailing], 24) + .foregroundStyle(foregroundColor(for: configuration)) + .background{ + Capsule(style: .circular) + .stroke(backgroundColor(for: configuration), lineWidth: CommonButtonConstants.defaultBorderWidth) + .background(content: { + Capsule().fill(backgroundColor(for: configuration)) + }) + } + } +} + +extension ButtonStyle where Self == ButtonStylePrimary { + static var primary: Self { + return .init() + } +} + +// MARK: - Secondary +struct ButtonStyleSecondary: ButtonStyle { + @Environment(\.isEnabled) private var isEnabled: Bool + + var maxWidth: CGFloat? = nil + + private func foregroundColor(for configuration: Configuration) -> Color { + if isEnabled { + return configuration.isPressed ? Color(.Button.Secondary.Text.selected) : Color(.Button.Secondary.Text.normal) + } + return Color(.Button.Secondary.Text.disabled) + } + + private func borderColor(for configuration: Configuration) -> Color { + isEnabled ? Color(.Button.Secondary.Border.normal) : Color(.Button.Secondary.Border.disabled) + } + + private func backgroundColor(for configuration: Configuration) -> Color { + configuration.isPressed ? Color(.Button.Secondary.Background.selected) : Color(.Button.Secondary.Background.normal) + } + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .font(CommonButtonConstants.defaultFont) + .frame(maxWidth: maxWidth, + minHeight: CommonButtonConstants.defaultHeight) + .padding([.leading, .trailing], 24) + .foregroundStyle(foregroundColor(for: configuration)) + .background{ + Capsule(style: .circular) + .stroke(borderColor(for: configuration), lineWidth: CommonButtonConstants.defaultBorderWidth) + .background(content: { + Capsule().fill(backgroundColor(for: configuration)) + }) + } + .makeAllButtonSpaceTappable() + } +} + +private extension View { + func makeAllButtonSpaceTappable() -> some View { + self.contentShape(Rectangle()) + } +} + +extension ButtonStyle where Self == ButtonStyleSecondary { + static var secondary: Self { + return .init() + } +} + +#Preview { + VStack(spacing: 30) { + VStack { + Button { + } label: { + Text("Primary default state") + } + .buttonStyle(.primary) + + Button { + } label: { + Text("Primary disabled state") + } + .buttonStyle(.primary) + .disabled(true) + + Spacer() + .frame(height: 30) + + Button { + } label: { + Text("Secondary default state") + } + .buttonStyle(.secondary) + + Button { + } label: { + Text("Secondary disabled state") + } + .buttonStyle(.secondary) + .disabled(true) + } + .frame(width: 300, height: 300) + .background(Color(.AppBackground.main)) + .environment(\.colorScheme, .light) + VStack { + Button { + } label: { + Text("Primary default state") + } + .buttonStyle(.primary) + + Button { + } label: { + Text("Primary disabled state") + } + .buttonStyle(.primary) + .disabled(true) + + Spacer() + .frame(height: 30) + + Button { + } label: { + Text("Secondary default state") + } + .buttonStyle(.secondary) + + Button { + } label: { + Text("Secondary disabled state") + } + .buttonStyle(.secondary) + .disabled(true) + } + .frame(width: 300, height: 300) + .background(Color(.AppBackground.main)) + .environment(\.colorScheme, .dark) + } +} diff --git a/iOSClient/Components/Buttons/CommonButtonConstants.swift b/iOSClient/Components/Buttons/CommonButtonConstants.swift new file mode 100644 index 0000000000..370204bb0f --- /dev/null +++ b/iOSClient/Components/Buttons/CommonButtonConstants.swift @@ -0,0 +1,23 @@ +// +// CommonButtonConstants.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 23.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation +import SwiftUI + +enum CommonButtonConstants { + static let defaultFont: Font = .system(size: 14, weight: .semibold) + static let defaultUIFont: UIFont = .systemFont(ofSize: 14, weight: .semibold) + + static let defaultBorderWidth: CGFloat = 2.0 + + static let intrinsicContentSize: CGSize = .init(width: defaultWidth, height: defaultHeight) + static let defaultHeight: CGFloat = 48 + static var defaultWidth: CGFloat { + UIDevice.current.userInterfaceIdiom == .phone ? 100 : 240 + } +} diff --git a/iOSClient/Components/Buttons/LinkButton.swift b/iOSClient/Components/Buttons/LinkButton.swift new file mode 100644 index 0000000000..f6fb0f2158 --- /dev/null +++ b/iOSClient/Components/Buttons/LinkButton.swift @@ -0,0 +1,50 @@ +// +// LinkButton.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 26.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit + +class LinkButton: UIButton { + override func awakeFromNib() { + super.awakeFromNib() + + titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold) + backgroundColor = .clear + updateApperance() + } + + override var intrinsicContentSize: CGSize { + return CommonButtonConstants.intrinsicContentSize + } + + override public var isEnabled: Bool { + didSet { + updateApperance() + } + } + + override open var isHighlighted: Bool { + didSet { + updateApperance() + } + } + + private func updateApperance() { + setTitleColor(titleColor(), for: .normal) + } + + private func titleColor() -> UIColor { + guard isEnabled else { + return UIColor(resource: .Button.Link.Text.disabled) + } + if isHighlighted { + return UIColor(resource: .Button.Link.Text.selected) + } + return UIColor(resource: .Button.Link.Text.normal) + } + +} diff --git a/iOSClient/Components/Buttons/PrimaryButton.swift b/iOSClient/Components/Buttons/PrimaryButton.swift new file mode 100644 index 0000000000..dd18446e15 --- /dev/null +++ b/iOSClient/Components/Buttons/PrimaryButton.swift @@ -0,0 +1,67 @@ +// +// PrimaryButton.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 20.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit + +class PrimaryButton: UIButton { + + override func awakeFromNib() { + super.awakeFromNib() + + layer.masksToBounds = true + updateApperance() + titleLabel?.font = CommonButtonConstants.defaultUIFont + } + + override var intrinsicContentSize: CGSize { + return CommonButtonConstants.intrinsicContentSize + } + + override public var isEnabled: Bool { + didSet { + updateApperance() + } + } + + override open var isHighlighted: Bool { + didSet { + updateApperance() + } + } + + override func layoutSubviews() { + layer.cornerRadius = bounds.height/2.0 + super.layoutSubviews() + } + + private func updateApperance() { + setTitleColor(titleColor(), for: .normal) + backgroundColor = backgroundColor() + } + + private func backgroundColor() -> UIColor { + guard isEnabled else { + return UIColor(resource: .Button.Primary.Background.disabled) + } + if isHighlighted { + return UIColor(resource: .Button.Primary.Background.selected) + } + return UIColor(resource: .Button.Primary.Background.normal) + } + + private func titleColor() -> UIColor { + guard isEnabled else { + return UIColor(resource: .Button.Primary.Text.disabled) + } + if isHighlighted { + return UIColor(resource: .Button.Primary.Text.selected) + } + return UIColor(resource: .Button.Primary.Text.normal) + } +} + diff --git a/iOSClient/Components/Buttons/SecondaryButton.swift b/iOSClient/Components/Buttons/SecondaryButton.swift new file mode 100644 index 0000000000..73a400dea3 --- /dev/null +++ b/iOSClient/Components/Buttons/SecondaryButton.swift @@ -0,0 +1,82 @@ +// +// SecondaryButton.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 23.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit + +class SecondaryButton: UIButton { + + override func awakeFromNib() { + super.awakeFromNib() + + layer.masksToBounds = true + layer.borderWidth = CommonButtonConstants.defaultBorderWidth + + updateApperance() + + titleLabel?.font = CommonButtonConstants.defaultUIFont + } + + override var intrinsicContentSize: CGSize { + return CommonButtonConstants.intrinsicContentSize + } + + override public var isEnabled: Bool { + didSet { + updateApperance() + } + } + + override open var isHighlighted: Bool { + didSet { + updateApperance() + } + } + + override func layoutSubviews() { + layer.cornerRadius = bounds.height/2.0 + super.layoutSubviews() + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + updateApperance() + } + } + + private func updateApperance() { + setTitleColor(titleColor(), for: .normal) + backgroundColor = backgroundColor() + layer.borderColor = borderColor() + tintColor = titleColor() + } + + private func borderColor() -> CGColor { + return UIColor(resource: isEnabled ? .Button.Secondary.Border.normal : .Button.Secondary.Border.disabled).resolvedColor(with: self.traitCollection).cgColor + } + + private func backgroundColor() -> UIColor { + guard isEnabled else { + return UIColor(resource: .Button.Secondary.Background.disabled) + } + if isHighlighted { + return UIColor(resource: .Button.Secondary.Background.selected) + } + return UIColor(resource: .Button.Secondary.Background.normal) + } + + private func titleColor() -> UIColor { + guard isEnabled else { + return UIColor(resource: .Button.Secondary.Text.disabled) + } + if isHighlighted { + return UIColor(resource: .Button.Secondary.Text.selected) + } + return UIColor(resource: .Button.Secondary.Text.normal) + } +} diff --git a/iOSClient/Data/NCManageDatabase+Account.swift b/iOSClient/Data/NCManageDatabase+Account.swift index afec1cfd35..04013557e7 100644 --- a/iOSClient/Data/NCManageDatabase+Account.swift +++ b/iOSClient/Data/NCManageDatabase+Account.swift @@ -31,17 +31,19 @@ class tableAccount: Object { @objc dynamic var active: Bool = false @objc dynamic var address = "" @objc dynamic var alias = "" - @objc dynamic var autoUpload: Bool = false @objc dynamic var autoUploadCreateSubfolder: Bool = false @objc dynamic var autoUploadSubfolderGranularity: Int = NCGlobal.shared.subfolderGranularityMonthly @objc dynamic var autoUploadDirectory = "" @objc dynamic var autoUploadFileName = "" - @objc dynamic var autoUploadFull: Bool = false + @objc dynamic var autoUploadStart: Bool = false @objc dynamic var autoUploadImage: Bool = false @objc dynamic var autoUploadVideo: Bool = false - @objc dynamic var autoUploadFavoritesOnly: Bool = false @objc dynamic var autoUploadWWAnPhoto: Bool = false @objc dynamic var autoUploadWWAnVideo: Bool = false + /// The Date from which new photos should be uploaded + @objc dynamic var autoUploadSinceDate: Date? + /// The date of the most recently uploaded asset + @objc dynamic var autoUploadLastUploadedDate: Date? @objc dynamic var backend = "" @objc dynamic var backendCapabilitiesSetDisplayName: Bool = false @objc dynamic var backendCapabilitiesSetPassword: Bool = false @@ -80,7 +82,7 @@ class tableAccount: Object { } func tableAccountToCodable() -> tableAccountCodable { - return tableAccountCodable(account: self.account, active: self.active, alias: self.alias, autoUpload: self.autoUpload, autoUploadCreateSubfolder: self.autoUploadCreateSubfolder, autoUploadSubfolderGranularity: self.autoUploadSubfolderGranularity, autoUploadDirectory: self.autoUploadDirectory, autoUploadFileName: self.autoUploadFileName, autoUploadFull: self.autoUploadFull, autoUploadImage: self.autoUploadImage, autoUploadVideo: self.autoUploadVideo, autoUploadFavoritesOnly: self.autoUploadFavoritesOnly, autoUploadWWAnPhoto: self.autoUploadWWAnPhoto, autoUploadWWAnVideo: self.autoUploadWWAnVideo, user: self.user, userId: self.userId, urlBase: self.urlBase) + return tableAccountCodable(account: self.account, active: self.active, alias: self.alias, autoUploadCreateSubfolder: self.autoUploadCreateSubfolder, autoUploadSubfolderGranularity: self.autoUploadSubfolderGranularity, autoUploadDirectory: self.autoUploadDirectory, autoUploadFileName: self.autoUploadFileName, autoUploadStart: self.autoUploadStart, autoUploadImage: self.autoUploadImage, autoUploadVideo: self.autoUploadVideo, autoUploadWWAnPhoto: self.autoUploadWWAnPhoto, autoUploadWWAnVideo: self.autoUploadWWAnVideo, user: self.user, userId: self.userId, urlBase: self.urlBase) } convenience init(codableObject: tableAccountCodable) { @@ -89,15 +91,13 @@ class tableAccount: Object { self.active = codableObject.active self.alias = codableObject.alias - self.autoUpload = codableObject.autoUpload self.autoUploadCreateSubfolder = codableObject.autoUploadCreateSubfolder self.autoUploadSubfolderGranularity = codableObject.autoUploadSubfolderGranularity self.autoUploadDirectory = codableObject.autoUploadDirectory self.autoUploadFileName = codableObject.autoUploadFileName - self.autoUploadFull = codableObject.autoUploadFull + self.autoUploadStart = codableObject.autoUploadStart self.autoUploadImage = codableObject.autoUploadImage self.autoUploadVideo = codableObject.autoUploadVideo - self.autoUploadFavoritesOnly = codableObject.autoUploadFavoritesOnly self.autoUploadWWAnPhoto = codableObject.autoUploadWWAnPhoto self.autoUploadWWAnVideo = codableObject.autoUploadWWAnVideo @@ -112,15 +112,13 @@ struct tableAccountCodable: Codable { var active: Bool var alias: String - var autoUpload: Bool var autoUploadCreateSubfolder: Bool var autoUploadSubfolderGranularity: Int var autoUploadDirectory = "" var autoUploadFileName: String - var autoUploadFull: Bool + var autoUploadStart: Bool var autoUploadImage: Bool var autoUploadVideo: Bool - var autoUploadFavoritesOnly: Bool var autoUploadWWAnPhoto: Bool var autoUploadWWAnVideo: Bool @@ -213,6 +211,12 @@ extension NCManageDatabase { } } + func updateAccountProperty(_ keyPath: ReferenceWritableKeyPath, value: T, account: String) { + guard let activeAccount = getTableAccount(account: account) else { return } + activeAccount[keyPath: keyPath] = value + updateAccount(activeAccount) + } + func updateAccount(_ account: tableAccount) { do { let realm = try Realm() @@ -293,6 +297,17 @@ extension NCManageDatabase { } return [] } + + func getAllAccountOrderByEmail() -> [tableAccount] { + do { + let realm = try Realm() + let results = realm.objects(tableAccount.self).sorted(byKeyPath: "email", ascending: true) + return Array(results.map { tableAccount.init(value: $0) }) + } catch let error as NSError { + NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Could not access database: \(error)") + } + return [] + } func getAccountAutoUploadFileName() -> String { do { @@ -347,6 +362,18 @@ extension NCManageDatabase { return NCGlobal.shared.subfolderGranularityMonthly } + func getAccountAutoUploadFromFromDate() -> Date? { + do { + let realm = try Realm() + guard let result = realm.objects(tableAccount.self).filter("active == true").first else { return .distantPast } + return result.autoUploadSinceDate + } catch let error as NSError { + NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Could not access database: \(error)") + } + + return nil + } + @discardableResult func setAccountActive(_ account: String) -> tableAccount? { var tblAccount: tableAccount? @@ -496,7 +523,7 @@ extension NCManageDatabase { } } - func setAccountAlias(_ account: String, alias: String) { + func setAccountAlias(_ account: String, alias: String, completion: (() -> Void)? = nil) { let alias = alias.trimmingCharacters(in: .whitespacesAndNewlines) do { @@ -504,10 +531,12 @@ extension NCManageDatabase { try realm.write { if let result = realm.objects(tableAccount.self).filter("account == %@", account).first { result.alias = alias + completion?() } } } catch let error { NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Could not write to database: \(error)") + completion?() } } diff --git a/iOSClient/Data/NCManageDatabase+Metadata.swift b/iOSClient/Data/NCManageDatabase+Metadata.swift index b9a48061c4..6aa8bae2b8 100644 --- a/iOSClient/Data/NCManageDatabase+Metadata.swift +++ b/iOSClient/Data/NCManageDatabase+Metadata.swift @@ -195,6 +195,10 @@ extension tableMetadata { var isImage: Bool { return classFile == NKCommon.TypeClassFile.image.rawValue } + + var isURL: Bool { + return classFile == NKCommon.TypeClassFile.url.rawValue + } var isSavebleAsImage: Bool { classFile == NKCommon.TypeClassFile.image.rawValue && contentType != "image/svg+xml" diff --git a/iOSClient/Data/NCManageDatabase.swift b/iOSClient/Data/NCManageDatabase.swift index 321c5f2658..6c1da011ab 100644 --- a/iOSClient/Data/NCManageDatabase.swift +++ b/iOSClient/Data/NCManageDatabase.swift @@ -72,7 +72,6 @@ final class NCManageDatabase: Sendable { tableTag.self, tableAccount.self, tableCapabilities.self, - tablePhotoLibrary.self, tableE2eEncryption.self, tableE2eEncryptionLock.self, tableE2eMetadata12.self, @@ -220,7 +219,6 @@ final class NCManageDatabase: Sendable { self.clearTable(TableGroupfoldersGroups.self, account: account) self.clearTable(tableLocalFile.self, account: account) self.clearTable(tableMetadata.self, account: account) - self.clearTable(tablePhotoLibrary.self, account: account) self.clearTable(tableShare.self, account: account) self.clearTable(TableSecurityGuardDiagnostics.self, account: account) self.clearTable(tableTag.self, account: account) diff --git a/iOSClient/DataProtection/DataProtectionAgreementManager.swift b/iOSClient/DataProtection/DataProtectionAgreementManager.swift new file mode 100644 index 0000000000..164a57dc3a --- /dev/null +++ b/iOSClient/DataProtection/DataProtectionAgreementManager.swift @@ -0,0 +1,143 @@ +// +// DataProtectionAgreementManager.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 27.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit +import AppTrackingTransparency +import FirebaseAnalytics +import Firebase + +class DataProtectionAgreementManager { + private(set) static var shared = DataProtectionAgreementManager() + private var dismissBlock: (() -> Void)? + + var rootViewController: UIViewController + + struct DataProtectionKeys { + static let agreementWasShown = "data_protection_agreement_was_shown" + } + + private init() { + rootViewController = DataProtectionHostingController(rootView: DataProtectionAgreementScreen()) + } + + func dismissView() { + guard Thread.current.isMainThread else { + return DispatchQueue.main.async { [weak self] in + self?.rootViewController.dismiss(animated: false) + } + } + + rootViewController.dismiss(animated: false) + } + + func showView(viewController: UIViewController, dismissBlock: @escaping () -> Void) { + guard Thread.current.isMainThread else { + return DispatchQueue.main.async { [weak self] in + self?.showView(viewController: viewController, dismissBlock: dismissBlock) + } + } + + if !rootViewController.isBeingPresented { + rootViewController.modalPresentationStyle = .fullScreen + viewController.present(rootViewController, animated: false) + } + } + + func showAgreement(viewController: UIViewController) { + let wasAgreementShown = UserDefaults.standard.bool(forKey: DataProtectionKeys.agreementWasShown) + if !wasAgreementShown { + showView(viewController: viewController) { [weak self] in + self?.setupAnalyticsCollection() + } + } + } + + func setupAnalyticsCollection(){ + let isAllowed = isAllowedAnalysisOfDataCollection() + Analytics.setAnalyticsCollectionEnabled(isAllowed) + Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(isAllowed) + } + + func acceptAgreement() { + agreementWasShown(true) + askForTrackingPermission { [weak self] _ in + self?.dismissView() + } + } + + func saveSettings() { + agreementWasShown(true) + dismissView() + } + + func rejectAgreement() { + agreementWasShown(true) + askForTrackingPermission { [weak self] granted in + if granted { + self?.redirectToSettings() + } + else { + self?.dismissView() + } + } + } + + func onAccountCreated() { + agreementWasShown(false) + } + + private func agreementWasShown(_ wasShown: Bool) { + UserDefaults.standard.set(wasShown, forKey: DataProtectionKeys.agreementWasShown) + } + + func allowAnalysisOfDataCollection(_ allowAnalysisOfDataCollection: Bool, redirectToSettings: (() -> Void)?) { + askForTrackingPermission { granted in + if granted != allowAnalysisOfDataCollection { + redirectToSettings?() + } + } + } + + func isAllowedAnalysisOfDataCollection() -> Bool { + return ATTrackingManager.trackingAuthorizationStatus == .authorized + } + + private func askForTrackingPermission(completion: ((_ isPermissionGranted: Bool) -> Void)?) { + switch ATTrackingManager.trackingAuthorizationStatus { + case .notDetermined: handleNotDetermined(completion: completion) + case .authorized: completion?(true) + case .restricted, + .denied: completion?(false) + @unknown default: return + } + } + + private func handleNotDetermined(completion: ((_ isPermissionGranted: Bool) -> Void)?) { + ATTrackingManager.requestTrackingAuthorization { [weak self] _ in + self?.askForTrackingPermission(completion: completion) + } + } + + private func redirectToSettings() { + let alert = UIAlertController(title: NSLocalizedString("_alert_tracking_access", comment: ""), message: nil, preferredStyle: .alert) + + alert.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel, handler: { _ in })) + + alert.addAction(UIAlertAction(title: NSLocalizedString("_settings_", comment: ""), style: .default, handler: { (_) in + DispatchQueue.main.async { + if let settingsURL = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil) + } + } + })) + + DispatchQueue.main.async { [weak self] in + self?.rootViewController.present(alert, animated: false) + } + } +} diff --git a/iOSClient/DataProtection/DataProtectionAgreementScreen.swift b/iOSClient/DataProtection/DataProtectionAgreementScreen.swift new file mode 100644 index 0000000000..c8e5113c1d --- /dev/null +++ b/iOSClient/DataProtection/DataProtectionAgreementScreen.swift @@ -0,0 +1,98 @@ +// +// DataProtectionAgreementScreen.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 25.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +struct DataProtectionAgreementScreen: View { + + var isIPad: Bool { + UIDevice.current.userInterfaceIdiom == .pad + } + + @State private var isShowingSettingsView = false + @State private var isShowPrivacyPolicy = false + + var body: some View { + let titleFont = Font.system(size: isIPad ? 36.0 : 18.0, weight: .bold) + let textFont = Font.system(size: isIPad ? 18.0 : 14.0) + let textBoxRatio = isIPad ? 0.6 : 0.9 + GeometryReader { geometry in + let size = geometry.size + + NavigationView { + VStack(alignment: .center, spacing: 16.0) { + HStack { + Spacer() + Image(.dataProtection) + .resizable() + .scaledToFit() + .frame(height: isIPad ? 128: 64) + Spacer() + }.padding([.top, .bottom], isIPad ? 80.0 : 32.0) + + VStack(alignment: .leading) { + Text(NSLocalizedString("_privacy_settings_", comment: "")) + .font(titleFont) + .foregroundStyle(.white) + .padding(.bottom, 12.0) + + ScrollView { + Text(.init(NSLocalizedString("_privacy_settings_description_", comment: ""))) + .font(textFont) + .multilineTextAlignment(.leading) + .foregroundStyle(.white) + .accentColor(Color(.DataProtection.link)) + .environment(\.openURL, OpenURLAction { url in + if url.absoluteString == "link://privacypolicy" { + isShowPrivacyPolicy = true + } + else if url.absoluteString == "link://reject" { + DataProtectionAgreementManager.shared.rejectAgreement() + } + return .discarded + }) + } + .padding(.bottom, 24) + } + .frame(width: size.width * textBoxRatio) + .sheet(isPresented: $isShowPrivacyPolicy) { + NCBrowserWebView(urlBase: URL(string: NCBrandOptions.shared.privacy)!, browserTitle: NSLocalizedString("_privacy_legal_", comment: "")) + } + + NavigationLink(destination: DataProtectionSettingsScreen(model: DataProtectionModel(), isShowing: $isShowingSettingsView), isActive: $isShowingSettingsView) { EmptyView() } + + Button(NSLocalizedString("_data_protection_settings_", comment: "")) { + isShowingSettingsView = true + } + .buttonStyle(ButtonStyleSecondary(maxWidth: 288.0)) + + Button(NSLocalizedString("_agree_", comment: "")) { + DataProtectionAgreementManager.shared.acceptAgreement() + } + .buttonStyle(ButtonStylePrimary(maxWidth: 288.0)) + } + .environment(\.colorScheme, .dark) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .padding(16.0) + .background { + Image(.gradientBackground) + .resizable() + .ignoresSafeArea() + } + .navigationTitle("") + .navigationBarHidden(true) + } + .accentColor(Color(.DataProtection.navigationBarTint)) + .navigationViewStyle(StackNavigationViewStyle()) + } + } +} + +#Preview { + DataProtectionAgreementScreen() +} diff --git a/iOSClient/DataProtection/DataProtectionHostingController.swift b/iOSClient/DataProtection/DataProtectionHostingController.swift new file mode 100644 index 0000000000..ac4b01fbb2 --- /dev/null +++ b/iOSClient/DataProtection/DataProtectionHostingController.swift @@ -0,0 +1,16 @@ +// +// DataProtectionHostingController.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 26.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation +import SwiftUI + +class DataProtectionHostingController: UIHostingController { + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .portrait + } +} diff --git a/iOSClient/DataProtection/DataProtectionModel.swift b/iOSClient/DataProtection/DataProtectionModel.swift new file mode 100644 index 0000000000..9030f16686 --- /dev/null +++ b/iOSClient/DataProtection/DataProtectionModel.swift @@ -0,0 +1,46 @@ +// +// DataProtectionModel.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 25.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation + +class DataProtectionModel: ObservableObject { + + @Published var requiredDataCollection: Bool = true + @Published var analysisOfDataCollection: Bool + @Published var redirectToSettings: Bool = false + + var isShownFromSettings: Bool = false + + init(showFromSettings: Bool = false) { + self.isShownFromSettings = showFromSettings + self.analysisOfDataCollection = DataProtectionAgreementManager.shared.isAllowedAnalysisOfDataCollection() + } + + func allowAnalysisOfDataCollection(_ allowAnalysisOfDataCollection: Bool) { + DataProtectionAgreementManager.shared.allowAnalysisOfDataCollection(allowAnalysisOfDataCollection) { + [weak self] in self?.redirectToSettings = true + } + } + + func cancelOpenSettings() { + self.analysisOfDataCollection = DataProtectionAgreementManager.shared.isAllowedAnalysisOfDataCollection() + } + + func openSettings() { + DispatchQueue.main.async { + if let settingsURL = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil) + } + } + self.analysisOfDataCollection = DataProtectionAgreementManager.shared.isAllowedAnalysisOfDataCollection() + } + + func saveSettings() { + DataProtectionAgreementManager.shared.saveSettings() + } +} diff --git a/iOSClient/DataProtection/DataProtectionSettingsScreen.swift b/iOSClient/DataProtection/DataProtectionSettingsScreen.swift new file mode 100644 index 0000000000..12dc3e8df0 --- /dev/null +++ b/iOSClient/DataProtection/DataProtectionSettingsScreen.swift @@ -0,0 +1,189 @@ +// +// DataProtectionSettingsScreen.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 25.11.2024. +// Copyright © 2024 STRATO GmbH +// + +import SwiftUI + +struct DataProtectionSettingsScreen: View { + + @ObservedObject var model: DataProtectionModel + @Binding var isShowing: Bool + + var isIPad: Bool { + UIDevice.current.userInterfaceIdiom == .pad + } + + var body: some View { + if isIPad { + iPadView() + } else { + iPhoneView() + } + } + + private func iPhoneView() -> some View { + VStack { + ScrollView { + VStack(alignment: .leading){ + header() + .padding(EdgeInsets(top: 16.0, + leading: 16.0, + bottom: 32.0, + trailing: 16.0)) + + VStack{ + divider() + + VStack(alignment: .leading) { + requiredDataCollectionToggle() + requiredDataCollectionFooter() + } + .padding(EdgeInsets(top: 12.0, + leading: 16.0, + bottom: 12.0, + trailing: 16.0)) + + divider() + + VStack(alignment: .leading) { + analysisOfDataCollectionToggle() + analysisOfDataCollectionFooter() + } + .padding(EdgeInsets(top: 12.0, + leading: 16.0, + bottom: 12.0, + trailing: 16.0)) + + divider() + } + .background(Color(.DataProtection.listRow)) + } + } + .background(Color(.AppBackground.dataProtection)) + + Spacer() + saveSettingsButton() + } + .background(Color(.AppBackground.dataProtection)) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .navigationTitle(NSLocalizedString("_data_protection_", comment:"")) + .navigationBarTitleDisplayMode(.inline) + } + + private func iPadView() -> some View { + VStack(alignment: .leading) { + header() + .padding(EdgeInsets(top: 10.0, + leading: 16.0, + bottom: 0.0, + trailing: 16.0)) + + Form { + Section(content: { + requiredDataCollectionToggle() + }, footer: { + requiredDataCollectionFooter() + }).applyGlobalFormSectionStyle() + + Section(content: { + analysisOfDataCollectionToggle() + }, footer: { + analysisOfDataCollectionFooter() + }).applyGlobalFormSectionStyle() + } + .applyGlobalFormStyle() + + Spacer() + + HStack { + Spacer() + saveSettingsButton() + Spacer() + } + } + .background(Color(.AppBackground.dataProtection)) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .navigationTitle(NSLocalizedString("_data_protection_", comment:"")) + .navigationBarTitleDisplayMode(.large) + } + + private func divider() -> some View { + Divider() + .background(Color(.DataProtection.listSeparator)) + .frame(height: 1.0) + } + + private func header() -> some View { + let textFont = Font.system(size: 16.0) + return Text("_data_usage_for_app_optimization_description_") + .font(textFont) + .multilineTextAlignment(.leading) + .foregroundStyle(Color(.ListCell.title)) + } + + private func requiredDataCollectionToggle() -> some View { + let listRowTitleFont = Font.system(size: 16.0, weight: .bold) + return Toggle(NSLocalizedString("_required_data_collection_", comment: ""), isOn: $model.requiredDataCollection) + .tint(Color(NCBrandColor.shared.switchColor)) + .font(listRowTitleFont) + .foregroundStyle(Color(.ListCell.title)) + .disabled(true) + } + + private func requiredDataCollectionFooter() -> some View { + let listRowSubtitleFont = Font.system(size: 16.0) + return Text("_required_data_collection_description_") + .font(listRowSubtitleFont) + .multilineTextAlignment(.leading) + .foregroundStyle(Color(.DataProtection.listRowSubtitle)) + } + + private func analysisOfDataCollectionToggle() -> some View { + let listRowTitleFont = Font.system(size: 16.0, weight: .bold) + return Toggle(NSLocalizedString("_analysis_of_data_collection_", comment: ""), isOn: $model.analysisOfDataCollection) + .tint(Color(NCBrandColor.shared.switchColor)) + .font(listRowTitleFont) + .foregroundStyle(Color(.ListCell.title)) + .onChange(of: model.analysisOfDataCollection) { allowAnalysis in + model.allowAnalysisOfDataCollection(allowAnalysis) + } + .alert(NSLocalizedString("_alert_tracking_access", comment: ""), isPresented: $model.redirectToSettings, actions: { + Button(NSLocalizedString("_cancel_", comment: ""), + role: .none, + action: { + model.cancelOpenSettings() + }) + Button(NSLocalizedString("_settings_", comment: ""), + role: .none, + action: { + model.openSettings() + }) + }) + } + + private func analysisOfDataCollectionFooter() -> some View { + let listRowSubtitleFont = Font.system(size: 16.0) + return Text("_analysis_of_data_collection_description_") + .font(listRowSubtitleFont) + .multilineTextAlignment(.leading) + .foregroundStyle(Color(.DataProtection.listRowSubtitle)) + } + + private func saveSettingsButton() -> some View { + Button(NSLocalizedString("_save_settings_", comment: "")) { + isShowing = false + model.saveSettings() + } + .buttonStyle(ButtonStylePrimary(maxWidth: 288.0)) + .padding(16.0) + .hiddenConditionally(isHidden: model.isShownFromSettings) + } +} + +#Preview { + DataProtectionSettingsScreen(model: DataProtectionModel(), isShowing: .constant(true)) +} diff --git a/iOSClient/DeepLink/NCDeepLinkHandler.swift b/iOSClient/DeepLink/NCDeepLinkHandler.swift index 63a3b606b7..1472e20468 100644 --- a/iOSClient/DeepLink/NCDeepLinkHandler.swift +++ b/iOSClient/DeepLink/NCDeepLinkHandler.swift @@ -150,9 +150,11 @@ class NCDeepLinkHandler { controller.selectedIndex = ControllerConstants.moreIndex guard let navigationController = controller.viewControllers?[controller.selectedIndex] as? UINavigationController else { return } - let autoUploadView = NCAutoUploadView(model: NCAutoUploadModel(controller: controller)) - let autoUploadController = UIHostingController(rootView: autoUploadView) - navigationController.pushViewController(autoUploadController, animated: true) + Task { @MainActor in + let autoUploadView = NCAutoUploadView(model: NCAutoUploadModel(controller: controller), albumModel: AlbumModel(controller: controller)) + let autoUploadController = UIHostingController(rootView: autoUploadView) + navigationController.pushViewController(autoUploadController, animated: true) + } } private func navigateAppUpdate() { diff --git a/iOSClient/Extensions/PHAssetCollection+Extension.swift b/iOSClient/Extensions/PHAssetCollection+Extension.swift index d596e1ed3e..b279f88466 100644 --- a/iOSClient/Extensions/PHAssetCollection+Extension.swift +++ b/iOSClient/Extensions/PHAssetCollection+Extension.swift @@ -5,6 +5,10 @@ import Photos extension PHAssetCollection { + public static func == (lhs: PHAssetCollection, rhs: PHAssetCollection) -> Bool { + return lhs.localIdentifier == rhs.localIdentifier || lhs.assetCount == rhs.assetCount + } + var assetCount: Int { let fetchOptions = PHFetchOptions() let result = PHAsset.fetchAssets(in: self, options: fetchOptions) diff --git a/iOSClient/Extensions/UIAlertController+Extension.swift b/iOSClient/Extensions/UIAlertController+Extension.swift index ddbf7d50e4..779f5edb55 100644 --- a/iOSClient/Extensions/UIAlertController+Extension.swift +++ b/iOSClient/Extensions/UIAlertController+Extension.swift @@ -35,6 +35,8 @@ extension UIAlertController { static func createFolder(serverUrl: String, session: NCSession.Session, markE2ee: Bool = false, sceneIdentifier: String? = nil, completion: ((_ error: NKError) -> Void)? = nil) -> UIAlertController { let alertController = UIAlertController(title: NSLocalizedString("_create_folder_", comment: ""), message: nil, preferredStyle: .alert) let isDirectoryEncrypted = NCUtilityFileSystem().isDirectoryE2EE(session: session, serverUrl: serverUrl) + + alertController.view.backgroundColor = NCBrandColor.shared.appBackgroundColor let okAction = UIAlertAction(title: NSLocalizedString("_save_", comment: ""), style: .default, handler: { _ in guard let fileNameFolder = alertController.textFields?.first?.text else { return } @@ -67,19 +69,28 @@ extension UIAlertController { completion?(error) } #else - let metadataForCreateFolder = NCManageDatabase.shared.createMetadata(fileName: fileNameFolder, - fileNameView: fileNameFolder, - ocId: NSUUID().uuidString, - serverUrl: serverUrl, - url: "", - contentType: "httpd/unix-directory", - directory: true, - session: session, - sceneIdentifier: sceneIdentifier) - metadataForCreateFolder.status = NCGlobal.shared.metadataStatusWaitCreateFolder - metadataForCreateFolder.sessionDate = Date() - NCManageDatabase.shared.addMetadata(metadataForCreateFolder) - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterCreateFolder, userInfo: ["ocId": metadataForCreateFolder.ocId, "serverUrl": metadataForCreateFolder.serverUrl, "account": metadataForCreateFolder.account, "withPush": true, "sceneIdentifier": sceneIdentifier as Any]) + var metadata = tableMetadata() + + if let result = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", session.account, serverUrl, fileNameFolder)) { + metadata = result + } else { + metadata = NCManageDatabase.shared.createMetadata(fileName: fileNameFolder, + fileNameView: fileNameFolder, + ocId: NSUUID().uuidString, + serverUrl: serverUrl, + url: "", + contentType: "httpd/unix-directory", + directory: true, + session: session, + sceneIdentifier: sceneIdentifier) + } + + metadata.status = NCGlobal.shared.metadataStatusWaitCreateFolder + metadata.sessionDate = Date() + + NCManageDatabase.shared.addMetadata(metadata) + + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterCreateFolder, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "withPush": true, "sceneIdentifier": sceneIdentifier as Any]) #endif } }) diff --git a/iOSClient/Extensions/UIColor+Extension.swift b/iOSClient/Extensions/UIColor+Extension.swift index 960db2c1f6..fc86c25ed6 100644 --- a/iOSClient/Extensions/UIColor+Extension.swift +++ b/iOSClient/Extensions/UIColor+Extension.swift @@ -25,6 +25,7 @@ import Foundation import UIKit extension UIColor { + var inverted: UIColor { var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0 self.getRed(&r, green: &g, blue: &b, alpha: &a) diff --git a/iOSClient/Extensions/UIFont+Extension.swift b/iOSClient/Extensions/UIFont+Extension.swift index ede832e2b7..aee237b31d 100644 --- a/iOSClient/Extensions/UIFont+Extension.swift +++ b/iOSClient/Extensions/UIFont+Extension.swift @@ -28,5 +28,5 @@ extension UIFont { static func incosolataMedium(size: CGFloat) -> UIFont { return UIFont(name: "Inconsolata-Medium", size: size)! - } + } } diff --git a/iOSClient/Extensions/UINavigationController+Extension.swift b/iOSClient/Extensions/UINavigationController+Extension.swift index 3f1de55c08..752b5aa380 100644 --- a/iOSClient/Extensions/UINavigationController+Extension.swift +++ b/iOSClient/Extensions/UINavigationController+Extension.swift @@ -31,26 +31,22 @@ extension UINavigationController { return self.visibleViewController!.topMostViewController() } - func setNavigationBarAppearance() { + func setNavigationBarAppearance(backround: UIColor = NCBrandColor.shared.appBackgroundColor) { + navigationBar.tintColor = NCBrandColor.shared.iconImageColor + let standardAppearance = UINavigationBarAppearance() - - standardAppearance.configureWithDefaultBackground() + standardAppearance.configureWithOpaqueBackground() + standardAppearance.backgroundColor = backround standardAppearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: NCBrandColor.shared.textColor] standardAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: NCBrandColor.shared.textColor] + standardAppearance.shadowColor = .clear navigationBar.standardAppearance = standardAppearance - - let scrollEdgeAppearance = UINavigationBarAppearance() - scrollEdgeAppearance.configureWithDefaultBackground() - - scrollEdgeAppearance.backgroundColor = .systemBackground - scrollEdgeAppearance.shadowColor = .clear - scrollEdgeAppearance.shadowImage = UIImage() - - navigationBar.scrollEdgeAppearance = scrollEdgeAppearance - navigationBar.tintColor = NCBrandColor.shared.iconImageColor + navigationBar.scrollEdgeAppearance = standardAppearance } func setGroupAppearance() { + navigationBar.tintColor = NCBrandColor.shared.iconImageColor + let standardAppearance = UINavigationBarAppearance() standardAppearance.configureWithDefaultBackground() @@ -69,9 +65,4 @@ extension UINavigationController { navigationBar.scrollEdgeAppearance = scrollEdgeAppearance navigationBar.tintColor = NCBrandColor.shared.iconImageColor } - - func setMediaAppreance() { - - setNavigationBarHidden(true, animated: false) - } } diff --git a/iOSClient/Extensions/UIView+Extension.swift b/iOSClient/Extensions/UIView+Extension.swift index a49d1300f0..626aace65b 100644 --- a/iOSClient/Extensions/UIView+Extension.swift +++ b/iOSClient/Extensions/UIView+Extension.swift @@ -69,4 +69,8 @@ extension UIView { self.layer.cornerRadius = self.frame.size.width / 2 self.layer.masksToBounds = true } + + var bottomCenter: CGRect { + return CGRect(origin: CGPoint(x: center.x, y: bounds.height), size: CGSizeZero) + } } diff --git a/iOSClient/Extensions/UIView+GridSelection.swift b/iOSClient/Extensions/UIView+GridSelection.swift new file mode 100644 index 0000000000..02444c0859 --- /dev/null +++ b/iOSClient/Extensions/UIView+GridSelection.swift @@ -0,0 +1,23 @@ +// +// UIView+GridSelection.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 20.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation + +extension UIView { + func setBorderForGridViewCell(isSelected: Bool) { + if isSelected { + layer.borderWidth = 2 + layer.borderColor = NCBrandColor.shared.brandElement.cgColor + layer.cornerRadius = 4 + } else { + layer.borderWidth = 0 + layer.borderColor = UIColor.clear.cgColor + layer.cornerRadius = 0 + } + } +} diff --git a/iOSClient/Extensions/UIViewController+Extension.swift b/iOSClient/Extensions/UIViewController+Extension.swift index 98be0e968d..6380c7c476 100644 --- a/iOSClient/Extensions/UIViewController+Extension.swift +++ b/iOSClient/Extensions/UIViewController+Extension.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 02/08/2022. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -62,4 +63,32 @@ extension UIViewController { return false } } + + var mainTabBarController: NCMainTabBarController? { + self.view.window?.rootViewController as? NCMainTabBarController + } + + var sceneIdentifier: String? { + return (self.view.window?.windowScene?.delegate as? SceneDelegate)?.sceneIdentifier + } + + func setNavigationBarLogo() { + let logo = UIImage(resource: .ionosEasyStorageLogo) + .withTintColor(UIColor(resource: .NavigationBar.logoTint)) + let imageView = UIImageView(image: logo) + + let originalSize = logo.size + let multiplier = 0.89 + imageView.translatesAutoresizingMaskIntoConstraints = false + navigationItem.titleView = imageView + + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: originalSize.width * multiplier), + imageView.heightAnchor.constraint(equalToConstant: originalSize.height * multiplier) + ]) + } + + func isCurrentScreenInMainTabBar() -> Bool { + return self.tabBarController is NCMainTabBarController + } } diff --git a/iOSClient/Extensions/View+Design.swift b/iOSClient/Extensions/View+Design.swift new file mode 100644 index 0000000000..ec298fb314 --- /dev/null +++ b/iOSClient/Extensions/View+Design.swift @@ -0,0 +1,37 @@ +// +// View+Design.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 06.01.2025. +// Copyright © 2025 Viseven Europe OÜ. All rights reserved. +// + +import SwiftUI + +extension View { + func applyScrollContentBackground() -> some View { + self.modifier(ScrollContentBackgroundModifier()) + } + + func applyGlobalFormStyle() -> some View { + self + .applyScrollContentBackground() + .background(Color(NCBrandColor.shared.formBackgroundColor)) + } + + func applyGlobalFormSectionStyle() -> some View { + self + .listRowBackground(Color(NCBrandColor.shared.formRowBackgroundColor)) + .listRowSeparatorTint(Color(NCBrandColor.shared.formSeparatorColor)) + } +} + +struct ScrollContentBackgroundModifier: ViewModifier { + func body(content: Content) -> some View { + if #available(iOS 16.0, *) { + content.scrollContentBackground(.hidden) + } else { + content + } + } +} diff --git a/iOSClient/Extensions/View+Extension.swift b/iOSClient/Extensions/View+Extension.swift index 25ed0dfed1..a4de19ecec 100644 --- a/iOSClient/Extensions/View+Extension.swift +++ b/iOSClient/Extensions/View+Extension.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 29/12/22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -24,6 +25,7 @@ import SwiftUI extension View { + func complexModifier(@ViewBuilder _ closure: (Self) -> V) -> some View { closure(self) } diff --git a/iOSClient/Favorites/NCFavorite.storyboard b/iOSClient/Favorites/NCFavorite.storyboard index 730995f7f8..8c56bb2470 100644 --- a/iOSClient/Favorites/NCFavorite.storyboard +++ b/iOSClient/Favorites/NCFavorite.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -31,18 +31,31 @@ + + + + + + + + + + - - + + + + + diff --git a/iOSClient/Favorites/NCFavorite.swift b/iOSClient/Favorites/NCFavorite.swift index f8d19eac51..526b82e6e1 100644 --- a/iOSClient/Favorites/NCFavorite.swift +++ b/iOSClient/Favorites/NCFavorite.swift @@ -33,8 +33,6 @@ class NCFavorite: NCCollectionViewCommon { layoutKey = NCGlobal.shared.layoutViewFavorite enableSearchBar = false headerRichWorkspaceDisable = true - emptyImageName = "star.fill" - emptyImageColors = [NCBrandColor.shared.yellowFavorite] emptyTitle = "_favorite_no_files_" emptyDescription = "_tutorial_favorite_view_" } diff --git a/iOSClient/Favorites/NCFavoriteNavigationController.swift b/iOSClient/Favorites/NCFavoriteNavigationController.swift deleted file mode 100644 index 0ec4b36d8a..0000000000 --- a/iOSClient/Favorites/NCFavoriteNavigationController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: Nextcloud GmbH -// SPDX-FileCopyrightText: 2025 Marino Faggiana -// SPDX-License-Identifier: GPL-3.0-or-later - -import UIKit - -class NCFavoriteNavigationController: NCMainNavigationController { - - // MARK: - Right - - override func createRightMenu() -> UIMenu? { - guard let items = self.createRightMenuActions(), - let collectionViewCommon - else { - return nil - } - - if collectionViewCommon.layoutKey == global.layoutViewFavorite { - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu]) - } else { - let additionalSubmenu = UIMenu(title: "", options: .displayInline, children: [items.showDescription]) - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu, additionalSubmenu]) - } - } -} diff --git a/iOSClient/Files/NCFiles.storyboard b/iOSClient/Files/NCFiles.storyboard index 5795cc6cf5..7f20ca992d 100644 --- a/iOSClient/Files/NCFiles.storyboard +++ b/iOSClient/Files/NCFiles.storyboard @@ -1,9 +1,9 @@ - + - + @@ -16,8 +16,8 @@ - - + + @@ -31,18 +31,31 @@ + + + + + + + - - - - + + + + + + + + + + diff --git a/iOSClient/Files/NCFiles.swift b/iOSClient/Files/NCFiles.swift index f71e2ec744..6667197cf5 100644 --- a/iOSClient/Files/NCFiles.swift +++ b/iOSClient/Files/NCFiles.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 26/09/2020. // Copyright © 2020 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -37,7 +38,6 @@ class NCFiles: NCCollectionViewCommon { titleCurrentFolder = NCBrandOptions.shared.brand layoutKey = NCGlobal.shared.layoutViewFiles - enableSearchBar = true headerRichWorkspaceDisable = false emptyTitle = "_files_no_files_" emptyDescription = "_no_file_pull_down_" @@ -46,6 +46,8 @@ class NCFiles: NCCollectionViewCommon { // MARK: - View Life Cycle override func viewDidLoad() { + enableSearchBar = !isOpenedFromSearchResults() + super.viewDidLoad() if self.serverUrl.isEmpty { @@ -84,7 +86,7 @@ class NCFiles: NCCollectionViewCommon { self.titleCurrentFolder = self.getNavigationTitle() self.navigationItem.title = self.titleCurrentFolder - (self.navigationController as? NCMainNavigationController)?.setNavigationLeftItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationLeftItems() self.dataSource.removeAll() self.reloadDataSource() @@ -338,6 +340,12 @@ class NCFiles: NCCollectionViewCommon { } } } + + private func isOpenedFromSearchResults() -> Bool { + return self.navigationController?.viewControllers.contains(where: { viewController in + return (viewController as? NCCollectionViewCommon)?.isSearchingMode ?? false + }) ?? false + } // MARK: - NCAccountSettingsModelDelegate @@ -353,6 +361,6 @@ class NCFiles: NCCollectionViewCommon { navigationItem.title = self.titleCurrentFolder } - (self.navigationController as? NCMainNavigationController)?.setNavigationLeftItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationLeftItems() } } diff --git a/iOSClient/Files/NCFilesNavigationController.swift b/iOSClient/Files/NCFilesNavigationController.swift deleted file mode 100644 index bda251c3ae..0000000000 --- a/iOSClient/Files/NCFilesNavigationController.swift +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-FileCopyrightText: Nextcloud GmbH -// SPDX-FileCopyrightText: 2025 Marino Faggiana -// SPDX-License-Identifier: GPL-3.0-or-later - -import UIKit -import SwiftUI -import NextcloudKit - -class NCFilesNavigationController: NCMainNavigationController { - override func viewDidLoad() { - super.viewDidLoad() - - NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterReloadAvatar), object: nil, queue: nil) { notification in - DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { - self.collectionViewCommon?.showTip() - } - guard let userInfo = notification.userInfo as NSDictionary?, - let error = userInfo["error"] as? NKError, - error.errorCode != self.global.errorNotModified - else { - return - } - - self.setNavigationLeftItems() - } - } - - // MARK: - Right - - override func createRightMenu() -> UIMenu? { - guard let items = self.createRightMenuActions(), - let collectionViewCommon - else { - return nil - } - - if collectionViewCommon.serverUrl == utilityFileSystem.getHomeServer(session: session) { - let additionalSubmenu = UIMenu(title: "", options: .displayInline, children: [items.personalFilesOnlyAction, items.showDescription, items.showRecommendedFiles]) - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu, additionalSubmenu]) - - } else { - let additionalSubmenu = UIMenu(title: "", options: .displayInline, children: [items.showDescription]) - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu, additionalSubmenu]) - } - } - - // MARK: - Left - - override func setNavigationLeftItems() { - guard let tableAccount = database.getTableAccount(predicate: NSPredicate(format: "account == %@", self.session.account)) - else { - self.collectionViewCommon?.navigationItem.leftBarButtonItems = nil - return - } - let image = utility.loadUserImage(for: tableAccount.user, displayName: tableAccount.displayName, urlBase: tableAccount.urlBase) - - class AccountSwitcherButton: UIButton { - var onMenuOpened: (() -> Void)? - - override func contextMenuInteraction(_ interaction: UIContextMenuInteraction, willDisplayMenuFor configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionAnimating?) { - super.contextMenuInteraction(interaction, willDisplayMenuFor: configuration, animator: animator) - onMenuOpened?() - } - } - - func createLeftMenu() -> UIMenu? { - var childrenAccountSubmenu: [UIMenuElement] = [] - let accounts = database.getAllAccountOrderAlias() - guard !accounts.isEmpty - else { - return nil - } - - let accountActions: [UIAction] = accounts.map { account in - let image = utility.loadUserImage(for: account.user, displayName: account.displayName, urlBase: account.urlBase) - var name: String = "" - var url: String = "" - - if account.alias.isEmpty { - name = account.displayName - url = (URL(string: account.urlBase)?.host ?? "") - } else { - name = account.alias - } - - let action = UIAction(title: name, image: image, state: account.active ? .on : .off) { _ in - if !account.active { - NCAccount().changeAccount(account.account, userProfile: nil, controller: self.controller) { } - self.collectionViewCommon?.setEditMode(false) - } - } - - action.subtitle = url - return action - } - - let addAccountAction = UIAction(title: NSLocalizedString("_add_account_", comment: ""), image: utility.loadImage(named: "person.crop.circle.badge.plus", colors: NCBrandColor.shared.iconImageMultiColors)) { _ in - self.appDelegate.openLogin(selector: self.global.introLogin) - } - - let settingsAccountAction = UIAction(title: NSLocalizedString("_account_settings_", comment: ""), image: utility.loadImage(named: "gear", colors: [NCBrandColor.shared.iconImageColor])) { _ in - let accountSettingsModel = NCAccountSettingsModel(controller: self.controller, delegate: self.collectionViewCommon) - let accountSettingsView = NCAccountSettingsView(model: accountSettingsModel) - let accountSettingsController = UIHostingController(rootView: accountSettingsView) - - self.present(accountSettingsController, animated: true, completion: nil) - } - - if !NCBrandOptions.shared.disable_multiaccount { - childrenAccountSubmenu.append(addAccountAction) - } - childrenAccountSubmenu.append(settingsAccountAction) - - let addAccountSubmenu = UIMenu(title: "", options: .displayInline, children: childrenAccountSubmenu) - let menu = UIMenu(children: accountActions + [addAccountSubmenu]) - - return menu - } - - if self.collectionViewCommon?.navigationItem.leftBarButtonItems == nil { - let accountButton = AccountSwitcherButton(type: .custom) - - accountButton.accessibilityIdentifier = "accountSwitcher" - accountButton.setImage(image, for: .normal) - accountButton.semanticContentAttribute = .forceLeftToRight - accountButton.sizeToFit() - - accountButton.menu = createLeftMenu() - accountButton.showsMenuAsPrimaryAction = true - - accountButton.onMenuOpened = { - self.collectionViewCommon?.dismissTip() - } - - self.collectionViewCommon?.navigationItem.leftItemsSupplementBackButton = true - self.collectionViewCommon?.navigationItem.setLeftBarButtonItems([UIBarButtonItem(customView: accountButton)], animated: true) - - } else { - - let accountButton = self.collectionViewCommon?.navigationItem.leftBarButtonItems?.first?.customView as? UIButton - accountButton?.setImage(image, for: .normal) - accountButton?.menu = createLeftMenu() - } - } -} diff --git a/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/Contents.json b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/Contents.json new file mode 100644 index 0000000000..f2f2fc305c --- /dev/null +++ b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuGroupByAlphabetic.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuGroupByAlphabetic@3x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuGroupByAlphabetic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic.png b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic.png new file mode 100644 index 0000000000000000000000000000000000000000..6021496449c36a53e0f5880dc6d3c5e345d0ea45 GIT binary patch literal 542 zcmV+(0^$9MP)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0ng(wsxYVaJ1TqB$E>D zKz8Op&Ja$B93Y{_5?U#eq$t`Nku;(FUrx3-k%RlG>22Tlz4Luexa+CA=eghKy6^Y8 zo{Rr6*5D;xrM3HSfLz92EW%p6MRg?s=3p2zu@h5p59{-MoVSx5_=W-8L_eOP9hWB7 zZ{ZjeoE#LqT*VB0L1QHVn(+cv7{Y2X)oh%=zDj_c7KFFraoW3x?N}+4HmMwdIzjkc zoIzLG-+;R*e}a~BK(^rurs6B+rTxixkA>KUbLD_M5Hf8?U*_yMx>27RX!sL=rFbV~ zeghqu^HoB|a9&I_ZWJTzFh+3%AB2)dGT-hIC$7U!ACTesGlWlrd~YK`=tP?@ER)w7kBb>g&r|MHQr!Z zvEp^c)X|GAIYBn!cFGUnP_g0*!URtWS=QwQsl_Lp5+eERH|1v4)q*7{AHuDiAcRXV gPWh;CfqyK10qsy@)S5{8tN;K207*qoM6N<$f>;jx{{R30 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x-1.png b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..06b658f763f3a490da69457a74437cd974b732d3 GIT binary patch literal 1135 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuGroupByDate.imageset/Contents.json b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/Contents.json new file mode 100644 index 0000000000..a3852fbd0c --- /dev/null +++ b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuGroupByDate.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuGroupByDate@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuGroupByDate@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate.png b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate.png new file mode 100644 index 0000000000000000000000000000000000000000..336b9c51b4d6f736bb13cd7920b64875eddb1b14 GIT binary patch literal 319 zcmV-F0l@x=P)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0Q5;jK~zYI?bAI<1VIo5;137_{bl*|3E{dFf308Jp3p^z zUBQ>)x3Nx&I*TC1@0d*T6IDDZ?RZ{v&;)^tN%A_P);zWZ)aYBbeR1yj0wGu4~3L^dptwJRc zokl^Wk`Rqvr_%`6T-+%{A&4KvzPrq=-P>QYw{w^IB$L^D^Y*>@?)=)j9E7I;6oFqU zPh!(W+VN{VDM{31trEXRHMrmBOyhTI>`11lLRNta|A#l|$@uw4Em7lFfEBMB$`KRl z5|AW*xsmdqCll5`DpBLtwYTLO38E;q`Xq`zzH!hNKWHcm)bI6a9Eefk`}SA&oKG9O zMvSK0!`4dEt43RoNJrCq5s$i=(>5bwg_wpFVj5P6Y3LTR4IJTpJ^?HOr@$?61#G0y zhs1Bc^T4~r==Eq{1Ae6aRmpc4GoRMi_Bk9q}-<#w~!^VpSkS&V&96G7hL`Io6BLT0ON8!3f%bkO-Oy`vVTggb)6(#BYFHs z#ETs8ApSEk@}>4wH&1vWIpA7+Ph#fFT*xeNFMbz5U(9@&3fTlcaCW#|pesSX%!KSn z+aoZSAWxM{gpA>g#0$>urUR|pZ&=oW9=SgEXg>gslO$-CkSVDLrMMZkqVTG866=E9dD@q9%rnOG@l9zE=8j}8Vp;@IQeYP0MA8xiI*C_SdW&i*H07*qo IM6N<$f+v#&iU0rr literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@3x.png b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe97b2405eada9c9f6edfccf70b548b1a76c1da GIT binary patch literal 925 zcmV;O17iG%P)002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x15!yuK~#90?VL}DjA0zdKeN_~wq1)AF2pKHIf#q1gOZfwV9!o2a==AO z?Bb*p*Cj+5WUi zHBV2wPn?gaECH^pVc-T(CH&m4mncMOC#jNDo@(G>MOZ_(5(=87pfvN`v>S0dyKlgt z&te3cb*OofM4s=!QeT5^qfthUZXFH1$7=^KKxGMtE6bh{`#RU@nC(kRHBVew6D{hm z#cW?nrg@}umOjkl)LrFI182$SszVZaydL6?hTV#ehH+6@0#ufO-jKTEnWg9u!a8`x zpdEZWgq?=xGfPoCyj_sav;62hD=sQafXWh}vIM9s0V+#?$`YWm1gIC2klbZ$0j@f)(Mr~Yb?jT0K0{&Qa#}dw(i>x)kQ{W^1PequljhH^E z22_BRPW`CW&WD8Z*2zWI2KPOwok+k zU~{nj33!uspd!l(`=l(R@s62sGMJ!t;&Nv_@EF(>Jf6Z#Nm8fNWbFl>V+IL;mzdM_ zR~9ecDY6y=SAe^~P_XYluoL)_Rfr<@S#?$c_kiue<5}P|aFL7`(nXiG9C(81rvP36 zhcFBA%qg<05^$Y4QIo(y%tSXAiY)5@ushg(2J8oZ=NG5gvJP9@L%@R;#~%S+rx&N# zvh20tNKnEUNHGgg+^NGL)(?z|LLRpq^)q)Vcou($-GltsX+JO*1e3t)LGRDao$PuA@W zgLDF+KKe0VW>#qbKc~8(R00qEQH&~zk{SO1E;FJs0tNwG00000NkvXXu0mjfv;VK7 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuGroupByFile.imageset/Contents.json b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/Contents.json new file mode 100644 index 0000000000..0b82de579d --- /dev/null +++ b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuGroupByFile.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuGroupByFile@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuGroupByFile@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile.png b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile.png new file mode 100644 index 0000000000000000000000000000000000000000..6b04ce66badfbb922dfd2c55bc3ac78f51c18b6a GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq^kHGbExU!q>+tIX_n~ zF(p4KRj(qq0H}k3!KT6r$jnVGNmQuF&B-gas<2f8tFQvHLBje<3ScEA*|tg%z5xo( z`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNbQbtKhft9{~d3m{Bxv^e;QM$gNrKP35 zfswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}fnFS@8`FRQ;a}$&DOG|8(lt3220mPjp znP~`{@`|C}0(wv%B%^PrXP^%^8>rO=Bx>bfl$i>&8Dzelp$%9iiWt-$8-0-FNREN{ z6f6q#svVb&K0Mg$xO@(&M*>4~si%u$hzDpK4@xX3H*{#ASmi%;L0o(^VLCo!lfj~aPCX~^$ZL@7HG?y|Kx1~ihEC2KbLh* G2~7aG2gXhS literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@2x.png b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b31a4482ad0f4bfbc61bcdd142b1201404b0c6f GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`z)p84^(v;p=0SoS&lF>KRGth^d4b*A_61DO#%1i~?3^L!&&<3m$MGR_>jXub7B*#E} z3Kj)=)sD+XA0BLWTt0`?BY`3L-_yl0B!l(sjDuW<90Z)h1@}At`R^}ubp6Gdhv!J| znyjN68L`J_a-}E#QNx^(EoZ`w`aO@9@o$x6?O<_Zb!rc63P`-7U@}8gL1ad#!dnAv$Ed`xW)+{e6Yi(& z_V0WnmQnFRPU>>C54TA}jKGBKX2EEs!*^`l8E&?mU~G0UNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`z)p84^(v;p=0SoS&lF>KRGth^d4b*A_61DO#%1i~?3^L!&&<3m$MGR_>jXub7B*#E} z3Kj)=)sD+XA0BLWTt0`?BY}Z@#?!?yq=ND7jXy6$Q%5FFGy4y4-XAk%ty>-lW-dc;oSM#rmya`!TvoSmOa__0t zk`e18IJFvU-yJcExH`S=e8kC@cF!J*gV^sQ@)^HwU=Mq{^uBdi)rwh-y$x4+azxgs zB`7C`vP<)>*1FLVarJ=P(N#=lMqz~;E^h2o3MW$YbQ4^ed`l( zGwJ{PxyNI4a?_7Q8EyQ#CL&t9Xu%B8*9@KO4}3Da)S#+j$8h?#2lKQEKNxiKm3bqa z9x-p&(`%Bz*~vfH6cj6-yx+9^hVI#rZuQq4w|TD#M!e}_U|P*x!yHr>*m`r4N+l?Z Nc)I$ztaD0e0sw%PU2XsX literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/Contents.json b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/Contents.json new file mode 100644 index 0000000000..808b6665c3 --- /dev/null +++ b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuOrderByFileName.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuOrderByFileName@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuOrderByFileName@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName.png b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName.png new file mode 100644 index 0000000000000000000000000000000000000000..a35bd067918b698ab496f2b4d4f7dabbde4cbf26 GIT binary patch literal 459 zcmV;+0W|)JP)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0f0$FK~zYI-PF%Z7Eu(&@ej>gL||qF5xHm)wkZ%I7lO;&mW1F+LAQb6 z%59teky^;>LRtix1wlcGZ6YFQ>p~FJg&^e57WWPe^S(2^qa%V39GG+Nz2|$+J;O<~ zsvlk0YO_|09^x3AxLQ}zOF4fEKO*3HU68DD(%Uc>f%5er#ychmxY1aPPed^I*;(Zz=ld7zp#yg=w};05Z8XD zm26@@mtY#*!q6335>ONNDM{Q5tD zR0-Z{oqO{_zgqMl-eOU;!I;qth)jrRYRD6b47p#J_uFxodA%{(*j5X zv%*OKg2~*T1*~)kIVd8-E3nTcz2PD|o#KuxB zG=&yg1yryS6vajmg;atTHX70xLvn(M#0Mf8ydV;zD85K8#mq6Y<6d@WcGf+@eK6e2 z?96|EzrCH^nORsM0L37#a#5BL(1VNRV3TiWkY@Br?()5@5bG4YYU=9fp;W zCZl{r%O3*X*64Q$*oJt&^Z+-lWv0k_)Ife6(Y6d<9uuNYn`IzQ_FxKvh6J5 zBKXG1NFFhVs&?8Cqt9)veZRHLXq?7K2k=s+55TJ!C%Oi#lKC~(GCdP#g_srQzc8=X zMJWpTuQZI*8x14%M#D(G(J)ePWN9P^bOF0@+b3%R_5ho!1)Uv;b%+f^z%2(M7l4y8 zKM3ptzQ^pl6u1X$m*vxDgA>@T5R)u-CyY2ls9k?T&Qqlz+v>;0ecW1cucFC_QSJop z6EtH|kZn4R`cd1H=LoJt#u3Y17ghpe{CnjeA@%{x`WAW2tRIuHtT>|u_=4C*O+qW; zYMSC6#;hBaF|0U%_&!pRzk3s!sImfh5+X7xm2lX$?I5_{)t6X)kRop4Q%xyGajay zVH_XxUBF*0&{0nUZ72edaeTyr*fpF&nYiptnmt7v|B2002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x1fxkrK~#90?VMkTRYe@fKd!d9k_DEaKD3*)l@)=BV1Y;oWf?x2pbtg= z5d2fis`(&DY6yx#`G*pTg0w)%UVKzRu!lsE9u&&Tf4L@$S^m%V_AvL_Idf*ty>sSw z?m2gx4-D*`nKQpH-#zEt`FkM{$b%snu2~6;)$&#WXT8-7GP;2QprWM}MT#mbACfex z0{jBB6{xFp3}42zV1 zsg-YOwm=8k^A50;xEUX5<*#Vvmr(DsGBE#*S*^Q8T7!b=rY`tOHU38vq`W7UO|!)FH-0 zz&~2!Pg?4>p=KSTbyrJ@@kGR|w88J|TKP}Fbzr<9bpiXe>t92SCkH)kz$xtikw(+Y z%@%GU*T?Y1lmISix0E1Hay9F#lmIU2Z(xj+C=W!;GIaw+0lxuvNAlJH2O4N^9Pqi8 zw**-4DohxgF{m>t6!zGbOLix z)82cLpIn>-yo8$5+X3|3=5wY44+{moirO70$t2X?irTz>1y}~Gv($H;&*}x%^55j; z1>jkmn4QS1NLPR}wjdttwZvL#sqZqaywp`K7TO_54fH34BNLC|{HwU}N>~dhe|FNZ(_6 z9`&9SVF>Uw$y;|9`7Me(3Y;^c|$j|J9JANC!OnOJQIa+GYV*)G&GYyeo4 zQvNpeje0^-@Ek+HKGdFvX7CvG4a-t?uG+R36H)!BXpmdLG|3)5C^0TJCCqY!%^QxdZ0~`K{C*d>eu-g<=P9V%XUMcgEZkFQ3G_L&TP9Hb%q=c zIxI5;`V|;09ms<&+ziXbs2RX*EzmUtJ8Xh<(wJeV$-$_{NuCfJK%HhSE1kg4q#GqQ zyK;w7z>kJtA4mtv0h?jD7n+a07*qoM6N<$f)e3OxBvhE literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/Contents.json b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/Contents.json new file mode 100644 index 0000000000..585e3e21f4 --- /dev/null +++ b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuOrdeyByDate.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuOrdeyByDate@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuOrdeyByDate@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate.png b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate.png new file mode 100644 index 0000000000000000000000000000000000000000..26cc076d0b87601a5aadfe6eb69486951884ad40 GIT binary patch literal 464 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/Contents.json b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/Contents.json new file mode 100644 index 0000000000..58efb22821 --- /dev/null +++ b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuOrdinamentoAscendente.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuOrdinamentoAscendente@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuOrdinamentoAscendente@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente.png b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente.png new file mode 100644 index 0000000000000000000000000000000000000000..2314f6244adcaccc8179f9d78c06312ecbccb5c5 GIT binary patch literal 343 zcmV-d0jU0oP)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0Srk*K~zYI?bR_(!$1%~(HCLSrl6$f3ht?BX`ta0T!scj0R?aXprJ?= zQNtN%kPwKHh|uhajbjrVCtbd@l6Q7@X2)N$S<`_5_OX-ZPqYV)7O(!S8QrrxB zo*!ZpuW24#MBXiYSHE3NG`V@kHumsXDN^DdFZ}Ifk(<-B{+^P?{xZd;IEzl2oCG7> z)x-;2;xJugnBwt#jiUv*Td{!)^WER1OU(UG+AzU6-m+NU5x*TwVnZ7z)p1-?yuei& pMZVD1NzNxuDxKto literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@2x.png b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..075545e1aeb0d22d142125d2c295b2d252097ae6 GIT binary patch literal 442 zcmV;r0Y(0aP)k zpeVT0ZC%*WkWOBcOwwfFeUQy$QvR>)yq^{nMNyPOoB*d0X)3sSq;#)nk4zdBsf~~xslHc2dSsiuqCFD&Y2@w|?U6}SQe?*O z)H?=tBF;C!A+VP+R16pVfB$cQ*4mezkruc%_Rb-`N5=NblXd>ql5vT&t9#A82N>5Q zV|wLk;Jhg_Br+ti1TI1TUn{3b2h0T-`?^bFzIv_b9!b$Fl8n!_KZzRXfIGt9xO-r? zKwgnhnJOiEd}XSZ=-DJAN~G!$X)W;Y7}o&U_+Y2(5owJX&0f002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x0>Mc{K~#90?V3Mp6hRn=pZF)BegYeXGxz}l>1?#Huv4-2ODLRe8m+8M zWu;$0C0bis*l8e*kOL7@NmNLY#dRRLCc^$Y7Typf=2i^iZIf^Qo`2cqfQ^CM)Sd-%Px{s1>) zs~!l~oJ82wa0Rm(UUBsM4!i><;xfy?70i<3dVJ@KNfOqX1cfXN8kPVJOMr$Yz-}GL z8@i~)8PyF1s2k=+!xErj3DB?v#JZu2xpl@^H>|-Ki*m!#ov|o4bWw^k7UhO6=FS;o z-LM8{EW!<4l;(`;h62s9piz5|5vaHQ+ZV ztJ(qZsHMMjHGGUYi)Q=n0js`eN>h=_89xAb8m>P9o;6&Tyx_;cQ^!4fbHhHJal2*w zaYKLKCu`i&cMJM;!@ivHb;tO#f%$~h7St5;-pU@-l=!o$moZ;u-@v-U>I!P-_@1IO zrKwtqv#BHe18WP*C#aFVX~I)lul3T*C!vcv|qFhN;D16#PDEYiTdg39fN61IU&;4tv-eOF1*s+Zdh zCG9wRP!)8kh|%C@2`l4RbzO78_V_ zP>|mZC2fP000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0SQS&K~zYI?bRVp#6T3r@gJeVu0Z0sLa#t@7%-dy!%;901c-$L00yy& zpy3P{5&}U&C}L-lZnrHnT|n)ZOwzt|-uGVrc{41Pp%v_4Gh@#uPVtgs^nogK9dzWn z#a%NPJ1H}YddHFWPO4hoKU3^{H(-`Y?p(AP m%^5VAq_XHUVtRWnHB8^gKxQDg2m|&20000<-xQaH;(^?&3qf3pSMdVg!L_$gaN#UGfGY(Z zP!!zhc3e1hN^Ji8bdn~8|Dc`D!h7M^bb{lF{7zlPG}(xFbBs_rPw3 z{fdOj6e-c7l_^@HWs{63;p<53ZfNlx02^OysUs=BHzZsc)#)U4B$o)RWz002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x0>Mc{K~#90?V3Mp6hRn=pJ)`+Phg{P20wscXQPFMor<+zLg8#}Vr8Y3 zm3{%0nA+OHP6KI#1Vl_F(ZCf+&SGylJ$H8Joq2a=)_Wfq4)%um^RTxwzncZaFbu;m z48t&n!^-UQGH??(mvJnMYy%s>QSO2K$z5OqObaaUfRl=IJssP?9{HuTm3y%h1kM64 zfCJzM@C-N;(ok+0UFC7eq!xJI(C*WahQ4Zz-kH98ytk9lI%!=cBeB}Y7BI|_0K$ZrRCBS3}Fj)dtXP>FE;RJXC z?DX7EZ=}wK2f&RaGn=Eb&w@PJ@N>vOBT(Cv1{scIO7#!GVZ#2J5bv}0;>RLpi*%w? zNu3RU0oRkvY|bFF;aA`-u-kJ#i&!=kVA(J=CQE?H5@50f^py<9C2D8Zr^-8}pL86E7~wChO_qwb z^AhEo4TpFR=(|daRz2TrSkgJ5FJ1evzxGi+NU~um=YSGi!o;FzXr!&A&VX7h3JVei zvTT?m18PwV3l;_b*|4N@z)(g+i1N*bC1gOuFbu;m48t%C0lxwJyG*Eib#`+A0000< KMNUMnLSTa8uVat^ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/WiFiSmall.imageset/Contents.json b/iOSClient/Images.xcassets/WiFiSmall.imageset/Contents.json new file mode 100644 index 0000000000..0d044c1a4c --- /dev/null +++ b/iOSClient/Images.xcassets/WiFiSmall.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "WiFiSmall.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "WiFiSmall@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "WiFiSmall@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall.png b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc239ccf923ebfee891ce29ca1475cb579642d9 GIT binary patch literal 1565 zcmV+&2IBdNP)4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%R z%Sl8*R45g-P|s@wBA}vifZ^l_|(iF_mfn|Pu^S$p|fd3p?__J?h zsNv1!Aeb6wp4Wia0l{N}OW9sPd#oU)9=+>!57*o6_K*JEAA(Aya^c+g#9fWtAX1J} z{ETEDV&1iBddo@El#CgBe+2wwJKp^2x^6xQf+YfV6G0V4Is?J3QuMad>8y$T zr?pz`wKnGd@v)NiX*l(IeF;!MLKdkx?!zd5dYuL5M<4C80L1O=+F(r8Drr#AYTKK zK-PY+S}!M2^v(0U^V!eqlMfX12a=5+gs&veiurXR5DJ(Vv7fg#qXn6#Ls)Qzo0B>P zwhfWF-)gn?vYG3a^2QV{N_pn^1V1`?zJJH}{l;hn{8PaIua!y$&4}VRbqlmpk?`Sz P00000NkvXXu0mjfi}?yB literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@2x.png b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..485b92a256a1e6b73cd6a0237beb8ae4e5cb89eb GIT binary patch literal 1451 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 D7UU6Q literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/actionSheetModify.imageset/Contents.json b/iOSClient/Images.xcassets/actionSheetModify.imageset/Contents.json new file mode 100644 index 0000000000..da6627652c --- /dev/null +++ b/iOSClient/Images.xcassets/actionSheetModify.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "actionSheetModify.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "actionSheetModify@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "actionSheetModify@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify.png b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify.png new file mode 100644 index 0000000000000000000000000000000000000000..d8967d1de6ced97b98eaebb8c76266540d55321c GIT binary patch literal 441 zcmV;q0Y?6bP)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0d7e|K~zYI?bW|817RG;@%Q(^fI*o33zdk-wRWLF4Mv;9uZfr>qSqd? z#AuKZR)fmLWTjVw!M|YCO&G-UHPkgtQ|hi4lh1O?bDvk9=lNa^{veWgW1&2PG3TJe zsBYk<&rIToF*(o_Fo?(@KzCy0-kk%oj~$=F1pOe}AWz95-kk%cgtA0IECt=6tMbB! zy@K#gyr2pUMJ`v0h`p`@uH#b-W)R&ZpPmetg*zD{??fL0uRI3EN9;2BjL%+W8r5Ua z`Nn1OkIO5Mf%u4BVK-Cy0#3o^$Y+AarSYaK0uT>r28#FDI-n-o>Xm3nD?sc?eFuWu z84?1jt1W>a@;jsvaMPDjfZrh<0_~B5+g^|xl=T`=nM3TiQ}kVa{!U(dQeX!#EKm$U z^a$)+6req#cC_|n5n&eWR8*inV)Yp#YlwNE@BNXjiMOagd&Es^k~@;|MAq|<~K jU&RYFfxc=29r5xBo?NXDOElCt00000NkvXXu0mjfQ)R|g literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@2x.png b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..17b56ef130d304f8af1dc277605eb47058e952a3 GIT binary patch literal 831 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ᠥb{DKBfu~o zZ=63T6J)Fw;H(!RQjg*X%0WZe)t3Yt*4-h!Bc-T!0A&H_AW-{hU$+3EiHl(S5Glkl z%>=9G_J;IM_^{fK*oSo1J$5a=3pU;cv;$29d=tANy(6XAj8VkirL*qcfdQN9iQYhY zhV@+8bd-c7XD|W!;!qBDDm31Pa2w}WEy0F$1CSgt3$B2kSQ*{XK6+wh`^E))VUz@t z-3nj`PiLWY0v)a$TBjVL9qW|4+mUuey9iHb8CDXFAk%66BF!1XnldzJ$Tc=lGleq4 z%5sAjXhQ6OduKqfat-*JRxE%JLDg?ixrFi|t)x)&GNI@ay<>H0Qif5g4N#0V^XcW- zEFcfn6KTcUwRuE}43H1mOX+oXK;@rFfEE}axr>fNKYtVgiw20JPVuoothWf|yFrPe zTs;;D_8Ow&225mQT_3$v{0I?4UhW`Jo?O>QsL)sy!a1DN?@jWeX$WkeYocS~2ybvq z+?^tifNp}7YumPPb`<3`0blq(JwQ+NKFTdBW@~9_aklPBFjj(bMiK7OS^M_zfR8s( z&r=L_Jn(%3Fk6u7Ign;lo^M>ZLpm@|fTm3Vq`L9JSP356kCFgsCr~rxT0AsXwK0QS zj5Kctq=rCpMv~o%Xcx*1LIh+OyEYGbi?CdX$t*^wN7WCU2fC@4eML))v$I@k$UoTU zOgz7?W3>sWLZk?^5M&W_9+*TKKy!vR&Ol221rmb>W(lwgI{*Lx07*qoM6N<$f+bs1 A9smFU literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@2x.png b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb5f15a348cebde89e11882bfd198a309967e50 GIT binary patch literal 1729 zcmV;y20r~ zascJOpgU1(D|Yl?5auPT(RO<&mbC=cJAtwcwRD55#|*Ua^t>-KbtSVv?9R)vv=-$y z!1%36U>hQFT=^8kenS1<^7Hhg02Cyr@^hpZYj76IB_Q*FYk?wvyo+cXDl4gr?V8v? zp6MvYkyXGFe{3JnhL{$d=oV~o$EB~e)uMam0*ov{sRF`)g1$;9|4C}+d^c8AV-I9S z=k18D0nP+|0{(%ef8(i&Z^q^PNZ6ev7#;(C5QqRjpwzHD);5;mrw+v4osaZ3Bh>gq z-oOkzoXzt*Dh-MAQJR69y#{@e;?SeiL?wU$p{{~`du zec~?QC147$nSy~^`OEwxBXu7+5PNGOGUYvl3XrcrZ_4B)%!>M*e*||EPy)0Q30LyO zWk=I>HR&3$cjsfKZ1jR)AENV5dk_G1b3ef~^MHN8RrK|5WNlYox~}O1k=|zD29U21 zDp?jgFmc|V0(We^(A|}0@1@_$ic#oH0QJZS^l-up4{sOQM zm9(?Mq{6bE1Nu=}L}UCsNCjf7YF}={zVhq947%>~h^a(OC9eB?V0xd5{tt8mV4k5v0IA{K3ie)8z z=}g1%ywe%Ix$-At3a9<(OVff`HcSExUIq~Of8nS-CnLQ_e&b6=4BkftEHfi#4rPkt zO!uW81G?Y;b78Lh$rx8J@}+$Sx69y~ z)I#xET3fB$c{NV#ts&qV0Fyv+JWAnc{~CpnV$I1mPD zOO@`1E>W8BiYyP(kT^dOg9c42XM?@t0)+bkg~8(~rW1kG#dd+d3Pk++MD~dD^6}(@ zI4=jH(^#v4Fv2U;UHzZqriOKDO3Yx8J-`gm8tN+k6^QYmsPB9L^q)YIP+s}a(%kUX zZ*A-_%KhFSdBLksOcELsQBW_Xqw^W4iE`10@{Ju z7&ngHK4;>*9f8I~6m{ajER-EYB2^<5MMvHtK5^MmBH>EVw}BFjiPO*#OqPBu)F2~SdV2_o*v4I zL>0msU^?E3hnKLd=e&e+0NC5lMe-i^KXzdtiRyjnUhH&??+8cJ$7eBkY!%4e{@8xd z4G1li9o+1tF~>n`tHqwuO3-SQML+?d2(RE+OR=Nhk5yHMhiW=5#iACKDo(s-Js=+- zx*h1ou|6l?`Ho|SUXee)cN)j6vk><}jF$VGqHFM$;s6dv8w@rL{bEmSASoK-=b@o$ zlskY+GSspgSdVM1%jWD>c7Y7V?)W`M{DWtd0j0oi8Gi8Wd*A@*9*~c4b&Fp^$(mmP XTaOS002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x3J6I=K~#90?VNvbRMi#7Kj-cS$S+&9ing61HVur_V#$(?*v>TIv=v(G zI2Ah<{LxNL#gVp5RRj|r35sA#TdOkZ4{^ZJ8XY?RDxDUHGbJIL#2={CCisIo9hFhg zk^D5f@AQwiyYD4rLw;=DF2wK5&b)i>z2}~MdGB)Xx#wIV6R3$y2Q5LR7-1$#5pX7u z2jl~%03QLJ@!xyE0iX@lHdLR(y6~XiW{WSQY}ivsZ_amt1;BjZoHS^C6Ja+tyU?zu zu*y5qpmRu!A6b?f0+EYRmV#W4^VWozpJ3rpa9ibgD|HIHlU$hge>?5qEQ^*PCW0Qy4pGPSMdj=x2fQx{_6uR3`)^k?i zVJbp>>HO2uN0y}qY56gttAS~QjPxRC9YQ_P?pCbw=;+6)4-(7`Vat4AF)(|ORtHhm zp`}~W^`@nVENkx^L^dN*I-uq-$QFohrE1>GX&GxUR5zXv!K*>915WQ(r!*mE8C7#% z80#=&BkP_6llkDtdW7Xbz*F-MBEKfqS?kBdn}k(gfXV$S$O_Zf4xe+jw@$o15;AY4gh_|4I%9UWOU zdoM-JR^U?}=~LMD@=UCMQlcg@9p(4HB9HV#gr!u5pB|~Yk(0GHat*?tfM8tGgXl^s z%YHXvU4EfDay76Scli=S zA9UO6P9{e$=hm+s9ih3I$KCt#>F%im7RDut@)OpC|9rfz$0y5~%(vq%4gSW|z-8%P z9s7#f)*KGSo&>%fmqbx6V@>#(p}GxC*1Cpi*um$4(*RIyCNFnBH_z@&gUOkN)tZOI z{^|K7KSY=_)Uv{)RCdpS$;5(>lOPJ(QTvjUf+zqh)P)AV2fP-Sd>UK-g0+8AsxGO? za#rSv1!oVi7;D~BTXutM)++gAd;0Em=gI`2r;eDKfE+B*khnn})6T0vFWAJT1W z)}W^8MpW*NmttV%4z`y(_RX@?AhH>ELVxO{CJLak>^{&P@lpWn`>^yFZh`{^j+-Uv zJ?O%=mye^F{ZSKHjo00xyhv5}PG82B;7w@k6<`W*AriR;*y3%{pS{}FoVY(KfjfNN z>!~h5xgz;Pm-;q#W$1O34au@dC02dEm#IHl??#u9bll0?*j<~(-N7iFMZcWTFS6LzjKP zq`v!s_!3EGA}!^KDwix}spt6tUp<@&h`kK7!u`n&zT4pJcOP_Z(yNn?K-?Xh_YP11 zfUUE!%3ku*#;k(Xd;vxi>#R=fuCuVpJDfMm!iXo+V(-8iO`;;~|F)2|TuhDWlCs_?BDv85u^M|GqT_$C0FQxXK3;kJ-h zGGbVAcvIs1<0S=|bz3X@kpx*38^A-Bwq?euEQP_thdsk!^Ch=Z+B0BM7Q=SQQYkiw zCy+wzcQRp8_9E!=A)IdT#yQ2ziFdR$o{05&_>e+_yK)CQ{ofB}Gjj2erG*A>l*xJT zb^C8o7GwI`U7k{&0bGLqeMasv9VRl~{H!+)w#(qIQi1$}f$b+Wy1j9$a@2t5yA0T= zf?6jg0+T&_=uv}mI9V2R_8?s*FrqFW%3*`yKvEF%uI4`hYGx*%McWPZU()+;Q8vT7 zZ#HcPTmR$M$*c@ml*Q2V+(&IQsCxZZ7Y#gEoUo{E%>hq@paz~Z@e}7nOj04i+|VFh zCm!C5hH-Z{2e3kKIc{aabtO9~9-lx>xm$2t%nn&LyFASn`)O0wLb<|y)}4?bD{sn^ zxGVYDSWRE?+qSHN)qDZy`SDT*+O-1`WZgWw6XCDP#>V&;y^@VE-sl~DJaIbjiK5Ym zJkLL3!=8z`^|6{x0j^7yMYbg#U9w`~owy6s)94LW_+(yo!I)*hsqxaQ#7dt{RwWx* zVxxF64P*sY{S<#J%o13wd7!^YmQ~k#6Fd6{vz--q7&sU&o$aKdO&}QiR-9V^0Ny~m zAL&=!uW?1FuYZ1yu8N;n`vm(S@PYfY5BfH=)mQ|2OR}s~4?J)_HniJPgETiFl*J{_ zP!;~pxEh)bsE+&{_?A=91}ei}NBRfT4HDWdHWIrYNU*wynr8ol%KSui^Kz0z5e2z% zAW@Ji!=h^5%c#1^ma3bae7%zp)lDU!8$FUusq!aNr=w`$Dxf7^ngVtmcScT6+5SYt zozI^EQU^>1oJ{?xf!k9xPfeCJ>tpP|_eln$Qbd#;SoJ5zp@!9(N3`z=;M}<60}NLU zl^U3uEC4I?7Q!{S^VeKVZe85hbK;`5H3t*h4qO$l1aG1;^!liDjt8v9B23_3-1!OM2x^uLXO0?(G2BJ7_Z&nX9dNTz55isK$2PKJ zUgjcltkyhdQ>?e(}p3dK<{h6s@1A-mNJO79lKu!Uo zpTkHoHZu@r;hYqw+IGE)>Uy;Mk#r|OjPGrd(o!DJ*Snn5e_T3n6k$8Cm00PsC(dn> zgW>Ld`E>U#LhOrCnGbw14O(9V*^TN>H1G^osO$J$#s+`L8i;ib)6kp}uxFqY$8W;@ z3`hZJ0m&P1r317B<$Xlk!L%W?6Em$?p||`t`~UF;OdwFM1?B(%002ovPDHLkV1n{R B6662? literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/Contents.json b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/Contents.json new file mode 100644 index 0000000000..5c7837e197 --- /dev/null +++ b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "activityTypeInfoServer.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "activityTypeInfoServer@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "activityTypeInfoServer@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer.png b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer.png new file mode 100644 index 0000000000000000000000000000000000000000..72e74ae5b89c63e5f192d8ac531f4273bda63c72 GIT binary patch literal 1897 zcmY*ad05if8va>M5{~1(4+^+WC5u=$2~33)ueoNWc`Zpr5fB7SQKu}IaNM^F^_u%q zGG)_DqanFaS{bI!nB};n=2GdTNvSzHP~Gmm=XuWgzVn{h#+2n+y# znj4AeE02bX3EC!KC3C4E@}L~<1=BLgeX6)+MG{Yc@`@Nj<*ZzzGu4ukGS*db7G z2QU;0#j!&vSYM*c=j-wv9v;Evvam>GY-}td7K322!;xrvdwV3x7HMm1BWKufcu`z( zoJ|zR?32iUbckV`5H^*?r81+S3SII^W(*e(hbxS}j8AoPsg(aZMR7j2C2tU^I6jdz)k~YV}F# zQ*NXVEch0wB#z&=zDKlZvQV~zwG*xV%elA2))w%K{O6vgp#H&yGR$cVhcaJT@LC`^ zv+*HubN^1(=ImjUX9ps>+uOEuPw0{QGEv9APUmTqI{Lh*FZ;RG!pl3y+OxRM=D8lL8Xp5HA*sLY6yQ_&=#s2>I2ELsmo3+Rfme6 z5LUPE#c!e~aI+?jHMcH1@k^%MU`_P$$C?(J{Q9H|Yt4pyY`HgBQ=CmCZ1XfVWSC3Y zPsTC1OR7dsvxxIjQRPB`m!nRrGt;!@h87kjJ%QAUIq`zG3@@sM$+nq|@}+5J2zcJD z2zai_ccQx>m8PyB0?lps?id=1OC^n@SzRrk+GZqjsTmm>WPzR9K*^vHf^qi;7;(8W z!#dj>vsGNF^)ws~lIp8l%-@%Zm`sKoEB@*0G!OCc{wI zHDK4p`g!sLm*;rLRxSjRtiDJY>|1gz4qjT}3S0eQJ9)19YC${CFaq?xpNApKK%qC| z<2LL&62$?%Vgo}S;V7OPjDP>uqBcQT{a3oQ<#eY(<2UGj=0JBf#@U$RQIaJ^EglMD z(A>aA852M4!8SkW-}h3mF}q`3Ak6n^40hD3H44kr{{3oWuAjap#a$TPain2rZ}`#c z&G&6n?2UzFogJoGxmKje{9QM?%Gt@&>peDCMb~=inpYlbY`~SROzct+Dys+@UFDGQ zH?5Z|zk?-gPp|Cw&g(zqf#&Bd9_pN-O$S)?2TFg5HfcZ9f)aq^snc!JKw~CKm2Ojy z;i7`#fBo$W_2N+ebU%OjX|m;O>UzwaZ=Z$bwQuha=uVr18l(SVg~_Ps0C&_qcB|`o z?|)N#ZJ;O&Qnu&}l;txqnofF-yLeouWw|`L+_gm}WkkLi<=YrPC{lj=ctV zovIJy6Kkr5c`sk2|2van!QGIB(O5&xh0D5)RY5NIk}N%E1P-qpsAnH5Ts$+c1}N1AUM(On$`v&eH}B6_hIT+4mEJu%-{I zcZ7NM`PoCVZhknGU3&LO)L^k!tnvUmxc9afZL2EE;Z)oCG_q~$<(`(_Z+jCeV3)DY z8rJa{3i zXlisSbS-+}UGCEmn8o%!f@jyJv{m%xC*Aosk`K5$$?304NO+!J@u)QX?Bofv_?fTg zjv@n>l)M5B*L0m_Aa(&E@f7lsUg0A>ZNiJ(0lRZ$HO0Kr_i&L|yZu>{$V6CB^_X9K zaIwvgH}#g8cdXOoFkvfa#VVPak+`9LyVKdER-)N`T^*uUbxh<{9 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@2x.png b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc1443c193e3dd6ec729c5bb9ed0aef6a2fa84e GIT binary patch literal 2441 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 Hu0mjfJVT$s literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@3x.png b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a48d98b9f40f0fc6249f83337d0384114c27306f GIT binary patch literal 7301 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 Y0~@*D;FLSG)Bpeg07*qoM6N<$f&(=WfdBvi literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c151a7275e1c6fa9942ce297390a5510f2b9ce GIT binary patch literal 750 zcmVP000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0;5SpK~zYI#nw+~TvZgu@y~r76R@Jr*p>ZHU3H^^+SJzCl9=LP1-mGM z=%VzGAa1%!MKHTsQq+YjyU>Lo1WT1dNajrlQmvu55L{SWW2?knn_$7(X~NttCVyr! zGnq*RJ-he2=ls6+ym#MukN+S-TUn`xuv4&BSyp0N^e4Xcg1`P9B()oT=)(8-LohAM zV&j}XE;^ytH!Fh-%UR`9Y!&qT$65Q_s>?g)ex3FU`tg&JgI+S-sxyW?CUsfCNk6!+ zbpZx-NDWB+V$_yafSlB2MMv5)Um8V6r7jusaPy?p*9uPF6JQZ^O6p8Az;3B4ZQr6r z)2&i(FI-n{-GmXl=B1=6y$|ns%1qmUeu=Wvg3^L^z#UP)psyBEc@MhW_SK5I*x@a~ zjBclE^pZ1zXXl^Id?!0G-td?^KQHEa9a5?xfbeGw9@6J1+T7s1CkrPq}v z>sLkVt2@bIsxGnUX(Ki_&|kx&GCpj&iRcC%sfOGTD#DU@QsTT}k1r@=)`$j_9kR!4 zQ%JBzbbS$08Fm}%5_^1tV^%55%`s+uB>GIRADaRyo|_~lD?H{;*YC>K+UxJSf`V?r z7x)}`8Bf^bc2mHZ2h5r@V}rb#l};+-dR*{I!=hfJ*o#*MhnEFZy4^3jAn)eV-99h% zt3e&h>~NWxG#5iUr6v?T*Ek_{R%)Q7(Q=XcK)If$1P9la+&!JBwd#-VDt z{-ZT&i?SiXIaA(oz@3)ngF0lrkGvqS$8XikNnJs=2^rf&n`Qm1;B_NbH#8ryTIvm1 zmqhDjbS(um?xfaam&9>w7hM!w6HJM6qD_KlL>DAZ=yAT8O?!VULmt#=hq85|oM1{~ gQptDq$Mk=SyUl{bY`@y;^Z)<=07*qoM6N<$f`1BSa{vGU literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess@3x.png b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfba6c4fd6b166225b80359f87ec493ad86f6eb GIT binary patch literal 2712 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 R{6Ph71A&CLxA$h!{|gw1TDbrK literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/lock_open.imageset/Contents.json b/iOSClient/Images.xcassets/backward.imageset/Contents.json similarity index 78% rename from iOSClient/Images.xcassets/lock_open.imageset/Contents.json rename to iOSClient/Images.xcassets/backward.imageset/Contents.json index d6fb0c7a01..3940e5e48a 100644 --- a/iOSClient/Images.xcassets/lock_open.imageset/Contents.json +++ b/iOSClient/Images.xcassets/backward.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "lock-open-variant-outline.svg", + "filename" : "backward.svg", "idiom" : "universal" } ], diff --git a/iOSClient/Images.xcassets/backward.imageset/backward.svg b/iOSClient/Images.xcassets/backward.imageset/backward.svg new file mode 100644 index 0000000000..9b8d324edb --- /dev/null +++ b/iOSClient/Images.xcassets/backward.imageset/backward.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/Contents.json b/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/Contents.json new file mode 100644 index 0000000000..a96275cf93 --- /dev/null +++ b/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "sortCreatedDate.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/sortCreatedDate.pdf b/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/sortCreatedDate.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ddebfd8cebf4690adcdec84cdf30fe8c3a90ebf1 GIT binary patch literal 1065 zcmaJ=O=uHA6viJA*HXc|@IcZZwL7!fY_hQ>)FjQ1ZQ78uT5W5YZYJs4%}(4*B&p~@ z!5-9$UIjh*a}p8Ji%`^y;6?Nx^-y~$iXaxDC$-MTw1HY27IyaS_uhQp``&oc(O8!v z`y|i1uV0oV1u(FwGg40via3;T=0Hb^&6<`)kS1do??@5Dv^gtJcSF+V)B+KJp)8Do zf+rPiQXB7tqotBXPtd7;lOs(H$f{o?_9uo@1BbyfXDGy}F~bBf%&N8Q@i=D}D|7ENXCv*+`dF!5~ZW#4#IXJ0+BMSgvAF!81E!5+vk6QODv( zoxjQKDB%=3qDQ>gi*W$!Soi5TcnITm@d#Xs<^B%|g(Pa{+^(q2?id6V358RD2ANYN zRuklFf?}q{1v3=01cxX!SdL0)fZ7E<4T?_x)t{e#->+WSu}6|icecIMD*ENCwPQCDm)dT&OnzJ_K7C}xPi}v( zSZIAdcPi0xv8_GuZ2tAyF6)4H(AC>u)==(kiW;t!D4;Yc2rU^}W);VvWe@`+oG`MK z!&uz}G)$`;P_ih1;l?}Ccqb<$)K}&4EO)&Tsc{wD-ey8#2}fwoBw{pR42z)8D+W&u z2KDAnq(_(-KAV@pZFfdOS?*K}o+eH`h{asgx1jwkyY8U-*_iL9j>VsqEgelu5w zF;{M8qUouBb6SLOVzGjIOhKsMbV}8sc?m;6!W#?xnx<-yhmDvblH3LMMoiPh{o52% z@fI;v{|6V?B3H+P_<`cnJO=;( literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/Contents.json b/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/Contents.json new file mode 100644 index 0000000000..935c5b1a59 --- /dev/null +++ b/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "sortUploadDate.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/sortUploadDate.pdf b/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/sortUploadDate.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a500b1a4788bec3622cfe6952ba5359688b209b GIT binary patch literal 1060 zcmaJ=TSyd97=|tc)8)bHAu{+2ETx)rW@l%2Oj*iZHPKbs(F#`4arUfE&d#yfBdr!; zkCiXd1qG!fC@3f-q68r@dXb2rAYTf)Kt%M=O9esn&$hW?(P3cDeDid7Ka1j$;x{rqEFyH!a&0Jlj_V4X$7gAOI}} z907%PDO#7-Q2_@A1{`*n^)%XoXlhtiLr82q*cNZv1CHI#pq^R%90O~3Zpb)PPgGge zWeuWz9?vkMQ<=(Yr5=`*kOs95vxLW8qRT2OFwC^+*@a^(B+}~f)S$&sr_pbl1nodZ zr}!hU-{x-26b#B^`vNpTX_)F%59-0dZc2CIgK=@5`hQ3yA~84RXGJY$$1*{YNKG6_ zGxsv4Qw$0ggX(NYpfXbDpoSQ;c#27+iMhR^4-{38L?A0L%NZ#***;peVTH0TcH;89 zR@_w>Bi_3~U$ zP0qfUXx@4%_AoxT{?_JuKa9!6ZKJpOjfI7^pV&Lmx$?=TH)H!pf)(RCPG$Ay$XI>6A@fk43@G@>r Kq_VQwmb#x#i#>h- literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/Contents.json b/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/Contents.json new file mode 100644 index 0000000000..11689d266c --- /dev/null +++ b/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "sortModifiedDate.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/sortModifiedDate.pdf b/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/sortModifiedDate.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6736d87ad5c5b45d4ee48da981312a5ec1cdca5c GIT binary patch literal 1061 zcmaJ=QAiX)7=Dcv@*(P>2!6=x6l-Vp_V#YC>?-f{I&@QR%?cG+_r|-;y&c&d62c*jqgcgiI4VWzF%I&N$7wYC|B!fGAWqh=id?CVX@Df4Mh(zu z>J|*U5)`fkHCs00nW1Kz=a3{O%@P5%5+}#p@r&16kJ^lIV5d*{-=rQw;t z^zVybmQxSLUwqEF-bDTDc<=lHX~x%D&Z?|BR1wrMGDrZm8#%5cLp(a zgDzigrl;a(WGgLUFvF%f|C$_EzvY&qOZo*2Q2}obh$xDzKtF6^5-0fsoJ~v#N4H@z z=I?P!oGh!`u;@RyD&|5qxXd*yo4Ee7)~!*(vqKq58Ti_G0n<)D1^?-D69kVLE-R@} M!!aQcXliTz1D?M=WB>pF literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/circle.imageset/Contents.json b/iOSClient/Images.xcassets/circle.imageset/Contents.json new file mode 100644 index 0000000000..4db51fb5a6 --- /dev/null +++ b/iOSClient/Images.xcassets/circle.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "checkedNo.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/circle.imageset/checkedNo.pdf b/iOSClient/Images.xcassets/circle.imageset/checkedNo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d9d96bea858b1ab0f0c59a20253c66b965af51c7 GIT binary patch literal 3123 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 KWMxgPP5%S5QEg=a literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/cityzip.imageset/Contents.json b/iOSClient/Images.xcassets/cityzip.imageset/Contents.json new file mode 100644 index 0000000000..5f7eb33844 --- /dev/null +++ b/iOSClient/Images.xcassets/cityzip.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "cityzip.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/cityzip.imageset/cityzip.pdf b/iOSClient/Images.xcassets/cityzip.imageset/cityzip.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ceae8c760719955b1e41e92950299b1e06ce3e1 GIT binary patch literal 1718 zcmY!laBpkQ!zW}-e&uR^Yw8BhYOI5R)bC9xz`LBqw$$iUFjz{Jqp&;ZCX)iy9t2O^+4 z-~1H(O6=^oQu9(kPB20^#Vs?Z1Zb(gTMp28m(=9^lvFN#pVYkck_-h)a|1g&h2j#R zYje3O=7ffMuTwVXx$|3OFW-bd4=<6*rpWZE%r;Lp&)}T!z4ZVIErlr@I zcb6csjz%MX?@o$Z-wx?#@Z zui64@BWJfPI&Z0_u=U+C>vs+P8UfNLmeyQmo7}g%-6S`1#_58jKDGsFr!AAY?um0K z#ys2f#8t;;0^cUJi~G9VUI^U&ZKO2eV(_z1In$gjT%KLIbWU)J)xnvswk>w6-gKZN zWb-1`Jh#>9X%UB)PjZ|2p~O);-95fEz4uB0Fc$k8LmmY zpNcLJT(>~{{tU0y_?wlsC8@Cqp-DQc!dpAmE&921_mr=zR_UGmr?tyQTJiLLsgR9f zm!o{6wg!oxSZyHVTy6G!dzI|JF3!Vmw|tIeFm*DWpS<%C)1AeIdG|RPX7iouHx6fg zX?^3x>ag894uv)qVJqi-W#;&IJ~4f*X#DFldAlQb>sKXDVC!4@`h|kSlS$o7=ks3Q z)jgY(w=E~_flZ!-d2Go|5vGoVGM^5b9bK}!eDc|AzCNvv51vHj+!eWIz2@-_ZR84`T~E!Nj(td}&Bd#mxtV)@wu4nLmy!Dd-D7`U61X`_X#Lr1$Cx_~CD|Cf>XhN;F$`bPt+#c8YS_l>I~Q!tU3*|-#9Hl* z7FU~Wo1!N0FOS*qNmab)1*d#`kn0>bboGew&w`4_tLt@;j^OK&d-;BtMcgk@%Vmwx&4nm+h=B+IS(oYpqUz49vCCagOJLC zR0VzK#FE6E{B&Tcl$f4ctY89^4?+|lATG2dgD3~90+v+yrFkU^hFtpInJL8z(WW3> zu?TG-K87|f{h-w1{L-Ripf$jf5m*W)2d9<*b%RSl{gBj(5(RzFT%a?YptLiT_KfAy zcdaOK4=w=}j6l8a1`1{nhXU=?_f1X7OmxbxP>41F3K|=LF;I(heqKpx9?%9*As7Vm zVG)pv?nRJ6P`4&0g1qG9tDx_fUzD4egYZyAQED2Ofr2@g0URipnVK4#Dx@jE#SDSo z1_6aUxR{|SFa%M>3=J(Y#f(gVbq1O`BTJyu(8Ns4ED&NPMTwa?sYRe_COESy73ezs pp#1z21yCFVz3Z8mmahP+ia_yMT#{H+0``TWsevh%s;aBM8vw$nrQHAk literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/closeCircle.imageset/Contents.json b/iOSClient/Images.xcassets/closeCircle.imageset/Contents.json new file mode 100644 index 0000000000..97c449e694 --- /dev/null +++ b/iOSClient/Images.xcassets/closeCircle.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "closeCircle.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/closeCircle.imageset/closeCircle.pdf b/iOSClient/Images.xcassets/closeCircle.imageset/closeCircle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5b391d1af61e97820955384c4c3578a20450c9f9 GIT binary patch literal 919 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 G(fc3vTh$N% literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/contact.imageset/Contents.json b/iOSClient/Images.xcassets/contact.imageset/Contents.json new file mode 100644 index 0000000000..212bb4dfb1 --- /dev/null +++ b/iOSClient/Images.xcassets/contact.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "contact.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/contact.imageset/contact.svg b/iOSClient/Images.xcassets/contact.imageset/contact.svg new file mode 100644 index 0000000000..6b3f9684ae --- /dev/null +++ b/iOSClient/Images.xcassets/contact.imageset/contact.svg @@ -0,0 +1,7 @@ + + + 01_24px/icon/user_file/contacts/default + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/create_file_document.imageset/Contents.json b/iOSClient/Images.xcassets/create_file_document.imageset/Contents.json new file mode 100644 index 0000000000..6126b598e0 --- /dev/null +++ b/iOSClient/Images.xcassets/create_file_document.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "document_menu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "create_file_document@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "document_menu@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/create_file_document.imageset/create_file_document@2x.png b/iOSClient/Images.xcassets/create_file_document.imageset/create_file_document@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b0623eb0fce5a2519bca1423420ea35aabace0 GIT binary patch literal 573 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 M#@0sFhAxr+2D1t~{Qv*} literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/create_file_ppt.imageset/Contents.json b/iOSClient/Images.xcassets/create_file_ppt.imageset/Contents.json new file mode 100644 index 0000000000..72118b7429 --- /dev/null +++ b/iOSClient/Images.xcassets/create_file_ppt.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "file_ppt_menu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "create_file_ppt@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "file_ppt_menu@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/create_file_ppt.imageset/create_file_ppt@2x.png b/iOSClient/Images.xcassets/create_file_ppt.imageset/create_file_ppt@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80aac7f83198a6adf9827f5277cf64321bd28902 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-wj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pr6J!>MI|Md6EchT=A;QVw!+(%*2Xnc?K?bJVd|a1AMNKzE|0}<3`uWn_Ts2mS zwnV3{5b^D~RwiNB8LZ}A|Et4&vg-7oKXn43<-JE44`{TQC+M&-9Gky&_u9V&e3PSB zXL|PwIB_V}Gj(R^n?KMvaC9}dcn7P8l%v9?mwKNj`%n07H`l>55v-^Mq!L2Z6kln5 z^=jj6-@Q_$p^uME*md*Abir>R*-K#^F^4tpuD$xRZwl+PV@ea|FFbL;fJZndZXc)m VMgIfq+JN3=@O1TaS?83{1OOytehvTt literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu.png b/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5287c637e77437a6e1878df9477dd09262a48a67 GIT binary patch literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|I14-?i-C%- zgD|6$#_S59g2>E}h>{3jAFJg2T)o7U{G?R9irfOAY6b?I3M(KpH?<^Dp&~aYuh^=> zRtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R! zB_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$`C_f=D4I5Cl_TF zlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L=L4A;nzM-ChKHO}eRvVD0m48uY zD$r(-`F4gjV3jChPEamT!Fx1x zqo1^+z}%a=jkish^np_|<564JtbB)}T^cJdedPbgzCHF|lP?&e6{+m@3)qStFh5RXg{osfHItH1P?~kuN`*wFf zyOt3P<1ZDhR<}E+S1mis&%A5z&f7XF<3)vHW?Y4UKIz~1NAZ*l5PZ0vWt7HJhe z9jtm@{vPSp6G8ibzFzWaXP(tB%f8>oPM=t_)N4xX{mt?BuNOV$<=^3TC9Ca4tabLQ z*nOOr-Gm~t_9Wd}^jxAWJ9_mlY0(eAx>m1qYqI@Xxp={!jc=a+nzu%yLXYd{b zs{~eI1!RMS^_3LBN=mYAl_Got6rA&mQWZ?~O!N$t?6?#Z6l{u8(yW49+@RWlJX@uV zl9B=|ef{$Ca=mh6z5JqdeM3u2OML?)eIp}XpbFjM%Dj@q3f;V7Wr!g#b6ir3lZ!G7 zN;32F6hP)CCgqow*eWT3EP?}wJ4-Ut5H{r%L%jv`pgu@O-%!s$A8s~Ks|`rh%D*Tx z6=*Zad^)1Mw+X6zEkuE*pJ#u-S3>98!;DU|>G(>Eakt!T5I0 z*}TgR0>{g*ue;6S_+!$92M+TV?p-XFH)qF`IS#H)As!rZjGtL*I94`sPu0um!y6Bb_B0? zXP1{&&pxfz)6&BKZ%SRWTlxcK+wc;rgK^g*_mtFqPAxyd`nTMe<85h1-P;OHu60+$ z_okk>(EdhL(R2yJk*0kstKW6K`mT5Q=69v1O=9gEf~uE>=w9;N&nLTQO~n7HCW^iP zvK3!zPI{xwet4o=_=4_J3?gqA{6CRsqRXy*Z55a86^-^gg@WxeYhv{5CJH7*NOJw= zJG{yGl#WDL+o64jH@xXF;%=L|aKrm2Y)g|jJ(%GiI2fd+8tO1HHfd^iCkk>1_(VqXbUQR8 zoH~^h!NSB6942;HNkC!7rcDxJjSL5;OhwT;_g$bwON3f#T+Xhv>*^x*kC%P8Baqec z@ip^*ovT|99ZCpU`_x~DUEU+=)a>m~o=9r^GWWf(k#`!;Vu^Vkue0s9<(Zw5e!bxO z1^+9Dm#ofhUV12E_N?s}nlxsGy%tU>y>f~OT1wFoJ|kj7Ml7RXgzE?GgtFhzl@vqJn1P} zYnjUriW(%epA_16*0OMyNz}bL^6C@svfb+s*lY2w&#IUsd+*#comF|c?yc7Wn zPvzgAZ&jV9-Z-`B;9njwz2FIJk~h38ug|@^5UjD27^#x(ap-HLkEKxBtmQB3urBp z_F};73owYq)DTIF<{nEW{d0@=-uAkU^K9q#{&{~l=RMDTk^&-8TSU!%NS#lQ5c3`b zeuvg_+vRy#SQ)!4wGaN@nQ64c5dc;tpoWp z@pyOf{X`YUn?}ABxG;iXraCBUy7pB;%q|KE@;2A)AJ{DdSf_1Vlhu;p|vT>Cpy5WHzcp zPk%~}-q{?#ZTAts>4R#m-Ah1FTFV({r(-aVOw!vh5w4QJ7jG#iVOt{4z9v zG!wuY(*$VCG6>5a5fA|pkpBz9^y<3RezPWT^J^$c%mD}g!tqmTEHF_LB9XKD1Q(sE UJ%o9(9smFU07*qoM6N<$f^^^ug8%>k literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu.png b/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..474a66c601dd8d3eea9067f4653516fe763a28fd GIT binary patch literal 1464 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|I14-?i-C%- zgD|6$#_S59g2>E}h>{3jAFJg2T)o7U{G?R9irfOAY6b?I3M(KpH?<^Dp&~aYuh^=> zRtc=a3djZt>nkaMm6T-LDnNc-DA*LGq*(>IxIwi8dA3R! zB_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$`C_f=D4I5Cl_TF zlw{`TDS*sPOv*1Uu~kw6Sp)|Vca~(PA#BPkhI$L=L4A;nzM-ChKHO}eRvVD0m48uY zD$r(-`F4gjV3jChP&)5S5wgLiG% z`Rtfb5xejAzJI#M6Qmn;<=VQE(7PU@TNiflzSJ{TFnJgAvSht>`OT7>_6ov|f_F?f z%w{{xN?AI|se8eVsd~Lm%)B$w?#=%GZg<`NxjQGH+anq9@zC7gujjn~W0&vJcGxm7 z@qhfa=tmiy$?6E5eY*R#{rY>mCF1KJ z*BMsH=N;Sf{@s>3+uCIxi^^g;E+zXdewO98Gm7uqLa

zTyun$jdD z7CA+C9QLfgy!GFiYQOq2q3Nzu4=-xF`swfU@~HKfC#ff!2r;!yX3Q*1D!J6bv)t^6 zh-c8_^AGEGyxJnETF`c6V_t~YzSnvBdw1^HlNWyHl*41;CkOc!ipLth`#oXa zRlmFguG4?n-Y&cKHF2rqk-gWaXgn4Wdtu6dIbZGUikaU}={J14)fKg}gsdiwXEU%!Ac$nqJ$4EDLfKt#Q$khFT<^+3`QDzRM}=!ng&g7I>B6Hbm->R zlvS|@m=e;yLb_pKLO>Of>s>!rpRO z#3Rwvr76lu>S9Y@+U?m@>a(=)d_x~^wrYQ4n7HB9*v1P>l|@>UTKxCj+I7q4?&X{F zXS-kIcK6@Ou3+(X(hPsSwcmRtrp#hUx}uX#-(*@s7-p7;tI}>i7xk>vfn%XuFYt#IGyTY+y3eH5!p$+;U_dt zJy=$>&OvVu^WEx${59N*)mnZs=Bm68pC22)qjq{r_U^U%8~5Dbx#=V0`OC*%<^5i} z({gY4&0UwXma#T?%wM8pGS^f5#m%fkbwz6<4@o6_y}7B1eXSF3_4P=Ou4~((yEj*f z&-nrNewNdZjZP1Ai~cQppZGxILchqQvUQ2u1X?_K>X*%SaNjq})l_jF^UGJpIRV0Z z7VQq1w@@mLciP_&Yqm4<-X8j;U!W}&dh(5{b>JDL_~;&$gEPsz5m8yFx$``6lc>AVsU2(;Q-_QStF?mHi?0B=o rr?Gf`IHS4E@9v8a>u&@&H2joyoO%3ORm40{iOk^X>gTe~DWM4fCp>{o literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu@3x.png b/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b959d7c9a89a1afe46cb9aecd29507dd02207a6c GIT binary patch literal 2841 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/deleteScan.imageset/Contents.json b/iOSClient/Images.xcassets/deleteScan.imageset/Contents.json new file mode 100644 index 0000000000..a339b95ca4 --- /dev/null +++ b/iOSClient/Images.xcassets/deleteScan.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "deleteScan.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "deleteScan@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "deleteScan@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan.png b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a4ff62f0f981567feab00d3bbabb604f3946e9 GIT binary patch literal 919 zcmV;I18Dq-P)P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x158OoK~zYI#g(fv4ip0}q`sT={YAHY5Uw*lNt({#-k^ZUPoXswR| zcoRUKh`wg#Uo2oB5j_l`4q%;#&O}jk<$)kmQ&Zz3BO@OGcpShSGp`zB?i6G=TB%fy zi^!aaY$&BpMNxG7o{%sMA7$oC09Kj#ZDY(|W!VBiqtVz^tJU6P=3^oNNc@eH?T!P5KL&TH}W=nhVL-*%v})A z^Y#F!r)m00!Oj8^S=L%VpSOFScSJ;%l~S)2#9RdMbi3W&n?dYFTQ6!;W6T;6H357y z$S4Sc38mCUB5E!!E`CuEa|ginBuNfu5CHo{;eM# zNkk505N56_rFta+h~xOOh|Ckwyok)laeTSVpNMXWNG*dXrFzUem59`c=vD>+aMRABLfNxeCZdzwZucA!odmGFUDsJ1B%&J`Bu&#b0QFX@wR_le z&_w`V8k|8CMOT>lL{ZlPKp2K&01i2hb2Wq5alJk^HumChfKuvxB5KBQ{CVD<>$)?; zF=?6}2XL*^>HGoYW|!~#&nl%pbR6fgPN$QUl%Z6OMq^jCTK%4xUpB_9Wtjj#x7+=a znZN7z`|s`)007l$^(=sI2Y|aE0HBmQ#mvX-G<{(CzOMni;JWTBdHa_4#PhsIi0Bd# zecJ2w-Wr}|MY1J23t*CnCZj0&u@nLT?RI-_k|gIv-FD)%?4*RuQt=*%e zqbHP7b0YGM>$-c9>{7OXQ01g5;1mK!|b$eA$}HS=;~s002ovPDHLkV1k;ls0#o9 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@2x.png b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b2037c59419b35a792b3f0f27e7363b1bfa5ea GIT binary patch literal 1792 zcmV+b2mknqP)`KWE1FrjcW$*aVd}FDRr43JAqh2{kBfQjjSW zD^lG`NgqlKyLXl>ec%a2B~42I0pi`AHBw0_DJllhNTeu0(*>m1e0B2?~?~DnCly zHbqW|9NRO8hrLVJo89%yuHEvG@5|1dd(OG%J9FGEpy-zyREeSb_$-!E<9u*wY3UXb z*#_JR+y=PT{%si~=drtxKrxe3?{><2bm z@ktTMm&@fpr}34Fi0}J*R5buL0J9=;Ac~?Vrl+SD)A(t|#KgqF$jHcps`?l(0?esu zwo<7)ozzECB4Uhr6gXh-pA?aY%H{IgDP!)4$;ru${r&w%fIR>ra=2VBA50Wr5*=gA z6p#lN06z$V$GeU;0es)js_GQb4@?C?P*};vT}ieQB74i_@>A_} z+rE)}KEFj(Pf*JZ*&qmJ)*#l7s8*|g@jP!9xCgk)^SmF0Vc2qBI_;d;C3XYw( zPAHel)4)@}`+#CQy_Q6Bx!k?f^2Dr&JhUberhx0ZUkBb))v;VIH{MF86%nx+8xc9M z+DmLVC>D!vscJo@gS432*9d&y|GcU`3%nY~@s^d6oiXOuzBw=MV?YdyXS3P$ z%i0=mGMUVFYES3Iq#HmxoOY3rObZgbk`BpIsq{A>1a9c->)YOzNF2xYar%4`$8{tn z(+i0PoB~kQI~s+{h}e@IKsBXvf*_df@9*CU{LTh?CY#OPSZ^;B3hxJgW!o+|j`P_r zNT8}!`}@&GxznVy6~J}fKc?*f;K-39Z&1rW=YWqmj`Is+%qC;Zrp3j@Q^3b<+m2GH z^sjFE5RnV^@|H$<^BWlkn4h12t(#7u^)RFN;q*Vmaa?}@BaQOr<#z+X+}vDG1%VdB ztf%4Bh)gDPsWH|%+U~X10!vFvt5&sXMl+F107FAVgDrFuqs5$9HfMVAef8?q`kT1a zC~qe6CcwIN>u#h=v|3_Gk!KR19@`s@!e$~b14L1@wVNK=EwL*t&1oPa_0?+G%Gyli zoc$e5+rdgpY`dj7Z9fgMoo^I2=aDn^^3F7#lVQ#;G=P2wClk(5LoEy(;VNk>r>Jz!%# zK0Q5srLparJQBz8QG2<6Vq#(-f&V3Hd$Uv-yMauVTHUxK3WY*OM7{=~s^4pFZr7;Y{w>{5$1(*QFJkJZmF#OY61ltb2?|%V!g4zS$SE*Faw$trc#16yo z_nzlDz)oPd=Xo!^TV!&%+}*$okWtlxl}e>;l@StD#0Fr&6hWb0wR^=L6sO52@<6?ClR-*DVx_#kabQwI#CI?1<~SQ>uDD zfPE8(SF(eYpWf_ehVKGH)M~L0U%Ytnaa%m=8ihh3v#_u*DI$*o8|}pYN)QA;N$Ml@ ziOu)@4*^A09kZgp14YMij@i0XV&wDr%~2FRU^Dhj0IGUIMD_ofJ?79%+{+){IEq-Wc;a zYPHyL;D(g;SAb_!^=PG1`DIUm^kUqIY&N^Tudi>rs@`FXXIp^}(DWA$YA3t%s(M;g iUufRNUdMI(pW(j%QqkeY*(H+z0000*Y| literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@3x.png b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6526408be8db624a724292b2f50c49d75bd7c96 GIT binary patch literal 3033 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_audio.imageset/Contents.json b/iOSClient/Images.xcassets/file_audio.imageset/Contents.json new file mode 100644 index 0000000000..e7d502e834 --- /dev/null +++ b/iOSClient/Images.xcassets/file_audio.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_audio.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_audio.imageset/file_audio.pdf b/iOSClient/Images.xcassets/file_audio.imageset/file_audio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f892f149f9125cc0de02f6090abfed29e7cb6295 GIT binary patch literal 1104 zcmY!laBpkQ!zW}-e&uR^Yw8BhYOI5R)bC9xz`LBqw$$iUFjz}Udl$k52h)I{6BKplvH z>U{H4@GG&i<4Vm-0Xe}4;S{&boD!g=`ffQu<6Tmd^HWl}^nFtE(n~TFj7`n$>=cSi zfUeEus+bcSqT?i@%Z7vsuvebVE1GpZKIVIa@Dn%S!f7&+(U9 z*!4T|!=wj^5A-aSE!;`e3EW z|9whF!CPLgu-WX3w*7jubfZah)|QD?(#zD#ON3rLTXk~>Z>;E|bfHa$a@-ynFhm&J z)L4{Xf5IpdoBVERbGKCO8rz$TPIuI!cE&wf$$ zo#&I8&hM~m(NB5A6ZJnoyItHIb$tDcldm@ls@bXvPs{C`y0&^7&qtq+VtO$w8v^)J z8+lGD-PL`|C}{m_QJ?$9!@DB__&?8N<<^dtXp%85V6f`yfW1tr2{JfIXJfIDr^ce*5VG)pv?nRJ6P`4&0g1qG9tDx_fUzD4e zgYZyAQED2Ofr2@g0URipnVK4#Dx@jE#SDSo1_6aUxR{|SFa*)WOf7&}7fsB}$O2Q$ z0vK6n>MTr=>?kQp%*;tG0+j&4nN_Jk*Xal4=a(pe;uz>%&%CsJ1yCsgiqGPb#G(?g OFDxvLxKveL{oMer#&l2s literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_code.imageset/Contents.json b/iOSClient/Images.xcassets/file_code.imageset/Contents.json new file mode 100644 index 0000000000..c967791083 --- /dev/null +++ b/iOSClient/Images.xcassets/file_code.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_code.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_code.imageset/file_code.pdf b/iOSClient/Images.xcassets/file_code.imageset/file_code.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74613b5ac99ce57f4f2321cc9b20dc582af4a046 GIT binary patch literal 921 zcmaJ=&ubGw6vl%drUkL}4|r0d_2vQsw`jfx^3 z6g`R{h<6bL5$wUX+S)@A4FpK2Lj=ivmC+9xaUyJg`#EQhib4V z{J0}Iw8xL=OzU6g9BpM~$cNGP_P9@T9Fef8$sVCQd{asq!^)zhH zyLxMO>znI4PX5*wZ>-KfdfvHmoA6-McrQW)U2QKI_M`bq0jlCqAPQ#LT1k5}hYpktX7 zgbB@bfegxMd#n#=zX*y>p{~0U@ElFmE^=f?(?Up4M*+K%^m78#byK#Nq!Y-hiU{i< Jp-}gU#6RVq6LA0l literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_compress.imageset/Contents.json b/iOSClient/Images.xcassets/file_compress.imageset/Contents.json new file mode 100644 index 0000000000..028f3ee0fe --- /dev/null +++ b/iOSClient/Images.xcassets/file_compress.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_compress.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_compress.imageset/file_compress.pdf b/iOSClient/Images.xcassets/file_compress.imageset/file_compress.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3b01f096bcac4fa4f4f7d85b824dcd8a650ae2ff GIT binary patch literal 896 zcmaJ=O=uHA6h5}B;>kln#KATgtva*G?xwLJLjKyIu_fD+rH4&+lCJLV)XhXb2Os3+nEC&dcwC~cDJX<`R5F&$p(xJS@O+9EnMoyl zoVsN`k7OkpkE03)wvJT0najP|@rrDJx-oh_b7#a!{u&rx+O~(hJo|Zh=r6v;V;`IK z-Q%klSL=o48}h-QBYy^;x34}Lh}j3!olfiM+SqUtT|arI^;mCD-mlBgg2Tq`!Pjo4RFLXgkTmlp0xn>n{Y5l$N1uvr-zY?NsQDR7_fbwV6{Q#R8(S;ysDCQ+z~bJVnq1goK00>Lop`~XQZms1xi2tV^ep$Er)iQ*xjYtayr5;=rVFwZgU zo}ijXOAu5ip@Iri6fce=M@~Jxz)9^0;SM qHuc2B=++_yb~w)%N5W%}n{`VJiK!BPR=DBujtXrICN7Yk%KQWM%MG3Y literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_movie.imageset/Contents.json b/iOSClient/Images.xcassets/file_movie.imageset/Contents.json new file mode 100644 index 0000000000..fcb1da8f07 --- /dev/null +++ b/iOSClient/Images.xcassets/file_movie.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_movie.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_movie.imageset/file_movie.pdf b/iOSClient/Images.xcassets/file_movie.imageset/file_movie.pdf new file mode 100644 index 0000000000000000000000000000000000000000..700d30768486fb5d8a37c829805387edfd08214e GIT binary patch literal 937 zcmaJ=QAiX)7`BI~Ml%vZh=>t8GE8T8&s{Z-gYM3=qfEUMsqDz@Zq8fV+o`=dyMmx7 z0->O{LX><6!$Mzz5cDAgL!=@o4M87*D9x7$@uk52IS&u6XxL?#Z~lM&@B6;TYiY zlF@SwBZE(-_Wr6Ex9_>C*M`Tp_s%yg760~h^elgzYq;%-k4|3rbZbLd^*t^7xmLDo zwy(77`;D@qwzCBzS6dGT&L}gBCm!~f43GJazMtwq1y>AH>j*zMKV-d&jdgyRo||}c ze`cX*IrO7^Ta{@&PA+~OTnY5OcpEO5-#LAAWygX#i+1ntGwxKrve(y#3fD`ko;N-d z%CkbUJ#glF(0=VQ#l)*~-DKV1gx*b)xCZuvxt57#*1gT}Occ1oQWnQDA}5V#5_hU1 zE1XLc>%Y*%2rMw*j1wgeZsXjO(PGra2~o1kmtgXK!{6gb`^>^QI6NmjQB{ zB&=-`g_@+9Mh)G=(zsIs&?#kpNbxd@Qwu5x4aJ5sybC1!&{gPvcN&ka3*?I}&7!W8pE#4OlUT#q$$>Cb@3&jEY)CMGi+}i~kR-TOp|c literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_pdf.imageset/Untitled.pdf b/iOSClient/Images.xcassets/file_pdf.imageset/Untitled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b754ff9af17eb7ff9a97272eee33b2b62504d36 GIT binary patch literal 1801 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 Kki*dx3;zShSQ9t^ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_txt.imageset/Contents.json b/iOSClient/Images.xcassets/file_txt.imageset/Contents.json new file mode 100644 index 0000000000..00fadd1b1f --- /dev/null +++ b/iOSClient/Images.xcassets/file_txt.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_txt.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_txt.imageset/file_txt.pdf b/iOSClient/Images.xcassets/file_txt.imageset/file_txt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04dabb7faa5073791cf06711baaa30a6b396d11b GIT binary patch literal 940 zcmaJ=Ur19?7>8H}Cyc0Gtd~R52yJ)1YTd*t4;S_TnC z8HHFu50#J=A^9X!kA-Ou(Nhs-LH6e*6dw$Xl6tW3%;msAhkH4k?|i@W{eIu?9D5`f zs+0G-kp1n#{8uDn3A66wsJ@;AOsaBb;+jB@$+CJbyBCp&$+TROLNL~=s|2t(>vqFN zAz5ceP~{ZY1P?kS*(*6E#UVR9va42-s^NpYFw_2@;`1SDXo7;HL?xtWI20wJ3>+V% zNv2UmTB(udJy`ZSeLie)V4Fqx;lxmQ%Ou`<;g@x}^L9to88kf7JDWcnS~z#BWAV;% zg{1iNiN16Q{#nm3nOIzH#BI`&B$ zn3$~n*k#*iyFWF(=X-14P^9aUoD3S(8)kOx*gg||^W#C}%1Xn#u~(;mqRr3ZzXPb@ z<)f+dww19&Z1?BsT(|Ao-HkhYN9W)F>15;M_b#?P{!n+aV(`ZGuA|oAe5#g@I=^i) z%+?VhzNn?x24|@a?Wg)ECIOYJ8I}e!)HJoQ3-+U>u8C#Qz}56Z78t~G2FEfYExKmm zxFS%A5=^YiV2DJi#d2m6%D{yH^OG^k0bMYjw9`Dtq&W*T{KYv?oSPGfH0F6zjEnmK z*d__PSBXMR5~iB2`dJ>wB?vmD!Vi!DGdMM%g77{n6q>MHFHsy+{b+~f>U@cCWCA-u(1}C73ko)m`nDQ$K2(4itH`Rb9>=Q{X37F ts-B^ycwI5Qp8`7)WsGCtG01H;QVfe1DEzdzYVv{#kK+Kc+Z)?Le*xb)B=`UT literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/file_xls.imageset/Contents.json b/iOSClient/Images.xcassets/file_xls.imageset/Contents.json new file mode 100644 index 0000000000..8c9182f8f7 --- /dev/null +++ b/iOSClient/Images.xcassets/file_xls.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_xls.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_xls.imageset/file_xls.pdf b/iOSClient/Images.xcassets/file_xls.imageset/file_xls.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ec7222b8fc3d4d8b8c0a7256202fe5fc0866dfc6 GIT binary patch literal 962 zcmaJ=Uq}=|7>78lmgGPZdTX*SjmX)(y*)eAi@f#Bx-+};A-T@jZbx0+-Lbv7JR^Dt zdk9j9A`KGyLl~ryMkM5mSb^9>rVl}d1VNb)6;X-?&77A9Cp7Fb%x}JLzTfZrU3n{v{a&G``|;?_PrruOZ#LQw<_s+D zuRUbFQrv-~c@uJdo1N>G7lx4D|taHQomgL~&p`NSnKX)$Ky65W8vy`M2rjsLPl2g~wh5+;_MA2~*Es@fM;=o1k zLz!H%W4f#><|!*$Hk>dC5IA^PQ{x~aF|TOGjh)xHaWI79IAO(T7}_SZC1PPjsCTLz zU>!;l0ILm3qawZg(tCB3gOy2A6(+1psBaYy+$%(BOc+F}rc~f0i0~8?`P5HceApz& zq!Cz0gqT8$9ju!;#(He0}4 z#RQ3FFbi{up0(IsN+Zioa?zp6!b${Mz<(IA6ir7Ko4K%d22pk}gfRiE##C;#*@yv~ VOIFV~Q7n>DQ6ll2!%=y}{} - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folderAutomaticUpload.imageset/folder_photo.svg b/iOSClient/Images.xcassets/folderAutomaticUpload.imageset/folder_photo.svg deleted file mode 100644 index f46eb94656..0000000000 --- a/iOSClient/Images.xcassets/folderAutomaticUpload.imageset/folder_photo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folderEncrypted.imageset/folder_encrypted.svg b/iOSClient/Images.xcassets/folderEncrypted.imageset/folder_encrypted.svg deleted file mode 100644 index 4f9e6b487e..0000000000 --- a/iOSClient/Images.xcassets/folderEncrypted.imageset/folder_encrypted.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folder_external.imageset/Contents.json b/iOSClient/Images.xcassets/folder_external.imageset/Contents.json deleted file mode 100644 index 741bbee824..0000000000 --- a/iOSClient/Images.xcassets/folder_external.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "filename" : "folder_external.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true, - "template-rendering-intent" : "template" - } -} diff --git a/iOSClient/Images.xcassets/folder_external.imageset/folder_external.svg b/iOSClient/Images.xcassets/folder_external.imageset/folder_external.svg deleted file mode 100644 index c6a0db5b35..0000000000 --- a/iOSClient/Images.xcassets/folder_external.imageset/folder_external.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folder_group.imageset/folder_group.svg b/iOSClient/Images.xcassets/folder_group.imageset/folder_group.svg deleted file mode 100644 index 960ab84ec1..0000000000 --- a/iOSClient/Images.xcassets/folder_group.imageset/folder_group.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folder_public.imageset/folder_link.svg b/iOSClient/Images.xcassets/folder_public.imageset/folder_link.svg deleted file mode 100644 index 8966f9a61a..0000000000 --- a/iOSClient/Images.xcassets/folder_public.imageset/folder_link.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/folder_shared_with_me.imageset/Contents.json b/iOSClient/Images.xcassets/folder_shared_with_me.imageset/Contents.json deleted file mode 100644 index 8b5e688724..0000000000 --- a/iOSClient/Images.xcassets/folder_shared_with_me.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "filename" : "folder_shared_with_me.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true, - "template-rendering-intent" : "template" - } -} diff --git a/iOSClient/Images.xcassets/folder_shared_with_me.imageset/folder_shared_with_me.svg b/iOSClient/Images.xcassets/folder_shared_with_me.imageset/folder_shared_with_me.svg deleted file mode 100644 index d115211941..0000000000 --- a/iOSClient/Images.xcassets/folder_shared_with_me.imageset/folder_shared_with_me.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/iOSClient/Images.xcassets/media.imageset/Contents.json b/iOSClient/Images.xcassets/grid.imageset/Contents.json similarity index 86% rename from iOSClient/Images.xcassets/media.imageset/Contents.json rename to iOSClient/Images.xcassets/grid.imageset/Contents.json index 988c574d50..30a6d892c1 100644 --- a/iOSClient/Images.xcassets/media.imageset/Contents.json +++ b/iOSClient/Images.xcassets/grid.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "tabBarMedia.pdf", + "filename" : "Untitled.pdf", "idiom" : "universal" } ], diff --git a/iOSClient/Images.xcassets/grid.imageset/Untitled.pdf b/iOSClient/Images.xcassets/grid.imageset/Untitled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..432ec04afaf80360b856ba5c63c0b073b01b0050 GIT binary patch literal 1165 zcmaJ>TWAzl7^WHo2VuvLvN&2(t>!4+G2|mn|cAQQUqID(-%{Gu>EJdW?>6G44gCH z{I~D>|2e*%SbU`_`z7DRZ;u~HDk#9W?~qzsNz`SA;4UvUrs}wRu&Ty@2+~pGKad~#w zWLRis&@u?}fkKethYA6UJ268rXo`h3MN<^21Tkp9uQw~oTlk<|if8}dBodLBll5ew zHF-<}REe~ufOK)UVAwSyf6XXv*#avgaT{xhF_UMRMAk7UF9tyKtC0v41ek%w%@g5IKD~STcXh?1hI4HGTWFF&%e#j6kQd@}XQudMaz#gQBS z8_|c?mmGb!E8Q4k57`_F>%&Yw937ztyYt* zw>-pv^cZC(Y^n5_^scAG3XWdo z2>QQaUk-`)TK$J=M2cRxVMlmF(`jXqfyXz!tu{7+dbg+{44db@Gg9UUXT!&Ewi>b$G=s#GCj`u^IT}Z*gUt+>FEStIB^^vi5 lF|3ZHITzq@LjjXcj)Ql_U=yUGFkDe#5z?vT^R;)!{{i*NaZ~^R literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/icon-calendar.imageset/Contents.json b/iOSClient/Images.xcassets/icon-calendar.imageset/Contents.json new file mode 100644 index 0000000000..830a3079bc --- /dev/null +++ b/iOSClient/Images.xcassets/icon-calendar.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icons8-calendario.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-calendar.imageset/icons8-calendario.svg b/iOSClient/Images.xcassets/icon-calendar.imageset/icons8-calendario.svg new file mode 100644 index 0000000000..8146bc2cf9 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-calendar.imageset/icons8-calendario.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-confirm.imageset/Contents.json b/iOSClient/Images.xcassets/icon-confirm.imageset/Contents.json new file mode 100644 index 0000000000..f208a73f87 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-confirm.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icon-confirm.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-confirm.imageset/icon-confirm.svg b/iOSClient/Images.xcassets/icon-confirm.imageset/icon-confirm.svg new file mode 100644 index 0000000000..f9e268e5b3 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-confirm.imageset/icon-confirm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-contacts.imageset/Contents.json b/iOSClient/Images.xcassets/icon-contacts.imageset/Contents.json new file mode 100644 index 0000000000..ca321128d9 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-contacts.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icons8-gruppo-utente-uomo-uomo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-contacts.imageset/icons8-gruppo-utente-uomo-uomo.svg b/iOSClient/Images.xcassets/icon-contacts.imageset/icons8-gruppo-utente-uomo-uomo.svg new file mode 100644 index 0000000000..927eab2467 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-contacts.imageset/icons8-gruppo-utente-uomo-uomo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-deck.imageset/Contents.json b/iOSClient/Images.xcassets/icon-deck.imageset/Contents.json new file mode 100644 index 0000000000..90df8ba400 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-deck.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "deck.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-deck.imageset/deck.svg b/iOSClient/Images.xcassets/icon-deck.imageset/deck.svg new file mode 100644 index 0000000000..0e36f77afc --- /dev/null +++ b/iOSClient/Images.xcassets/icon-deck.imageset/deck.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-mail.imageset/Contents.json b/iOSClient/Images.xcassets/icon-mail.imageset/Contents.json new file mode 100644 index 0000000000..f08f7eaae4 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-mail.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icons8-nuovo-messaggio.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-mail.imageset/icons8-nuovo-messaggio.svg b/iOSClient/Images.xcassets/icon-mail.imageset/icons8-nuovo-messaggio.svg new file mode 100644 index 0000000000..8518704a8a --- /dev/null +++ b/iOSClient/Images.xcassets/icon-mail.imageset/icons8-nuovo-messaggio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-pages.imageset/Contents.json b/iOSClient/Images.xcassets/icon-pages.imageset/Contents.json new file mode 100644 index 0000000000..fe86cc0dc3 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-pages.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icon-pages.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-pages.imageset/icon-pages.svg b/iOSClient/Images.xcassets/icon-pages.imageset/icon-pages.svg new file mode 100644 index 0000000000..67730faf16 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-pages.imageset/icon-pages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/icon-talk.imageset/Contents.json b/iOSClient/Images.xcassets/icon-talk.imageset/Contents.json new file mode 100644 index 0000000000..f0dc62157f --- /dev/null +++ b/iOSClient/Images.xcassets/icon-talk.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "app-dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/icon-talk.imageset/app-dark.svg b/iOSClient/Images.xcassets/icon-talk.imageset/app-dark.svg new file mode 100644 index 0000000000..3e133d0a17 --- /dev/null +++ b/iOSClient/Images.xcassets/icon-talk.imageset/app-dark.svg @@ -0,0 +1 @@ + diff --git a/iOSClient/Images.xcassets/lock.imageset/lock-outline.svg b/iOSClient/Images.xcassets/lock.imageset/lock-outline.svg deleted file mode 100644 index ea1b2fabaa..0000000000 --- a/iOSClient/Images.xcassets/lock.imageset/lock-outline.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/iOSClient/Images.xcassets/lock_open.imageset/lock-open-variant-outline.svg b/iOSClient/Images.xcassets/lock_open.imageset/lock-open-variant-outline.svg deleted file mode 100644 index d1e4c56ff4..0000000000 --- a/iOSClient/Images.xcassets/lock_open.imageset/lock-open-variant-outline.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/iOSClient/Images.xcassets/loginPassword.imageset/Contents.json b/iOSClient/Images.xcassets/loginPassword.imageset/Contents.json new file mode 100644 index 0000000000..a417091099 --- /dev/null +++ b/iOSClient/Images.xcassets/loginPassword.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "passwordNextcloud.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "passwordNextcloud@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "passwordNextcloud@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud.png b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3f50839c4f10242178516576332c024e814c1e GIT binary patch literal 2460 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 ac>D(=y>7`u;AmX{0000-L>=QPDwnih3 zs1z)OgvhInT7p4aVb3g;NY&8pE+~R`MvJ%{?7TG-?{KV0?8Glxu#)KP=d86VFzXids(cMnP5sW4!K8Ag)MEL{DHj?*xO^xeHgubpedcZ!b!xok`e%sS0-p zIuEDxW`FTU)lw`+YXb4}`FZ z-6dFCKoF$X#ih|2AaCFvgBE3g!>K^{q%sy&0z z3~ESuv~i89?!k?P`h=-Axl?y&M56IcC{F@{=$8_8HO~w*cR)iTrtveN2LTIY{ZLP2 zq!5Y5)}it&;0XHJfnKv48d7eWrzmzCP^!q+lcwrh*$6MMKYk~UwF+3E@KI0DUx3#H z>-lC=`G>5GG4XEzTY*j?Ft^22oE*}SndU@Z3GJ=GEYOz{rsg5P0za|y=lK`fi=W2b zU#tP9Il!I{#yxt%%qJv*%?uC1Y|9c z0(N2%=`QLn?k?&sR-_!{8E@>lX!17|?*$vfBmmHy+`c%=M^=36yw zp8|?RbU`*tY{bNNdq(_C(N88#&F^kBudF^k%X0V`@L`2#lcxF+zcRw6>0ZG(3UsDI zI<4*TnzNa)Ydqql(;I;zfgfdKM0x%3JH6NG@?b^)v~H<>)3Nvza7AG4-1^3ue&r-h zkyziNn;y0Q!y19~Lev_oN`*LvAMjrEe(T9}P2_aSf;D3Vm~gPH!ThKR}v z01?@r4Py_t0pw%9<(D8>$O*6ck*uY8I*PJ9(`A8sC{maWbmnXN)vOtNsrWHd+v%5} zX;W2)*DT3an3PzDaSv)`6{cw-c!mTeSc|)Y#j{PtM*}SzDtZKM0>nY*0|Wt3!tRg6 z{4k1`cpUdo)W2VcqgX$>#)PS^9*RccIB+iz0S;OK4$J_sP`|0ebw=b6zIY3G@#stk z&m#g;0IYzV&PHOwROhUC0oi#}19}Qu0GSFOtXg9M9NRjdOT|VKp@6*aHOE3GM!Z$$ z5+Cxt>cH@0A{Qtw?!0uNy#%~fZ=ekIzYZCXbOPf_xmXOe`z0PMMl#;Y%<2DsFd9GT z>?|(znjLV}BiasN1)N*_G8%29Y@OgWFM#I}Ma~FJu^pWTobtl9>SL`b6Gl`(yv&xiBA=PE`(<^zam3wRz$Yq|k9$FG`i z8VdX~8y%EC)m#Wv0vZhIG4MR{x~V-EF|jv5=DM|54*Fr}=Lz$2arHFHve z^?Bfuz*4V(JgSJ8xB)%~bOr*l>_%5|H%#MOOvO7Yx&p9)`badkZbUU51mS4>VW7^{ zMZVCqx$1_w;DG0mWL?cq5nTreD!U>kp4HVtE)a>vH;M9HKtb0gOx59m=4N^I#-Rez ztB#r4f96iz>ruJAvBd7teZYf&Eg}!M)K%>rjK=R}=ps@1K2QprQLOb|K{@9rkH+pp zWtSV+auLzxiMr|`i-x{;=J3|zQ^mFp03Y|d4mlR}UM=>fQDK_ywsGnN9`L%_tbnzo zd2{6%KlE9DFc3U@`OAXV;T9|uIEu)ADX|W>Y^dnThF|$p&4tdT^dgXz;uhNk=ujbA zsOj$*_7;xNY2D;AG{*#H0l002ovPDHLkV1l)U*p~nR literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@3x.png b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a9d3968949b7a3d490a99368cc4f5bcdc75caee GIT binary patch literal 7569 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/loginURL.imageset/Contents.json b/iOSClient/Images.xcassets/loginURL.imageset/Contents.json new file mode 100644 index 0000000000..6de00731ba --- /dev/null +++ b/iOSClient/Images.xcassets/loginURL.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "baseurlNextcloud.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "baseurlNextcloud@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "baseurlNextcloud@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud.png b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..d76926e7d6ef7ae2ea97246e5b865c7c5a5d0e4f GIT binary patch literal 2818 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 IM6N<$f}O2;{Qv*} literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@3x.png b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8450538e3d057acf58b019aca90eb47bed5a4efe GIT binary patch literal 11758 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 Qxc~qF07*qoM6N<$f?&`MfdBvi literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/loginUser.imageset/Contents.json b/iOSClient/Images.xcassets/loginUser.imageset/Contents.json new file mode 100644 index 0000000000..9f0cdbcee5 --- /dev/null +++ b/iOSClient/Images.xcassets/loginUser.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "userNextcloud.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "userNextcloud@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "userNextcloud@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud.png b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..95a6baaef11f54a20fa834ad126647ce8f2fb561 GIT binary patch literal 1825 zcmV++2j2LJP)P000>X1^@s6#OZ}&000CHX+uL$Nkc;* zP;zf(X>4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%S z&q+iV%QKy%8^PJk+6~sShB~Zdu7$>E%h8c8%8} z1_iO3V-bI%m=P;R@P%S6E^c-c;eDE(JCckv9fIlEqbf$AZeM%6xmXSDNvZ;mH+Ws; zuYu@#GIHXDvsi7%a4QnrSjZR$zxExTapG32J&70BH%fzF(jaCD?DJUIKcsLkE;riq z&b8JA(A>rt{*WT!6lP--E4btp#}f;!<^Fqe*uAcWke_HmFv z)TFA%N7qtva+O^Byq*0=MoA3^x?2AfIr9!WSVkQV6$lT9b*p zty6NRT?WU2-J$1uERmX3i~5}i&` zeiSuPax(FQ?CiWpqGFZTm(QXlnIJbe$yb)K7gRBKQKdb%+B$D{PEu`Ke4lKyPFb)4 zGdz%on>a|EdVL**=d>vgx zVCRTLRQ?Wb14!FHBhRER5DUrcZ5JrcjD=g07OB+P7kpNW%>9T!^d%$BVM~`Y+0pi- z(t~9$GXgG-_cpz?2y30IFFf7P4I?_Ao;fxVJv*iJxr;Z5??sLVccs0)&iH|~7Pt6> zX~qO|dw98O-d8H0GXdsKAvb1m8SWsX+zBml$+Kw?xLqj_lqy;C-w=NT7v}xp{5Bz{ P00000NkvXXu0mjf5RiA} literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@2x.png b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..51bd35db1cc68dc17dd37109580418a88d56c697 GIT binary patch literal 1236 zcmV;_1S|WAP)HK;>H$=Fzua^MY_wPz>Fb+bLwaF%b`U<0YkWd0_mf^vb4#VK z)<%n!5majc5IvA#O=Kq>b1Si^G*%x2b^^t!@_jHG%Q`bb6JM|J9S{(-sl!xS%?5b1 zkF=X`1F!|~qw;}^kS4$nY)+V}4PI#QXhRfjH&yTC8r5#9-UU%F6cl#$$wtA*t%OY5 zT~2er#qa^JtI=-76C=TBe5H~)@BBQGJwi_b4B$Uk5p7-Og@(LenUv9;uN7q@aJSRli?FXKz$dM5SLIaJyEd}0`Nt_mS8u$E zVgyE>?M{UcOBnw2j9KhvZQRE4Jx7cCua&M=qyh9{r~5k4G?n4)Zu7b_5{kx_s7f<% zzteR>MRs&FhFz=&x2RN@wq-)90T@{~JtF#wQwEJoRwEUr^)08k^8vpqzBjz6jm9Hr z;!72F2+RjmMH)LA!<)v78P`b2#NJaR3M5q|TK3SDtzLYTafMM|1!p%1x{36k(<Y zlbJD%giL&e!nZ&YD6*Hd(T)F= z34lan)e+!LKor@X{w8xf8I4Ti&j{!okYCyf@0viJu4p&my$U}AW&PJmS7#cN(TE@` z(~Z=}wkJ1l5EY~uKw(9u5o47o3jq8+->C^wmNR}or=8}bnXZpjqRaqDCiSH1hRGJQhSc!OsZbAbZ?C;kC3j)=dktZ8Kc0000002t}1^@s6I8J)%000CHX+uL$Nkc;* zP;zf(X>4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%d z+et)0RCodHTzPC%#~J@-=Iz@xzVHdY;sfG9jKPkXP;HkU}6CQ_uT z$6u{gRaGmcLTyN!(zI#PMy;R`O%ssX95|3dFc`-MgE7Ph!E0k1U-;U6@6Gf#<_L}O z;>G)1tnLW2>vw!J^PBIUZ%h}V|h*;>hI~MEe|^Xi*ZjqSQQnV>dDAXSQZ!OW%C57 zB0=(2hgcRdmBAHDCq|qUNy$_vDduNNwJF9wWR_juCyj=a1D^~MUGGdaXvS2pP;vM2 zLL*In6Qla5{rv@xFW%7_mY?O%p}L3=3BafGyZ8c zQNvV@f9g1^?6;oc8?#m^TP$ImmJq3%lmfpH3reo)0ZKQ(>QTf8a8D62EsF`Hcrw6B z<&qTvP7^oqk3PojD#q=7b^rG7r0S<_T+`QGZBxTpYb(szx~j(iH-;e{URcR2eQl=+_FZsXG!>K#ezIxH(! zlcb6Yd4AH}6%|87tD1`HyFMJDq}R<9yHpsoj7$0f*shpKRhX2L$T(Bm@y`3_-*fBJ zT``0*U(mVuI)HN@F@8Ve&LXI#I!IX+8R|`sG+Sym-rf$8n}7%@R`|@jnWo8d$!6;q zS4#m(v6P|~3$ax&W9z}xJ&hNG9cj?cD$__)Jx8z1e~*ApDq);2VN5M1$wx@ZDpNRr zI@CVAw`SuV{)qvl2{P6A%9=L)o_-%A-q${1PqI17GMVUnF> znu*(B_41*>l}3q32B1q|82O&r6%JRB*8pKG=^GQ-cuirrv?T-EAXw-=t`V zK-)FWS^$UBW5!+wPas2EJ=nK)k5YSLJfd~dlYvvJxY>f0{sczQ5AM|-M@D>{dEJ7{ z0y>?qSYT=@S!e@U@~7ok6A_&eD@ycMTFlf6I_-s8Iqyibqy>gMJ$*~ zD_iuT1_#alQxW%p;J^;~dOH+jXU6)`{Yi=qHQ~wJa}6v+z6LnTrx^>N+1?a$bTR`S z?_Et79EI3WOQG_?n79^|xCR!~ufXt4JxS;jr@q3S*iF+_l8xy?-5-pKYmTXFV2#HK z)A@Q7tT0wD3RV=XFc1ji(I{s{!3qO`FdmI^)>Q!(f;NOYV~!~H1dY7MUW0=g`Ih(C z4mhGZJ&xWKjUoe~H!oaiu5p%rSyZ9FMzF2j%=u7f7I-QFgt6I!%~-CmmF7-!4J@u` z2=1k$PCS&6N&cI++c41_B!qJzJ9gpP0;NbqgI%7Qvszyy0hc6gxV zBPEL100TYA#Qj*1BJ^#6@^)r$*S7Rs1B)xG%W>?Zm;@4Y%!52rwl`gtFL?G}*%yO) zrQbE38EMv12wxWTm8RdTgxL_ZJ>6GI^K$RG23Et%5A=+VbbW@}1wZr_q>^T#E@q`I zgL7#0j>+Ym@V+hO93}ZmO&3{GQ~@ymXa_YlynJiV~46edjjV&!)4SXm_}mXY_yNW8ou_{KaUW47RG2$$a^i5=F;&Qe8>p%1x$OrSle6Ip z&4)-95$D%J{{1%O5+qJumdv>aY>&)mOx%Jk`-gD}j;KN^;SK|HeLZp2Vzun-f4+i?; zH>AbIxaM13JT})9{KcJ6<<0hqqlX6#gTDubd~ECfw;q^gm*A~qw@mzqLl`#nf1PRTr`q?4k~(t<@s z+Zv*ww}_l|n5d2FE|PR)g2EW z1+w##M7kk)rtR~UAgY-w8Jh!!Kvom!Uy?0Isl0=);pLtra%7CXi%doycqy8qiUH{xWO=f`C*vf7{lwH#m@$x1NJd$8BT3sRX@^TF;HaXU|1J@#YE9Fu?3a>o} zqLYqlGl(9YfG6I-X=EFUUyuf#c(W`z$|=~-M9i(6vqFe+4&?bEPP|MDg^S&IDoBcPgwS}7bskzR1Y z5GK}(oYSl1sNI1xwEy^GR{IG!@H3(O5e9KxW7-D* zJJHu)&~KGDHm#=m=Zke_W72?44lF3{xu?rBy^fQ|xLAdvwE~D(0gk~f(#71!hmRt| zP>a-DGptvWX?pf3VYJq6xWzxI5C#1f^_FFG8{()~IVO>dbd46x8vqJG19arnVZ)>a zz%}FAZVFJ-!KVEusInp~qk?xYv?~M))~(Dht|`AaE|#;!5VNlUpl84%@fb8tZefK< zbzmYV6nFk=Th4(%pyyD_A0LM$i)@?w{I9%TCucq)B6 zx%rdapr7E#-r<8A?rFmBVYTqUf|V;yk1vPt;|QE82j|=leZfH_h@YKc`J;}KjYdq& zepsdM`VC)oEgydASt?fa(0LF5bpX6(l8Zt9V`jdyAtaaFXEXSU{X z)0{VIsqY~FUjRYM1X^AUZWmO=`$NO+FTr9C!eUNHk4@NhC`yT225!2IbNdAZ9Vnkx zqYjDRz^UF5aE3o_+S@xkrVFkLn9dI3(^qOw(CSqu=Vrz1Hsa4L=UlE9%zhre+A>bg z!uXik=IO5C_we-2i41!JoCVAC?6Lw<&b`n{_n`!NDORTu8=5uPFa0wQ+Q;g$545`B z1WsfE6MIIn`A=@YhWYqh9A1AE@7w^1oTnVV4~zb`u<7mEtbNBXH;2n}*7^+LQEUND zo-TtAg>%h(2-dI0LwxfAyJZKxsxy^Wdt>Uz?+FXKqwR*yVUGn7!CA#z0Cpo(NjoCT z<}!aqGY+VS4D3U1g+WhcvG_!<&v*qyO97GqwO>GSzEvAMQAwMo15g(&WaaC!y>wM; zibyyOoz(%$v>dT!7Aoh9MjXVMYl?#{mE-Sah76?h(qhwM<2>_WLv&dWo<-pW6T6fn znx-94=P|UFtI=SkU6Lain%39L;1-3cd2j?W$A<&M);<`jR_I-QoF&;}zT#2Ev9~#X3keoPyFidw1uxi; zBo9KiH&aiQ1`Uihy_V=4+mB&xnWwYo1QN`` z_oh8yK_?(sQ1qZ~Y#63dJNK9;a%3S|NU&f?z2GPuvV?@N@*pH2qtV> z3?HS%N(hM>jiD_;C@hFS6tE(eSYrM9p+7_tELxz6MXc4vwqUV^epxCeu(jG2Yj+oI zcj@)VJL5TX=G?h+@12=DcXyuTrrS9)=e%dmoUiwN&pD8hk&%&+k&%&+k&%%sxmpWQ zAx%IVFd1kCCOOxKfg#`oFbIs)M7k=dhXR=n%m;db4+1lR8Azc7F#`M**bn>#cm?<^ z@Mdh1j!`B8*8=N+gFqqT-vQuzz#=EDRFS3{G8U>p7~c^KFPJOErt=_V?O3BX5z z+kq#MKE_P%&%kG$d&eC)U@7n_-j^~0YyfTq@-e2L2Nna*IBDuKyaL=rx>}D|xd`|J z-j{F`=m)0NK%Qy9eZVn8rY*=oV$3oLcm(ekc^FuU8ny;86}TFIN8ADIL26rv5tauQ zB7I9KT7f$pnOyl!1FM0S5YN{Yy}(|)8GV>=1>y3X^XzKldXE-wj}i7Q=lZi{q|@r8 zaaxOak0tK94LROU7VvjXm)3w+9Q{RhtTw_C!lbABevooBvp3A@@!s~EjVv!xF* zZVk9U^-Ms<`+A4H3TOy;W*VwVyW9xN0bLcy(S^T*zFd>(oPcK=kiKmcm5;Rq=OL9e z15cqc@dhw2#B+IIAJWO67n^i&KGKQrCERH4_y zwE*O6Zj4PjMI-j1?HoillTKhKDqp`r^l7OkkGC*_gg)flvosmeLh%_yrh`So+kqGG z<}bB1Wdh!2YCXZiz66{Bu8Ci?&@4b?3R0sq15e{^zEatz=pA^NFDH*Q18Jj+(y}+> zttsD)Tc~om4R4>(ZiF`>PxRNQegD_b5GG;!Rf$DFnBvx-e-0Qb-R< zA-RQw?I}wsUPU_*r-E(7YhqVmsU>|BSNYtDdOr)3 z5avac*|i)4Q>D0>8$fK`X{QbGW+?#M<4$Zg>IL=3otT5^9r8Tl+LLDPN6C9hoC&Q( zjjYTW`4r;m#BI)Qr+}}M4qJB~zsJVY3|p_7VMj#4UvHARmNo zy?dR6+UX)RAWnNDz{iX**9YJz)%lbaxX}n(pd}u)amh{d0q6f0BkFOz#{3HL z_f486B+mu>gP0{K`4+^H_&StM$JR8>BObG>Ss)-^<`;mswD4izUXnK$orm37q6Lwu z06ZQ?!mi` zo3RbRd*c?a1glW;bVnKSGA-hZql`ENVG0DK?^+3*)SfvBtRNYu2^;z};pQkK{-zV@ zfAM;UPeGcn9}=IMAZ&rSbOS%fTU&Nv_i%}d9P$o+fp-Yphz!vSz(Y|c_)C-lMyC&z z>A39UgATBeIPF`=uwj+yp;^rZg zcA?~ApfF#_WYkP^pmMot%InDFY$5PB=h~&n1oJ1ryJAfHu=DRkLTIeR6o~G5I8=#5 zDPjX+Ui}*K#Wo-#$OFLVh-Y9jsQq2i^)yU@=>Ak@fpk!Ru08)jn!k@A&Tb$zWF6uL zTTOm?@h=)Wsr?;!4H-1Twjv|1>qEqoHueLbKnzWPcdlIlyo?O<%XRF#0a>58)wmvc z4ao>c!T2{eE<}w?%vDNBG+9xMvTV#me312#*Ji5APY?bk>pCs|l8Z>gs1)>m!>q>t zc7FB5S-@Su-KaUkao`@*vbjpxW4WgH8z(K{9>NqzS#4m-S%heZT{FQuh}V8UvY9{} zlr>5XQy?c0i&zs8Yb+CF24YIp)fzj1FCyOhapJzS(}ZYE!gT7R$gVmddxz-c5$CWk zhm|g2T-C`QRAIb@7`HAX+QL|gsF6(7iTlnDAvH1*N+}o55WJeT8pf4!F|3{7fb;JK z&NHLV|FgObe>d6Nf%iLqA21)P2HijvtDljD zv0|W#ba8997V%f2j5q}KY{I>Vm`u1J-rfaZW7H9spq`x^HW9HcM8{oaJA_QGOy&`d zx4TJLH=wtvjT_Lp*q8FPpbTSc<4AZBD)WntFxOG;2+@1#rQK1^U4CFX!|7{iqFM>y zVIs;)?-?U(F5}mgbRRP5n`4A+L}dIYF}ae0ERZi?ceXy8@#}2;ZsS@P>cd$RXX2Nl zUdnxOCZu5&#`B1#HqCsM1pV0D_WKyg?9Sk3Yyfd!PCNR7ooz`ZsC&WRQRJS*M7OC- z8ke+PL-EyIccI=-EMD&>ImA?1KvX7XEzuW!PLCkHdRp|^4*bIjdzl26M&E?`3d~I@ zry)B~zsT5J7M(}(_8R_y&7%~zuEt6ZwNcp!va7>*rx)c=_&aK_5wkA97RI;3L<4Gb z=u^OlY9+{OR2989;J#jDSDkw0DuNvp^i{VHCL&Q0CZTq97)AV=OvcLgOhee$<%Yy+M0Zj6irxfMOE3I_~#6bq(jY7 zDJ}R5qXRkO!p--xq=hPlyQx3{@tF;?31%fbRmV*irHAY0cDS+Xt16`d*)r7?@@aw# zWd}0BN@O-0l7*DsCN__Eo7g8v@d&dSuY2YT6jyn;%d8_^3|S>NqpXfLI`GzvO{DM~ zE0Z?7g|ZX-`on36ZY!$rG@uMx?mVTR;P&<$)a>6>+~t7xR3L}VF>aod#%Y3& zS(<=M`gAMh8dBV6gy9y{#IS(u-WjxM<{a#*`yV;aFSmqUkA2b53g?-1masnjW>+2a ztgJy&IJB*lS$I!m8$o=6%kidv)_K<4bhB5B*PM8|8y=K%DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uy@;OXKR;=wz0 z+UeE3ffDWC3-zZ@;t?sb)J!|I)I%~cA;}?-jVskju&dMA=wrBqq{J!RrvZ8s8+YG1 zw=CG@-Ss>3pWnX!e$G+LBkSko?|r}f-q&^cYxiEew|niyaAwZh)rS{ngdY;hXy0hS zV|Ork2fzD6g*}X+ee0QWuWtTs$njZQ;(f!_3oVZex0%m6>Vg_p`V!T@4wh^!8Z5HdM&92?29(tNNZYu z&}!B4^R^-T4r)iNYwl6cRQ_gMpnXX3&CCU7eCLYZxHgkd>*Fiq9j*!9qIo857t)$S zZ)pCJjec}{9b@XogHx~G;@rM&?YGrw=I4V;52RR6E)cq%H2<}k@R9GIPv5puD^o9H z5BW5stWkd6DV1At;r%OH_g~FbJK1HkE7@V{3iTD;&6Q)=Uzw{x{FbzM!n zs`8y{-nO4JEo##{w>m%O?78mnZl%}j%#TwnZscy@{g^LsdgZAdTZCU!zwv52RIQP! zD7?Sn_QIa2UH=;vR6bLmwx?V|ZeCq@lFe@`!Q0U}jN2FH^xj@SY5m=F)q77gzbz=q zioQ@=$I|Y&(^c!OV9xKe#`a#aukEA{JeE7NzWS?o>d$J9D)~QR8)m#^zrn3lsk^>B z^xD?CWZROg1^3l6U8D1>WREAk+y6GUVAH=TR?A<;q#yFgXfhAkS@LvJahA?CUa{|w zZrZW(_ZsO(Px)BfX?pP2RI3WB)kd0~p$*6FHf)Fv-S+#V_fI3qYPRa|n=9XL|FBKT zLadrOhL!t&XZDxerb2<-<2xjen;HME{={_ckl%;n+O3;iKVF_zSnpic@OZxS{QJVw zSK9E-nvd$@?2>?@j7Z3md literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@2x.png b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbcfa2767c9593e104b8fe596ae5a04ded3c35e GIT binary patch literal 1294 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 N+f$Aw8?3S9{{c@|Ce8o= literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/moreBig.imageset/Contents.json b/iOSClient/Images.xcassets/moreBig.imageset/Contents.json new file mode 100644 index 0000000000..2bd4f9dce3 --- /dev/null +++ b/iOSClient/Images.xcassets/moreBig.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "moreBig.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "moreBig@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "moreBig@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/moreBig.imageset/moreBig.png b/iOSClient/Images.xcassets/moreBig.imageset/moreBig.png new file mode 100644 index 0000000000000000000000000000000000000000..a63fd72eafe285243533c16619aa9a1950e6bb67 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-wj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8d&?8!V{7DoXnVobR4_&bvUe-Fc2hu^{nlni*cG_H5}JLl7UR=WlZlLI;djI+Gv z%wbPpK4J0Yw1e!6%v*8+%w2rBY&Tfsc<=ir$V+_ZRbsy*>2{_#XXjZXfyga_0h>|| zbRPb`_LrNs^MR>{1B$-=y5sU>VQ<4yk-v@0-*bnDt*MggYV12zJGZJ~Us^_b2=C8V zr?)wrW8yh_VA`^|CRv9{cde3C$zlIxXBzCeT;PVtm+zC$Jv*&2;lKL*{Y;#>`5zf> zIey)!JK?uOGVj};kxQrP+df#@zc%1LvuO2{pf_6?YE75kux9)xm(Zs&d@%!E2_QZ{`&*#er*exn4K9DVEl-;;_u;0Gp^4%n7*Jc>}n!+1=GIN g^WyM;ee;Jw`nj0$-;EQJf$_=U>FVdQ&MBb@0G#>ghyVZp literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/moreBig.imageset/moreBig@2x.png b/iOSClient/Images.xcassets/moreBig.imageset/moreBig@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4dda5c166863d5ff1cd8c3f4424b3ebbfeda612c GIT binary patch literal 1015 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 bcmf3V_;jAZWry#g&;_9#Jsqm-aLNAzEndpC literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/moreEmpty.imageset/Contents.json b/iOSClient/Images.xcassets/moreEmpty.imageset/Contents.json new file mode 100644 index 0000000000..608e3161e0 --- /dev/null +++ b/iOSClient/Images.xcassets/moreEmpty.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "moreEmpty.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "moreEmpty@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "moreEmpty@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty.png b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty.png new file mode 100644 index 0000000000000000000000000000000000000000..f06ecbf37cf0f4c07d306ef2c5486349d151646a GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt_go-U3d z9-VK`8}czG3bZ{;k6hZUv4i<$&P%px)%F91DlrU>Tl_Y)rkzMzJjs6HkNfXtfA>yn z^HKXO&Qrbfm{78f-Ix8JT$gV+%EEr8(0%fS)rBsSJCAUNa@lu06sg`a@%D+$BLB8N z>2iHODe#H6(*HDJ{dEP$tfuN$9o354pLl)0Qsem)qy0}fAIvmMbe7H!13HSq)78&q Iol`;+0H*6zDgXcg literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@2x.png b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b004371d02686f3da1ee31bf47b44c9bb04d5754 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-wj^(N7l!{JxM1({$v~0Mo-U3d z8I5nRc;+2)5NLfk-(!a8VKECoz5@k3%c6xGlmf*Pcd>0S@7CMS^UB2A{84St$?jF* zlWrF^cYwi(=nRJ91m2jnVF!3l#3}GQ$p2vdRR4>Ke4%bf$WRz-lvywKHJ;N%d2FpJUdc##&Zs>kb^|)L-A&9RwW^Q2Od4%T_GQzbBR1+l{}Q2X|l^q?{Du5FP6I-t~^L$ znyIO~rIXuwj=ExI!oJU00e*9~$^{lpIU|qmk z!_+(>oIiuXgh53pX zfB$HBe`CI=?U5XoXH)7nWo7SsdcIX8bj{n(EN9soKfV@x95h@0Te5ES?Yk^z51jeE zFzCpPE6>{hM(mZa7D+vNtMAsuEzhmL6+ExGqZ(Ln?tRs)_a~D2&TUvBxA`XL$9HO( z=jAVN;j-T0zccY#1OMu0S3cLc%WV$ZByA>Pztnh!a*}x!qgd^k`6lyMA4pyBLDJ&z zoM);J7{0&U(f?EWN!h9C9~JGlB+jl_{Y^X}`Pir9PYkX%z^G;LboFyt=akR{0JMMY5C8xG literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/navigationMore.imageset/Contents.json b/iOSClient/Images.xcassets/navigationMore.imageset/Contents.json new file mode 100644 index 0000000000..fa2d81caaa --- /dev/null +++ b/iOSClient/Images.xcassets/navigationMore.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "more-round.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/Images.xcassets/navigationMore.imageset/more-round.png b/iOSClient/Images.xcassets/navigationMore.imageset/more-round.png new file mode 100644 index 0000000000000000000000000000000000000000..4440d0415ff97ccbab30366093bc228d95938f31 GIT binary patch literal 848 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 Y?2$#Az*s~!NihpLIYg$as$oO$A0hjjQvd(} literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/noPreviewAudio.imageset/Contents.json b/iOSClient/Images.xcassets/noPreviewAudio.imageset/Contents.json new file mode 100644 index 0000000000..2854571244 --- /dev/null +++ b/iOSClient/Images.xcassets/noPreviewAudio.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "noPreviewAudio.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/noPreviewAudio.imageset/noPreviewAudio.pdf b/iOSClient/Images.xcassets/noPreviewAudio.imageset/noPreviewAudio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e5cb56cba78bd62bc5698758ee8bf1a12df97ac GIT binary patch literal 1226 zcmaJ>eP|nH7^j^TIR()_h7-g`OHHEfedKcaY6-MynwIvOHVJmnb?xQyHaUB_H{QK% zvpQi+rsBk5DP8OK$J__FAu<=ClrNm@waqSp#+WaB%Pa z?)N;X%8IHP z1Y6lg=r9P~Kj#Oe|gA1?%V=Q}XWyQV?0)FV;JNOsWB&6Oir1Td{CdNM*SDWq zop|$xGx_1_<&`n{n(NozlRJbzPTVcF-;Nc(tet9>r}EinV(jlLUljk|cRYNldf~{_ z&SJ2N$sTHE?;Wn14PJit;qRVzB#-s(zvlYvi8JRLl$sV&KT;p=TN!9t z#y{`W-#i`tWaznf7PnV>Ut8L7q-OrOdGV*k>0{#uA5W$p8E=@aJ%z4Jesy%y@^7ej z=%e7>t&_L%omUSn-kg}*c(rTyrVlQPmNQk=m6}=J<6v%_zkT9f@7_DJ-Ak9gfA-bu zd;08olsi|RjJwkGeq9zc5{*p+zBq|W#I&zfQQhtZa z?~Vb6ixfySL2T_%*Qf~g?BgM7R52*6DO9@9&r{IjrUyd|1pJj1bq`~DI1FNeEr&S6 zC5Snyk{-n@fjrf1X$jK5Vec!<{w$xrN*$IRZqy*Q;ySgo1^srp@qvowyzAY<3Q=^N zvA4<4>eua3Fwro>gOB0Y47`#gN-zv-m_VIu17i*I3G{wghl%_HFwy@XUf=<~0WVGb yemr6-nvP8S>Pcu5h-SydF(zQwMjO~+3}djbCprYiB8o{$RS3KwGIe#4Sld7R$dQf! literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/noPreviewVideo.imageset/Contents.json b/iOSClient/Images.xcassets/noPreviewVideo.imageset/Contents.json new file mode 100644 index 0000000000..c3002c4769 --- /dev/null +++ b/iOSClient/Images.xcassets/noPreviewVideo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "noPreviewVideo.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/noPreviewVideo.imageset/noPreviewVideo.pdf b/iOSClient/Images.xcassets/noPreviewVideo.imageset/noPreviewVideo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f710e31f4d4c962780e595afc85683ea0bea502c GIT binary patch literal 1158 zcmaJ>ZD38f;aQBj&d{;>WL;s;m?0R_=Nrp}(%9Hgbg!p=VX zzBBLhyw6NyvLpJ5BI{D){lEU4lN7+f28N_i2t`~J7dfF1+(f`T)OFVouJ44;jR*tC}pbXgqvv{qU3i^Q%S=|p!6*w!$G7&V8P z2yAENgT|g1(qvtgRfr6_tUysfld-HTSd$f1g-)BA++_|5%8H0FNRGHxb=hVKC0&*+ znN-wi3|j;VI#38`;zy-^i#Z*HQ)uegreYN<-oQQ;2ex9oMLZ%d!Lt7!5)Mn$$$F}2 zHFZn^iiFw|fOavrKTP{dL@iZte>0 zK9c@&k{&(0*?oBN&5EAmuUO&sqxjR)UpIWPVdc+5n1iQRQw4b3mseZH;pMET{;@OQKLmyc$57;V3v$;{tbJ2iEB zVEfce;oA6#=?kkr4vl|%>%sl)qnAbx_m+>X7|mSYJ^G<1W|ekTR<)*B`rrr!lq7i} zREic^$u(&agd0VhO@ngit8^HpX_*6x7erut^&P3c`c=dyN;VF%7)NrNUx} zcGIjygzuma3s6^utF>S-P@9SL2ouhBcoDo_rX*x=w`B4paVsDermIZB_kP)b?BRV@ z4^NFp(Oa(MaL+DXR<;Oz9^KUbnqmA)(;|cuo8`T2@`C-6UCJ)aNf=rsyg0z`^JzZF z!6K%JByWJTi1~HFW(lTYap0F?THs$;;6HK$!C))jiMb%=`UP>L}Q9ycLi b+{rQU?iSGmsmO`TD=dP#UutaZ?1{buHvDWt literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/nonetwork.imageset/Contents.json b/iOSClient/Images.xcassets/nonetwork.imageset/Contents.json new file mode 100644 index 0000000000..34ae16431f --- /dev/null +++ b/iOSClient/Images.xcassets/nonetwork.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "nonetwork.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/nonetwork.imageset/nonetwork.pdf b/iOSClient/Images.xcassets/nonetwork.imageset/nonetwork.pdf new file mode 100644 index 0000000000000000000000000000000000000000..777d945c779186a896ef672389cae576b7a8a790 GIT binary patch literal 1177 zcmY!laBpkQ!zW}-e&uR^YwB~SvaI5R)bC9xz`LBqw$$iUFj(7@2Zz{1GFz)0J`KplvH z>U{H4@GG&i<4Vm-0Xe}4;S{&boD!g=`ffQu<6Tmd^HWl}^nFtE(n~TFObjjT>=cSi zfUeEus+bcRWSu8#$n&O@>l)jcjwvh7bH?oc#3(msNd@18C;uASr);Uar(5<@ny)=Y z*I4dU#r&TKb+T+y&pB@I|6*Pl)5WV-@$2#X{olWQbE%(@+?!h#%DLsem_yy3lwV)% zHD51qlJ{J(schHbU~9?m8Fq&zYMTn>P5LXCwMKYb+ss~>YQw!torFzW*Isxa#wmJX z=lYg|Sq8Ipznt4#;pLe6*f4BTikS6V>3`wTJ9y7z?L9LyJnX69+$k;k2aOQ8dysyR2 zeeq{S*xN5xADSioPBx#v!Y0{awX)H)g^K%*Dr(Js$8hY<_m-=1FXz5~%z9_evUl7+ zc1@3Hn0G8WPe$hTKE`~}&Hw%EFKgfPS76_E0~EW^$b!bRF(RHrDhpB-^qmt+5_9s? zfvGJqJ+)ZD1SlVbNERS2G=)NxgH-`jV18*{iGm@QzISFyu|l*dNLMUE8;FmgjY~f$ zwK%`DC>dxCFvSB?cXDuQ2~amUW$TBeR+K2{d*%Y2;RL0fp|oc#m%eL7iF3_{4B$Y)%+%D_R3S|PE@lV}0uWHh zgNqrO0z(r`%*+Jn9&|AaOAIk{6HL99MivNlB}IvuIjKdUq9i!8Di!ED{h<8(5(Q9v h1HJ2+mzJ*pDsDh=TU?S@R08&erI{(0s;aBM8vyHFnV$dv literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/notaMusic.imageset/Contents.json b/iOSClient/Images.xcassets/notaMusic.imageset/Contents.json new file mode 100644 index 0000000000..857154c7de --- /dev/null +++ b/iOSClient/Images.xcassets/notaMusic.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "notaMusic.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "notaMusic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "notaMusic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic.png b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd41c8713dd6d589f35a8cdadae5be24d5eac92 GIT binary patch literal 1521 zcmY*Z3pCVO9KIfTjAlG4ZYsVF4hsM_5I`t=q}~h)@DN$ZWEcBf*yug7NWVoTXtnAxwx30Fgt0 zh9NYz50VoS9Lgea%uqWF0yGxFSQK)H!VWS+k)2$TR*Wzj(g^b-#sEcvA(2R8nBO^q zyY;be%b}SWiq2*;30Q1oWF#gMk70!QV{xXYrdR_*tf8Sk#L#C&g|dA(`k}0YUq$}W zv8J(n!vdJ>07fWMsOxi<5zaP4p@c@?%h!Ff1J3>H6w3OR7L*`X7{TH&2H5Y~&{Coh zCAfqI&>&}_J_$$MVg3*M=0n5^&HuBRubJ+kP^u&t5&QkvNHE7XZ3=X0qW0Dn9(M4n zH=XFzlY2WBV?O5*imzu!n%%WMsc2@oQaRa~UwtNXR6pZ9v5{64|8?;`h`c&Bv3jp~TpB#9oqkBOaBbQW&#SYd%jqxC9m9F8(>tQL0EvuQiq0UY1-NR{q{GP9* zsJMD0KO{J~Cc|cy!fmY3mWq7l#tl17G&ObeB$27q&9`dd?)&WPseQeDeM70cS55%l zf;8_>t?oXA^mZNxkH=qHUOu1TKRGo;vr!fEBX$jAbe|%W;>=yqxmwSns4es6z$7?I zwqi>_9r=8RP0><+#E;9NKYD3l&a0N4Hhy3vW!H7@WlDBzopbZW#i7Mbgvp);wnt7$ zS6!>h3o(tSU8lsv9(0YQ;J$3*;%(*0xQW=^*)shDDi2YuIz@c(nu}?k#ICX`{BV;} ztHCr>^f7ZGD_uS6`D=}tnew)W%JNmJmyjY#uCi(TBsXCF645l4st3E1DCsel6KFho zFvt{mzFP+ICq!|DtM5Mm-DfhmCdb8SO-Um{g`|5y&B}{MNq^PE+m@dyYd zW<}DrWrRrlJ;rU?!{Xw~`3V)d=L)|^B{@n-C56Vo%s00|vcFoxLaksx__5mCI9pd)dSCb(%gKx> literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@2x.png b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aed44f65487fbb7d7157b7935528de0963ea1446 GIT binary patch literal 2595 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@3x.png b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd918083c68524ddb9ddfb651ff722a7f66b0cb6 GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/offOutlineImage.imageset/Contents.json b/iOSClient/Images.xcassets/offOutlineImage.imageset/Contents.json new file mode 100644 index 0000000000..90bb416360 --- /dev/null +++ b/iOSClient/Images.xcassets/offOutlineImage.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "image.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/offOutlineImage.imageset/image.pdf b/iOSClient/Images.xcassets/offOutlineImage.imageset/image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e46da2947e728bc562063fccab54b7fd22dc980d GIT binary patch literal 1186 zcmaJ>acCP=7{^V@daH;?89FB4X1g|Q-n+|7a*fu2P0}=UX=ARqN>{tv<)yjxaxY$9 zFdfr@GNufiqBzhN1gF9VgE?edDKgl~m^c|sv@(&^PN!Qz#XpL&I=_ptfew5e+`Hd> z-}}Db@BQ9uO~<+)Q{{lvdgazHbCL=Q@Ljv5&Q20_nIX6f?J2&;vTcI|Wd(M$rwr3_ z1TW>EfTSas4G2KL4uha7BWiGj?(o4=#iGr&vt7NGAVI3hG=z!0Jp-w2Tfw%*7$lfE z#xbyqSH|^c5`@Z>$^nSxU0z^Bqq2fI9aL8RD#UGO3YR-xeOaZT8#%+ZYU}zWl6HBv zY%*+AAF~XCe4wCF{81%faVKU72JNxO{fb{vs1jCHss-p4MQOta<5E2P{~?ix#GI@r z3$4pz8lXy~D+Q#Fy9L9p2L4x)ER)DK=8TFw_(T3k1WE#BE=ZM$ z7oS$0dp9;MEJ-(eZtQH@I(_Zt!1!5T^5lBo#XBF){xmpy$(P=Ff2H#grTFQO(+g|+ ztoDgFdVaXtF!KIlZ2zi{mTtfF$~SF`zEdX}j(pPcLAWJzdoNr3eRa$J2TpGPd!~?n z^Vs2;<5SH?*Z+C+g@^xwd?>IXy>Zjp`G;QLd*l4uLv4lK(dK&&#>X2tH0tJizcp_@ zb7bkzgZcT_j^Fw=H)~#=>$%UG`s(y|jjt9P-(90VIurTq+GOANrTo54rxR1h-dfz8 z{Cw*ChG&1aFRz~bI{xMJXMFpvztf~&I`CZiu%~*KCMfD zM#Fbu9opS-VZT<76Ru&|%=PXR-P*&jJCfmCfX595OgcFZ-o1mHAeDsSiYkk+hIdkH HyubS&w;X$@ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/offOutlineVideo.imageset/Contents.json b/iOSClient/Images.xcassets/offOutlineVideo.imageset/Contents.json new file mode 100644 index 0000000000..a3f76c948d --- /dev/null +++ b/iOSClient/Images.xcassets/offOutlineVideo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Untitled.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/offOutlineVideo.imageset/Untitled.pdf b/iOSClient/Images.xcassets/offOutlineVideo.imageset/Untitled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6174b23e8112e6725853cdb80b895308f7c57298 GIT binary patch literal 1120 zcmaJ>U1$_n6b64#2DMTtR4w+zZduML;XOeV_+3dz8*|_XP6VMQ@vp3l>vvcF@ zO<64!A6mgmL#ed>Ae6pUeGtX;A)pUI@KI5aB$R^agQAf5phyd$XVx_f5qcT8cg}q0 z-t&FmnH$M>W_B5RixzqC{MjST01EQZVXeKLqyoW}44^3|kGY=5NmQqBuqnqK*H^Mq zYJ;q=ga;Uay*3PhL5Ga!5IfimyT`^n(Ju~lyNX0vTxT&%?B3It>)8pOJ1U?{IHMAQ z9kP1V-rq%-&Y0c;sZt=zg2b6lF(<)v!!#i62}cFe56{;P1~wn&fm`3VStI#C7RMcd zh1#PoC&&lNafTmi1YGHNawVXtv(=;~rOb#Ml$r+HLFpIxATB41{|`wfHQ^USSy)3J zhl8P!jvSC)8I-x#0JStg8P`)-8OeB9L#J?LQD~$`_#>(Wh80UDp`uXcvR1vgZ({d` zX}WIJ{PFMa?)h%UpL??UqV@8`+NZy#S1giiy_dBMm)pMnb9Bw*{cRJ8I}7&Vhxwl? zgU`~(iTMjWPRx;8Qhm9wY1`ya*U!7%|6bh~v~K+>x!v0S>-3c~ua6WuK4}%?#_f;A zjt~0>W*Ur_8XaDf+M}G6YsrjjU zJsW?V*>XPr+lls}KVHoJ!!DVBPr8{kpT2T$&QG)rj@?>+D*GrDsZOUZm)TIF@93BS zlIJ5RKtWXGc;JW%V4IWXp)`sL!eToE_9ix~jTt6*`K!T?|4; z3P~L3qbRx@I|>d^44Mg3x1yG1HCC9OlGw98o)(%^(1@*qaYyBOPzzG*rrHvsZ?}Et zd-z)aEgD2B;dbM`3j3hjEh2-EZ(*>}39;pADXzFDN5W%9kp8k$s(~2RD8x0oG$0m@ zvM3D0Qp~`laDcxQi_!OEjAAj%aEw{+#S#>YT!u@;@EUj*Qvr895rj8_?H&_Y9Vtku fAmoMuX8mCa;jMutXcff+Rbye%gcgaU_h$YBOeR$x literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/palette.imageset/Contents.json b/iOSClient/Images.xcassets/palette.imageset/Contents.json new file mode 100644 index 0000000000..6601935c6f --- /dev/null +++ b/iOSClient/Images.xcassets/palette.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "palette.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/palette.imageset/palette.svg b/iOSClient/Images.xcassets/palette.imageset/palette.svg new file mode 100644 index 0000000000..6ded5cbb6c --- /dev/null +++ b/iOSClient/Images.xcassets/palette.imageset/palette.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/passcode.imageset/Contents.json b/iOSClient/Images.xcassets/passcode.imageset/Contents.json new file mode 100644 index 0000000000..63ca80e76c --- /dev/null +++ b/iOSClient/Images.xcassets/passcode.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "passcode.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "passcode@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "passcode@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/passcode.imageset/passcode.png b/iOSClient/Images.xcassets/passcode.imageset/passcode.png new file mode 100644 index 0000000000000000000000000000000000000000..41a50a2571dfa9d0343d8d09041dcaaf68e32492 GIT binary patch literal 2027 zcmV4Tx062|}Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p z&-NL70H}6&O2Ohrf5S9hN26frd#!pvQPb zQ6@LfwN@8K`IXz^_Lu*E#`8l5xC-3f+PF=CdRJCjQyD~&gXV$6B1NpLDBT0XI?$GR zb4px;YKW+h{Tw`7F>2%pWgT&(TpJLfAG6kN8fFf8vx&u5>f&dqw@tqB{zDqj;NWf7 zm^P;*uC_=qx2VuWoq*Yq4#HO{=@aUyV3M2^P*Ql$Z^6znm*4irb_og>PsnDy9obc#*f#PBR`QSOlgRxWcqh* z3jcmL2s;Bwq_k~?WBUcv0s)-xCSfk-B=zOUfo?}=0#YQRZ8T&%{{}f>DhNXq7adg? zMXp};K=Jfpz)v5;!x1^+EDF%={A%N3uzLk~&E<}P4_?P|^ww{USvkKUg@{zM7J+)5 zhtj!|ARISbqmj7?;xTtprpanNAq16ULXMRZ^zB>?eLFe+(k-mhMKh5)6WJEX%$P%#wAPaA2TdzX zFvQ8a$U$%(!TC3|4xuJWG`+!KSnG6jn$SW-G+F`)Yv8e-YY3rsp5Kjem0B*HmVEl4 z3Ccn3>7yFeOG$$m#x>^5UJ`RezgP>NJ*GU0qy+h(l>?P$P6j2OKP(;hUrxeNZgMF> zd)oA>96QOTP$b<6!m^?Rg96pNm%8@op+xE)u?;u9qJk|WZ@sCv3SQ&})oWMJ^y^35 z)U*m&8+=oA002ov JPDHLkV1kM#<01e6 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/passcode.imageset/passcode@2x.png b/iOSClient/Images.xcassets/passcode.imageset/passcode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7859c3c887cd2e332a23111668545cee989e38 GIT binary patch literal 4598 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 \ No newline at end of file diff --git a/iOSClient/Images.xcassets/printer.imageset/Contents.json b/iOSClient/Images.xcassets/printer.imageset/Contents.json new file mode 100644 index 0000000000..d92ed2c7e6 --- /dev/null +++ b/iOSClient/Images.xcassets/printer.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "print.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/printer.imageset/print.svg b/iOSClient/Images.xcassets/printer.imageset/print.svg new file mode 100644 index 0000000000..1eac5337a8 --- /dev/null +++ b/iOSClient/Images.xcassets/printer.imageset/print.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/search.imageset/Contents.json b/iOSClient/Images.xcassets/search.imageset/Contents.json new file mode 100644 index 0000000000..860d5f83b6 --- /dev/null +++ b/iOSClient/Images.xcassets/search.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "search.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/search.imageset/search.pdf b/iOSClient/Images.xcassets/search.imageset/search.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cf4b343bee1290718536941a89f7d2266792d886 GIT binary patch literal 2031 zcmaJ?4LDS38{Vxgc8vB*B(Zf=Xp-iChA`IOj3JVrV(qlXI2dNmsWHYF(ITSVtu*_g zNV2o)vKdqxn$(B<6q8M9s2G1sq9*N^)oiq9tj)FCb?tkd^SsylywCkU&-0#h-M5v$ z2i*?8jfAqgH!(hl!UH$}j)+A$Ibq!eAX^9vfX(hP0+`QD;A2o&e*qkszyT3wU>ui? zMX&&$LP0j>gSjx|!4`tRW{>Rz9Nqy(#8L1R5{^K!#o=s_2Z{5ABmX^wMni#6q^<AQUZ(0q_J8kwydJg-E%4l(;B3-}mT7DmwEwnrFpQ z*@ijq?XC}8SI2+V0)$2`*;MCpoY89(+82{}a$EVPmnoZk_cUob51DeGX|+?@v2GeX zq)}@sVHeiHChy_rSDxRoeLUA*`Aj=}!}O>2%JnmeH8W@1VWU{zRP5Vht&T5v$$nVR1^5R{Lx5~;i0414$yZw&K)bvr){jOB(^0P-UTja z^Yz8dR;ItT-Kx5Kg_uv&#%@Qx*N=*eF|ci3eaAC>eJD*P8BuujNmgoA6P9l?JQ_wy zE~R<5H7ZIH_dU+uCYgHqiZIFR;99_jm~~wpUrYOXdW=h3Uy9;1QEh(EP3W#G?-H*E zDjV+_8;)7d{twANqa=i}-yYM@Wq#7EznI;vkZvwMHKlqKHSAC;V_JTF3!3&i-(nql z$mgj^X<=aWu57pc<(HS#Th2*7E+s7QXX!5cF9)POK_J_c<1r4WK1Ks*amXKkKd1+Cast-g0cJ1yjR94p(m+vl5nPYf521BarYwvz;bxDvHE7>wBSCCI0L#32Y%ZEdI6YJle zZ|iT05M}k*UQCW;^rn=R*N9}30ljq;Mendt|BG$P7fWG^@}XB^az)z%`nACdLj`Fn zF}kw5^ymlCTiRR)J60r@c!`^+jAIsz>7XypEoAfHXoRQP(O^74LiPg|301dT;PyYm=c5qrh7%wmfJb3{xRLQd7+Hs6Ey8r` z_h2Y&02mJ^2slU@L@N+o-~@s~1U;__*dS0W1h7m#Qij{Y?7lEFStzWhSjY$z>ZAg} zGH?Lp&q9%$SYI%b%XWjsKo|~j5^?h{0&#~SAqXKEbg~ej>rj9!|JkDMpugnHRo4=S zt+PAa0UTnz=j|SVfTY<0kWkn_S3oF8K(xfo7r^?#0zR9!*tb{!Mxk&36@_~@01BB* zBm+^vJ0Bjo9o+z+cRoBBx#++9@Fa@;dp`2}SUj1Ebo~!3m4vkXmrp2Qb9taZr_X_0 r35ZmO4S-=Gp!*e&TVX;`Frd?L-Di&%vIWBVF7Wnvdz6)x=T7<`%;r`- literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/share.imageset/Contents.json b/iOSClient/Images.xcassets/share.imageset/Contents.json new file mode 100644 index 0000000000..5d0e2aab26 --- /dev/null +++ b/iOSClient/Images.xcassets/share.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "share.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/share.imageset/share.pdf b/iOSClient/Images.xcassets/share.imageset/share.pdf new file mode 100644 index 0000000000000000000000000000000000000000..037bb6d632d87b405c09765131a504bdff51b545 GIT binary patch literal 55201 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/shareAdd.imageset/Contents.json b/iOSClient/Images.xcassets/shareAdd.imageset/Contents.json new file mode 100644 index 0000000000..cf2205ffcc --- /dev/null +++ b/iOSClient/Images.xcassets/shareAdd.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "shareAdd.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/shareAdd.imageset/shareAdd.pdf b/iOSClient/Images.xcassets/shareAdd.imageset/shareAdd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a8c5c91930acdfde6c7d1723fbf36ad8304565e GIT binary patch literal 898 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 Wt`-zQi6x6*afo3-#) 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/Contents.json b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/Contents.json new file mode 100644 index 0000000000..1d44c683b2 --- /dev/null +++ b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "share.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sharePhotoBrowser@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "share@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share.png b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share.png new file mode 100644 index 0000000000000000000000000000000000000000..6c262ee817be64452e5655a1499d45ead1af75c4 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%C&rs6b?Si}rvRT2S0GIx z=zI9>6VM2;k|4ie1_Ar}fcO6s910rte~7>E;`8|f3%)!*HZ8gnsDiV=BeIx*f$s%0Gz%imVCp3mTV i^C$CN#e;w6mhLNA#&&m+li52^*m%17xvXeK@{R|9-PT!HlP z1AM7Lf_^xyyge!hdi{__p%3l<#s=XT8fxaWxn{u8`U`JDDWbHVTI zhjV|Ht<4WutddY4^mnQHhI^Nnuhd$-PIu!b!!6rP^x^||eZCZV8)zhFfk$L90|Va? z5N4dJ%_q&kz{KR~;uumf=k1J}VTTL^+Lo{N&D3bx!L%;JCBSj%yWhY5^{Z?wn00AO zWWV{Z`(GXQeLin8cP7h&`29-9OJmP-WgK)5aa1)?dC27zTH52|+7X%{pviY(&Xz=r zS?&uR%+EyewO&}XY;8IrpGui*lp1_rO^;DsvLVOw8}F-EDn4rIOVn0;m+!Vef7LNCyTt0`r*~VFYs9`S z+_Hdu@guj_Esy^Fm|EGVvU^*|{V)ryj^~_}>1NMmw5mUgPu;t7!m6COucDDli?=v^ zOW$OEKlo#=IPyHIxz4L4M=Wi|L`~t5RGCV)6d-2A~;0QghW^W1g z*F6$ZUJ9d-Neb0tds<=G{PRsW|xIAmb5^~>?Eye&^0x5Vq4iGuQyr>mdKI;Vst E03uySCIA2c literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/sharePhotoBrowser@2x.png b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/sharePhotoBrowser@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1960d136dfa951b465de5a8e583622d2765ab93b GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@C#^NA%C&rs6b?Skf%mAMdS0GIv zpq}%o7ig1mNswPKgFt-${`vV1_y4~SC@^T4u;IY-ga?28>lH4XU-0JjhxPWqU(EGg zTn1FmS>O>_%)r2R1cVu^Hh`1!wn ziCjhBmZ{5XKAu^A@1XO2;g*WW6K3---L&=z_ld%uMNhi8dO9^Q?Hq+O?}&p=fS?83{1OOg+x|sj~ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sharebylink.imageset/Contents.json b/iOSClient/Images.xcassets/sharebylink.imageset/Contents.json new file mode 100644 index 0000000000..3d40e6ef2a --- /dev/null +++ b/iOSClient/Images.xcassets/sharebylink.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "sharebylink.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sharebylink.imageset/sharebylink.pdf b/iOSClient/Images.xcassets/sharebylink.imageset/sharebylink.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40caf0cbcfcdf167335da933b6081cf8b85e289f GIT binary patch literal 59178 zcma%j2l(q$`9C0A!3hd7zFY*sa7ofOX>z^yV%l`3BTdpIEh3~%(xy$)Bu&#M3dj!u zWrOU!hcacz5Ri?4?9F8>Q@yg0A^+3%GDP%mpXYm@HaX|bIq!Mr=Y4axVd?B*bVqE1 zZJvGZ?)x`bKe2!;3|hSnmM(=$hOH@{5oziI3YQiz5=|0tbpeMn3kfnFhb!Q+uz(RH zk%03HJ1-=X_yU?hc3HlB1I<>aL>4~xv%$pE^bHaV3y7DLeZzh6uI+uQ_B{@b_&f&AMzWV*4BpX+;yVQSu#K|J8i0vd<8!N6a@ z0OL5gVC#bgKy~_+-g#*(ohES5fyU8fDnVe`B$6Prm-32@b^9yle`SPLfX^OSM`rRj6yY04Hd$-*V z-)*%u_S)x5=lt}mKW}`C*z_BR-t@>R$LvKNwpZ@ySDCeUjEnmcUpe{My`K5QmgijX z?bTLad$r3pT>JH@0IZ_4N))E-StVCx%~w>#R~Dwr<6u_lXu}0`_FV`a4Nil5=AiS5 z7y<5oG?()H)L^nRvLmuE{ln1MNB`~ur%X*#|Kr{C!1guUA1)+kPfB|O=Rb}uYpS9A z$GfcJ0Ya-*%xS~H$ZKmuAP?z*Iq-N#X=~FTJhDJcAGLfroSFDJ-Uplq*K^=H3RXY6 z!Gcw2o^Q;im($?Rj1SAf2T0X)#sUHho?-pR#mqQ1W#K36nr?6vt3T(|R~c?b|4!yhKl>ouKicb|qt1AD)L3`3yRP{C@3-A{!_D4W^tXqe{p&x@IO*iI z4mswL6VHA5@b4XYyKvq6uf6xwuGb!YboIi^-v9e^{VRWR^#k`k_}a>!@A=eqKimV_ z_0gSc z*YOWL#0>tljKQ115)z>!OXM@4bm+yZ;;kd1i-{D6G$@i`C z@GIZDU~{?A{N~A5Us3+n%iq}P%$4Gbe?0J<9haZ5_?PbCigo+T zS6})Pa`Zjt?X4bs-w#s9?zcf@u=tu^UG%{zZ(M%x@A^01GdbxIWbNC2y!M4AH- zp5MdUvfDkd{J|rqJTzJV#NY1t{D$KjZ@lL2^S8o(b?qxp@5){CU%U^Tc&t-F~HX`5yW!caPWDST3&I_S?t)^1RhaM|)$-qwoI5dUw2k@}*Dh|NL1S ze>?r|W2b)S-F5eS__ueydDPeb@`W$Hw(RcXPPNZk^NhRJIQ5rT?Q-+w&uzEKXulWE zXrBJ`4qNVV7<0hdD~`JN!N;C`XNy;S{=)5VU5NeWl^0uEpZLhd8UFHzZs6ZvcddK( zS<&6vq|V;^%>#e+im&c=PyXP;4qJDp&29~Edgi@R*1hrKLkmxCzW1WD{`iC4UU=}w zzf7*V&1LIscj*tmfLyuJ@}8`GCueDU1}9o5Zlnmm1nM{i8V&)(q3U+uf|+D9GJ zh&6WG+T~~68}3uT{u_gD z#@Hve7~hWEx1oQivHIiOnYZq5ANY;iQ`uV=RbM>tt^2wgEc?P`YhU{KV;9|d@GHlj zaPRK#Z=zp&>J6PACw4rLJ8aW^!b@WA^5>qteElz7zOwU+Gw=Gv&ZnMazQ&4?pSQdr#f? z{5IFP^OEjA&e?vK#yN`~`ueNauYbbxP4ldnd_YJhk;q=l=?!4>hZ+|m${}%e1 z@_6xwfBh$xySsYwWS2d!eShoUueSHE_k8u=jqcR`OfA9Aa3P&eDMR4Nfwx@XcKOIb zPk;S?O+^e#CV;b#f7)K0a8xMpDwr*kF z)xVa?Ke84@ul0=#{j*;k8GFd`v(?OrJ6_N}f5V4%fBC*IyotR0B5~=)4YBGte0{Z3zI*1cE_)F9;%Wyybjsbu18?4Vqi?j%SZ}p2 ztiQ0vS67RL=kK`q`&+H^^x?NK7d2O`_x=GV{b-#-jcXQ_ZvQ><_YZ%u_~Dl}SnUU! z5bJDr#AV(I-*+$gRr1BsTbrB^o_XZ9`_{hx%ByR-mnSanopj9$KY5;f?56b(68E}f z`_74}(~(z=6QqYXIg;4=Tw?s-xktW9?0WN~XWo8J?YZ|?eB;-(+k313;H7P^rnZM~ zee}zntCoM4`M=lKSnW3d!SDa@-3`Be#0G2Mf97`{yefN5vu^)>#h#^44u)Q;Hzj zSx??||1a;n@+9j0FAl7oUXYfp|I^9F7yj|x-(G&-;?)kkaLwPp_WaJr-|^mR$g9_G ze(gJV?f%YL;r7XI`O3A|zWL^x%X??8xK+3(`R>UZUiX8Qzq|WZf5q{y?dIMdJNDw+ ze|qf8+g^CVuke>IZk|}W;HIDLwE45UZvM{e;iR+u9Y;iGZhXjXH=bQOzy8c$ANt+{ zYmYA5nD2kce|=Bwk!oV6hp)Jzec|dCKC;e5JHEEsYrp;CYJa|OHSW?4p4#ilHx?gx z_&Tw_V^2NvZT{qt_#>DStO-2FyljWteLW80@!hj#n& z344A2D{Jiel{Idl58ER4^o`pn@}AX}owLs3Q#SYa+Tx-u%r$P@?fc*Q z!qwOB;e6%5y$`v5y}#$2Eq=1z1$*th+t*5a@3-69OV_$^VckX4mwx`m2DRa#(4W@& zN4mA$*Y@9!J9US1R{P#w!l4_-Qj70d|D1JR-f!PiH^0Yz@$GwRFRtltc-5M_uT`eL ze9FpGjz-qFU)jQ3=j!XPz35v9@5Mj8*<`)*{;&V^wpV=pN9%m~`qTfu{2k;cYb^ir zu6uv?nf?C0!x~@N^oHDKU)^d^_B;6{+|Q5LDmr7Mm$GXgR#SKKzC<4ILu%W@a<_f) zh@X44FKu+%Gu^KpcfjrUZhGlPf6eT7?=CMYZzQ6%PE2*~d3epWuRrSP%(`3W*E?X{ z@1>TVdH|Atr0~wqoqe5ykn*JXov;0aULF0}G4u`#;#ZFU#Wgpbf72IkdhRCXrmJsi zeC-!%=CwtcL+>lZ4&Up6%wws?a_=7KADbvgm9q}p{I-AoX-#jd2J^RtFCYH)p*wA} z>$XpAecfpnZFj*DNO4JqGR}CTcFT6RZuiaY?>|Bk@cIu9I^}s5I_IwsZ1wUUFK_a) z_43y@J?MG*i)U*0J#gutFWu^~mEDu?KdTGBxYNxd->K!{z%;X&T+4?OShuX?$GnPwP#%AFXxaesAymii;cEyH= zZP?py_5JSN?4SD|+eYP$@SmM{i@uq)`7bv+=-}^f_T9~PCD%K_J8{Vg8xl{rXDvD4 z#5+z{=Y;B#yRRUwIOEDoulUR8%9o1nMpqwowH+*b<=s2WPan1N^4qNyf4%ni+`>kQ z_1;?FzB<0*^cDRTxhF1+zOwA5Esoq`=VjNv@v~)nFTG<~ZYdmH|D)@F)VuKfA07R> z^`1QS$>z%1%5SHxLbCFAS3oDc_RM={yz9Sn;CoBo8oj#sjVGS|@k4K4w(Ft09{JQU zPc8mx?uZ>;{>tWG-~EM^FTrnb`Ra9>{(jy3y4^1lU;DdtigZfM+4<>{_r8KMs9*nI zW$h2PCcYzY`MaIop?=Qf3%C7vtK>~f-F>f+-Ve9iDuG|R_>Jf8`KEHcvhPKED|>$V zoBK-pu3YcB>wa+253bzJy#9%G&tA82)4@OgLw<+feCM?fZuA`Ov@Zha`eB-^+*S2kJOK!2>P21cuy0v`M@Y&&W`#pDE#VNAe z{H1(M;Y&rcvh*Z6Uo1R!sGshA_ef^UbPi7+e)KjcS57@!J^M>%|Kyi1AN#B7vZK~M zdz-VZ($&}8GdeYRX0jxI^jU+_b-&!|wsZdQPI_B3zV+}sufvVg&O7S7OCDYEmuLU7 z?9uA5HGJ2z|9sU8n+~hbqp$D(TJXZMI}W*H<=rR$@K0BFA3g2$wH{jQ<^S7ypEGXw z-3=%1bIAeEeRI%Uy303&2kQRrzu2vCrzOHuNYd>nxjXfXTz5cV_=`T~E@Q>a8vGry2 zvh)6V`J!`MKfd{r+uykT%g~Pav(9|WzijtW`ps=lJo*AA+4#D6 z$+>#=aeR`cr$!+zfB+6;IVzbc+g1) z^*3FKZIk%mtWB(=k|&$4X$+2SZhVQEgC1x;7X9XrSDt@~6@|~fw##21cP>lW>K^Tm~`@A~tJV`lsw|y>S|}KzVknix#HOG9DC@o?;qDa?!n_z z$6t8DW+(jOgtt#rPrUD>ADnc-$(x^iz{&5PVx02Gsku`xKW*F7jyiqq(}UBWKSMm@ z)-#DS&pm6?vko}xgR||kpFW2>=caR$=brnk&3<*ruh;nX=+`fu_rvqU`i&x%o)%UNu?CKq_KKplD{qFc{HoE4JYuCT_XV-psU3A@>zjuEBm+L#%KX=2f zH#~l$eB%Q*)o!}$X6EMGZpq$q$sew~ow)tCci?wiekXS4Wq-u} zc-dX}U6*?-nY|z*WXXyf6D`f2kv;V^5DG>)gOA~;U7Ny^dssc zFFtBM`s!oBWA8ow(-mv2*#C*IJaN>Mn>~5jQ`7JK&e)-R@IIq0-mwo^G)xVzbx9$FR>B=9h zyz}q!-~aro_v(kQ9r*etub=%!;*A^LWZ!)9E$glK-roP6P2M@@AH+XyeOG$-h4;qq zuk-#fA8h}@RsUrEx#C0X!w=W^(rR!2?DhBlJ?@<4x2xhxs=zPkiaFHaR2i-eJWDa* zG_`>4h`?2L)txF^23QhLE%@F@gZZ*D?1Q1U2G6qFkF#gEt<2^PocX*@Qr=nGyy}6o zEPUq}5{o4k;;|%7EZ`Ux$992f!?HjGJYP&kHGHLIYV$`3}qwuqYE zSdh!?LVDn73)qhM;x?LyFC@twQ5=n-$PNntWlO>c0i)<*6j>4@mc;Ro(7r{>*9Tvh zdaAyJqqD0X2YxME)b)L52@H?N;~mHG9S2?qMoF+~BnHP~i@}J+!_fAX$zprB^_<8@ zbZBkZ_6)~22KK^~uF@Ke{AG(4O&|2}XTC4B{qb|0k!Q}HqPAhp)T}A~1EV{l@aN3~ z-1&H-J=}4|n;qK&3!W$rn1uYNNx6d6`R@}uuwixn)AVxrzfZQT&z(8+IqegMe(rjQ zGwt~ZpaR3U{=97u{Y(Hjx$0#82SS+uu<>(A8KyY`kdopLyw4~2sR93uqXPT?VW0ar|?S65Ip2 z_<08~y)&OS)2O+iFIC%1^r;>7mn)8A8f|5&6)+gP6#nGaC!3m%_or6uQ#1gjnR-&D z|F2g+x?vhqwOwK=HaLpOVpY?Xk?Aj5KI{VUvlW_#-Cqh%711>QmB9S!ztWwp>$6K( z3V6IE4Zvm~Ey7@6E}z?+!Y4AckWMeerugo5Wu*;F@?hBAekuIfX`kBY$G0>ZAg9ZL z3qTel*y0#2px6>5u>^}jNNfp$e2U0?g70bTy;X^}(#zC$m;v`)|`$$#9X)fK28iTB|Ppw|Ry&MZ00L z2PY`1#`l{=u0y4$PKM&CRDq&sI9a2H^;|blb7Z9C$Z>%#kIEF4sP)YX1tHYzlcK=* z=_f;NyY++0f}sRO_p|+0tY}g>VRo6);TBZ@H#@aVimGQ)oq9Ia>E}|l zMln6^{(T9z6Ya)2%QG}Q;&1NS-w`m^Ka1Zz|p>=y8)T}amkB``D%9zau_ zS{hsf907#vGB~U<2l$^YaD_=t%;Yk$jL~jn>SZU_O--ap&0teAf^|RNEl-*Tk>?HL(3hD7`rrS{RM!{l?L|Ew! zpmZPOMbpt5R&z$sZP~?`W@AjxVI<4J4aapyLr=kj0Y^~As^ssVASH8N=+5UnY1 zyBRu_&hX`WCR^t!-9o21=`=IpjNqV^A7{&XF2PsQS+QuegG^MUIl9wT_ZjtZ%WucC-oT)Y>(P_z9 zRFhH8Y+C9-ksPm;Lr1OH|8M&*AsBxljNr zK+u4gQ0dH6#At#d>j^iRl^d=jn{g#3Iu%Wx5p26-$shIjC<-%-QRrahC__>dlW?J8 z5M|)9EV0oLuCzF~lr#89iko9OtSO3-aVJ!ZOzM0IE)N?`GX~8FX7#q^dP!{}#+cEn ze-bn{g2(B$+t7@Y^II2jFC0HOXOw*Ct@N# zfU%fvnQhqWdaP}S-T+OyqT@Co&*pQzQ7Mc|MarEpdM({4ccnqWL0O|MwtP66z~vIB zM_Pw~<|}Ngg`lOOW=Dxy+<1t3nUXqy3VcTBpiW_6Ry0q`H^rn5$t+yu$8eb@qC`;A z47`lwIu(VFLfJ$Vxu#WSE2L1~C=-eov1wC~J=r(BcxlS)8OO(Yf()vb0||QQqn=!0 zSh}7-jm{9`sc}zBSbPa(Ds_>QN_1;R&=az96hX3%(J)msVJn5zeZ4}WSaQ@V;4U)k zx9h!lWx|L&H-Oqb$jgtSf*|OM9Ztlorm|4G4M%yx(PjiipC=*-wxPtxMvSaC9J?(m zWenv>x!%u2NP}*-8ZK!~4@n8w+(>KdVc>hPT+UNc_ydqveJN6kiOzQRHhDz%%G z!)m4w7#<2%ylTI*P5=8pVG15oSRJ+<$n@M+n8jKn1(%gzG9!qF$zBy9!aS_0e0A7v z(Fr)~k2-NtfwA$BFm;(NTOj^Pc9}6QW=hPY(QCxBArqE^QJ+Uxg7SdSj?1DtBWQR- zQ8heFgRu}H;#x~*0-Fvo9g^TmHr|jkq(!u?o_P0m`zAvt3FpC)ebd|SDC;`5`8#I zA@S*9#%#q?oNOyzPaCrpA}BNIQe2^A6{xa1V26Xm0H>ikl5DtCc0@vA+{K%2)yl+0)KT3@J}YJ=Ylyd8 zAQyGH=8=6mSz??X92t4cA|_B%BoM{%U`tA%5?Mylv{0I_P>hpV-pivX7j(ELFeB+Y z6a@q|1dQ$hMg#VuFe~r@)HW(?K(+`}0W=L?XC!;91#~kO<#J-7fx3y=3d>CnYIV?J z%MOxyGwoqLVhmd-)XZBfk5!6j6s1%dvW2W<`i@l}Ot?3o;{L#@19NUnD3^wiNtJOeSGPq-8M(OH1`J>=i5RtVL{G_Ke!R(h zlMz#Pp!|R{T$&ip2*Q>LHDps4dQM=%a?2LHtdp}UL0U{hgE7_g$7-0(F~PtidPx?j zXILR37SoA@0JRzz%lJ{HfJUvjFgITcmuM8_j#(S0E1YQc3Uz3}=n6R$^?L4O3;Bty zT=gwT0fDxQNrC|3L%M4Em_P)x6-EdVDZM;QF=D%*8^dICf&w2f>_C$Qod~eDsAsTZ z(N#n6O@gsJYS*xs{+%!(&JrMGM1vD~cgRz1ECsZ7g47241{@Ohg=*y*Up>;7!P6v83Re7)SGx@N&m)5BT~>^onXU=Fa}tc{^K z=EO{n7WI&rLx{w)^4P%;xKtwZFo9(vjaMsZip(N` z+zN}Hre%PMC=JtfuA61VG%s?L5CZ}=Vue;g%GuIvg}yNy_VL)T+@@^15ip5fy#(+i zSZTUqgNzKfFcE?NPHI{J0i&9&$~mhiBc>w4qof*lNH%9Nff0x8++1wJIMyO2u;n!s z5$g;SNoZpFo@4q=jpLlGQOs(Us(}`~IEgphzTFQ(%&A~ddt^d#(#@lOv5)#Co{u-| z*$NYbRJ&cJ^WJDMXp15np$N;Xz+uq}5h}7%8Jf03WXIi(-Bm%v! z#4S&3z|~wZ&cn22h3IgQ&!#lF-t@?F9XR`BIX;G?h6|zXkG&opL=s^t7#0!^uT%!3 z0QjEP#1Z?Icq)Xo!l01@`9WCCw9GmoCDjSgTVTeq3GGXWK*aP)VB%21uFtldlu)aq z37VrJBg8P%M28+lR5F=V*_24C;2dg|COB^$Y!j~5t3J?rZx}~&6O>_iEwnocUZ@pS zLKn;#K`z%+5we)z(>1N=R#CA&9I7c)CX#y8M}vsQa!P`5a3P;@EVL^s)mjL2U;=e; zJ!nRvLBTb#3Nb?n#%Bbxz)VE~OpI(@*EO9qfmO)DRT-0^WF;>sYF~Fx8LEF?tmVwRO1QEna(?%iEr^bDh!BX@v*BH8R z2I;lysYI_oVeyU|vRR4Mtx9?bV;ZCsB-t8{`th)A8*>-n+t~^*_ZfIhM~27ZI)*6} z&`WO;AF2xC@S&vzaJoJbYlK@E>Tp#6KF955g{Y3Zoh(I_&~A;+iolf5R#>pI7>K4w zwmf9&SO_ADlI)0{R-m&|9f(i0+4cgcB@Vqxom040p+itjC+3jJ3^=fX9_G7Rp0IU> zXZaaH2f>RIVXS#QA~z9j>p%M?5YiJJpti222A*z}c(zCeMJX>7db%9C;NtvHCPbMZ zve`m6%nuTD6$!M|?3t;7*arcW0oCMMd1 z>)}mhMi7@Bb7XoAsjiG;Xpmz-vcgbwwk}TtJ>YOE4Lor3X0qPObIF9#a?Pj}a*_&( z7zFy+`laH;t=b8oEae$N5D|M&3kG3ng$|S005y`iVGPBQUfjg!h;?0zk=sH}P#vn@ zQTa){!cu^HBVU8dLO5~q{i+^~NW`Daje{bAW<*UY^hh|ONTym1lI>ofp|mcZaESs? zFp}s*utj?@U$-V$a+vT)kVBeX#GQ-=ARl4ihE^*Ua;f>D6jOLvRmfbjlh4YC8Jx>RZWL(#M-Ks^;?`n=X}l205?1lQ;?#Up&lf{B{J#7hJq1CpmDD}oF9s13PO@8 z(4-S@CB%Fi?4}GC^L-iwVbOp{Xblzwt5MxVa*1vr_I(eHnDlUxZ6q4a=}8W1T}nt~ zb+Dcp4`Y!ttY9ez^-{V_jgm1YS1Gy4bh^NY?tl){ z%B;41yIt@#6QtGY5i_^g9UJ&7SK>=V5~k9lFxSgTiJIL=vWmcr<7Cfpl~|@V0h&~m zN=zcrhuTGpVmm05q+p&l+%BXN)Ci)dum#O-YNuWvJuNY-(puif>J5ezKf`6J5 z3NbR%?bd0Wp|#FLBr)BbfHa~D)dI%%FdgZ#9V1^&jtr_;G7=3MovpBFlabI+yESzv zHrZ8a5O9Q?ZqvYMB;X>{3@lx!2m$cbG}{2a8g*Mbnd55Ru$k*O<0jA9i9ytv3$~|^ zBC?~`T!>>?(#QIQg$KasVoiB8jZ+6A4KW zepyurweSM0PPj2FCUAJRWvtzgXU+V`tr*@!VWScjf~>Cqm$eBHw!qB*9W3Q>GfFu~ ztug4g8}6i@he*5Jj5Tqp1rm&`Nappv56x9C4>MlUmL@GcS#mWSA0Qk^*Be|GFB+Jh zi&8N$-e7BeW;BK{5${d8Tu&OQVp5Y*VXg0$dl^+JGdZ&@&Q_>faY)QtAVV*)SWlBl z6|LAn8`DXi$F&L{m2x$)*%`zuRZ#&}4FUWuvqB2eQUv6+Lf>hi5m_|iP)3*$%+V;M zGGc;&@=5@*Xgw?1b`)Vw4xDOnBI`C2^Rb>&w+1mX?9+(UOtf?aCC6U1Fbf#K5C@AR zdNj`hpr+Y?j(lY20TW32?ipSoWmT^9*m=wGL&*S}iEGivkj5L0r)l zoJk^vr%e`UIXu;j*$O|>htDXA5yu=&QWXNxP1w`TB-a9N|X&==}_HNNZ}+QYC;L7 z%88*SCIbTTWg^1IexPcShgMZ{F!w2ZKoyc*RFq3rc~DIg64TY3mM^Gc9Vr3JR;pEK zxB@W2mXq*J!W)kPpwtZqNW{ej4l)VWZIA2ma;I3S&9)q`sbiNE;jw@Td8?~eYRD)q zN0}kl$vI4rt51f5de^Pfd81n4nNCYBi$d@*6aySV1w<2BF;Z7)iY5cD%ZXBpPg7@_>@za-zy6%@@P8QGkud|d!O5FRNCu(3S-Jp$4+pCV=}>_HL+m#ZVc;PdA;kv$<4@R8fg=4U~ zYBP^<{Z6hV*64V}&)0Mn7(BET0;s^EF`gilx%pD-gfHW9fa|7;$ROk=RZi{|a|xQ! z>7fRYk)g55fi+n+)f)3c6qd573{Xrl%yOB!*t8l+ifZ-k>}-Yd1OW2jDN#S`#Vu0h zkyZ%MI@Y9xY5{GDiCS1`XR%byl(Td`9a&&mx~uv_QRop}9cp(g0Df?sxY?R-c_N!K z??IKON}*7KE%h?VEY(N4MXc5}nJ$j@3XDHwyP_`QLyyVTyJkZayQ4H6&oTZgEPD>G z&NC?xFqEqvfJ{S|m?)D0f%z)$w^ZFF#{jk}_e0J!-89pcDZ;5dy0C^Y^C&ncJuwfIO=qNtzfb3o(S-I{s z%u%XUQ`*CcR9sd55SzV8qGf`#4NP^50&JIT!b~7iwW^U^h7vOp(g24Ds!0jATWL4Fm^35?VD8kgVi zAYF*{HNH#SI+O=Y<7Dl{FMBS92b)f`30MBZs<`J2j4@hqMeo<8-(KH5v z&}ydbcveCM@rgWX#tU_Nwq?xDN<|ysyklxGR`f)GOsz6M2tZabD=kDdxD)`nw?Rn- zaK&QAXkILZOsH)K^rUGCNGjz+;7$`L$RgaK$>O)v$PEW$TN`slYeGg2Ei&nt(LH(pcKbKXquMv zQK_2nRar`q>9JJs3O%`Q@Rg`N|Oiruol`*PCs6dzv(0~>r&0>Yt<(OIHCL^@UrerPd$LJ&~ z_v8Rcx-LLVvNGKF=2?IUCtD`yH%Y}TW@y5t2!P8$XhSX8vLm$Q4plVe!DxU7%~B?0 z^Q1aLMiw@d3J^6RIKe|>0Bs_bkE5@k4-n#Fl!eQ!D9u*H04oi>5sxBT8Ugh(JXf>? zd{QY(g^ZKR7c-nV2zXye)J44l02FZwuIUWafj~Gt+cJ|g6td~*imXc6u$WZC5KVNY zdKU!24xJt_ec;woaMZ61q&_HPv|=NLb+SX>c6>A6;3R)&@|n7#w`_Mta8k|Z5Gq@xy4RCfMsnhHKiQPjk(qQNp(-m>y2gbZ6NzkUr1VQjmQH{y zcJ7zw^&XIDM=fHEdyrkBh@eysaj7JFWK!j8UgR@KtvQJ&7<&w51ps^jM`*)Xipm2d zl4%rN*2DAqBt4fy;CKsDSz-uEw^gr54TMy)4`Gly>1E~qvjrtW||&izk_B&eW4s$Px*{f?QK04JMu5X@&&agcF# z(TD)$IVw>~Mimve=RQTZYz^?dMcdk@@vsLl&6(o?6GAO+wcr8B-qX0=0-y*$ zJ4rw_!NY_DdjZ^HShy}^L7Kr#1v%&ei6}-27+(jqgZZI=AF(=EvRgDkWmv={JtS<4 z6(l0$A|6kdj52QKTXv6WROJZ)swT8P24Fc!<1)niJ_gEvUMOGzF_?oGGA>Pht|Xss)j>O3dTMG^te7DV7*Tk0q{mg5E0_0mx&YsD!0tzA4+C8VB_P-RVUlr~yyEHEi6Zpt z0H{~QIH;&_^FslJI+&_XSqtL4)Ch(O;8f${zZuU}W>jZ^mxe7Ji=k6X9aaex5-T+{ z0|3tC>`)4_8&i!2DEF0czXCFT(X6wwAxKU|NdVa<5^Pm6p=n*uWlOLH0zAw{@Ch=| zhW==v)eMD6cIv?Kcjo2`RBu#5Y?|Pd=spbGe_)F`)K^Nd3qq3|%EES8Al#-}86^fS zU6ieUw=Y%b)`Uq<>K)2PeV-6jIO=<@JD2Zc!hliQiGIw&%wiW-(ic{`o$fPB8eJFr!qt&prT-qi5PrAl*ME>?iSN=UMq40SCw z%}53S*(+I<;=pK4U0q?&R61S)xT-E_3#kVoPIMtL*^Ba?)E)Cuot{h}Q;Dggd7csl z%vh`q0C18-;|*|@Kn0<0#D?C`OAS;8p~ZSxvGG8Gy3H8D7LrJ@XZI5wdz1lbmJZm{ zp4R{3vOagCDIx}26)lE!{0c8643aksanSvf1o?(k4e9^|s6koacyQn>!#l1x@C0D^g!r+epTR7k8V%cN88%r`1#W|baiak$4$awtfVddIr7am|bUX{k z!Y+(vLf|z4D)&(U76ZhKlX>447XwW%l*oHhoo?f^4C0!RP(uB$Vx9C3cb z*ImntWqr5e3iTKnpGUBHHZPeBQKY~_`!$&95ninZ!gQpZX?1!+i}!Vi)0m+niek;} zFs@;^l@3)MPedBG9nDg_CLhZ=v3_N44;vAcR?txcv5Yo_=9$VkwA&&`42QZ*xOzAe zJ0T?av}jhuhSE}~4gf5Q7|?Ag=C>3SG*oD)!KdR!eqNwqa>bg#41g6zJ_a8WG>}vi z#DN&-IEq04DY8wAFW^zDmPSWjPK5rzcziI1S!~ZDW-HX)q>^;RYK#Q3RH+X^-wvKJ3Gl)JEs}_rOxiGb=LwXhx<%li z2ny9z27)jccjnNN9D!b&iX7*IU~aK>$d#C&rH2eCoj^l23@dS0M0HxM=)qt@kz+%% zvosyjR<)2Zdr?y?m368`k6cons>i1Q$k_@%bM13}`b;=v+!|Lm2Jv`mz>(0uVhuCE z!OUC1T$h_5!E}{;TfsaM;CYVk3uw_wHB75A1yQnAvxlUC&!R&S!wFAQ)f_D3%@HJl zgsjkL=F&sZxj0BM)!sb4mFh?%-&R4HS@`z`s(({GQ1>5GDB!PMN=hCbl~j;x7yK4T zzsCJ})hrDvAAa6c6frHfCk1cdPC8^-F-Id1QX=5LNrCNRRR9OZSg;vHS!FCq0c0V* zS!uP+?nvxqo7qG)0)Xh;FM~+PNHZh@a*f2N8AwE+CP;yPhn$dBwc|VK)&D%UW z0@Z7am(ie{v&K-+lAV}>`<*ct)RUT%lOzXLQXUH0Ej8$);9dqQX&3FefdxThVN^;h z1aOXZ$1;MfM|+k#;5`n_Pb4Ch1VFS3#cM4TNEAzSgR+iMTCFa~s*0LqjfjOztygNs zOLI_HQie>np-f=Vc05FEq~zC!F6qN~ZVVSekeG~M5@aM`7s$*Sv}mFqKwiMYNH-2_ zWCR={upGb$@beYoBVbwhd>e>O1prkM#({zl4XQR#%R_@fwWqiQU}8hZeY(_&#@)~` zWA!SYQV6j)ZO!985uBMEg7h!)iMXBsy{`Ev<>I^sT9Yv)Hnj3Fp%sfKt%^z7={5}f zGQ)Yx7z_2>KbgGH`jYkY=Q+R4g_udIDe>4z1M0 zX{QosV)>MbnuwH=^hSLpJX ztKj6Sy(p{VEl8S}NIr~|%0vNG12;+uvO!MNQrH*cNp4K05(w6CJ9E`j`haIDT(tPS z>`SN#0<;b^FycMXcoiE+V=UL{^`W8LC)m;;U#G;F7u4Lq2?)>x3H3CcWmFsMAzr^f z&jNrxC7WTI$lxuWV+CLXv_t`5rjjtVU3Cy*4Lk>QDM3z|0=)^Egf;Swx=|Y`HcaKf zp@g74&(c5}O>3@tiFPPNBcwm~R3y>HgO}hoU;6IC+iA`2(HO5@NnAhUQI1XpjIvtfWW?n0+ znhS@nOHQ3S2-4F$jQbfNv(1^zYK&V3vKxVdUX2_Pynwgo0cR=l@pd|t$+4qGP}nKk zlRW4SbK`K$0l_3M!yhEDSL>Z9Mg3d4w#Orw*v}F?*C~OsdJP$Q2A1^w+F)lRlW;854UaD2997tS&DY`QEqR2Zp%dONV%s8(R1es!7+xL|AQ1Y}nN2r!9EpT;Mdj4AdT zo+9BxY7ELu8JC{o5`Ar+NdYCmJq$9Y1H71K4J_a2H^+eW=-k&QzQwQ#l%9{MX*fT88CCPDT0n%s0M?AnAQj)V5Vqg z6cqigW`o2rEnqE8;t4xPGoIpOZrsGy45h&Su?A!v{_n563+eH0um4 z7POXhr$|Dh2Ov9ltcde1i-9#Ftp<}tMtHARQt479gVcGutt)*MSYsl#Dtiz>3k{&; z$aWOQU2|OXgNEWX<$9DsC_b0qVsrDwhM+Kj19;&huNiS5zy|y)C-5lVCIUMM^JzpH zPAX&*EeR#X4H(=u$);Z$C9G7uDMBdlKDr{#u`iHG_F7O=wq&5hbT`c{^(s z^Y>zRox z0^*NcU9-}54`CZ!&}#`8-}6Akg=Gb~j<9_pii39AVa+Ec&@+>?To66lJyIHJVtT&i z4mS}k2((2`7p?QqG$O@-u3A82`ZmVGWn<#Fbsc4;f|!VD!!g53y<}I;jm@41g>fVU zGYy?_!HCGqawm%Y0W|Hl>!;0iP;|knuktVLzl^%@&Xl?9$oU4T%5$FKb zh(o&H$XS}~l|w?ACq4j9W}KFU+azeZ={iXUKoetNh<(t0%K}S2fI$~ksXcK)`ED}u zOFa=YDF(%z7HIF_bzWlIpb)Cr4RUd8`9RjK7{?a{P~Wa%P?Rm@i=%igXKG|tlID>Efpw=H zr(zPT3|Y2fG_q(lhxdFdDDc4ZrpjJD)zp1I7gDa0q)o%EL!gQR0}jM1S-9lYKqRK* zxfaYNX7;d^1U>6zPqT^xht9MN)$O6VHk0caFo-EF+zkfFkOgmt3tR9VgCb5$01$QRCub`J-}ENHY?wHfhzFJuXZv%06C^VnvpO;erkhQu#k*!ViYJTQb&4`l*Ra<)M9*JYlG^5j9{}B7Sny7 z9fm0t>Zt}O+Q#8(8MJ-X%(#bu-l+_Mgca6Ja3<0db8$s2^h;I_#P}457Z?qA#8M51 zv!l?%>#Gv*7&FLAWE#`vMr$$a$T6}x#`LTl-5Ae2J6OHGbzAq zbrj2+aU1HkcoIPLy#nlJ=Cyzf#t*a(Rti%IH12@Xi{a&`%yt`^3>=dn`xQa5`Z5Aq1~tHBR7?pr-s^)hQeNsB=}tbz0yk0$q7HzW2&yDRrqjY5EXd=4LGxMw zFL=YUF&1iLhQ~x(mASqv{J-|Dw6}32$$lT8|3hJb!E{5Y;e8oZ9_YR$>Y|RF{Xj{i zF6!c?v|-I)+hSS@ z$(Y&o)C(`W{#6$yz53E$8j9C5-F`3hELmc&0%ANvVOjAVzuT%ftrBgVX|qo&?K3Ur z+l;%Z9lMqMqO0#by#UVR`f1@ZipB(rcvq0{c++reCMt}f4q6Dzib|b1*Yr*+PxpGg z%7!|~JUgxrTY7Q3n@$n-v&o`<+EWdoIAIxyxUQTtMbD&y>0PP0Bjk z615@o*+Jl{;Rz__aF4dt4IT%f;7MyvXCxn1ZmF~%E>?!5tIOh=7A$SutvgIz z(_v9)xBYUig@UA4`JkAL&NHUwH!L4nUvu~BO&1`qj|{8b9k%Ga!R#?xoA=oIA=;^ zp2H5Go<@NTThNhQQNNt}ReDB)SLv)*>-tF@fOj>z*dSR}LH(yLoJ@}@+lsuOUV1!| zU62w{GE`YY3}^%#H-HRGJm1=jSIg%(&8mw zCuA-kVWvEHys8}7zbylvBc*P1%&KaEcO=Y$5iaOTXRP*I-e2u@`qJ82)vP|$7P-sh zXjTj30hqJcF24j_!-ijoFlY z#;P>;%UdWmkE&AOTRZ}m#U3%yWPNxk9>~M6mc)DdUi9w zwq1EKieNlET*X#Su#qs^pBHGZqt>=NZbt96IneB`11uNV(6=-`H?CgGq53-M)2+D@ z>D+-|YCS>_$A65gR-L*rHk+WFkGAYY<$C$`nXR{5^jhs6`opyc#i5O0WNQ*Us=*2! zu6jt5MeO?m53m6Cab`4LXbYyyL;g$UR8R)mpj%fIY2kFG0y0dcjJ6Zn#!S6d7?o~S zmr9{u9cF!Zw9SQ{B|qOjWGT$&{(dE8S~++fBq(?exdU)H=SS_WsVUWkG94VWtUn)Z zv#m42JSCH@ib@e_Cr5+@yKoYimKmT7KMnG$kz2RTGlE*qPutXL?_Q^#$?kX9vk#bo z0>?5!$*rrr@>}F4B_4bAGSpeqzo=(-K3NVjTb&Ab0lmqb>TQ&DKx^}dWXIz-txMy2 ztqBvu9@^crj;(8bvvR66_yk%NiWs;yp8u6YH5g&EJ$d!*TVHHU)a+8hyyJ!g%@Q`W zSAmNyM`_F9xO`ND4*4S@J44@Ca(HvLZ3}4)#zr>_NJ<-STI=ypl*f%B*B$e8NvHD1 zMPasum0Th_CFC3;4U}>O8@ZrJ0}VR7dZp$}aht14*IUoEc^M9QFjRX}@I}BVxn5T8 zMQs?HVPz9Z-mLH@ZN`16O2p6_{Z<$HAp zHeVk9wP%<|;0#ukmMn;7Wq-MD8l|J=}Evl}x;=FMc zpH>eHu#P;Sr||XkJ?KoL#k5-nvYeyZg#B`HX%05`f@B;N4o4AhY8hmIj=0+j*O5j$7^R{!v`iE>Qm}%}gAtO* zw`-uGdOYizg5`~Yzc?^+f3~A(1+J{oP7K2znWYXYuS>i|WOcPiLIZo(w%!N5!f7D0 z66uDtYCFfKvO8^*A&30I(MCKD5mZ=qhP=dN+u%fvTx>go5k6O(Hx>HLUm4BzB=72- zCv2_J><>1(V{fJngLly=XZ&%I?~IC0&|y!r&s}z)$vPt72oX*Z@*iGEOu4KQ7U1p5 zW{jtJaV7c&Vj%9xR1W*~Glyk*Y_LLmoz^t#~_c zFX_5IA8nTIp3~MM3LI%|sa`Dga_}EI`C~?h2m4}PXB2lmjHr-|*J?a%hdP2Pc%~!- z?7r>+GX}^6JE7K=-<2Gn(PO zr6iG2g#`f<;L+q>G1}$M?Rx=X&rSzICT$olWMM0cU|g8+t_yl#HnK zruJnjY&?m&BFal0ONTnW>|UlucT!)la)(_tDpChqbkE$DsLPJqjwtttqZtNp^c*Q+ zoYAJ{HF8zajSE=QU>3lvK2&C2KFb~Q_9fRd*{#+qL4BKh?l7|aPOC=iYIokEGn_lG zt@|{xK6$3t9a@FUV9kg6&}3Ik4@44wi7jjGVo(jLtJX}x0!gOVnoj$!hCJ5p+S%+& zi@8v%?z$yv(s4_d!8|uykaXiJ_%_6N2uBDuCq->&ss;m`9qM5*jm7lkfspUcc< zR+#&P&A8WHu35g-2kYG@j<+UC4g@1?=_m*?#g4UdB#eQ-L`wI3|iWDuq_uW`+d-1_5ezaRL@fF1tD)K0;ol& z6I_||oB?G~_Z-zO?^)#K&Re_Xuyk0cZaH@nveQ%7!^m1Auu$~_j~wwZdfUqzt^I*V zu<+c@+edM`hKF%htc(|+GGL04jkdhq2`!LEQL0Yq!anw0iV&knX!z>3<&`}%Eg{zk z12jjUIku(_>ma&kVRuPYPbX_6RCcG_{!pzs1Y6V z{EIOBahm&?3l16>6iXjY%aD z&U(C1!kNM!nU}u@)lBA3*_{j&OR4~4^oSgCFh?#Fh;D0x?5BH*G|5bhYvVN4l%7(q zBN?eN3fJX6DnM;qFo(Q4c8}LVPDJoPVUEY+Uh9;!ZdWUx;42&-xz&+vw~>71=u2pk z6_T}uX77r*)YEsRV6Pg;P&-!#MN~53YAQ0hN2japDia;{VN;k6UGC5XnGo&)wU4M& zw@^K~LN!;{#?xZnu|o4Q3Wss;G))7;L^> zUJv!-!Ypg!Bhtdm4%nw%if$k^8CjSCdv`WmQ6ehlAgwEO5lG;I>_{fkDbKs`(&EKN z(9wtY3XUqmK0{C$p?YiqVPlwtagxb(HrH%%L_jhupFoQah>}^_bgb zwQFy+bdN=nmG`yWGxdfxKC;Dw}AcyZi+zpQV$}zb-(XVWlmKn)bKdv!VppuKOpyz zx|t3<_^mZ%QO7kQQn2Am5r{IsYumq$#CZuXpU{D^I|3= zhf~j(*vOR^y1uQmUaLF1a+%#|*KVVby(e!58~rl9wB)X4iJPqt%}$m~y5_!qFaR3J zu;s&|J>|%t>CJ^w2G|jiS0R4F%m$Xx5h=2GZGsP)6_?FxH;-{3S`8^RxE=`(h*#PYD!gi6q1zQpC7PVSto3=i!7m|6a; zo_RwH1s#Simp8usnJ*}6ax1wQ)>Hhp;$o8Oo+#e<@MfJ#QX;b1eCXl~s1+$vnzwYv zc|6$rz4;K-D}D3(+fbg`x9t_`9K(gOpLwK)Z?*8~d8_$@2(BTA*pDpcOALeRf_Tvj zvMl9`**sV#Qt*tp{~PUJ-Q!u`7}P)J=pJP;c%7r!&n8FHpZU3HewIoaf86`G!k zv-wkmjnVadNIg=J_d& zI&7lyg?iQYHXzgled>CCgD4UsZRoSHMJ2$eeqG-`T+X^y1oW$hUH?;SZj@8w9`==E2Vbh&s~GU#<7= zaRO;2uFlISeMWp>xCdH}s`G{;34Zl{C(hn=>41)djhg_WE?;WTr#`*i%6(KM-fa{dBBJBCh-dFX+%M_+z4bc&(G&QI9{kog7`YROI}ic* zEjT?iD3kv1?D8Aq|E7;EPI`UpmUB;SgMa?Gl}p5>cH1aY-Fs>oT>5cKWSF25yztbB z{OiYU7AQywgCK4d{`<%6rj~~)|8cY6pYOJMcgEZVMleliYTX)ti`dfy{Pyy@<3ms3 z`}%)@STr+|;1#t=gjUojU07j$eCiS-`D37Ud*%Nh;}xxge`LsRK>tA|S(#}1k21|7 zU6o{#{oxP`ZP$-6$^L_Y-EdCdN|u9J^hcg!5zL8nVwwSqw|*aEn%zX1L^J-eQ2WX# z+^6zaPWhDk%167M)Njl%=sPxM9Gw5bo0(|B#ZpO`g8Yg!Y9PnTK#qGl=j;P)sktzk zRene^=UDk36KTIhh6>ByGw))tqzyZUr-{x~$h;Fj40agx6ADSN z!&BaaT`ZQgVJ8Hpip&5yDS9hYKkbBjW*tL_SIKvFu~gEATrlT&Vy6(k+Q)FF+%@C) zyR4L0D5=DaChJ@r%T4`+y9+lu(kF>LDX~z}h8xF|MJ~{k4D(@}U|a-3qDAgLRe2Lj z+OP|BrAXYDIMDeItt?};muS-6q>?t|0w)+sK?6FLjTVB`>&v^mV0g-V43wK#(uQ3y z>llvAIythMQxDx;OC1yKdXmk$SSo2l4rXQfD<9~~*!oI6a`8x$EOmTjJ10XfzE|3i zV*@t|2^uhT^eU$wIW}68lOV@NkCzO&SSo2lj-iS7k{1YcaX2yc&|%b1i&hfs;^#|- zUEC~n*df;Q6dz~!Xe~%Tc5&<`33m4d$Zujv9d?2Y?1;vU`2y)jPKfNOB*@*RFk_*l z4L6nvqCEj{(UYYfI1Ks@b$Q=X7f01ohg`r(;Q}LtjrKh0hwd&?N*w=Bw$jC7NgH;I zqCi{XEHGlG2p?yuQzAP*iNeHV-m@dW$t88@353VTz?BK~;@D;Cr`}DViO`FEpULK4 zESJ=w#|S_V6EOExj&@Ax$1e7jC&4bBu8E+FrII$}WHRjnC#LveA_sD$+>_vTp9?b< zO4@KEoCfGifkasuI$A=~Kj&hSLK5uon0Kvqv0PGzo=Du7I9Qx0%*gIeKX_sULn83* z;}peWNgZ|przoHleVmBheUzejvL;&VVyUDKxq!(R5NKnDcKRn>Z1g3WbocRRW2vMK zIfbapaIO0=OPz9$vb=Mli-eLk+=69}3*xLF#+!22A{R4Y6KP5&63XwwEv%^VvX0EH z9!AK&d%up#yY)EkDV*}G(o0Y-rEKdLCpO)pIx=t6-gwq9CDzyBsmWb(oWy$)24^Vj`t(|(qARcKF)Z#{oV2fL& z4YwdA3LjvsMj9jaxWyw)f?M1u5pHp-wBaU^pfo-}?f)?D!g!=faEluy!YyuB#lr;p>fh=-a4yW0aM0`Jx=b?714o_L*t2w9wyo_d9e0pAgszO_n*UVO9Ep%+HT z@cFUgn{g;M(cFt$B||T6mOAvLFghJDSEXpbp8mNP4>b{bajRtL#m&-&9*e9fY!HIn zD11Jtqtv5!8)_2tZmklbcWah9^g!q#+4qFjgU=6xUOd!9=*6v)p%*tx9eRAgro$)D z<3Ehec^hgX^x_9hhF;w4ccGVJPa=x9e+rzK_m`cHJOm%orzi&Ws31|0jmhSzUx4D` z0!iiob6=+5O)S4_4*VOuiwqm`fr+0={4o9wjQWmk7fau!8L1}zhOhq?n+Qq+1Zc%# zNgH-3vPkyKAFX0moU5K_;>B4Pi58#qS`GnrEZK6!4C&OX%=@Z(veAw*8FG;_O6ja) z17C*}>7hR;b_^Tw854oW#Bxa+dW=kb9oP>Ni#<*&Nj-WP_FW5J$*f=j8=a4Y}p#KrJdG*~>({Q8(!4Gj3oOn^{X0$n{kQN}d;8b-&(8eUuT6c1BOLe6 z@?XEj4W7)LUqdtJH>$axfB#02b@g2Sjk literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortDateLessRecent.imageset/Contents.json b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/Contents.json new file mode 100644 index 0000000000..f7f765b8ec --- /dev/null +++ b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortDateLessRecent.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortDateLessRecent@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortDateLessRecent@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent.png b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfcc22aaab7e7eaaffb90087e43994c974d34df GIT binary patch literal 502 zcmVP000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x0jo(wK~zYIz1F>MQ$Y{~;LkR=j0$=UYK!Kb&m<@jfs5Eqc_&yA zC#eJ_BCRAcP*GaNy+V=FLhhT|nU~_+mnJAdA1|tbJ#oQuxRpe17H}8wu^RY>Zo$NZ zByv!|?cyuHda^G(sR^eO{|oLEh#XIOC&=|=1)q{oDJDHRT*(&B)sRo&F0SJ793mq; zsRjnZO=sb`SjjwSVMja@zXe~3`|>w%MHJnh9vBL{&Usf3J$%5KI>NfV3pb&IM_9{| z#=@?9a|-m5z*s?%9q}IQ;!;8K7A}h|S}PH#Vkqo?Ti8fnSVcE|`@&{+#GyIcR7I}J sW#Og+oD?_tv+$+Ezm;dojq~5&C)f^FmTJe|T>t<807*qoM6N<$ff5N<3OyF)&Chgg_qM4tjC#x0mrZz zODb?J#TFbd@O_7MNi3ZMHM~_&_&J_T$UlZJ3j7ng&^mVuhBt&kyA2E4ta}uP+mu~^ z?U<3b_VQAew!jLZxf__o%98c7H(Um*Fcs^ajy80JdV%mWEUUm##Sy~fa46P2BlL<& zsL8w2r}FinEUG#p>O3OvW|hWFHn1m!#jYwkaRi3ty<(zl<@NG`U3N_TADucv7&F-f zFxGCR#qxDxTZaaa#u3;dAN*}~u~+5mM7vXLE2MIyA74hU9rFnf2%$m)Pb5%II!EB? z$aT&GQ1wKZrt`6DcOGBd|5{?VU?tNC>O1s1^Xuh18A=Vis2w z?7XcY@VGFzKf!Ma6{p4}VUg??HgdSuku@>>uy;09#(|iw%`%FPjK=h-Xrp6LBw#d>5M)&c?z;iIiP* zy(1SAaSzDP32<%KN{v68(LM+~hW1ZdN!gG}mae!V(z4 z$;kBseiY)jH>B&f4@dq}%?jU*h0k=LppLKQ8?wsV(|Pb*)bUQ1QS4fiF@3Zm`G{~p z_XxfbB86Wna?OWTF>Tr+%ZwAlP+Qg7>5RzTT zb$sEoLf*7fs>fnwu)3gg8uz3kUM}xuGs4+xe=70<`i0pk8`wv6VWF+bCxC` zxM5*exG4T!DQt>%McLUx{j@^0qvKm5n`D00000NkvXXu0mjfrWYII literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@3x.png b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..114b84422ad6181d8927094411dee4fd2ac7c8b3 GIT binary patch literal 1743 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@3x.png b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fdf0031fcae8a732bd429babbc86daf7a5bc35 GIT binary patch literal 1278 zcmV002t}1^@s6I8J)%00006VoOIv0RI60 z0RN!9r;`8x1hYv*K~#90?VMYP-9#A2e|xO9wPI!M+6P5l>dGoAimWeH7b@z53Rb+- z3wWtMsHg}E-jE=O3cggq3L=7{t_r1iDeQ~j4X^l85CuWqb+f+f`Od)?ZB9)I{pM6@|3HQya}{DZPOKN?-{MS z1@seDn02UvIw~Qr&pH!WEzEU1@Dgx%D%J+B1KyEKTevI-zQpdYo~Tn)6Bz*Bz&2_t zp-;4U9NVbxfR%NMY9i}V9eCQP-+@!=6xBq|2KJyEbpW`iPElPrtd2@o1HWKje)rZP zrXZ&Qv%rq{?@Cw-e2Q(<%T)<*cx zxWkCe0#^h3Tm>Ef zXHX;eMMF2UmH=-9BSw4@c&sOi8ca8{HenAke*iYHfTmuG(#foi*u#O{z*WFsJyXRD0Z*v1fMG6e*)1Y})?YwpD}U=hrNNzEEU z8DqXCYXL8MQB;hTsQh;4u;NdZU8J zj5Gh;>^IUr>$aTu7;u&_R~e3s|6KumKykw)jK{f?*LeR(4j!ZP>aR`SWOip5{R7}4 zEi9sV%SyMXc3ju6MBrw0bDl*127V{%4{%sL zTaH>}nIzbcdd2?9h$u(U)~3Y%$8cRi;u8oC?gKkHga4#U%PTY9>CW6v<;nvTe>Oca2eQ zANIp`)tD_TZ~F~6y=-NJz`sV~3vc%Llh0Wm6 zD1hhiW7aO_r&F518XTVW60&|VWGSkd4yIz;DAot9LM>xSb2IR&le#`&1A6P2Lp@3q zp@n_B{>Z ocMA1}WLYY9&@opa5C|mv4+Uo1j6ii~WB>pF07*qoM6N<$f^}tDnE(I) literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortLargest.imageset/Contents.json b/iOSClient/Images.xcassets/sortLargest.imageset/Contents.json new file mode 100644 index 0000000000..e92b17d4d0 --- /dev/null +++ b/iOSClient/Images.xcassets/sortLargest.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortLargest.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortLargest@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortLargest@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest.png b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bc9f749fc84ed178fccea6140e525a5a960c9d GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt^vJY5_^ zJUZWAGW26|6lwn`fBIC=EP-4brjJ5pa*o;$8QQdOt~30op;B_?Rz|Wa=PZwn+(Idd zXZc(j^()U-PyX)v%wFb4_nrr@r(~kuelOL$_u1?7y`F{db>?Yxz5CpC iea>2!J(&mP3>Z`QTU%LPJ8=Z)KL$@%KbLh*2~7YY#&uu- literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@2x.png b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..261ec9c26cc0af2def413f332e8113e4ce69b54a GIT binary patch literal 403 zcmV;E0c`$>P)Nu;($kFQrG! zUGOYALa*jUvMVRj8X^)KA`%-JVe5!btq4Ns74fMR{{pEa$s!`L@ux)gBv?0WGMerE zQa5TMbtG9tBsRJfnF0lnH<%*_w!i{lM*X_61NseaZ1SMy{NTKdYuCzEYzaI8+&dDt z+m>)517L|;=A4Kru~c()$^dxfl+XdVwfd_>Oo002ovPDHLkV1mB=tEB({ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@3x.png b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c48a7077d1bdaa4ac433db3f0c0f21e4b4204d31 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u1|%)~s$Kypwj^(N7l!{JxM1({$qWokm7Xq+ zAr*7p-rnDRIYH+5NAr#M9`GLWwaVN(FZ`&zqlN{?BZXZrUc7nmNI~zo@g4gII`7mi zc5vKNdH0Xqykq&=t``sV18iPRnBtvv>Dg=>-&x;2H(d~$^!(?u!Nn?bqPy$o(BGl)tec1yjeLT@&&_no8D4p3(h$V>%=7$7~(3l(!{7IH`a=-_S?&P z&oTUd!hdF>{+f>qzAfG<^edD* zr#IT2Jl*xfw|cjVKL4+ahThpVt*N>4jh{`gT7;W0g? zRcg)^*sNe=joOm0$?SXUn%DIBy?Q4Pu!;PsPVX+b`Xn;4|5RA)V!emqoBU1xH=EwG j;=cB}vjYSwKJd$*b>S;|$GRJsEEzmq{an^LB{Ts5+ebg@ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortSmallest.imageset/Contents.json b/iOSClient/Images.xcassets/sortSmallest.imageset/Contents.json new file mode 100644 index 0000000000..91698080a7 --- /dev/null +++ b/iOSClient/Images.xcassets/sortSmallest.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortSmallest.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortSmallest@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortSmallest@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest.png b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest.png new file mode 100644 index 0000000000000000000000000000000000000000..cee841c113f207a950f1911d4f7a1b5de7317209 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt^PJzX3_ zJUZWAvGsCxlxTgZe*I#$CWqNKvqx%|QaPhmatmxvsdg>UblP>rbFxVomr%#ixqk$V z%^Q0j-REBZ)6SxOrZLa|8uzLhE?>8Q*>&{nCxZtm-j7}R!g#xT7(MstEXlriGDP{! zGcHbx)2Y)Qm6sZQ*f@D*m8BC?U$KPgM`bHZ_nRB^3u6;B?w;J0XI0_BGPUr!UO~$> zsipt6Yuh{){LTH@Hl*Tc>gtCpW^Zb?mU-k^`zd(O%Js!_6q&zjul*ntdh}+GuT|tV oSEUzrT5E2kE7z1AkbfZid7o8^@u`_AKu`V`+5sbfqwxT|)>$|Lz8%N2 zPR2Q(E6?xW8T!hoB Cw5wnM literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@3x.png b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff8333664ac4c3ee48c0e8d936ce2c9f5b6ac97f GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u1|%)~s$Kypwj^(N7l!{JxM1({$qWok?Vc`< zAr*7p&feQ4oG8*Jf2@#uyTBJFlf1CS6`W2NqBmT)bm^Gx7J;n=0^W`}Z{A!#=T@Sf ze?a;JyI5x@_oAb}n7f3!f40r-oIKa^^W>8%@0r_uPn`LA?t6h*jk=;ji+~e{Vv9f$ zqeXz(!P*DhA54|)nEg-bT~k=zDEQ%|t=7#Jr+{RIulNNumD3F=k`r{8C#5=U;_;Zqc+%(rvw1_bh`2dh z9OHBj|DW95{4uP3)6NtNzF^At3O70aY?9sT1G+v@^ctzNa3K+(U*K_x806(xy*xdH5^1{;X8|p8p__w^I5ryPkQh zOY{ZlJwPWQnUp)VRAL9ym$VJnA|I$-n0YX2>jqDYpj!4{mhU-lNFQyQ^ZmeK_#zcHSQ*q*NEbF|<@iSWYo!8E?)l<@+JF zJC9*aXxLks3E>e3{%yMCQmVbajPHc9PQtD=O9e#>=lpGDU2;0gDo`-?f%3~kO#h~v zYOcECAA0MA6_7V+)3msdBc2H!pJc@BYw{=Bxbxn%^*)`_?%OTor?e zM4oS(R^k5B`Jv{a`;vao7G0|1gUKedX#i@VE20>Q)dzBLdb0&Wjvj|KH*8IZp uU$y + + + + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/speaker1.imageset/Contents.json b/iOSClient/Images.xcassets/speaker1.imageset/Contents.json new file mode 100644 index 0000000000..ff3b03bf97 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker1.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "speaker1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg b/iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg new file mode 100644 index 0000000000..957cd4d925 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker1.imageset/speaker1.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/speaker2.imageset/Contents.json b/iOSClient/Images.xcassets/speaker2.imageset/Contents.json new file mode 100644 index 0000000000..92044d85c5 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker2.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "speaker2.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg b/iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg new file mode 100644 index 0000000000..3a22d817a4 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker2.imageset/speaker2.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/speaker3.imageset/Contents.json b/iOSClient/Images.xcassets/speaker3.imageset/Contents.json new file mode 100644 index 0000000000..0125d154b4 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker3.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "speaker3.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg b/iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg new file mode 100644 index 0000000000..567b58690d --- /dev/null +++ b/iOSClient/Images.xcassets/speaker3.imageset/speaker3.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Contents.json b/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Contents.json new file mode 100644 index 0000000000..30b4db5316 --- /dev/null +++ b/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "Unknown-1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Unknown-1.svg b/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Unknown-1.svg new file mode 100644 index 0000000000..5764f2fa6c --- /dev/null +++ b/iOSClient/Images.xcassets/square.and.arrow.down.imageset/Unknown-1.svg @@ -0,0 +1 @@ + diff --git a/iOSClient/Images.xcassets/star.fill.imageset/Contents.json b/iOSClient/Images.xcassets/star.fill.imageset/Contents.json deleted file mode 100644 index 80fcf5cf0b..0000000000 --- a/iOSClient/Images.xcassets/star.fill.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "filename" : "tabBarFavorites.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true, - "template-rendering-intent" : "template" - } -} diff --git a/iOSClient/Images.xcassets/statusdownload.imageset/Contents.json b/iOSClient/Images.xcassets/statusdownload.imageset/Contents.json new file mode 100644 index 0000000000..be3c311a02 --- /dev/null +++ b/iOSClient/Images.xcassets/statusdownload.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "statusdownload.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "statusdownload@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "statusdownload@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload.png b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4a54a7afcb726d2ccf28395e8e06c54b16b8f7 GIT binary patch literal 2853 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 AiU0rr literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@2x.png b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..86523e479d7e00607d56ea0f68719a993defb8ec GIT binary patch literal 3370 zcmY*ccRU+f8%~XyRk4eb+B-(92wDk2L#+~22~E`%q7gNUt5(F;+Ow*5YEz>%?^UgF z?X6bLQfhuR>f_$~-S7L(@Asbfoaa2}dCvR(cgQBj$SaJzi~s=Oih(}D>^v)81pVdn zSwK6Y@;qJgG(+kD%KG@%&NmDm`qrKR02BK~TmqzL@|+W_T`bT8~Q|M0y^n85*gM~nUQi!gaLTDos5FAgyf|TVT za`Hl2j35vQMtJZLYKGAJ`}+A#Q|J+q=m7*+*r@gTb3-9Z<+7)QJpQBz3h!swsz*E@+W5C7}r?)i6F z=LLcKKc z|I;=tMpV1F^?A2{F+kk1ctks5wf6zzR4DcDNG|?EGdAik;=GnZJ>FK=OXE)Tn z2zQzeMdfuvC*%tOl9*RK4vE(JG#5x;cxl@H!wfRqB~U`JT5M5O=axru zQ5#sjZc&qF#(z0i&dT`fE8OHO+98JDHLEL|1Ic$H#sG(<029z$K)ea_%OHYG+Un~} zDv}_XWe_4eRduuLad`jE(;?<}6BE8iinLc20Yt$FXB~?BPPvL!!|3~|Iyb&)&fEFx zlap4s4{KGj$F}-$R6HV=qzaj@vUMfWAe?qqZ!)Xg3r2bJugcW~JgJ6sP6fBku`oUl zjS_v5@kKQs^8^-nQeTbfhzbil+m3TMAaU(XVtD$y6Tj1om}=}wu>z@zBe&6J`aXsy z(}@J_DmS!~VL?_lN}>_&f;bZ4Tumj3C; ztHHtTV)H_dv?y+{7)*%)0U;aN*7dw#XWyEr!%GXr^6N1>NQb?fEQ@d^w)7aYGUE#Z?Ua_^}*cBmuuy(L!A8Ut{T8)9DPv~=q{ zu3#_Xz2^U{HRDWJB*I)hp5^zOyV%!yQB2wB#l9H(`lRQ1?9W#v!minTDM^tjEtFPN zRUJdz|E<$1u4acLySB1Y!EeHKN;v6cFp4&BFV;itB(@Z;i;_0SloS^i0~X~|Q!pM2 z+v(fPqN?nrUOB?mO4DtT4;=2=Rn!^Rb{I?sqT2RaSS~B^jUV{~OY2VkkCln0;{o+1 zv9DNAhR5+ySkn){qMqbXAQ{m!oteq^=FOWsODiiYx_PGHYvj8@>WYereyja=zQxAG zrTjPzj17fkxm2p32yb#D^LKfnn{Byf(NPd4QfoVSmHr2vPi;`lL;(jsh(tp6G>Gat z8)w6Q@DpKVCpO^pkjr76`^?ed@oC5iE$xrzo}hI_Ig|puZL4bNmw?>r>Ro2__)r4F z!(2^(IpC7GEgLVbIKT%a4~3RwOZR1c4k6&+tW<#4O;|566-Sy;ot}@;5w}<%5|tci zCY60i-Sz3?>`oEos0tpYy2`1 zGCg|$Tv=~#mPED84a@JnvBLu5k=B)AB2{kEf(h1}9hrN+hx>bHlDvB%?WF>K-8LZ; z_vLapw^oB5a*k0#&D#^((ceN!2+F(#9JfCQ0pSe@cw4=@N5KKz$&elwK@1z9r5(OB zo}s8=%56#g@k&9_5_OzIq9@rbQ%B6DHhph<`JlWx4hv%S;3f@jhm6l0pLUvyie{Q9 zx6oY29UsPI^vwiz^~ov-0b=Qr*^3nv6mD>9?LsUKUnZHsgAI+*q9X002A#Cs^3*g! zF;~2PwmrKA!}()EhDr$v3W_JVZZ&&C4zDE+3@B_=r#+sFCkt)jP|cBZ z7T2Tc2a#`1iG0aOAuxEXG2r+hrrZrLK>gxVW+s2_y8*?a%nuAfc-w27v8=wnzItb^ zt7ULN|q$ZyAH2`_1CQ1h` zq8MMPMuRbtOVysGuYHRToX=1BxvpQxH=@FCq)b%%!zC)27Oi)s31xg3W$*U`TsQ>{ zX5#9xQW=y=os?JtkY-&as~k$|8w-(X#yNKT*A@v|Nt?a)_-_a}-&e`G>_l9NpzNX+ zUGDPo@4gFM#sD9C@4o9@EB}F-qy6aXj!p8~7_Z!V zTT?^K{Q&0|>AfFDgQRs(F@DB%LHskV7~cDYbg)9pH2bgDHs?-7Fyg>t#Y; z*;K*yLho2~~-q>O=~(s9QSqqw=y~g}2_eabVlRAp`M9$@yU-YEZ~Mk4@hhsjPflA{SU>;{NQsXegPMEFlY!Rv?)k@6ZFDpb=Pp&LSMz;#nW~(4 zY)`5VnHBGM=y0>v4GU+WVb6c<-7THGdGh)5`@KNHk_l7*KiOyIt@l=GmA}i9s${oT z(I4qF)9?V5!5tR*(Bf1CY6G#?O5h{GABjd#m@Z+QZpoFRf63H1Yh&3MIA}6_1Xtf6 zN)T5ze(Y+b+_m(0AyG$3n+ODyk;)pVL5`f zT1<^iO(VwFr~LfE7Sl!y0Z+sg)N*TiO=wFXZ1&QF~72l(xkE@(5@1QGrXcE$fM6SEC8H7xm)2Qr0}a zi4j#6Xb}98*3yseI|brElQEDinZyPnnNfW{3Imr>N=g>k^zDTAhu3 zsn_j0O~Osb-@BV86#p)!VmXSGymg>tbm@RZLj25Bm#PxJDoDWOmrW$QnWD#YT-Ce% z^GovsiSysRBLRynfcI-)Qd;-(}eBF`kk?AYeobBykLH&1orKurz| ztSc=qT#t%poz?xIVicb1#R;o>QCF-_FD{bV<*k$3Pp^HIt&}@LwbnvY8)C+)u`bMc zJ0&xk(KOcW!_#0cpY+aZ7I%M$OAW*pyK4)K+0gR-Hhujx#h`GTIQ0#`V2VC&lqqpXRv>3WX1^-j`zU9L#=qQgflpsI7&I9C{RySG zcq%roQ+B)Gk%fw+#kC8}y0cfv%hvjH^j8nYXCw2~^V`mp6$ZNZU8 zZAj&{axve_q1)v&rChVpyz#uQz`uYPv6tm{NNciJ%JHRhAFK}z0ELL!2 zlRND>9qHQvjxc9`;H2gJ?l5nto4RGul3L13Bvw{I z^5E~Bd+xpSJX7EI&ij7f{4vkW#OUcfp&(@@1pojP8tN(rx4q`yN=$g$O6mCR0RVW% z&dSPq8p_H*J#SA3XE*y>M|`~TlIMaEy+VwqMbRCFy!zLa46(JwhURT7%+-U08p*}q zm6+SczCA4Z^xT8la8{ya+TA$!H?Al78D2;O5qknkiJ83rcf$crlZN4Ah8gZ6Ipn;e zQ}XYy3V2Pe;RnmX*2LOi=^Y>WqtD`sLnav;=^9MX<)4<~xruLb)6*V3<0P4Q%!gGh zE%DcBw*cdU2P2+*?X%|WS(YT4-@idTe^y?K$DO0(W+E5Jj&Tl2DSuQ$1zcA9bNpcC z@ghccoej(zZ3;uBZ3y&tsDo=<+cf$G?{#gTG4Td7U^)ja zc;Zolia+0F_!ss5`6PK~-|z^y9MkG@7E!L(1{4zDf*gT={m`lurazV@x(*9Iy{Rd zBXb0yuqogCFn{7pO+}i0C!0#Z-Pb%~dC)%cLmAUL9FekwDDo~gxV|ACo>q$97lV|$ zF{Lm{`vc#tkUp>ebc(9kcj9W!6Kgbw;jEcRx`-b`JHQ7?%692-AzI7ao{4?ju~RhO z@aY!T*a@4ZIqZqN*d+f3+so0m95rkDqbmQY$=YD-=^fXL#4Kn2Toe(ykFqHp4|84% zzN+K@S+4}{@NeATqt%iv?=D{`|Mi9Ru(G^4I`LetIkMYW-PXe);j^r~T0#`#2+*p} zJ|JKceuL-xBJMqp&6vzAowF(5E>Uq5kJJK(M(Rq6LMp=+*;a?QkNMk$7aC_qXV1>` z&veeL&Y0}hlHiatjaIIJdlqroGaEa$CqG{Lna_x5f3PwXDvoP1_tO}DDyUwoKJYR3 z3y4C)c8dMWk7e2Ss16i}Fbmx|GxNJ%sy56FPltd3^*9P7)#!e$>^h|xsSaECLfHuM z5bn=PXP5@Y`VY`}sk1t^rslR1J-^qw)1sAqolfc$$54v^rpriFj{0#<`YHzc%{ww4 zlpSPw#m}`19vP<0Zixj|lv&hadx9XM+R}Qy4VrR$;K@B;-4U?6fTOJE6jXoW$9=Lw zD1~KQhDdVFA@NpSsq!wG)xSphtT*Q3SV-kbE=C-W>v9L-9J^ecVuCH1Ix;=PGpUZd z_RjF38ygNMxmym14NYt}A^g)NBLv`uqHSJ_ygdR);OY3Z3mW-{ZI~Zo?X=4vYxx;VK0Dvq?=62|AkAwkH?rt6k8I&B?KM0xI@n5qb7w{hl z(p8SjR9g?I?CEU}6bFleg}CHNfk2?Fx1EEGfr{FHmfz0gxSWtkxQw8nkB<-7M-=So z?IBl6FdNV3NI5R9 zze4{l|Be&s?C`%z9*F;>b(^5zUyq)S zTYf@%MQ%rad=Zkr#TT98@XNUJ8B_F!MUVG1Z-#c(eBYJqS4Qx-2;_s50_q*!MJP=N zW=wXpvSt(yz$wf#r1MAuiS2QFr^d~D_olQO2{0|8IEAwtBm)>$XJ_ZNrT*fuVs`K6 zKARQ!!Ushn6|Ue}(zi7VPLOBS)aTv+qXOpw^=X{A;x_$R5OQf!fb5cZ5$A2B1&rzb zQN2LC;;8Z-^CnS*2YLRF=efFBG`%y-@oM{t!OV;!Tc9ErG%}_RWW_7?$yiShpofoR zMzrP{&YK2&Z$zwrU$Yn;BSJT&)@jGo6v2yeg!G-wM$Kod?}e90kiys~qxu~4oN0_E z51y7YzjfnVh@zovsFpU!aaVV~3hMsQ)P!VMH~&1akK~j9Hmcb~)6!Ev7M4%@{Y`45 z0?1!MeE5)(HiYsm2^up?0CYcY5+>KL zRc(f|*$e1XUZJZUYAEz7Xv=?7M)GJIyCB;k^eP*>dSJK{K!}}y6IpZbKD32NS z9Y30@|Y4_Y-ud zO0|<18Lv}&q>e;E?x{l9)l1)#@xanjKC6i-NVprC3+DPM=~q`6E{6K6s;-UG6>U=` zF;j&k#G!?tjT)zx0P4Y+ZoVgk%^a$z#G4hgrsR}&&fz0VW5xYiV`*-=`uUof?vy(I`!0nuM;nII2au zoJ&65*5_UfhPKA5Q-e5re(ktRRn>_2HwxFNrmn7>uSpVixSA4?5hb%5 zUb6W70rcMll-CdJUN{r5C*Kz*Z%A!jA_z1!Kw`026@9f(=?WBY-KNa&mUkeN;UOLC zsD36zk-MEy?0XZH;g^_7TK)zXOGcC7;o(N6CEoh??Zb~d@i zf-)r8J8a(h7<0A0zPME%UtM#?AG^p|^D4_YmWm62yCfdScD%rNF>I>|jn$>gGcR zff1@;`b$Ogka;k&fqBAI>TOS0OiWG=8C&qpQeaOM$Mt!x3^bBHC$EU4VaT>V{l)RB zpzhUD*OA}l^?)nQMDrkDbYFFR)RIo=3Ea}s5-_jI$K}j}v(~6Olr2;}wwehn*~%h7 z&_$DH-T#i$o{B&GZu@?aCn!0Se)vE{y#CMjSSCNF>dtCXD}Dr+5&E9u-2y@xvHq+~ z+jcC*vJBi3a;Z|9?-q9SsbFM&nmDZmZ$GM<#KP{8(z}f9hsbJxs4I*N3m;br!IH2V z#0aZeYDI0+@W`*tp&L~|i77)jyGaIB#9!CqzgWJ~q7|SKg$CK+iMVY~sTa6x{isp5 z_Yf+F*l9UKw%6M}>dUEbON4E|tk4e|Agh78q&|B&8pEU4?6@jl0P)667hVpztER5s z$0$fWoqx4T)QgiTR#y$diB7X=%o52O1JE|6Vf zeZPcaab%+w{Xm-B>Q3&XD&6mP4C1|OW%qPstjqDr%v6RQzTwV!(!C~J7hD@AHvYWF16}3M5G!y#W!3h9ITzPaIB;e~~Ir+j4c6Sdd{b$G9$Lm%c&IEMGaG#O?5 ze8M-v@s$uVY-ES+`!%~LW~Je$jiw$WY3&11lx*H;o-x+#Vxghw;F7Ju^3>4K&@)ZJ z?f@9v$tfswdTYBJ?M&zqn1#MXL4EY6XC@VRr@7wqKlahyN6;ZRgUxm&`m=#HX`L#bz5GG&N5oN!aYH>Gjf6Xp;E_Hes!)c>~m>~hSED~|NTyuyv zIhFlw8tm%2Pu0_b`_#p>q#aUZSXd<8(%gIyy!qMFk}PX~IR@{{YHGq5NCBkl$9^W@ zr)Q*DYfT*i9$QUd|7;uO>>n;)pC#+62^}aGuo*6>1uuQT~_h;#Q3 z=PCV+F^k>0++a@ZC;^HMKFR)3nCC5yT)~rG8diGq)=RsSPuUlzM{n?7K5jDvI8Ebf z&N%u{DBJ|lKWXW1fUfnX77?|#iPEr8yWAP&f*OtIS__B;(v{3T95?wm!6YoAlZ+OC zP->g&Lm&(l<(P?{gh7hSk5jU-Rt@`Jk>YPyrKkLNCl^?h@{einl0D*b>{t*8eZtnI z(6|ui+`V~TO7ZM7RbGiZ%XhmpGF6|@#>&bM#}^awKINUAa)3}v*! zKGj}tG*0A1u6EZohlw~8@K2LS=+JYZw*6NgG3=5C5SW*fe()&qn;xL(R38f2#jo}g zyCVz_O47m_8w;WU#5MNT%7uJ03x;dF9)n{^Z3A6{CEH;ww^zj$_c`yu4a_kf{#4Ow zc~i1imeZe4U4a+v*T>yQp4N4F?Gm&a;{oMcrM(6vGEMFt;Qc_vE31VzgrkM@)%uL_ zj8BL*D`g^)^3MSPV~IC~L~TLGUhs0z!ovq3_Z2J}&nHZnDq-yr#;(pkzVyh?Dgd)0 zAG8+1;bGReeMqE~PyLp-=~Vz>g)w0Hv!ufH*+!vMDUV!HQg_9phstM8Erie|cSORE z84H98dK6{B58^k+mwd$$H9c-TURxF3{s`*fGMMbs8d$)ma~u3XkEDcjHo-TEPa5|b zrY#yvHyu1XVpIEYOsxc?yt8R#C8 zQ~Ib=V;a#$N}8#ggI(V3_M#tpe{=F{)|%t|z}(aQ_t=9jJX!VWO*WIRFi@#Den$`) zDCnSXn!~&5X{0_>`1#gw>eX6*X5s}6=zZG=UotnD8c2WlS6UAbYY=8gf%JK9H{3_n z_fO{o*Ybc9MQ|QR0bWq$Tg|5#uL*Gr5V`|;O;TYcS`ch#&XN55769@?R$GREE+Qz9HMJ0%w|Yt6%ZDezh% zR#iQd2Epx4er_7|&Xjq?ee&D5QNYg68hY4Wx&?m+fpbAV-JA{;E4Z*AQ_@QlkpVEe z_DkY#=7O;o%UVKUjnMDxvKy;-yX8URB^c8WQA32F;!XSHF zcBtW{5A^Wd*EBj9f`MG~7<$rV`>YHIQM) zT61pX%7VyEv>;!Q>@K_`sHMK1s-u!pH!SHpXQtN^+^=(OK|*)Px+4U2PYZpnL;5rI z9Ay|B@9Cvv26$abMBf~(HGL#=5Ig_Sy;yHMIc^AT_|Xa*#{D@ha+bTj)~j2+OJ#d* zNj%xHxHCsT6KFyBGvVDs+1w~E%aHE%JO-ajS$2*e*?YCD+Qz`I$y%5V1jE7D zw{PiV9wcb3$AOxNrCAat-`&f8QaCuMHjdhS^eI>(u3-up#VSIWPVrTX%O9<*TMW4OHMhvnx)C@Jw2VA^b|bu_sS%A z11AVJ+>}M?Y=^Q5Iy(m{3%uO&4VXy2+U_r~Bh-GhW9NMJ(?hmSkH4%TXzS$;fH;m_@lI0I~;naq=uWO?{? zH(=o}oyA0~W@K1nyIQupwxsebi1b`I@5)z9Z7V_9AMCKOu@_@QXs#3ZtJF4NCO=hW z;p;lFoJx)qudi0cVrBco-i=Mw6vi7$^(>O+?O_Jb1eVcp=WLOfvy7+g6DiyG^h}xd zU@t1yd!BWSk{lyC;Zg>#vjeNkV~zF7nVkqN6nm)_1n~7PI|+lb2d$5ydpp8VU7;9H z>UMfG0L6|*4uGl$;?(BPp32=7h}_?|`EqnxScVUo8c-NSFke%JsXCltK?wc7|A!i? LIx00v(6E02@x=DZ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statuserror.imageset/Contents.json b/iOSClient/Images.xcassets/statuserror.imageset/Contents.json new file mode 100644 index 0000000000..90c24b9a7e --- /dev/null +++ b/iOSClient/Images.xcassets/statuserror.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "statuserror.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "statuserror@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "statuserror@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/statuserror.imageset/statuserror.png b/iOSClient/Images.xcassets/statuserror.imageset/statuserror.png new file mode 100644 index 0000000000000000000000000000000000000000..ec243f09c03953fb5c68eac06d4b3904dace7a5a GIT binary patch literal 4690 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 Tgy?1eebhBob>P*?*5UsG+*87? literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statuserror.imageset/statuserror@2x.png b/iOSClient/Images.xcassets/statuserror.imageset/statuserror@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..83e5cb20f75088b52f3c7b2ca0b7afe20b9db3e0 GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statuserror.imageset/statuserror@3x.png b/iOSClient/Images.xcassets/statuserror.imageset/statuserror@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..886dd8b5387ae5dc41ad8f767b88574a53489022 GIT binary patch literal 7814 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 Vv?Xa+@=qa1Nls0+O4=;=e*mqZu|NO- literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statusupload.imageset/Contents.json b/iOSClient/Images.xcassets/statusupload.imageset/Contents.json new file mode 100644 index 0000000000..07cd780b37 --- /dev/null +++ b/iOSClient/Images.xcassets/statusupload.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "statusupload.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "statusupload@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "statusupload@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/statusupload.imageset/statusupload.png b/iOSClient/Images.xcassets/statusupload.imageset/statusupload.png new file mode 100644 index 0000000000000000000000000000000000000000..95e89fae88743ff8cc6b22b4249e70f0906da42b GIT binary patch literal 2815 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 L80nN~J4E~&-`ErD literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statusupload.imageset/statusupload@2x.png b/iOSClient/Images.xcassets/statusupload.imageset/statusupload@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6a22c8f3d1032dc999722c6a91cf420609a2d935 GIT binary patch literal 3433 zcmY*ccRU+f|Bk&^#iledT1pa9DppCu^56crUAP+5qqtTdS+?H6j(Z@*$2_$Ekoo=SKgwzwe2|xcUB7?QA}0tr-+{nn zppbvH$w!sXQG}5%#)a&BuCEGH{)_oP*grnXkaP3@y3F61{)LiLRb^C${986vM*VgP zYjU-Nbx`VN?lc3pF`mE)p&SLd#^!`e##{o^pTZ2JG*Qy+#SWh3M!_%3%%;o?NH-Y_ zTFi8cZmze{jnPUzdC8dc(=_;UR3h7D(I?#NcQ&7y>PMMs3!o#ZiUdE?)1a@01b$uJ zJ`8Y`o3n#7GD#|9RIqa=#Q8IPU378~$8!bj$`GwosBX_XAt*1?n1&<;G`EZEzU?Sw zjvv&t;lLP+N9E5@_bBE`f{VR`CxFX^p;MuG8}1XK1){nUo-cmCX6qe%`7*cGmaww2 zg3vReB01Gj;<88>np&>kp3@^Y)8Gd{5XrQazrRX6+DW(?*l5X_58-8Q766+);cHOd z)G1lx|1zS3gXaEeF_zFeR*ac?K|cjIkX#5%lYgaQRKTJ^vB<^G1B<@{CG}kRq7d1( zkc<4KbnqLtN0`RG%R@@oCgPs`=iqsqSE7nn_{I)HhGX8rm+!c@K^>%$qjkE=` z#~nSDo*VPul!~oSz=8ZIf9v}k?z32nJ0Gk+JFs5*j^=vI?JtDDt+K+p1vs~@iywF4 z+V6d*TUu9ekD`KPA2jD1UeaIJvY_vP&JXTv7|9OYfK)czn^Tq;UKPzHLFORfu!t+d zsT&>x->wL0$AFZYFUFxBtX14{{qT0qEGZ%U#)3{fY5Kat^|hsI@?d&+u87(n`^Wb{ zf^k;H?6)$LM80z{Jq+0`w{I%^)e)Mbbl5z>Zdt+18E-{-qMk?M(l#7qvq#E}44e%1 z_upbWJu(WVE7o33YwCEfePPi;NqisDRy@J!&?#Z zBeeXWSu~SB7zothpiJ3!c00bOx<9hq&k=uQxv{ZfW4Gz=@4v~5P;0M)VurKLt*&!$ zf-AW5cJKGFXOzoZR#sFbJkbI@u_k$s6%aaH`Ae2Y${HO%O=qIjeA3LYv&CXDcP+B>L)2FU~zHrC)MZ|e+clM z@?@FlWUlU2`6=!92`L58x6Ge4jzs4?K&Ywx5v6g-u$E8J=%%K+S=b~LM6rqxuV;oy zA4^A(IHZhNlT0ho3wFW)cdGRC>}(5Gw$qwB_wLV=E@e>gLJ3B>N6t3Xgoyf{od)@`lSv5&vV_RyqVdATQj|s z;Gm?-Tn~<}!qmyS4Q7_xHQ_7il_h%h_*jX^XXD5k{Yfs1HjZUmr`N5}WGyjFWk_s3 zD~#sh$LBAGGOt{fmbOFQ=zW3*+se2m!HY{vzcHcF=%b}*P8yfDs5R9}fiLV>5zn(#t*pTH7nZe^9rLX5wiwdvI|*L?q&e;Cq3OwxWq zd=IB8Yst%N;}=q?-WHaa$6mInH)e`%|Fl^=f28xMYo`7Y>ZL29&?cQHDCn&uP^#vd z-u$O(HzPUx^e02UL2%LaG;u_fos?DL+&_yZ$15;6RBkp*@?@H?U}6}E$V8B3sd}6db+4|tU5o*z1kAI&#!bg z8;$p2fLX%j=`W3 z4fu>=e2<22c+hfRD%1SwAm?b3H=b`rtagZ2tXT!f$$cg^sYKHea*~RjZ1||~;LglV zJN|I4Y8C)x$9BkcU5hCdT91C}T5lOz4R$)?H`%T=f*)6SJc+al>?(6;wf_W889g!t=h9AioX(tVHU_%YD`A z=i+mPRIQZ(^Z3}dJXX+E4pyyiRU^@=Mq#5jM0Ld7d!{wSq4z?Rbd_V*kTLym%1wI8fNxpu$qsb544KX(iS75QWU zOM{%@VO)X9tAE}QAb79mO$X7PP+_`@M&krt@#Muv=DSi1JlSN zWV`Yc`>_K3Q@aELYu^i7EMw(hZPUsPri8=|?It%=J1 z)>a>>>j%!D9NmL^G~rO^RV%^sps6Tz12#UJGfmsAzhpv$3;t%#uCW(d-JV~$Onko+ z{Je8_mOe%yFXtP$praMbM$(?`bh^DV{b~GkhC-thW^0f9X*ZXBQPJ1Ay>H+s9K-+a zHH^6oyl{5l?XL@FuI`CPWp}04GzEh#Ac;|nCUXNjgstJz-+|t`{#`%9hz_>99n0xZJPUtUW>ob@%WeV5%wHaa>w?0_pZS26XX%aZ#;p%2{5l!DJp zy7sA_QYjlZODwTgXRe9>*E*#FJnQ3`0Cfy zdi>_fW4-j`-XAb-q1tOT@*kz1PDRkyeD>#J>&WtRF3yhGOp!FzYDSI52p|NQENbX7 z_^D6xj4r$M6~{-!$a`%MEPMtHysb)cxAE?2-(a{JB8*Hf?X)s}%x3N&N#S`!bi?Pg y9!uj&s(Z&wL>GNBzhy0T6GA{*>f>kl1GTlII|o-v%{b0KG&-7wsMi_}5&r>9yC0MQ literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/statusupload.imageset/statusupload@3x.png b/iOSClient/Images.xcassets/statusupload.imageset/statusupload@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8740be36edc460c7ead4dc44c211a17b5b2635d0 GIT binary patch literal 6277 zcmY*-byyTm*Y?69v2;raD-8lm$I>ZFr_#O1O83Gl-I5a0xikm}C>>JL-3Um?k7fk{ z0pZo>dA{d+-?^@tIdjfE_kGU%G1oN{qpSUt7(@>O006`=HD&!jv&P?!kNano&<@xK z0Dz|mB_&;$k`h?g)6D_l4F3~|k2m`2wqi&n7vpA*rjaYCPavUwQ)^^k*1|wvGk^anG7K-txh{m(R0`G9X)?qVsc^*Gw2haB79rds6V4>aSDo zb%j-o^yVXej%Z^WWcn6wuP`Gssf58kmu>nR^gL| zbM|;7ME*x+77G3O*N`~Pfx!uQEvEV9RYZkur{h>EN3)Bk|F~>rWR6p-c&tnqE%|!o zjAHUGt9+V+SG83%>L9*;vP{j`6M^C9($SzSqLXkDc-%c!)=IeNj`H`stM0w z$jTn^lG~PT;whY%eP5Xl?|7vA>R|%ANP%@P(J|Dx4oj#!DT=7`k-MG&5U81|JFB1i zFs96g1b*bd6Wr_3mqA>;kSVH)nD|D19L|{SO&M`GxC`cft7M-M7p%F)=9b*c_GX&g z(|zV6Z+ zE&uPjCqL>H`P)$q2m2J7(iL45D-}OyLB~}UP0`8MGEI?PMrwAh4oOqevZ_f@v?E~4 zUihn5lkWFGf8V%I?6zaj1xkc5=RbHQQS1^c%&@feRJkeak zdRN+4mREH4-`={LT)~=IUa^|T<<4#G+MOMS1(?kVX|-7z2$aM%ngzgy)gfxNYW-jG zXZeU>cGFC=hilTGknKo5+??)?xw(saiP}(8p!Nf5q(T&*M1#wnlGC(Cq?*mjEJ=fj zt6*PF2K5a14XU5qLyhr8b6S2go)2sD?nlksy9|(H9CfW1I0GtHH5%}E(qH~{!14>) zqw=F1kNBll$caJf!j4E_Wx09Xc~78;u$H8*{|613eg4UPaNP;GtBAS0=aR4fEP(B7 z9arLZ<+s_8k7X`VAif%LIDeT)2a1rWHanRo#Jgp_|f79cC>v+klZS&aPfiqzucy5YRvNUpIsW z{4a>NlMIWomM&Py%@Yn5V37rZ!C+}mdk3h#vg&`f|5?efIC^`#Lm?19KR7NlA!+5JX6b?+=2{%iq=82Fd5@#rkiO|Hq>Y_pD=7Uh z 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/folderAutomaticUpload.imageset/Contents.json b/iOSClient/Images.xcassets/tabBarFiles.imageset/Contents.json similarity index 85% rename from iOSClient/Images.xcassets/folderAutomaticUpload.imageset/Contents.json rename to iOSClient/Images.xcassets/tabBarFiles.imageset/Contents.json index 51ff0d5d02..662b45275b 100644 --- a/iOSClient/Images.xcassets/folderAutomaticUpload.imageset/Contents.json +++ b/iOSClient/Images.xcassets/tabBarFiles.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "folder_photo.svg", + "filename" : "tabBarFiles.pdf", "idiom" : "universal" } ], diff --git a/iOSClient/Images.xcassets/star.fill.imageset/tabBarFavorites.pdf b/iOSClient/Images.xcassets/tabBarFiles.imageset/tabBarFiles.pdf similarity index 95% rename from iOSClient/Images.xcassets/star.fill.imageset/tabBarFavorites.pdf rename to iOSClient/Images.xcassets/tabBarFiles.imageset/tabBarFiles.pdf index 25f0cd639b316dfeeec210527c252a3411796cdf..e9a6038f8e5adc0390a80093c286497ebd50c29a 100644 GIT binary patch delta 1285 zcmX?nh?*^_YZ)sH z|H-h09N;*j!z07X<&l&VaOS{*69<$(WNJUfG&?(Yu(V>cvijOWz)d zcoe<5U!D6)`lhchGi`|r^&s+5gXc&8<;bN1T{YwK-Z*vN!V`yeOVC!ZB_d;1UTn0Nc1?bx$$cHPnKtSirZ{H@_G zpS*jLT5q}BKD$==hl0+Nwp;&`u3Ucj!+{dRo2|C(_f$exIh&<^Ird_QZ{*e1?f1Ul z*!oN6fM@%q&uQm&InTE_C!&5b@3V&CECZ1qwJAZ9!mJ7e=efxBOBr}q)N@6cmv~6C z%zn1|z4OMtZ6eOn)+(hng=?p|{5})n6SQukW7rh7DR2JXlIUwuXjFP!swuH_RiTK) zjpvINE=*06TC!!$up|yn6SKH)6$;OI5s>7bh+K5F>1B zcx>j?>~lR4T6VQppPJr3)HL_=F`o4LJ!03ki0!#8v14hL0n=nHBLx%3y+&t$KZ||% zx%7k3In7ruq_)Y<@14wU-F5VCANyfJCUvFhb2#q0vk4v+GZ!*n^XQMmZON&;J#9@f zDUVbovSv;D%sD6i?yqACy-DpR_t#zaI8~{>@KRs$E1!ocYu&l{Y*Rzf1LC`ZeGKBn48gfbAjM; z7M9GM)Z)npE5#-+xW+cwT5LL_#pKIk&OlOJ+?CN{bFBDfe;tbyLzA==BLiI%(=$0vdv0wJ(6LAFX8=jP2Nq13Ig@i97-|8_8H@tN%-j@B%+%b(eDd)JN>NlOKkV#y Yi%SxVN-By{(|8RH&3IK+UH#p70j5g&YXATM delta 1018 zcmZ2_g!%9x<_S7dW@hI4{t9OLt_mi`mInHM3WoY23Z~{J=Ef7<`s_{24HOJOKp~Hp z3(PPuG&L|r7c&70Vu%@;8BZ2w^zk#aurzaXGqrFtGBGhTFmf_9ba6CwHE}dEvT!tU zbhNXva5OVm6|j0xU7N!XF+%yaE8%+tQkxwu54tA$&GDJkoy)^9g#^d_-|7`bP`1n%g%frW=x9+EzRm=$Dd0w#ezVGRqIw$Y$ zNWZwV^0<7$^G%Fvnw70P60UlleCfuwFw*ms)d|yuUf#Rw-Jh2k%xelTTo?DmCToH( z%fpqEdG*(}EX_K5S9rziqlX1w*d%_vGr@9cFk5%|gC^0LPflL$$|`W1AbF}}*3m_d zQZ@@~`xSHqx)=xvHJdb9kpv+@A8t* zUafe4-Bsn9s=&=_Q?%|ZzdP-h!y2v~0x}oNm<^kq^TdUeZ(doa&a#-FXHHb%_rmhB zuoHc^Gn*s}vKVV~PMrLea(rL#6!t&+-#(Pp&F!Bk`$BzP%id}0R^K?>ZoXm5`!CC7 z{qMI-<39PiUypmm`2}^cw-l%L8WmoiYxPaE${-%wsYEy>B5a%H)*w#MZy zQlU&mwMvl?-D#9wCWV@}u8z8!yKvIw)Suly_xarSujlhT-_P@X{(8P8KckLxp%h+D zG$w@!Ka&JJ_0h8N&`RT00{cm9>8RR zDjP&-L;yR0vS`f-3Z=Ez_{YGhB_@vb&^g9wc};^@h7 zmi6|u84PyO{k!swP)222Ou{v>$SQ=CLT9j8J2NG4VwyQ7_~5Gz;fDxxY)gMbmuqrF z>T;e0_TT)tLxxJyZ5+N=0Qf9_@7Jp)#60yh_H2jua~~#T{oK2ympA*+V$H(T)cWkV z2Ime?&nkSK_N|-d&BC{>xo@xjZJSqkBc`aF&EpcUr#pL=BIBo4JH?gNQCQNXi^lP0 zaJO4hO|4V?(ebcwW?WJAwF85vJoxo+#okjvMN|GER+YM@>x9@kwR}bWro(|+xuQ1O zECl;lrp3_JkiHfU7!s{CJ)MMxQTx0GI}v#v2Uq6yO7O2hUEV!NYjvT;$jFZrvwawyfyMmzTk zdrERdQI>^-TFc-*{G(uD!P#}UZk~Nv!XG2lMtJjv&z=0tEWmeErJDRHCWKJ=C7+-g zz|36PaiZiT}a;UFDA?4G~zM+nPcD zbvWAw?WG8N^?{`~Li;+=QrOVH#sDkHYSv}hnM(GG-DHMd3y-~ zQB_*jj6<3uFjCX>#ws)*_j?;sy!%UAAFVFmhLvQ-ZpYJfIZZ!cX0g`d^OF$jf$6}` z<6*Z(lIvo(*6*A`yIr%evkR9lM_;j6R$monhpPxZ zU2y5^Y-O76*~R!(!-So~kNp=gL2g(x(WM@3iC@)#QU9Z*#Ao$6{vph)FQO7si>@}}x_fuOsyCcDPgJ;tTX2S2A~>&($#HvPq%D}WT$Wv&rGLiD`dgXn zQa0{7ES%fwTh%~P^gB4DH%VlWVg}8y)h0Ju+$W>U3mK7xnNLS^JEsdKMvrzXcDF61 zRsRah_Fy~Gf8V^ev!(c8?$g|bF5B6DvlaZyyc8tQ3Us}Zhi&frv3ueUR=R6R$FX@y zSsm-|={E0iY0QZeIHj|xyKF>ogf}bj@at+qljt z74O!#FHqba^@LEaYpV;Fn%6v@1&XA-!OcmcluCZoLIql#}3N zeBRR~|LSD5bc)57Q2tOVD*v21CSNt1>FnV>#n(EaTrWShiW*Gd`gpX?=j*SM1}l+R zBczc&O@lV=Fhfu^w{1=vqcSA0%1vUgDZ r)~M61Ge4$j9bN79;Xiy@{B#OP|AeE1Ob}2xj^Ww=zxY*q#vK0v7Ba-? delta 1585 zcmbu9Yc$&j0L2M{dXx!m6v@2WB9(vg&p(MO5+vrCD*6!9M3T;9Sfrs<4LZ-_(0H{) zt!UF}siw9*v}K~yvs7E9E1Oxo->+7+JKer@Uv|#!r+eQ^rV~B&W zwmxXc))fts$$+gl8nE?46G&JH%A@5tVu=76`$_0Xtu22WEDpeepJyPE@UI?7f^1hz=a4<@E`~gNHi)1B)L%V5COsyKxYSgh~`29s30D2CR0H&gr$H)Disgm zArMC<<6QuUAX^5XEBtheKoZ|jj02K}G$o0;>4&$I3=z4qf%4)cN?sCuBm<{ZgtT@x zO7H1xoX2YYI0bh~R8*(|RC=TVunI*H7Ke9mh!OC)tZ%ipxMk!A)J2*THD^}z-z8PK zW>!{0-no_sjeIM$4T_k6cC_3|bcx>e4ex=Ij&f@DSYXB}bJXrf?-w_QgCEL^d}=K| z&X0zB5BolOj1xsI$Ty0X13zfoc}YznT(rx6U&z#`hu;^5`AP$;X0ztbGg+bybW8`l zq5s0%wG~R=vw zs#iJZZeoST>w)rKExPP0jS|rvy(I;Pp?c<^@nN^-s@aqV2wjd1??a{)jNZ)iPA;X; zK%>i#32VRjd8}6#T#)+@a4Y(?Z2W8W@JAi@fsBYn9p!@qZZebNVl$NS&Oo%C+l+f# zm{~QS7m=RIE3p8Oel*9kym8C6GJk@A-tNC1zX9p7$hj~{aqJ={5ya+wnp+GuUPo5xP z%A5&RuTV^d##2Mlo}|(A5ff(Ak?*bEJ-9euPO53*!0tpc}+}w z-P=5iftHcZT#J){x@Qfl>-Z|RXj`+UHpq_snACo*-9A|KA;8_}e`RW^aJ92_z|pJ#qB)%MoJ`v=%ch5W7~ap{1mmxE zxBlF;6uk{~5Ro-|rrv9ct@nc6&@glUI>SSRn!zM^8CA@V``)a)=$V)AW#<))!0%pAEH>K0R$h)8w#2*N2<09vxd5_?6zz z4YoIcnW(NUb(alJEQU<3`F+`v+N9SUS==JYno!PglQHDrjg)}hSmxER@FXmg9+ ztt!L0n}f$yhxW=~MfKm+bp4sjJYjFfa2qPURUeWdDpdpJr6^s^plZ9loh5bq;Dv(a z2O|rPok40_8&l<}h?v+x18OffL?2pt_7+!XY-iB^tg5Qw^PK}1a=|2|J_%RI#`%VG1xm@v>B&*Ab|WDWrXgb;ZcA{!)ONNg+# z!(o%L95NXMcx19PCCpvf`oB!t+r|i7g#xj0I8t02sU<~6p#=XtqmJ&e`Go1u`Afip XxX&^Ikp$wzC8KES|L3px!zl7EP0Ep! diff --git a/iOSClient/Images.xcassets/talk-template.imageset/talk.png b/iOSClient/Images.xcassets/talk-template.imageset/talk.png new file mode 100644 index 0000000000000000000000000000000000000000..c124efb15d47254ff4407bc69f715e95f87e2d45 GIT binary patch literal 26026 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 1.png b/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 1.png new file mode 100644 index 0000000000000000000000000000000000000000..f86c0a35748de2f01da0c44b836575e17872d809 GIT binary patch literal 2644 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 literal 0 HcmV?d00001 diff --git a/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 2.png b/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a2edcf07e1536127999554383c6ed88cf4dbbb GIT binary patch literal 4063 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 MR3D~SrsEp%ADq}-&j0`b literal 0 HcmV?d00001 diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/Contents.json new file mode 100644 index 0000000000..c063e0dfe0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "bars.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/bars.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/bars.svg new file mode 100644 index 0000000000..2daaa4931d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/bars.imageset/bars.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/Contents.json new file mode 100644 index 0000000000..6698d77844 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "chevronLeft.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/chevronLeft.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/chevronLeft.svg new file mode 100644 index 0000000000..a2daa8af27 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/chevronLeft.imageset/chevronLeft.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/Contents.json new file mode 100644 index 0000000000..a383c1ab2b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "cloud.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/cloud.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/cloud.svg new file mode 100644 index 0000000000..195d5aa3f1 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/cloud.imageset/cloud.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/Contents.json new file mode 100644 index 0000000000..8b922f808d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "deleted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/deleted.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/deleted.svg new file mode 100644 index 0000000000..457dacb7e0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/deleted.imageset/deleted.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/Contents.json new file mode 100644 index 0000000000..f127dc034a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "offline.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/offline.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/offline.svg new file mode 100644 index 0000000000..787c5e2f04 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/offline.imageset/offline.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/Contents.json new file mode 100644 index 0000000000..90b1371bf3 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "recent.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/recent.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/recent.svg new file mode 100644 index 0000000000..93b496fd89 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/recent.imageset/recent.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/Contents.json b/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/Contents.json new file mode 100644 index 0000000000..8446dd85dd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "settings.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/settings.svg b/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/settings.svg new file mode 100644 index 0000000000..f6ac0b5535 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/BurgerMenu/settings.imageset/settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Contents.json b/iOSClient/IonosImages.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileFolderCell/Contents.json b/iOSClient/IonosImages.xcassets/FileFolderCell/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileFolderCell/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/Contents.json new file mode 100644 index 0000000000..fb87640df4 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "star.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/star.svg b/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/star.svg new file mode 100644 index 0000000000..f6a2d18050 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileFolderCell/star.imageset/star.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/Contents.json new file mode 100644 index 0000000000..35be49c57d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "files_selection_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "files_selection_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_dark.svg b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_dark.svg new file mode 100644 index 0000000000..42fc4ade84 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_light.svg b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_light.svg new file mode 100644 index 0000000000..18ef5ba003 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/files_selection.imageset/files_selection_light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/Contents.json new file mode 100644 index 0000000000..af3bc0e95b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "grid_item_selected.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/grid_item_selected.svg b/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/grid_item_selected.svg new file mode 100644 index 0000000000..5cfb397249 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/grid_item_selected.imageset/grid_item_selected.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/Contents.json new file mode 100644 index 0000000000..c0c1d104bf --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "list_item_deselected.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/list_item_deselected.svg b/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/list_item_deselected.svg new file mode 100644 index 0000000000..413d290c78 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_deselected.imageset/list_item_deselected.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/Contents.json new file mode 100644 index 0000000000..ae8263e6cb --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "list_item_selected.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/list_item_selected.svg b/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/list_item_selected.svg new file mode 100644 index 0000000000..5cfb397249 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_selected.imageset/list_item_selected.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/Contents.json new file mode 100644 index 0000000000..27ae0631bd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "list_item_some_selected.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/list_item_some_selected.svg b/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/list_item_some_selected.svg new file mode 100644 index 0000000000..31d5f2a7e9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/list_item_some_selected.imageset/list_item_some_selected.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/Contents.json new file mode 100644 index 0000000000..54dded32e5 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "selection_mode_close_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "selection_mode_close_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_dark.svg b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_dark.svg new file mode 100644 index 0000000000..e520f79859 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_light.svg b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_light.svg new file mode 100644 index 0000000000..30c68b1d73 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/selection_mode_close.imageset/selection_mode_close_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/Contents.json new file mode 100644 index 0000000000..8b0062ba92 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "view_mode_grid.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/view_mode_grid.svg b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/view_mode_grid.svg new file mode 100644 index 0000000000..5c342bc466 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_grid.imageset/view_mode_grid.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/Contents.json b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/Contents.json new file mode 100644 index 0000000000..742361aa3d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "view_mode_list.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/view_mode_list.svg b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/view_mode_list.svg new file mode 100644 index 0000000000..e400c26ddf --- /dev/null +++ b/iOSClient/IonosImages.xcassets/FileSelection/view_mode_list.imageset/view_mode_list.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/Contents.json new file mode 100644 index 0000000000..6f64e04406 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "IONOSEasyStorageLogo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/IONOSEasyStorageLogo.svg b/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/IONOSEasyStorageLogo.svg new file mode 100644 index 0000000000..81090a9b3f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOSEasyStorageLogo.imageset/IONOSEasyStorageLogo.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/Contents.json new file mode 100644 index 0000000000..5ecb06cf36 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "allowEdit.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/allowEdit.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/allowEdit.svg new file mode 100644 index 0000000000..8c0c0fc3ae --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/allowEdit.imageset/allowEdit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/Contents.json new file mode 100644 index 0000000000..a5f0913a3c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "createFolder.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/createFolder.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/createFolder.svg new file mode 100644 index 0000000000..4bd04bebe7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/createFolder.imageset/createFolder.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/Contents.json new file mode 100644 index 0000000000..cafaea2c07 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "data_protection.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection.svg new file mode 100644 index 0000000000..66de7a19ad --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/Contents.json new file mode 100644 index 0000000000..e4aa7a6551 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "details.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/details.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/details.svg new file mode 100644 index 0000000000..b5872eb395 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/details.imageset/details.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/Contents.json new file mode 100644 index 0000000000..2c8ff74531 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "goToPage.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/goToPage.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/goToPage.svg new file mode 100644 index 0000000000..9abc66d052 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/goToPage.imageset/goToPage.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/Contents.json new file mode 100644 index 0000000000..8da9cac0d7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "item.lock.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/item.lock.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/item.lock.svg new file mode 100644 index 0000000000..e1fb6e2058 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.imageset/item.lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/Images.xcassets/folder_group.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/Contents.json similarity index 85% rename from iOSClient/Images.xcassets/folder_group.imageset/Contents.json rename to iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/Contents.json index 2c54bdc970..9f5ea921f7 100644 --- a/iOSClient/Images.xcassets/folder_group.imageset/Contents.json +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "folder_group.svg", + "filename" : "item.lock.open.svg", "idiom" : "universal" } ], diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/item.lock.open.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/item.lock.open.svg new file mode 100644 index 0000000000..32ba7d81ac --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/item.lock.open.imageset/item.lock.open.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/Images.xcassets/folder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/Contents.json similarity index 87% rename from iOSClient/Images.xcassets/folder.imageset/Contents.json rename to iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/Contents.json index 68fa26d8d7..129d8c9786 100644 --- a/iOSClient/Images.xcassets/folder.imageset/Contents.json +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "folder.svg", + "filename" : "media.svg", "idiom" : "universal" } ], diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/media.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/media.svg new file mode 100644 index 0000000000..a1f220bd44 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/media.imageset/media.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/Contents.json new file mode 100644 index 0000000000..b19e81657a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "menu.add.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/menu.add.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/menu.add.svg new file mode 100644 index 0000000000..a914655f03 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.add.imageset/menu.add.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/Contents.json new file mode 100644 index 0000000000..debee046f6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "menu.search.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/menu.search.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/menu.search.svg new file mode 100644 index 0000000000..7bf599db8e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.search.imageset/menu.search.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/Contents.json new file mode 100644 index 0000000000..445e75ec89 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "menu.share.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/menu.share.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/menu.share.svg new file mode 100644 index 0000000000..2cc6980daf --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/menu.share.imageset/menu.share.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/Contents.json new file mode 100644 index 0000000000..f63acb7fd9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "modifyWithQuickLook.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/modifyWithQuickLook.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/modifyWithQuickLook.svg new file mode 100644 index 0000000000..dd7ff22c7b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/modifyWithQuickLook.imageset/modifyWithQuickLook.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/Contents.json new file mode 100644 index 0000000000..3fdcdc2ba0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "moveOrCopy.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/moveOrCopy.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/moveOrCopy.svg new file mode 100644 index 0000000000..b96a316ccd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/moveOrCopy.imageset/moveOrCopy.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/Contents.json new file mode 100644 index 0000000000..f127dc034a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "offline.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/offline.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/offline.svg new file mode 100644 index 0000000000..1c13f1c859 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/offline.imageset/offline.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/Contents.json new file mode 100644 index 0000000000..4a1a97d5ac --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "photoOrVideo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/photoOrVideo.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/photoOrVideo.svg new file mode 100644 index 0000000000..a1f220bd44 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/photoOrVideo.imageset/photoOrVideo.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/Contents.json new file mode 100644 index 0000000000..16dcef10c2 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "qrcode.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/qrcode.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/qrcode.svg new file mode 100644 index 0000000000..c64b825b7c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/qrcode.imageset/qrcode.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/Contents.json new file mode 100644 index 0000000000..0381974294 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "readOnly.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/readOnly.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/readOnly.svg new file mode 100644 index 0000000000..85fbf6bba0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/readOnly.imageset/readOnly.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/Contents.json new file mode 100644 index 0000000000..f6b0af7edb --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "rename.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/rename.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/rename.svg new file mode 100644 index 0000000000..555a6d6ddd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/rename.imageset/rename.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/Contents.json new file mode 100644 index 0000000000..6531023078 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "scan.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/scan.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/scan.svg new file mode 100644 index 0000000000..6eda7e4976 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/scan.imageset/scan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/Contents.json new file mode 100644 index 0000000000..e1822cd489 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "star.filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/star.filled.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/star.filled.svg new file mode 100644 index 0000000000..b82a0324bc --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/star.filled.imageset/star.filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/Contents.json new file mode 100644 index 0000000000..dfb142827f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "star.hollow.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/star.hollow.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/star.hollow.svg new file mode 100644 index 0000000000..dfd1f57e0a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/star.hollow.imageset/star.hollow.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/Contents.json new file mode 100644 index 0000000000..8bd314f8ef --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "synced.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/synced.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/synced.svg new file mode 100644 index 0000000000..a27f3fa02f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/synced.imageset/synced.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/Contents.json new file mode 100644 index 0000000000..568d58e066 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "trash_icon.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/trash_icon.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/trash_icon.svg new file mode 100644 index 0000000000..791a447eb0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/trash_icon.imageset/trash_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/Contents.json new file mode 100644 index 0000000000..ab10a8c07f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "unshare.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/unshare.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/unshare.svg new file mode 100644 index 0000000000..baf0f77268 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/unshare.imageset/unshare.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/Contents.json new file mode 100644 index 0000000000..c13090e44b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "viewInFolder.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/viewInFolder.svg b/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/viewInFolder.svg new file mode 100644 index 0000000000..4f5a949d4f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/viewInFolder.imageset/viewInFolder.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/CloseFullscreen.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/CloseFullscreen.svg new file mode 100644 index 0000000000..5abe918a24 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/CloseFullscreen.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/Contents.json new file mode 100644 index 0000000000..fcf9f2510f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/CloseFullscreen.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "CloseFullscreen.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Contents.json new file mode 100644 index 0000000000..57bc8b85dd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Forward.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Forward.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Forward.svg new file mode 100644 index 0000000000..05003673f4 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Forward.imageset/Forward.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Contents.json new file mode 100644 index 0000000000..91c010c033 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Fullscreen.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Fullscreen.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Fullscreen.svg new file mode 100644 index 0000000000..58b1314fca --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Fullscreen.imageset/Fullscreen.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Contents.json new file mode 100644 index 0000000000..c590a5b8a4 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Message.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Message.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Message.svg new file mode 100644 index 0000000000..64deb1f13d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Message.imageset/Message.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Contents.json new file mode 100644 index 0000000000..8c7abd5ca9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Pause.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Pause.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Pause.svg new file mode 100644 index 0000000000..edd847cf29 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Pause.imageset/Pause.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Contents.json new file mode 100644 index 0000000000..aa0a07fe4c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Play.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Play.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Play.svg new file mode 100644 index 0000000000..cb338acbf4 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Play.imageset/Play.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Contents.json new file mode 100644 index 0000000000..d5e457a819 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Rewind.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Rewind.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Rewind.svg new file mode 100644 index 0000000000..7a865a3236 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Rewind.imageset/Rewind.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Contents.json b/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Contents.json new file mode 100644 index 0000000000..35a2d6a428 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Sound.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Sound.svg b/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Sound.svg new file mode 100644 index 0000000000..1a907cf577 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/MediaPlayer/Sound.imageset/Sound.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/Contents.json new file mode 100644 index 0000000000..01b166d2af --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "copy.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/copy.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/copy.svg new file mode 100644 index 0000000000..c758646e5e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/copy.imageset/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/Contents.json new file mode 100644 index 0000000000..1af2d3ddf1 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "trash-can.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/trash-can.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/trash-can.svg new file mode 100644 index 0000000000..a83633f209 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/delete.imageset/trash-can.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/Images.xcassets/folderEncrypted.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/Contents.json similarity index 84% rename from iOSClient/Images.xcassets/folderEncrypted.imageset/Contents.json rename to iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/Contents.json index d5a0abaa2c..ca7708d919 100644 --- a/iOSClient/Images.xcassets/folderEncrypted.imageset/Contents.json +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "folder_encrypted.svg", + "filename" : "cloud-arrow-down.svg", "idiom" : "universal" } ], diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/cloud-arrow-down.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/cloud-arrow-down.svg new file mode 100644 index 0000000000..01435b2f49 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/download.imageset/cloud-arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/Contents.json new file mode 100644 index 0000000000..169d8021cd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "unlock.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/unlock.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/unlock.svg new file mode 100644 index 0000000000..82a1c90225 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/lock.imageset/unlock.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/Contents.json new file mode 100644 index 0000000000..ee2dbed774 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "rotate-left.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/rotate-left.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/rotate-left.svg new file mode 100644 index 0000000000..561d4d5117 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/restoreFromTrash.imageset/rotate-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/Contents.json new file mode 100644 index 0000000000..0785af5309 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : ".svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git "a/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/\356\202\232.svg" "b/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/\356\202\232.svg" new file mode 100644 index 0000000000..f813d1fdcc --- /dev/null +++ "b/iOSClient/IonosImages.xcassets/SelectTabBar/share.imageset/\356\202\232.svg" @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/Contents.json b/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/Contents.json new file mode 100644 index 0000000000..c534a82ed8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "lock.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/lock.svg b/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/lock.svg new file mode 100644 index 0000000000..a0c7918df8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/SelectTabBar/unlock.imageset/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/AutoUpload/Contents.json b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/400-folder.svg b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/400-folder.svg new file mode 100644 index 0000000000..df9048c778 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/400-folder.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/Contents.json new file mode 100644 index 0000000000..169927c48f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "400-folder.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/400-folder-open.svg b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/400-folder-open.svg new file mode 100644 index 0000000000..01dcc3730b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/400-folder-open.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/Contents.json new file mode 100644 index 0000000000..acdc636ebc --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/AutoUpload/folder.opened.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "400-folder-open.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/Contents.json b/iOSClient/IonosImages.xcassets/Settings/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/Contents.json new file mode 100644 index 0000000000..29731a44f6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "autoupload.folder.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/autoupload.folder.svg b/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/autoupload.folder.svg new file mode 100644 index 0000000000..f6bfbdf098 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/autoupload.folder.imageset/autoupload.folder.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/Contents.json new file mode 100644 index 0000000000..fa8a86ab74 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "bulletlist.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/bulletlist.svg b/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/bulletlist.svg new file mode 100644 index 0000000000..7e0e057e1f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/bulletlist.imageset/bulletlist.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/Contents.json new file mode 100644 index 0000000000..dde7152a80 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "calendar.user.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/calendar.user.svg b/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/calendar.user.svg new file mode 100644 index 0000000000..981e30a453 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/calendar.user.imageset/calendar.user.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/camera.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/camera.imageset/Contents.json new file mode 100644 index 0000000000..82cb0eeb52 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/camera.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "camera.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/camera.imageset/camera.svg b/iOSClient/IonosImages.xcassets/Settings/camera.imageset/camera.svg new file mode 100644 index 0000000000..5ffef4a313 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/camera.imageset/camera.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/Contents.json new file mode 100644 index 0000000000..7cd1cb21ad --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "dataprivacy.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/dataprivacy.svg b/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/dataprivacy.svg new file mode 100644 index 0000000000..2796a8af60 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/dataprivacy.imageset/dataprivacy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/Contents.json new file mode 100644 index 0000000000..13f00331b9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "folder.gear.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/folder.gear.svg b/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/folder.gear.svg new file mode 100644 index 0000000000..dd7383eb85 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/folder.gear.imageset/folder.gear.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/gear.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/gear.imageset/Contents.json new file mode 100644 index 0000000000..8353f0456c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/gear.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "gear.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/gear.imageset/gear.svg b/iOSClient/IonosImages.xcassets/Settings/gear.imageset/gear.svg new file mode 100644 index 0000000000..b51d206a3a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/gear.imageset/gear.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/github.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/github.imageset/Contents.json new file mode 100644 index 0000000000..746c02c4f1 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/github.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "github.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/github.imageset/github.svg b/iOSClient/IonosImages.xcassets/Settings/github.imageset/github.svg new file mode 100644 index 0000000000..bf27fa578a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/github.imageset/github.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/Contents.json new file mode 100644 index 0000000000..9144f89aa8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "handshake.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/handshake.svg b/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/handshake.svg new file mode 100644 index 0000000000..3128becc4e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/handshake.imageset/handshake.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/Contents.json new file mode 100644 index 0000000000..c22699c49e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "shield.halved.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/shield.halved.svg b/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/shield.halved.svg new file mode 100644 index 0000000000..12d06e9ff6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/shield.halved.imageset/shield.halved.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/Contents.json new file mode 100644 index 0000000000..d5403d2121 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "xmark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/xmark.svg b/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/xmark.svg new file mode 100644 index 0000000000..0c9345af80 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Settings/xmark.imageset/xmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/Contents.json new file mode 100644 index 0000000000..4201e3210f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "copy_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "copy_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_dark.svg new file mode 100644 index 0000000000..3026738097 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_light.svg b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_light.svg new file mode 100644 index 0000000000..f5630435ff --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/copy.imageset/copy_light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/Contents.json new file mode 100644 index 0000000000..2a2bdfd707 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "downloading_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "downloading_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_dark.svg new file mode 100644 index 0000000000..c2b6c0baf6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_light.svg b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_light.svg new file mode 100644 index 0000000000..a46c40cda1 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/downloading.imageset/downloading_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/error.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/Contents.json new file mode 100644 index 0000000000..0ced9acb07 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "error_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "error_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_dark.svg new file mode 100644 index 0000000000..84c1d0bc97 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_light.svg b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_light.svg new file mode 100644 index 0000000000..e2a4dbd7a5 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/error.imageset/error_light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/Contents.json new file mode 100644 index 0000000000..09723030c2 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "favorite_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "favorite_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_dark.svg new file mode 100644 index 0000000000..6d4f7db7e5 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_light.svg b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_light.svg new file mode 100644 index 0000000000..a4b25a9f96 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/favorite.imageset/favorite_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/move.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/Contents.json new file mode 100644 index 0000000000..7638a95b17 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "move_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "move_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_dark.svg new file mode 100644 index 0000000000..e9286f6d34 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_light.svg b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_light.svg new file mode 100644 index 0000000000..b809775cbd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/move.imageset/move_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/Contents.json new file mode 100644 index 0000000000..5faddd05a3 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "rename_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "rename_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_dark.svg new file mode 100644 index 0000000000..892634803e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_light.svg b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_light.svg new file mode 100644 index 0000000000..972e425cd7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/rename.imageset/rename_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/Contents.json new file mode 100644 index 0000000000..5d90fca9e7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "stop_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "stop_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_dark.svg new file mode 100644 index 0000000000..801db52766 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_light.svg b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_light.svg new file mode 100644 index 0000000000..3568727310 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/stop.imageset/stop_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/Contents.json new file mode 100644 index 0000000000..9316576563 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "trash_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "trash_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_dark.svg new file mode 100644 index 0000000000..549a48a225 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_light.svg b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_light.svg new file mode 100644 index 0000000000..54482bf2ee --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/trash.imageset/trash_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/Contents.json new file mode 100644 index 0000000000..c0da23caac --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "upload_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "upload_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_dark.svg new file mode 100644 index 0000000000..2d3b1f1b44 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_light.svg b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_light.svg new file mode 100644 index 0000000000..9ab37c385f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/upload.imageset/upload_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/Contents.json new file mode 100644 index 0000000000..56d357b7a6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "wait_to_download_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "wait_to_download_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_dark.svg new file mode 100644 index 0000000000..73474bbc18 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_light.svg b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_light.svg new file mode 100644 index 0000000000..bb5cef0021 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waitToDownload.imageset/wait_to_download_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/Contents.json b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/Contents.json new file mode 100644 index 0000000000..d65815fcff --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "waiting_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "waiting_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_dark.svg b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_dark.svg new file mode 100644 index 0000000000..3d767a5c16 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_light.svg b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_light.svg new file mode 100644 index 0000000000..fb04fe8cf9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/Transfers/waiting.imageset/waiting_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/Contents.json b/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/Contents.json new file mode 100644 index 0000000000..e3179b8a31 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "accountCheckmark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/accountCheckmark.svg b/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/accountCheckmark.svg new file mode 100644 index 0000000000..48d664bc84 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/accountCheckmark.imageset/accountCheckmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/Contents.json b/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/Contents.json new file mode 100644 index 0000000000..cf93f1e9ba --- /dev/null +++ b/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "checkmarkIcon.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/checkmarkIcon.svg b/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/checkmarkIcon.svg new file mode 100644 index 0000000000..48d664bc84 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/checkmarkIcon.imageset/checkmarkIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/contactsIcon.imageset/Contents.json b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/Contents.json new file mode 100644 index 0000000000..0aa9ebee58 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "contactsIcon_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "contactsIcon_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_dark.svg b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_dark.svg new file mode 100644 index 0000000000..1f10f2a24e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_light.svg b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_light.svg new file mode 100644 index 0000000000..035cadc70f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/contactsIcon.imageset/contactsIcon_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/delete.imageset/Contents.json b/iOSClient/IonosImages.xcassets/delete.imageset/Contents.json new file mode 100644 index 0000000000..22b685c78d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/delete.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "delete.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/delete.imageset/delete.svg b/iOSClient/IonosImages.xcassets/delete.imageset/delete.svg new file mode 100644 index 0000000000..791a447eb0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/delete.imageset/delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/deleted.imageset/Contents.json b/iOSClient/IonosImages.xcassets/deleted.imageset/Contents.json new file mode 100644 index 0000000000..8b922f808d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/deleted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "deleted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/deleted.imageset/deleted.svg b/iOSClient/IonosImages.xcassets/deleted.imageset/deleted.svg new file mode 100644 index 0000000000..457dacb7e0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/deleted.imageset/deleted.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/favorites.imageset/Contents.json b/iOSClient/IonosImages.xcassets/favorites.imageset/Contents.json new file mode 100644 index 0000000000..4fe3bbcf6a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/favorites.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "favorites.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/favorites.imageset/favorites.svg b/iOSClient/IonosImages.xcassets/favorites.imageset/favorites.svg new file mode 100644 index 0000000000..ef62a7e554 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/favorites.imageset/favorites.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/file_unsupported.imageset/Contents.json b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/Contents.json new file mode 100644 index 0000000000..b6fef97558 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "file_unsupported_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "file_unsupported_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_dark.svg b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_dark.svg new file mode 100644 index 0000000000..20edf36392 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_light.svg b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_light.svg new file mode 100644 index 0000000000..fc1497094c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/file_unsupported.imageset/file_unsupported_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/folder.imageset/Contents.json b/iOSClient/IonosImages.xcassets/folder.imageset/Contents.json new file mode 100644 index 0000000000..3d32767cc8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "folder_icon_light_mode.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "folder_icon_dark_mode.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_dark_mode.svg b/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_dark_mode.svg new file mode 100644 index 0000000000..4a16d8a38f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_dark_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_light_mode.svg b/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_light_mode.svg new file mode 100644 index 0000000000..c823d5b3d3 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder.imageset/folder_icon_light_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/Contents.json b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/Contents.json new file mode 100644 index 0000000000..0b2f580359 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "folderAutomaticUpload_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "folderAutomaticUpload_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_dark.svg b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_dark.svg new file mode 100644 index 0000000000..6c1c1bbf53 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_light.svg b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_light.svg new file mode 100644 index 0000000000..d5228039de --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderAutomaticUpload.imageset/folderAutomaticUpload_light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/Contents.json b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/Contents.json new file mode 100644 index 0000000000..ee1583f476 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "folder_icon_light_mode.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "folder_icon_dark_mode.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_dark_mode.svg b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_dark_mode.svg new file mode 100644 index 0000000000..4a16d8a38f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_dark_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_light_mode.svg b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_light_mode.svg new file mode 100644 index 0000000000..c823d5b3d3 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folderEncrypted.imageset/folder_icon_light_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folder_external.imageset/Contents.json b/iOSClient/IonosImages.xcassets/folder_external.imageset/Contents.json new file mode 100644 index 0000000000..ee1583f476 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_external.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "folder_icon_light_mode.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "folder_icon_dark_mode.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_dark_mode.svg b/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_dark_mode.svg new file mode 100644 index 0000000000..4a16d8a38f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_dark_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_light_mode.svg b/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_light_mode.svg new file mode 100644 index 0000000000..c823d5b3d3 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_external.imageset/folder_icon_light_mode.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/folder_group.imageset/Contents.json b/iOSClient/IonosImages.xcassets/folder_group.imageset/Contents.json new file mode 100644 index 0000000000..bdc320951e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_group.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "folder_group_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "folder_group_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_dark.svg b/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_dark.svg new file mode 100644 index 0000000000..017e95d53c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_light.svg b/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_light.svg new file mode 100644 index 0000000000..ecdc7a8f1e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/folder_group.imageset/folder_group_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/home.imageset/Contents.json b/iOSClient/IonosImages.xcassets/home.imageset/Contents.json new file mode 100644 index 0000000000..7ba806a97d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/home.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "home.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/home.imageset/home.svg b/iOSClient/IonosImages.xcassets/home.imageset/home.svg new file mode 100644 index 0000000000..09fab0e8f6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/home.imageset/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/local.imageset/Contents.json b/iOSClient/IonosImages.xcassets/local.imageset/Contents.json new file mode 100644 index 0000000000..8d0cdde65d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/local.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "local.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/local.imageset/local.svg b/iOSClient/IonosImages.xcassets/local.imageset/local.svg new file mode 100644 index 0000000000..0abdd25c8d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/local.imageset/local.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/more.imageset/Contents.json b/iOSClient/IonosImages.xcassets/more.imageset/Contents.json new file mode 100644 index 0000000000..6d5404f0eb --- /dev/null +++ b/iOSClient/IonosImages.xcassets/more.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "more_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "more_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/more.imageset/more_dark.svg b/iOSClient/IonosImages.xcassets/more.imageset/more_dark.svg new file mode 100644 index 0000000000..234390501b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/more.imageset/more_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/more.imageset/more_light.svg b/iOSClient/IonosImages.xcassets/more.imageset/more_light.svg new file mode 100644 index 0000000000..6ed01ab95c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/more.imageset/more_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/offlineFlag.imageset/Contents.json b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/Contents.json new file mode 100644 index 0000000000..282dc917cb --- /dev/null +++ b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "offlineFlag_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "offlineFlag_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_dark.svg b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_dark.svg new file mode 100644 index 0000000000..761e98cb81 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_light.svg b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_light.svg new file mode 100644 index 0000000000..1f5e5417cc --- /dev/null +++ b/iOSClient/IonosImages.xcassets/offlineFlag.imageset/offlineFlag_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/restore.imageset/Contents.json b/iOSClient/IonosImages.xcassets/restore.imageset/Contents.json new file mode 100644 index 0000000000..9263531fea --- /dev/null +++ b/iOSClient/IonosImages.xcassets/restore.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "restore.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/IonosImages.xcassets/restore.imageset/restore.svg b/iOSClient/IonosImages.xcassets/restore.imageset/restore.svg new file mode 100644 index 0000000000..065444ce9b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/restore.imageset/restore.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/Contents.json b/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/Contents.json new file mode 100644 index 0000000000..9f6c3312dd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "restoreFromDeleted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/restoreFromDeleted.svg b/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/restoreFromDeleted.svg new file mode 100644 index 0000000000..065444ce9b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/restoreFromDeleted.imageset/restoreFromDeleted.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/Contents.json b/iOSClient/IonosImages.xcassets/share/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/share/canShare.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/canShare.imageset/Contents.json new file mode 100644 index 0000000000..9c38a17166 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/canShare.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "canShare_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "canShare_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_dark.svg b/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_dark.svg new file mode 100644 index 0000000000..6263150715 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_light.svg b/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_light.svg new file mode 100644 index 0000000000..cf6943381b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/canShare.imageset/canShare_light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/Contents.json b/iOSClient/IonosImages.xcassets/share/folder/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/Contents.json new file mode 100644 index 0000000000..747759f1f0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_by_link_folder.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_by_link_folder 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1.svg b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1.svg new file mode 100644 index 0000000000..fc788215ee --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder.svg b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder.svg new file mode 100644 index 0000000000..5f1fab8ed6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/Contents.json new file mode 100644 index 0000000000..dd9c42bb86 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_internally_folder.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_internally_folder 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1.svg b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1.svg new file mode 100644 index 0000000000..f3b1ef2666 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder.svg b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder.svg new file mode 100644 index 0000000000..2a7ae19315 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/Contents.json new file mode 100644 index 0000000000..7840f50d5e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_with_me_folder.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_with_me_folder 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1.svg b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1.svg new file mode 100644 index 0000000000..6689ffe00f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder.svg b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder.svg new file mode 100644 index 0000000000..ed6b42d4e5 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/Contents.json b/iOSClient/IonosImages.xcassets/share/icon/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/Contents.json new file mode 100644 index 0000000000..c72dd7f7f0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_by_link_icon.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_by_link_icon 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon 1.svg b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon 1.svg new file mode 100644 index 0000000000..94af3bb4a6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon 1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon.svg b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon.svg new file mode 100644 index 0000000000..ef7408fe7c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/byLink.imageset/shared_by_link_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/Contents.json new file mode 100644 index 0000000000..8b9388ee25 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_internally_icon.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_internally_icon 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon 1.svg b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon 1.svg new file mode 100644 index 0000000000..f6a0a85023 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon 1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon.svg b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon.svg new file mode 100644 index 0000000000..2ab64b67da --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/internally.imageset/shared_internally_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/Contents.json new file mode 100644 index 0000000000..c8e0ca2f82 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_with_me_icon.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_with_me_icon 1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon 1.svg b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon 1.svg new file mode 100644 index 0000000000..f19ba72d23 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon 1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon.svg b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon.svg new file mode 100644 index 0000000000..1b123284b9 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/icon/withMe.imageset/shared_with_me_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/internalLink.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/Contents.json new file mode 100644 index 0000000000..f8e70f58a8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "internalLink_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "internalLink_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_dark.svg b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_dark.svg new file mode 100644 index 0000000000..4df5733c91 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_light.svg b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_light.svg new file mode 100644 index 0000000000..1176614db6 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/internalLink.imageset/internalLink_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/Contents.json new file mode 100644 index 0000000000..2d97b56ef0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "lnk_l.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "lnk_d.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_d.svg b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_d.svg new file mode 100644 index 0000000000..61e798611f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_d.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_l.svg b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_l.svg new file mode 100644 index 0000000000..bbcdc1d415 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/linkCircleFill.imageset/lnk_l.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/Contents.json new file mode 100644 index 0000000000..e9afe39795 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "magnifyingGlass_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "magnifyingGlass_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_dark.svg b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_dark.svg new file mode 100644 index 0000000000..cd50472dcb --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_light.svg b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_light.svg new file mode 100644 index 0000000000..78b9080aa8 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/magnifyingGlass.imageset/magnifyingGlass_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/plus.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/plus.imageset/Contents.json new file mode 100644 index 0000000000..e6da59e03f --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/plus.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "plus_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "plus_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_dark.svg b/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_dark.svg new file mode 100644 index 0000000000..dafd1ba62a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_light.svg b/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_light.svg new file mode 100644 index 0000000000..2ce5621cd7 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/plus.imageset/plus_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/shared.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/shared.imageset/Contents.json new file mode 100644 index 0000000000..f47e0b7301 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/shared.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "shared_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_dark.svg b/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_dark.svg new file mode 100644 index 0000000000..93e5eb179b --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_light.svg b/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_light.svg new file mode 100644 index 0000000000..b6eb6a8505 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/shared.imageset/shared_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/Contents.json new file mode 100644 index 0000000000..f6a2f1f63c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "sq_l.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "sq_drk.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_drk.svg b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_drk.svg new file mode 100644 index 0000000000..d1fa673b78 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_drk.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_l.svg b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_l.svg new file mode 100644 index 0000000000..558fbc8fc1 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/squareAndArrowUpCircleFill.imageset/sq_l.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/share/threeDots.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/Contents.json new file mode 100644 index 0000000000..f58aa0a9cd --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "threeDots_lights.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "threeDots_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_dark.svg b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_dark.svg new file mode 100644 index 0000000000..defd48728a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_lights.svg b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_lights.svg new file mode 100644 index 0000000000..3ebec761cc --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/threeDots.imageset/threeDots_lights.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/userContacts.imageset/Contents.json b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/Contents.json new file mode 100644 index 0000000000..0c49af404c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "userContacts_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "userContacts_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_dark.svg b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_dark.svg new file mode 100644 index 0000000000..eff06a4270 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_light.svg b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_light.svg new file mode 100644 index 0000000000..5091ab6757 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/userContacts.imageset/userContacts_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/shares.imageset/Contents.json b/iOSClient/IonosImages.xcassets/shares.imageset/Contents.json new file mode 100644 index 0000000000..489053d91a --- /dev/null +++ b/iOSClient/IonosImages.xcassets/shares.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "shares.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/shares.imageset/shares.svg b/iOSClient/IonosImages.xcassets/shares.imageset/shares.svg new file mode 100644 index 0000000000..a536b5b310 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/shares.imageset/shares.svg @@ -0,0 +1,3 @@ + + + diff --git a/iOSClient/IonosImages.xcassets/uploadFile.imageset/Contents.json b/iOSClient/IonosImages.xcassets/uploadFile.imageset/Contents.json new file mode 100644 index 0000000000..acd1e0ab0c --- /dev/null +++ b/iOSClient/IonosImages.xcassets/uploadFile.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "uploadFile.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/uploadFile.imageset/uploadFile.svg b/iOSClient/IonosImages.xcassets/uploadFile.imageset/uploadFile.svg new file mode 100644 index 0000000000..0dd4ada493 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/uploadFile.imageset/uploadFile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/userAvatar.imageset/Contents.json b/iOSClient/IonosImages.xcassets/userAvatar.imageset/Contents.json new file mode 100644 index 0000000000..232e34b25e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/userAvatar.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "userAvatar_light.svg", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "userAvatar_dark.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_dark.svg b/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_dark.svg new file mode 100644 index 0000000000..423ce1423e --- /dev/null +++ b/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_light.svg b/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_light.svg new file mode 100644 index 0000000000..5c9aa259d4 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/userAvatar.imageset/userAvatar_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iOSClient/Login/NCLogin.storyboard b/iOSClient/Login/NCLogin.storyboard index 05bf9df04d..a1db0c79e4 100644 --- a/iOSClient/Login/NCLogin.storyboard +++ b/iOSClient/Login/NCLogin.storyboard @@ -15,132 +15,126 @@ - + - - - - - - + + - - - - - - - - - - - + + + + - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - + + - + + + @@ -152,7 +146,7 @@ - + @@ -164,11 +158,14 @@ - - - - - - + + + + + + + + + diff --git a/iOSClient/Login/NCLogin.swift b/iOSClient/Login/NCLogin.swift index a174b87e25..841557060a 100644 --- a/iOSClient/Login/NCLogin.swift +++ b/iOSClient/Login/NCLogin.swift @@ -11,16 +11,14 @@ import SwiftUI import SafariServices class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { - @IBOutlet weak var imageBrand: UIImageView! - @IBOutlet weak var imageBrandConstraintY: NSLayoutConstraint! - @IBOutlet weak var baseUrlTextField: UITextField! - @IBOutlet weak var loginAddressDetail: UILabel! - @IBOutlet weak var loginButton: UIButton! - @IBOutlet weak var qrCode: UIButton! - @IBOutlet weak var certificate: UIButton! - @IBOutlet weak var enforceServersButton: UIButton! - @IBOutlet weak var enforceServersDropdownImage: UIImageView! - + + @IBOutlet weak var loginButton: PrimaryButton! + @IBOutlet weak var qrCode: SecondaryButton! + @IBOutlet weak var lblWelcome: UILabel! + @IBOutlet weak var lblDescription: UILabel! + @IBOutlet weak var loginContentView: UIView! + @IBOutlet weak var spinner: UIActivityIndicatorView! + private let appDelegate = (UIApplication.shared.delegate as? AppDelegate)! private var textColor: UIColor = .white private var textColorOpponent: UIColor = .black @@ -45,64 +43,22 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { override func viewDidLoad() { super.viewDidLoad() - - // Text color - if NCBrandColor.shared.customer.isTooLight() { - textColor = .black - textColorOpponent = .white - } else if NCBrandColor.shared.customer.isTooDark() { - textColor = .white - textColorOpponent = .black - } else { - textColor = .white - textColorOpponent = .black - } - - // Image Brand - imageBrand.image = UIImage(named: "logo") - - // Url - baseUrlTextField.textColor = textColor - baseUrlTextField.tintColor = textColor - baseUrlTextField.layer.cornerRadius = 10 - baseUrlTextField.layer.borderWidth = 1 - baseUrlTextField.layer.borderColor = textColor.cgColor - baseUrlTextField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: baseUrlTextField.frame.height)) - baseUrlTextField.leftViewMode = .always - baseUrlTextField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: baseUrlTextField.frame.height)) - baseUrlTextField.rightViewMode = .always - baseUrlTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("_login_url_", comment: ""), attributes: [NSAttributedString.Key.foregroundColor: textColor.withAlphaComponent(0.5)]) - baseUrlTextField.delegate = self - - baseUrlTextField.isEnabled = !NCBrandOptions.shared.disable_request_login_url - - // Login button - loginAddressDetail.textColor = textColor - loginAddressDetail.text = String.localizedStringWithFormat(NSLocalizedString("_login_address_detail_", comment: ""), NCBrandOptions.shared.brand) - - // brand - if NCBrandOptions.shared.disable_request_login_url { - baseUrlTextField.isEnabled = false - baseUrlTextField.isUserInteractionEnabled = false - baseUrlTextField.alpha = 0.5 - } - - // certificate - certificate.setImage(UIImage(named: "certificate")?.image(color: textColor, size: 100), for: .normal) - certificate.isHidden = true - certificate.isEnabled = false - - // navigation - let navBarAppearance = UINavigationBarAppearance() - navBarAppearance.configureWithTransparentBackground() - navBarAppearance.shadowColor = .clear - navBarAppearance.shadowImage = UIImage() - navBarAppearance.titleTextAttributes = [.foregroundColor: textColor] - navBarAppearance.largeTitleTextAttributes = [.foregroundColor: textColor] - self.navigationController?.navigationBar.standardAppearance = navBarAppearance - self.navigationController?.view.backgroundColor = NCBrandColor.shared.customer - self.navigationController?.navigationBar.tintColor = textColor - + + self.overrideUserInterfaceStyle = .dark + + // Login Button + loginButton.setTitle(NSLocalizedString("_log_in_", comment: ""), for: .normal) + + // qrcode + qrCode.setTitle(NSLocalizedString("_login_with_qrcode_", tableName: nil, bundle: Bundle.main, value: "Scan QR code", comment: ""), for: .normal) + + // Labels + lblWelcome.text = NSLocalizedString("_login_welcome_", tableName: nil, bundle: Bundle.main, value: "Welcome to the cloud storage", comment: "") + lblDescription.text = NSLocalizedString("_login_description_", tableName: nil, bundle: Bundle.main, value: "You need to login over browser", comment: "") + + // Navigation Controller + navigationController?.isNavigationBarHidden = true + if !NCManageDatabase.shared.getAllTableAccount().isEmpty { let navigationItemCancel = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(self.actionCancel)) navigationItemCancel.tintColor = textColor @@ -131,44 +87,7 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { } } } - - self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") - view.backgroundColor = NCBrandColor.shared.customer - - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) - handleLoginWithAppConfig() - baseUrlTextField.text = urlBase - - enforceServersButton.setTitle(NSLocalizedString("_select_server_", comment: ""), for: .normal) - - let enforceServers = NCBrandOptions.shared.enforce_servers - - if !enforceServers.isEmpty { - baseUrlTextField.isHidden = true - enforceServersDropdownImage.isHidden = false - enforceServersButton.isHidden = false - - let actions = enforceServers.map { server in - UIAction(title: server.name, handler: { [self] _ in - enforceServersButton.setTitle(server.name, for: .normal) - baseUrlTextField.text = server.url - }) - } - - enforceServersButton.layer.cornerRadius = 10 - enforceServersButton.menu = .init(title: NSLocalizedString("_servers_", comment: ""), children: actions) - enforceServersButton.showsMenuAsPrimaryAction = true - enforceServersButton.configuration?.titleTextAttributesTransformer = - UIConfigurationTextAttributesTransformer { incoming in - var outgoing = incoming - outgoing.font = UIFont.systemFont(ofSize: 13) - return outgoing - } - } - - NCNetworking.shared.certificateDelegate = self } override func viewDidAppear(_ animated: Bool) { @@ -230,27 +149,6 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { self.activeTextField = textField } - // MARK: - Keyboard notification - - @objc internal func keyboardWillShow(_ notification: Notification?) { - activeTextfieldDiff = 0 - if let info = notification?.userInfo, let centerObject = self.activeTextField.superview?.convert(self.activeTextField.center, to: nil) { - - let frameEndUserInfoKey = UIResponder.keyboardFrameEndUserInfoKey - if let keyboardFrame = info[frameEndUserInfoKey] as? CGRect { - let diff = keyboardFrame.origin.y - centerObject.y - self.activeTextField.frame.height - if diff < 0 { - activeTextfieldDiff = diff - imageBrandConstraintY.constant += diff - } - } - } - } - - @objc func keyboardWillHide(_ notification: Notification) { - imageBrandConstraintY.constant -= activeTextfieldDiff - } - // MARK: - Action @objc func actionCancel() { @@ -258,20 +156,17 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { } @IBAction func actionButtonLogin(_ sender: Any) { + spinner.startAnimating() NCNetworking.shared.p12Data = nil NCNetworking.shared.p12Password = nil login() } - - @IBAction func actionQRCode(_ sender: Any) { + + @IBAction func actionButtonQRCode(_ sender: Any) { let qrCode = NCLoginQRCode(delegate: self) qrCode.scan() } - @IBAction func actionCertificate(_ sender: Any) { - - } - // MARK: - Share accounts View Controller @objc func openShareAccountsViewController() { @@ -293,7 +188,7 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { // MARK: - Login private func login() { - guard var url = baseUrlTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) else { return } + var url = urlBase if url.hasSuffix("/") { url = String(url.dropLast()) } if url.isEmpty { return } @@ -301,36 +196,38 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { if url.hasPrefix("https") == false && url.hasPrefix("http") == false { url = "https://" + url } - self.baseUrlTextField.text = url isUrlValid(url: url) } func isUrlValid(url: String, user: String? = nil) { loginButton.isEnabled = false - loginButton.hideButtonAndShowSpinner() - - NextcloudKit.shared.getServerStatus(serverUrl: url) { [self] _, serverInfoResult in + NextcloudKit.shared.getServerStatus(serverUrl: url) { [weak self] _, serverInfoResult in switch serverInfoResult { - case .success(let serverInfo): + case .success(_): if let host = URL(string: url)?.host { NCNetworking.shared.writeCertificate(host: host) } let loginOptions = NKRequestOptions(customUserAgent: userAgent) - NextcloudKit.shared.getLoginFlowV2(serverUrl: url, options: loginOptions) { [self] token, endpoint, login, _, error in + NextcloudKit.shared.getLoginFlowV2(serverUrl: url, options: loginOptions) { [weak self] token, endpoint, login, _, error in + self?.spinner.stopAnimating() + self?.loginButton.isEnabled = true + self?.qrCode.isEnabled = true // Login Flow V2 if error == .success, let token, let endpoint, let login { let safariVC = NCLoginProvider() safariVC.urlBase = login - safariVC.uiColor = textColor + if let color = self?.textColor { + safariVC.uiColor = color + } safariVC.delegate = self safariVC.poll(loginFlowV2Token: token, loginFlowV2Endpoint: endpoint, loginFlowV2Login: login) - navigationController?.pushViewController(safariVC, animated: true) + self?.navigationController?.pushViewController(safariVC, animated: true) } } case .failure(let error): - loginButton.hideSpinnerAndShowButton() - loginButton.isEnabled = true - + self?.spinner.stopAnimating() + self?.loginButton.isEnabled = true + self?.qrCode.isEnabled = true if error.errorCode == NSURLErrorServerCertificateUntrusted { let alertController = UIAlertController(title: NSLocalizedString("_ssl_certificate_untrusted_", comment: ""), message: NSLocalizedString("_connect_server_anyway_", comment: ""), preferredStyle: .alert) alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_", comment: ""), style: .default, handler: { _ in @@ -345,14 +242,14 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { if let host = URL(string: url)?.host { viewController.host = host } - self.present(navigationController, animated: true) + self?.present(navigationController, animated: true) } })) - self.present(alertController, animated: true) + self?.present(alertController, animated: true) } else { let alertController = UIAlertController(title: NSLocalizedString("_connection_error_", comment: ""), message: error.errorDescription, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in })) - self.present(alertController, animated: true, completion: { }) + self?.present(alertController, animated: true, completion: { }) } } } @@ -371,9 +268,13 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { let password = valueArray[1].replacingOccurrences(of: "password:", with: "") let urlBase = valueArray[2].replacingOccurrences(of: "server:", with: "") let serverUrl = urlBase + "/remote.php/dav" + spinner.startAnimating() loginButton.isEnabled = false + qrCode.isEnabled = false NextcloudKit.shared.checkServer(serverUrl: serverUrl) { _, error in + self.spinner.stopAnimating() self.loginButton.isEnabled = true + self.qrCode.isEnabled = true if error == .success { self.createAccount(urlBase: urlBase, user: user, password: password) } else { @@ -383,6 +284,14 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate { } } } + } else { + let alertController = UIAlertController(title: NSLocalizedString( "_error_", comment: ""), + message: NSLocalizedString("_login_wrong_QR_format_", comment: ""), + preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), + style: .default, + handler: nil)) + self.present(alertController, animated: true) } } diff --git a/iOSClient/Login/NCLoginPoll.swift b/iOSClient/Login/NCLoginPoll.swift new file mode 100644 index 0000000000..ce17b17365 --- /dev/null +++ b/iOSClient/Login/NCLoginPoll.swift @@ -0,0 +1,223 @@ +// +// SwiftUIView.swift +// Nextcloud +// +// Created by Milen on 21.05.24. +// Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH +// +// Author Marino Faggiana +// +// 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 . +// + +import NextcloudKit +import SwiftUI +import SafariServices + +struct NCLoginPoll: View { + let loginFlowV2Token: String + let loginFlowV2Endpoint: String + let loginFlowV2Login: String + + var cancelButtonDisabled = false + + var isIPad: Bool { + UIDevice.current.userInterfaceIdiom == .pad + } + + @ObservedObject private var loginManager = LoginManager() + @Environment(\.dismiss) private var dismiss + + var body: some View { + GeometryReader { geometry in + let size = geometry.size + let welcomeLabelWidthRatio = isIPad ? 0.6 : 0.78 + let descriptionFont = Font.system(size: isIPad ? 36.0 : 16.0) + + VStack { + Image(.logo) + .resizable() + .aspectRatio(159/22, contentMode: .fit) + .frame(width: size.width * 0.45) + .padding(.top, size.height * 0.12) + Text(NSLocalizedString("_poll_desc_", comment: "")) + .font(descriptionFont) + .multilineTextAlignment(.center) + .foregroundStyle(.white) + .frame(width: size.width * welcomeLabelWidthRatio) + .padding(.top, size.height * 0.1) + + Spacer() + CircleItemSpinner() + .tint(.white) + Spacer() + + HStack(spacing: 15) { + Button(NSLocalizedString("_cancel_", comment: "")) { + dismiss() + } + .disabled(loginManager.isLoading || cancelButtonDisabled) + .buttonStyle(ButtonStyleSecondary(maxWidth: .infinity)) + + Button(NSLocalizedString("_retry_", comment: "")) { + loginManager.openLoginInBrowser() + } + .buttonStyle(ButtonStylePrimary(maxWidth: .infinity)) + + } + .frame(width: size.width * (isIPad ? 0.60 : 0.80)) + .padding(.bottom, size.height * 0.15) + .environment(\.colorScheme, .dark) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background { + Image(.gradientBackground) + .resizable() + .ignoresSafeArea() + } + } + .onChange(of: loginManager.pollFinished) { value in + if value { + let window = UIApplication.shared.firstWindow + + if window?.rootViewController is NCMainTabBarController { + window?.rootViewController?.dismiss(animated: true, completion: nil) + } else { + if let mainTabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? NCMainTabBarController { + mainTabBarController.modalPresentationStyle = .fullScreen + mainTabBarController.view.alpha = 0 + window?.rootViewController = mainTabBarController + window?.makeKeyAndVisible() + + if let scene = window?.windowScene { + SceneManager.shared.register(scene: scene, withRootViewController: mainTabBarController) + } + + UIView.animate(withDuration: 0.5) { + mainTabBarController.view.alpha = 1 + } + } + } + } + } + .onAppear { + if #available(iOS 16.0, *) { + SFSafariViewController.DataStore.default.clearWebsiteData() + } + + loginManager.configure(loginFlowV2Token: loginFlowV2Token, loginFlowV2Endpoint: loginFlowV2Endpoint, loginFlowV2Login: loginFlowV2Login) + + if !isRunningForPreviews { + loginManager.openLoginInBrowser() + } + } + .interactiveDismissDisabled() + .fullScreenCover(item: $loginManager.browserURL, content: { url in + SafariView(url: url) { + loginManager.browserURL = nil + loginManager.poll() + } + .ignoresSafeArea() + }) + } +} + + +#Preview { + NCLoginPoll(loginFlowV2Token: "", loginFlowV2Endpoint: "", loginFlowV2Login: "") +} + +private class LoginManager: ObservableObject { + private let appDelegate = (UIApplication.shared.delegate as? AppDelegate)! + + var loginFlowV2Token = "" + var loginFlowV2Endpoint = "" + var loginFlowV2Login = "" + + @Published var pollFinished = false + @Published var isLoading = false + @Published var browserURL: URL? + + init() { + NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)), name: UIApplication.didBecomeActiveNotification, object: nil) + } + + @objc func applicationDidBecomeActive(_ notification: NSNotification) { + poll() + } + + func configure(loginFlowV2Token: String, loginFlowV2Endpoint: String, loginFlowV2Login: String) { + self.loginFlowV2Token = loginFlowV2Token + self.loginFlowV2Endpoint = loginFlowV2Endpoint + self.loginFlowV2Login = loginFlowV2Login + } + + func poll() { + let loginOptions = NKRequestOptions(customUserAgent: userAgent) + NextcloudKit.shared.getLoginFlowV2Poll(token: self.loginFlowV2Token, + endpoint: self.loginFlowV2Endpoint, + options: loginOptions) { server, loginName, appPassword, _, error in + if error == .success, let urlBase = server, let user = loginName, let appPassword { + self.isLoading = true + self.appDelegate.createAccount(urlBase: urlBase, user: user, password: appPassword) { error in + if error == .success { + self.pollFinished = true + } + } + } + } + } + + func openLoginInBrowser() { + browserURL = URL(string: loginFlowV2Login) + } +} + +private struct SafariView: UIViewControllerRepresentable { + let url: URL + let onFinished: () -> Void + + func makeUIViewController(context: Context) -> SFSafariViewController { + let safariVC = SFSafariViewController(url: url) + safariVC.delegate = context.coordinator + return safariVC + } + + func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {} + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + class Coordinator: NSObject, SFSafariViewControllerDelegate { + let parent: SafariView + + init(_ parent: SafariView) { + self.parent = parent + } + + func safariViewControllerDidFinish(_ controller: SFSafariViewController) { + controller.dismiss(animated: true) { [weak self] in + self?.parent.onFinished() + } + } + } +} + +extension URL: Identifiable { + public var id: String { + return self.absoluteString + } +} diff --git a/iOSClient/Login/NCLoginProvider.swift b/iOSClient/Login/NCLoginProvider.swift index bf797e840f..141c217afa 100644 --- a/iOSClient/Login/NCLoginProvider.swift +++ b/iOSClient/Login/NCLoginProvider.swift @@ -91,7 +91,12 @@ class NCLoginProvider: UIViewController { @objc func goBack() { delegate?.onBack() - navigationController?.popViewController(animated: true) + + if isModal { + dismiss(animated: true) + } else { + navigationController?.popViewController(animated: true) + } } func poll(loginFlowV2Token: String, loginFlowV2Endpoint: String, loginFlowV2Login: String) { diff --git a/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.swift b/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.swift new file mode 100644 index 0000000000..c320f9a330 --- /dev/null +++ b/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.swift @@ -0,0 +1,160 @@ +// +// FileActionsHeader.swift +// Nextcloud +// +// Created by Vitaliy Tolkach on 23.08.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit + +enum FileActionsHeaderSelectionState { + case none + case some(Int) + case all +} + +class FileActionsHeader: UIView { + @IBOutlet weak var contentView: UIView! + + // MARK: - non-editign mode view + @IBOutlet weak private var vHeaderNonEditingMode: UIView? + @IBOutlet weak private var btnSort: UIButton? + @IBOutlet weak private var btnSelect: UIButton? + @IBOutlet weak private var btnViewMode: UIButton? + + @IBAction func onBtnSelectTap(_ sender: Any) { + setIsEditingMode(isEditingMode: true) + onSelectModeChange?(true) + } + + // MARK: - editign mode view + @IBOutlet weak private var vHeaderEditingMode: UIView? + @IBOutlet weak private var btnSelectAll: UIButton? + @IBOutlet weak private var btnCloseSelection: UIButton? + @IBOutlet weak private var lblSelectionDescription: UILabel? + + private var grayButtonTintColor: UIColor { + UIColor(resource: .FileActionsHeader.grayButtonTint) + } + + @IBAction func onBtnSelectAllTap(_ sender: Any) { + onSelectAll?() + } + + @IBAction func onBtnCloseSelectionTap(_ sender: Any) { + setIsEditingMode(isEditingMode: false) + onSelectModeChange?(false) + } + + + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + private func commonInit() { + Bundle.main.loadNibNamed(String(describing:FileActionsHeader.self), + owner: self, + options: nil) + addSubview(contentView) + contentView.backgroundColor = NCBrandColor.shared.appBackgroundColor + contentView.frame = bounds + contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + } + + // MARK: - public + func enableSorting(enable: Bool) { + btnSort?.isHidden = !enable + } + + func enableSelection(enable: Bool) { + btnSelect?.isHidden = !enable + } + + var onSelectModeChange: ((_ isSelectionMode: Bool) -> Void)? + var onSelectAll: (() -> Void)? + + func setSortingMenu(sortingMenuElements: [UIMenuElement], title: String?, image: UIImage?) { + btnSort?.menu = UIMenu(children: sortingMenuElements) + btnSort?.showsMenuAsPrimaryAction = true + btnSort?.setTitle(title, for: .normal) + btnSort?.setImage(image?.templateRendered(), for: .normal) + btnSort?.semanticContentAttribute = UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft ? .forceLeftToRight : .forceRightToLeft + } + + func setViewModeMenu(viewMenuElements: [UIMenuElement], image: UIImage?) { + btnViewMode?.menu = UIMenu(children: viewMenuElements) + btnViewMode?.showsMenuAsPrimaryAction = true + btnViewMode?.setImage(image?.templateRendered(), for: .normal) + } + + func showViewModeButton(_ show: Bool) { + btnViewMode?.isHidden = !show + } + + func setIsEditingMode(isEditingMode: Bool) { + vHeaderEditingMode?.isHidden = !isEditingMode + vHeaderNonEditingMode?.isHidden = isEditingMode + } + + func setSelectionState(selectionState: FileActionsHeaderSelectionState) { + var textDescription = "" + var imageResource: ImageResource = .FileSelection.listItemDeselected + var selectAllImageColor: UIColor = .clear + + // MARK: Files Header + switch selectionState { + case .none: + textDescription = NSLocalizedString("_select_selectionLabel_selectAll_", tableName: nil, bundle: Bundle.main, value: "select all", comment: "") + imageResource = .FileSelection.listItemDeselected + selectAllImageColor = grayButtonTintColor + case .some(let count): + textDescription = selectionDescription(for: count) + imageResource = .FileSelection.listItemSomeSelected + selectAllImageColor = NCBrandColor.shared.brandElement + case .all: + textDescription = NSLocalizedString("_select_selectionLabel_deselectAll_", tableName: nil, bundle: Bundle.main, value: "deselect all", comment: "") + imageResource = .FileSelection.listItemSelected + selectAllImageColor = NCBrandColor.shared.brandElement + } + + lblSelectionDescription?.text = textDescription + + var selectAllImage = UIImage(resource: imageResource) + var closeImage = UIImage(resource: .FileSelection.selectionModeClose) + + closeImage = closeImage.withTintColor(grayButtonTintColor) + selectAllImage = selectAllImage.withTintColor(selectAllImageColor) + + btnSelectAll?.setBackgroundImage(selectAllImage, for: .normal) + btnCloseSelection?.setBackgroundImage(closeImage, for: .normal) + + func selectionDescription(for count: Int) -> String { + if count == 1 { + return NSLocalizedString("_select_selectionLabel_oneItemSelected_", tableName: nil, bundle: Bundle.main, value: "one item selected", comment: "") + } + return String.localizedStringWithFormat(NSLocalizedString("_select_selectionLabel_manyItemsSelected_", tableName: nil, bundle: Bundle.main, value: "%@ items selected", comment: ""), "\(count)") + } + } + + override func awakeFromNib() { + super.awakeFromNib() + if let selectionButtonWidth = btnSelect?.bounds.width { + btnSelect?.layer.cornerRadius = selectionButtonWidth / 2 + } + btnSelect?.imageView?.contentMode = .scaleToFill + btnSelect?.setImage(UIImage(resource: .FileSelection.filesSelection), for: .normal) + } +} + +extension UIImage { + func templateRendered() -> UIImage? { + self.withRenderingMode(.alwaysTemplate) + } +} diff --git a/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.xib b/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.xib new file mode 100644 index 0000000000..c8fda03430 --- /dev/null +++ b/iOSClient/Main/Collection Common/ActionsHeader/FileActionsHeader.xib @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSClient/Main/Collection Common/Cell/NCGridCell.swift b/iOSClient/Main/Collection Common/Cell/NCGridCell.swift index 5c3393be06..99180b4987 100644 --- a/iOSClient/Main/Collection Common/Cell/NCGridCell.swift +++ b/iOSClient/Main/Collection Common/Cell/NCGridCell.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 08/10/2018. // Copyright © 2018 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -33,7 +34,6 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto @IBOutlet weak var labelInfo: UILabel! @IBOutlet weak var labelSubinfo: UILabel! @IBOutlet weak var buttonMore: UIButton! - @IBOutlet weak var imageVisualEffect: UIVisualEffectView! var ocId = "" var ocIdTransfer = "" @@ -102,17 +102,9 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto imageItem.image = nil imageItem.layer.cornerRadius = 6 imageItem.layer.masksToBounds = true + imageSelect.isHidden = true - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - imageStatus.image = nil - imageFavorite.image = nil - imageLocal.image = nil - labelTitle.text = "" - labelInfo.text = "" - labelSubinfo.text = "" - imageVisualEffect.layer.cornerRadius = 6 - imageVisualEffect.clipsToBounds = true - imageVisualEffect.alpha = 0.5 + imageSelect.image = UIImage(resource: .FileSelection.gridItemSelected) let longPressedGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPress(gestureRecognizer:))) longPressedGesture.minimumPressDuration = 0.5 @@ -179,7 +171,7 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto buttonMore.isHidden = status } - func selected(_ status: Bool, isEditMode: Bool) { + func selected(_ isSelected: Bool, isEditMode: Bool) { if isEditMode { buttonMore.isHidden = true accessibilityCustomActions = nil @@ -187,14 +179,8 @@ class NCGridCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto buttonMore.isHidden = false setA11yActions() } - if status { - imageSelect.isHidden = false - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - imageVisualEffect.isHidden = false - } else { - imageSelect.isHidden = true - imageVisualEffect.isHidden = true - } + setBorderForGridViewCell(isSelected: isSelected) + imageSelect.isHidden = !isSelected } func writeInfoDateSize(date: NSDate, size: Int64) { diff --git a/iOSClient/Main/Collection Common/Cell/NCGridCell.xib b/iOSClient/Main/Collection Common/Cell/NCGridCell.xib index 2466c28b44..59ab9abf12 100644 --- a/iOSClient/Main/Collection Common/Cell/NCGridCell.xib +++ b/iOSClient/Main/Collection Common/Cell/NCGridCell.xib @@ -1,9 +1,9 @@ - + - + @@ -17,15 +17,6 @@ - @@ -101,23 +92,19 @@ + + - - - - - - @@ -136,7 +123,6 @@ - @@ -148,13 +134,13 @@ - + - + - + diff --git a/iOSClient/Main/Collection Common/Cell/NCListCell.swift b/iOSClient/Main/Collection Common/Cell/NCListCell.swift index 711fefe711..ff0c961f65 100755 --- a/iOSClient/Main/Collection Common/Cell/NCListCell.swift +++ b/iOSClient/Main/Collection Common/Cell/NCListCell.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 24/10/2018. // Copyright © 2018 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -28,7 +29,6 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto @IBOutlet weak var imageSelect: UIImageView! @IBOutlet weak var imageStatus: UIImageView! @IBOutlet weak var imageFavorite: UIImageView! - @IBOutlet weak var imageFavoriteBackground: UIImageView! @IBOutlet weak var imageLocal: UIImageView! @IBOutlet weak var labelTitle: UILabel! @IBOutlet weak var labelInfo: UILabel! @@ -38,6 +38,7 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto @IBOutlet weak var buttonShared: UIButton! @IBOutlet weak var imageMore: UIImageView! @IBOutlet weak var buttonMore: UIButton! + @IBOutlet weak var progressView: UIProgressView! @IBOutlet weak var separator: UIView! @IBOutlet weak var tag0: UILabel! @IBOutlet weak var tag1: UILabel! @@ -45,12 +46,18 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto @IBOutlet weak var imageItemLeftConstraint: NSLayoutConstraint! @IBOutlet weak var separatorHeightConstraint: NSLayoutConstraint! @IBOutlet weak var titleTrailingConstraint: NSLayoutConstraint! + @IBOutlet weak var subInfoTrailingConstraint: NSLayoutConstraint! var ocId = "" var ocIdTransfer = "" var user = "" weak var listCellDelegate: NCListCellDelegate? + var namedButtonMore = "" + + var separatorBackground: UIColor? { + UIColor(named: "ListCell/Separator") + } var fileAvatarImageView: UIImageView? { return imageShared @@ -97,7 +104,9 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto } var fileSharedImage: UIImageView? { get { return imageShared } - set { imageShared = newValue } + set { + imageShared = newValue + } } var fileMoreImage: UIImageView? { get { return imageMore } @@ -140,9 +149,9 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto imageItem.image = nil imageItem.layer.cornerRadius = 6 imageItem.layer.masksToBounds = true + imageItem.backgroundColor = nil imageStatus.image = nil imageFavorite.image = nil - imageFavoriteBackground.isHidden = true imageLocal.image = nil labelTitle.text = "" labelInfo.text = "" @@ -159,6 +168,16 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto longPressedGesture.delegate = self longPressedGesture.delaysTouchesBegan = true self.addGestureRecognizer(longPressedGesture) + + separator.backgroundColor = separatorBackground + separatorHeightConstraint.constant = 1 + + labelTitle.text = "" + labelInfo.text = "" + labelSubinfo.text = "" + labelTitle.textColor = UIColor(resource: .ListCell.title) + labelInfo.textColor = UIColor(resource: .ListCell.subtitle) + labelSubinfo.textColor = UIColor(resource: .ListCell.subtitle) } override func snapshotView(afterScreenUpdates afterUpdates: Bool) -> UIView? { @@ -213,7 +232,11 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto buttonShared.isHidden = status } - func selected(_ status: Bool, isEditMode: Bool) { + func hideSeparator(_ status: Bool) { + separator.isHidden = status + } + + func selected(_ isSelected: Bool, isEditMode: Bool) { if isEditMode { imageItemLeftConstraint.constant = 45 imageSelect.isHidden = false @@ -232,19 +255,10 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto backgroundView = nil setA11yActions() } - if status { - var blurEffectView: UIView? - blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .systemMaterial)) - blurEffectView?.backgroundColor = .lightGray - blurEffectView?.frame = self.bounds - blurEffectView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - backgroundView = blurEffectView - separator.isHidden = true + if isSelected { + imageSelect.image = NCImageCache.shared.getImageCheckedYes().withTintColor(NCBrandColor.shared.brandElement) } else { - imageSelect.image = NCImageCache.shared.getImageCheckedNo() - backgroundView = nil - separator.isHidden = false + imageSelect.image = NCImageCache.shared.getImageCheckedNo().withTintColor(UIColor(resource: .FileSelection.listItemDeselected)) } } @@ -282,19 +296,11 @@ class NCListCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProto } func setIconOutlines() { - imageFavoriteBackground.isHidden = fileFavoriteImage?.image == nil - if imageStatus.image != nil { imageStatus.makeCircularBackground(withColor: .systemBackground) } else { imageStatus.backgroundColor = .clear } - - if imageLocal.image != nil { - imageLocal.makeCircularBackground(withColor: .systemBackground) - } else { - imageLocal.backgroundColor = .clear - } } } @@ -307,7 +313,7 @@ protocol NCListCellDelegate: AnyObject { // MARK: - List Layout class NCListLayout: UICollectionViewFlowLayout { - var itemHeight: CGFloat = 60 + var itemHeight: CGFloat = 64 override init() { super.init() diff --git a/iOSClient/Main/Collection Common/Cell/NCListCell.xib b/iOSClient/Main/Collection Common/Cell/NCListCell.xib index 0d02c3cfba..40980fefc1 100755 --- a/iOSClient/Main/Collection Common/Cell/NCListCell.xib +++ b/iOSClient/Main/Collection Common/Cell/NCListCell.xib @@ -1,137 +1,126 @@ - + - + + - - + + - + - + - - + + - + - + - - + + + - - + + - + - + + - - - + + + + + + - - - - - - + + + + + - + + + - - - + - + + + + - - - - @@ -239,11 +231,12 @@ - + + @@ -253,20 +246,11 @@ - - - - - - - - - - + - + diff --git a/iOSClient/Main/Collection Common/Cell/NCPhotoCell.swift b/iOSClient/Main/Collection Common/Cell/NCPhotoCell.swift index 8d1f322fd7..86092d9987 100644 --- a/iOSClient/Main/Collection Common/Cell/NCPhotoCell.swift +++ b/iOSClient/Main/Collection Common/Cell/NCPhotoCell.swift @@ -28,8 +28,8 @@ class NCPhotoCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProt @IBOutlet weak var imageItem: UIImageView! @IBOutlet weak var imageSelect: UIImageView! @IBOutlet weak var imageStatus: UIImageView! - @IBOutlet weak var buttonMore: UIButton! - @IBOutlet weak var imageVisualEffect: UIVisualEffectView! + @IBOutlet weak var labelTitle: UILabel! + @IBOutlet weak var imageItemBottom: NSLayoutConstraint! var ocId = "" var ocIdTransfer = "" @@ -73,12 +73,8 @@ class NCPhotoCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProt accessibilityLabel = nil accessibilityValue = nil - imageItem.image = nil imageSelect.isHidden = true - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - imageStatus.image = nil - imageVisualEffect.clipsToBounds = true - imageVisualEffect.alpha = 0.5 + imageSelect.image = UIImage(resource: .FileSelection.gridItemSelected) let longPressedGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPress(gestureRecognizer:))) longPressedGesture.minimumPressDuration = 0.5 @@ -109,27 +105,21 @@ class NCPhotoCell: UICollectionViewCell, UIGestureRecognizerDelegate, NCCellProt } func setButtonMore(image: UIImage) { - buttonMore.setImage(image, for: .normal) +// buttonMore.setImage(image, for: .normal) setA11yActions() } func hideButtonMore(_ status: Bool) { - buttonMore.isHidden = status +// buttonMore.isHidden = status } func hideImageStatus(_ status: Bool) { imageStatus.isHidden = status } - func selected(_ status: Bool, isEditMode: Bool) { - if status { - imageSelect.isHidden = false - imageVisualEffect.isHidden = false - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - } else { - imageSelect.isHidden = true - imageVisualEffect.isHidden = true - } + func selected(_ isSelected: Bool, isEditMode: Bool) { + setBorderForGridViewCell(isSelected: isSelected) + imageSelect.isHidden = !isSelected } func setAccessibility(label: String, value: String) { diff --git a/iOSClient/Main/Collection Common/Cell/NCPhotoCell.xib b/iOSClient/Main/Collection Common/Cell/NCPhotoCell.xib index bf456974fe..c6c0871374 100644 --- a/iOSClient/Main/Collection Common/Cell/NCPhotoCell.xib +++ b/iOSClient/Main/Collection Common/Cell/NCPhotoCell.xib @@ -1,9 +1,9 @@ - + - + @@ -18,17 +18,8 @@ - - - + @@ -62,26 +53,20 @@ + - - - - - - - - - + + + + - - @@ -89,10 +74,10 @@ - + - + diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift index de8fdc7b9f..19a0e56562 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift @@ -126,6 +126,49 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { return cell } +// MARK: - share state + enum ItemShareState { + case notShared + case sharedOnMe + case sharedInternally + case sharedByLink + + static func state(by metadata: tableMetadata, isShare: Bool) -> ItemShareState { + if isShare { + return .sharedOnMe + } + + if metadata.shareType.isEmpty { + return .notShared + } + + if metadata.shareType.contains(3) { + return .sharedByLink + } + + return .sharedInternally + } + + var iconImage: UIImage { + let imageCache = NCImageCache.shared + switch self { + case .notShared: return imageCache.getImageCanShare() + case .sharedOnMe: return imageCache.getIconSharedWithMe() + case .sharedInternally: return imageCache.getIconSharedInternally() + case .sharedByLink: return imageCache.getIconSharedByLink() + } + } + + var folderImage: UIImage { + let imageCache = NCImageCache.shared + switch self { + case .notShared: return imageCache.getFolder() + case .sharedOnMe: return imageCache.getFolderSharedWithMe() + case .sharedInternally: return imageCache.getFolderSharedInternally() + case .sharedByLink: return imageCache.getFolderSharedByLink() + } + } + } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { var cell: NCCellProtocol & UICollectionViewCell @@ -220,19 +263,14 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { a11yValues.append(NSLocalizedString("_shared_with_you_by_", comment: "") + " " + metadata.ownerDisplayName) } + let canHaveShareIcon = isShare || !metadata.shareType.isEmpty if metadata.directory { let tableDirectory = database.getTableDirectory(ocId: metadata.ocId) if metadata.e2eEncrypted { cell.filePreviewImageView?.image = imageCache.getFolderEncrypted(account: metadata.account) - } else if isShare { - cell.filePreviewImageView?.image = imageCache.getFolderSharedWithMe(account: metadata.account) - } else if !metadata.shareType.isEmpty { - metadata.shareType.contains(3) ? - (cell.filePreviewImageView?.image = imageCache.getFolderPublic(account: metadata.account)) : - (cell.filePreviewImageView?.image = imageCache.getFolderSharedWithMe(account: metadata.account)) - } else if !metadata.shareType.isEmpty && metadata.shareType.contains(3) { - cell.filePreviewImageView?.image = imageCache.getFolderPublic(account: metadata.account) - } else if metadata.mountType == "group" { + } else if canHaveShareIcon { + cell.filePreviewImageView?.image = ItemShareState.state(by: metadata, isShare: isShare).folderImage + } else if metadata.mountType == "group" { cell.filePreviewImageView?.image = imageCache.getFolderGroup(account: metadata.account) } else if isMounted { cell.filePreviewImageView?.image = imageCache.getFolderExternal(account: metadata.account) @@ -293,21 +331,6 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { default: cell.filePreviewImageView?.image = utility.loadImage(named: "doc", colors: [NCBrandColor.shared.iconImageColor]) } - if !metadata.iconUrl.isEmpty { - if let ownerId = getAvatarFromIconUrl(metadata: metadata) { - let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: ownerId) - let results = NCManageDatabase.shared.getImageAvatarLoaded(fileName: fileName) - if results.image == nil { - cell.filePreviewImageView?.image = utility.loadUserImage(for: ownerId, displayName: nil, urlBase: metadata.urlBase) - } else { - cell.filePreviewImageView?.image = results.image - } - if !(results.tableAvatar?.loaded ?? false), - NCNetworking.shared.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { - NCNetworking.shared.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: ownerId, fileName: fileName, account: metadata.account, view: collectionView, isPreviewImageView: true)) - } - } - } } let tableLocalFile = database.getResultsTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))?.first @@ -325,17 +348,9 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { cell.fileFavoriteImage?.image = imageCache.getImageFavorite() a11yValues.append(NSLocalizedString("_favorite_short_", comment: "")) } - + // Share image - if isShare { - cell.fileSharedImage?.image = imageCache.getImageShared() - } else if !metadata.shareType.isEmpty { - metadata.shareType.contains(3) ? - (cell.fileSharedImage?.image = imageCache.getImageShareByLink()) : - (cell.fileSharedImage?.image = imageCache.getImageShared()) - } else { - cell.fileSharedImage?.image = imageCache.getImageCanShare() - } + cell.fileSharedImage?.image = ItemShareState.state(by: metadata, isShare: isShare).iconImage // Button More if metadata.lock == true { @@ -380,25 +395,6 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { break } - // AVATAR - if !metadata.ownerId.isEmpty, metadata.ownerId != metadata.userId { - cell.fileAvatarImageView?.contentMode = .scaleAspectFill - - let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: metadata.ownerId) - let results = NCManageDatabase.shared.getImageAvatarLoaded(fileName: fileName) - - if results.image == nil { - cell.fileAvatarImageView?.image = utility.loadUserImage(for: metadata.ownerId, displayName: metadata.ownerDisplayName, urlBase: metadata.urlBase) - } else { - cell.fileAvatarImageView?.image = results.image - } - - if !(results.tableAvatar?.loaded ?? false), - NCNetworking.shared.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { - NCNetworking.shared.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: metadata.ownerId, fileName: fileName, account: metadata.account, view: collectionView)) - } - } - // URL if metadata.classFile == NKCommon.TypeClassFile.url.rawValue { cell.fileLocalImage?.image = nil @@ -428,8 +424,8 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { cell.setAccessibility(label: metadata.fileNameView + ", " + (cell.fileInfoLabel?.text ?? "") + (cell.fileSubinfoLabel?.text ?? ""), value: a11yValues.joined(separator: ", ")) // Color string find in search - cell.fileTitleLabel?.textColor = NCBrandColor.shared.textColor - cell.fileTitleLabel?.font = .systemFont(ofSize: 15) + cell.fileTitleLabel?.textColor = UIColor(resource: .ListCell.title) + cell.fileTitleLabel?.font = .systemFont(ofSize: 16, weight: .medium) if isSearchingMode, let literalSearch = self.literalSearch, let title = cell.fileTitleLabel?.text { let longestWordRange = (title.lowercased() as NSString).range(of: literalSearch) diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift index a1b0267f81..8197f61cb3 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift @@ -44,6 +44,10 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { if metadata.directory { pushMetadata(metadata) + } else if metadata.isURL, + let url = URL(string: metadata.serverUrl)?.appendingPathComponent(metadata.url), + UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) } else { let image = utility.getImage(ocId: metadata.ocId, etag: metadata.etag, ext: NCGlobal.shared.previewExt1024) @@ -114,6 +118,7 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { } collectionView.reloadItems(at: [indexPath]) tabBarSelect?.update(fileSelect: fileSelect, metadatas: getSelectedMetadatas(), userId: metadata.userId) + fileActionsHeader?.setSelectionState(selectionState: selectionState) return } @@ -155,4 +160,8 @@ extension NCCollectionViewCommon: UICollectionViewDelegate { } } } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + headerTop?.constant = max(0, -scrollView.contentOffset.y) + } } diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+FileActionsHeader.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+FileActionsHeader.swift new file mode 100644 index 0000000000..99c36c8fc3 --- /dev/null +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+FileActionsHeader.swift @@ -0,0 +1,172 @@ +// +// NCCollectionViewCommon+FileActionsHeader.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 28.02.2025. +// Copyright © 2025 STRATO GmbH. All rights reserved. +// + +import Foundation + +extension NCCollectionViewCommon { + + func fixSearchBarPlacementForIOS16() { + if #available(iOS 16.0, *) { + navigationItem.preferredSearchBarPlacement = .stacked + } + } + + // MARK: - Headers view + + func updateHeadersView() { + fileActionsHeader?.isHidden = isSearchingMode + collectionViewTop?.constant = isSearchingMode ? 0 : fileActionsHeader?.bounds.height ?? 0 + fileActionsHeader?.setIsEditingMode(isEditingMode: isEditMode) + fileActionsHeader?.enableSelection(enable: !self.dataSource.isEmpty()) + + fileActionsHeader?.setSortingMenu(sortingMenuElements: createSortMenuActions(), title: sortTitle, image: sortDirectionImage) + fileActionsHeader?.setViewModeMenu(viewMenuElements: createViewModeMenuActions(), image: viewModeImage?.templateRendered()) + + fileActionsHeader?.onSelectModeChange = { [weak self] isSelectionMode in + self?.setEditMode(isSelectionMode) + (self?.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() + self?.updateHeadersView() + self?.fileActionsHeader?.setSelectionState(selectionState: .none) + } + + fileActionsHeader?.onSelectAll = { [weak self] in + guard let self = self else { return } + self.selectAll() + let selectionState: FileActionsHeaderSelectionState = self.fileSelect.count == 0 ? .none : .all + self.fileActionsHeader?.setSelectionState(selectionState: selectionState) + } + } + + private func createSortMenuActions() -> [UIMenuElement] { + guard let layoutForView = NCManageDatabase.shared.getLayoutForView(account: session.account, key: layoutKey, serverUrl: serverUrl) else { return [] } + + let ascending = layoutForView.ascending + let ascendingChevronImage = utility.loadImage(named: ascending ? "chevron.up" : "chevron.down") + let isName = layoutForView.sort == "fileName" + let isDate = layoutForView.sort == "date" + let isSize = layoutForView.sort == "size" + + let byName = UIAction(title: NSLocalizedString("_name_", comment: ""), image: isName ? ascendingChevronImage : nil, state: isName ? .on : .off) { [weak self] _ in + if isName { // repeated press + layoutForView.ascending = !layoutForView.ascending + } + layoutForView.sort = "fileName" + self?.notifyAboutLayoutChange(layoutForView) + } + + let byNewest = UIAction(title: NSLocalizedString("_date_", comment: ""), image: isDate ? ascendingChevronImage : nil, state: isDate ? .on : .off) { [weak self] _ in + if isDate { // repeated press + layoutForView.ascending = !layoutForView.ascending + } + layoutForView.sort = "date" + self?.notifyAboutLayoutChange(layoutForView) + } + + let byLargest = UIAction(title: NSLocalizedString("_size_", comment: ""), image: isSize ? ascendingChevronImage : nil, state: isSize ? .on : .off) { [weak self] _ in + if isSize { // repeated press + layoutForView.ascending = !layoutForView.ascending + } + layoutForView.sort = "size" + self?.notifyAboutLayoutChange(layoutForView) + } + + let sortSubmenu = UIMenu(title: NSLocalizedString("_order_by_", comment: ""), options: .displayInline, children: [byName, byNewest, byLargest]) + + let foldersOnTop = UIAction(title: NSLocalizedString("_directory_on_top_no_", comment: ""), image: utility.loadImage(named: "folder"), state: dataSource.directoryOnTop ? .on : .off) { [weak self] _ in + self?.notifyAboutLayoutChange(layoutForView) + } + + let additionalSubmenu = UIMenu(title: "", options: .displayInline, children: [foldersOnTop]) + return [sortSubmenu, additionalSubmenu] + } + + private func createViewModeMenuActions() -> [UIMenuElement] { + guard let layoutForView = NCManageDatabase.shared.getLayoutForView(account: session.account, key: layoutKey, serverUrl: serverUrl) else { return [] } + + let listImage = UIImage(resource: .FileSelection.viewModeList).templateRendered() + let gridImage = UIImage(resource: .FileSelection.viewModeGrid).templateRendered() + + let list = UIAction(title: NSLocalizedString("_list_", comment: ""), image: listImage, state: layoutForView.layout == NCGlobal.shared.layoutList ? .on : .off) { _ in + layoutForView.layout = self.global.layoutList + self.notifyAboutLayoutChange(layoutForView) + } + + let grid = UIAction(title: NSLocalizedString("_icons_", comment: ""), image: gridImage, state: layoutForView.layout == NCGlobal.shared.layoutGrid ? .on : .off) { _ in + layoutForView.layout = self.global.layoutGrid + self.notifyAboutLayoutChange(layoutForView) + } + + let menuPhoto = UIMenu(title: "", options: .displayInline, children: [ + UIAction(title: NSLocalizedString("_media_square_", comment: ""), image: gridImage, state: layoutForView.layout == NCGlobal.shared.layoutPhotoSquare ? .on : .off) { _ in + layoutForView.layout = self.global.layoutPhotoSquare + self.notifyAboutLayoutChange(layoutForView) + }, + UIAction(title: NSLocalizedString("_media_ratio_", comment: ""), image: gridImage, state: layoutForView.layout == NCGlobal.shared.layoutPhotoRatio ? .on : .off) { _ in + layoutForView.layout = self.global.layoutPhotoRatio + self.notifyAboutLayoutChange(layoutForView) + } + ]) + + return [list, grid, UIMenu(title: NSLocalizedString("_media_view_options_", comment: ""), children: [menuPhoto])] + } + + private func notifyAboutLayoutChange(_ layoutForView: NCDBLayoutForView) { + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterChangeLayout, + object: nil, + userInfo: ["account": self.session.account, + "serverUrl": self.serverUrl, + "layoutForView": layoutForView]) + } + + private var sortTitle: String? { + guard let layoutForView = NCManageDatabase.shared.getLayoutForView(account: session.account, key: layoutKey, serverUrl: serverUrl) else { return nil } + + switch layoutForView.sort { + case "fileName": return NSLocalizedString("_name_", comment: "") + case "date": return NSLocalizedString("_date_", comment: "") + case "size": return NSLocalizedString("_size_", comment: "") + default: return nil + } + } + + private var sortDirectionImage: UIImage? { + guard let layoutForView = NCManageDatabase.shared.getLayoutForView(account: session.account, key: layoutKey, serverUrl: serverUrl) else { return nil } + let imageName = layoutForView.ascending ? "arrow.up" : "arrow.down" + return UIImage(systemName: imageName, withConfiguration: UIImage.SymbolConfiguration(pointSize: 16, weight: .semibold)) + } + + private var viewModeImage: UIImage? { + var imageResource: ImageResource? + + switch layoutType { + case NCGlobal.shared.layoutList: imageResource = .FileSelection.viewModeList + case NCGlobal.shared.layoutGrid, NCGlobal.shared.layoutPhotoRatio, NCGlobal.shared.layoutPhotoSquare: imageResource = .FileSelection.viewModeGrid + default: break + } + + if let imageResource { + return UIImage(resource: imageResource) + } + return nil + } + + func setNavigationBarLogoIfNeeded() { + if isCurrentScreenInMainTabBar() && self.navigationController?.viewControllers.count == 1 { + setNavigationBarLogo() + } + } + + var selectionState: FileActionsHeaderSelectionState { + let selectedItemsCount = fileSelect.count + if selectedItemsCount == dataSource.getMetadatas().count { + return .all + } + + return selectedItemsCount == 0 ? .none : .some(selectedItemsCount) + } +} diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift index bfabead0bf..47af4ed9c6 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+SelectTabBar.swift @@ -4,6 +4,7 @@ // // Created by Milen on 01.03.24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -25,7 +26,7 @@ import UIKit import Foundation import NextcloudKit -extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { +extension NCCollectionViewCommon: HiDriveCollectionViewCommonSelectToolbarDelegate { func selectAll() { if !fileSelect.isEmpty, self.dataSource.getMetadatas().count == fileSelect.count { fileSelect = [] @@ -40,6 +41,7 @@ extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { var alertStyle = UIAlertController.Style.actionSheet if UIDevice.current.userInterfaceIdiom == .pad { alertStyle = .alert } let alertController = UIAlertController(title: NSLocalizedString("_confirm_delete_selected_", comment: ""), message: nil, preferredStyle: alertStyle) + alertController.view.backgroundColor = NCBrandColor.shared.appBackgroundColor let metadatas = getSelectedMetadatas() let canDeleteServer = metadatas.allSatisfy { !$0.lock } @@ -132,22 +134,18 @@ extension NCCollectionViewCommon: NCCollectionViewCommonSelectTabBarDelegate { if editMode { navigationItem.leftBarButtonItems = nil } else { - (self.navigationController as? NCMainNavigationController)?.setNavigationLeftItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationLeftItems() } - (self.navigationController as? NCMainNavigationController)?.setNavigationRightItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() self.collectionView.reloadData() } - - func convertLivePhoto(metadataFirst: tableMetadata?, metadataLast: tableMetadata?) { - if let metadataFirst, let metadataLast { - Task { - let userInfo: [String: Any] = ["serverUrl": metadataFirst.serverUrl, - "account": metadataFirst.account] - - await NCNetworking.shared.setLivePhoto(metadataFirst: metadataFirst, metadataLast: metadataLast, userInfo: userInfo) - } - } - setEditMode(false) + + func toolbarWillAppear() { + self.tabBarController?.tabBar.isHidden = true + } + + func toolbarWillDisappear() { + self.tabBarController?.tabBar.isHidden = false } } diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift index dca7ce92a3..339183e8b6 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 12/09/2020. // Copyright © 2020 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -28,8 +29,11 @@ import NextcloudKit import EasyTipView class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate, NCListCellDelegate, NCGridCellDelegate, NCPhotoCellDelegate, NCSectionFirstHeaderDelegate, NCSectionFooterDelegate, NCSectionFirstHeaderEmptyDataDelegate, NCAccountSettingsModelDelegate, UIAdaptivePresentationControllerDelegate, UIContextMenuInteractionDelegate { - + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var headerTop: NSLayoutConstraint? + @IBOutlet weak var collectionViewTop: NSLayoutConstraint? + @IBOutlet weak var fileActionsHeader: FileActionsHeader? let database = NCManageDatabase.shared let global = NCGlobal.shared @@ -46,15 +50,27 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS var searchController: UISearchController? var backgroundImageView = UIImageView() var serverUrl: String = "" - var isEditMode = false + var isEditMode = false { + didSet { + DispatchQueue.main.async { [weak self] in + self?.updateHeadersView() + } + } + } var isDirectoryEncrypted = false var fileSelect: [String] = [] var metadataFolder: tableMetadata? var richWorkspaceText: String? var sectionFirstHeader: NCSectionFirstHeader? var sectionFirstHeaderEmptyData: NCSectionFirstHeaderEmptyData? - var isSearchingMode: Bool = false var networkSearchInProgress: Bool = false + var isSearchingMode: Bool = false { + didSet { + DispatchQueue.main.async { [weak self] in + self?.updateHeadersView() + } + } + } var layoutForView: NCDBLayoutForView? var dataSourceTask: URLSessionTask? var providers: [NKSearchProvider]? @@ -62,9 +78,15 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS var listLayout = NCListLayout() var gridLayout = NCGridLayout() var mediaLayout = NCMediaLayout() - var layoutType = NCGlobal.shared.layoutList + var layoutType = NCGlobal.shared.layoutList { + didSet { + DispatchQueue.main.async { [weak self] in + self?.updateHeadersView() + } + } + } var literalSearch: String? - var tabBarSelect: NCCollectionViewCommonSelectTabBar? + var tabBarSelect: HiDriveCollectionViewCommonSelectToolbar? var attributesZoomIn: UIMenuElement.Attributes = [] var attributesZoomOut: UIMenuElement.Attributes = [] @@ -99,7 +121,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS let heightHeaderSection: CGFloat = 30 var session: NCSession.Session { - NCSession.shared.getSession(controller: tabBarController) + NCSession.shared.getSession(controller: controller) } var isLayoutPhoto: Bool { @@ -128,7 +150,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS } var controller: NCMainTabBarController? { - self.tabBarController as? NCMainTabBarController + self.tabBarController as? NCMainTabBarController ?? mainTabBarController } var defaultPredicate: NSPredicate { @@ -163,16 +185,27 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS // MARK: - View Life Cycle + private func forceRefreshDataSource() { + dataSource.removeAll() + getServerData() + if isRecommendationActived { + Task.detached { + await NCNetworking.shared.createRecommendations(session: self.session) + } + } + } + override func viewDidLoad() { super.viewDidLoad() - tabBarSelect = NCCollectionViewCommonSelectTabBar(controller: self.controller, delegate: self) + tabBarSelect = HiDriveCollectionViewCommonSelectToolbar(controller: controller, delegate: self) self.navigationController?.presentationController?.delegate = self collectionView.alwaysBounceVertical = true collectionView.accessibilityIdentifier = "NCCollectionViewCommon" - view.backgroundColor = .systemBackground - collectionView.backgroundColor = .systemBackground + // Color + view.backgroundColor = NCBrandColor.shared.appBackgroundColor + collectionView.backgroundColor = NCBrandColor.shared.appBackgroundColor refreshControl.tintColor = NCBrandColor.shared.textColor2 if enableSearchBar { @@ -182,8 +215,13 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS searchController?.delegate = self searchController?.searchBar.delegate = self searchController?.searchBar.autocapitalizationType = .none + searchController?.searchBar.searchTextField.backgroundColor = UIColor(resource: .searchBarBackground) + searchController?.searchBar.searchTextField.layer.cornerRadius = 10 + searchController?.searchBar.searchTextField.layer.masksToBounds = true + searchController?.searchBar.setSearchFieldBackgroundImage(UIImage(), for: .normal) navigationItem.searchController = searchController navigationItem.hidesSearchBarWhenScrolling = true + fixSearchBarPlacementForIOS16() } // Cell @@ -206,13 +244,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS collectionView.refreshControl = refreshControl refreshControl.action(for: .valueChanged) { _ in - self.dataSource.removeAll() - self.getServerData() - if self.isRecommendationActived { - Task.detached { - await NCNetworking.shared.createRecommendations(session: self.session) - } - } + self.forceRefreshDataSource() } let longPressedGesture = UILongPressGestureRecognizer(target: self, action: #selector(longPressCollecationView(_:))) @@ -236,7 +268,6 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(getServerData(_:)), name: NSNotification.Name(rawValue: global.notificationCenterGetServerData), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(reloadHeader(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadHeader), object: nil) - DispatchQueue.main.async { self.collectionView?.collectionViewLayout.invalidateLayout() } @@ -249,11 +280,11 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS navigationController?.navigationBar.topItem?.title = titlePreviusFolder } navigationItem.title = titleCurrentFolder - - isEditMode = false - - (self.navigationController as? NCMainNavigationController)?.setNavigationLeftItems() - (self.navigationController as? NCMainNavigationController)?.setNavigationRightItems() + + isEditMode = false + setNavigationBarLogoIfNeeded() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationLeftItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() layoutForView = database.getLayoutForView(account: session.account, key: layoutKey, serverUrl: serverUrl) if isLayoutList { @@ -271,6 +302,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS } collectionView.reloadData() + updateHeadersView() } override func viewDidAppear(_ animated: Bool) { @@ -297,6 +329,8 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS NotificationCenter.default.addObserver(self, selector: #selector(uploadCancelFile(_:)), name: NSNotification.Name(rawValue: global.notificationCenterUploadCancelFile), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(updateShare(_:)), name: NSNotification.Name(rawValue: global.notificationCenterUpdateShare), object: nil) + + tabBarSelect?.controller = controller } override func viewWillDisappear(_ animated: Bool) { @@ -366,10 +400,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() - - if let frame = tabBarController?.tabBar.frame { - tabBarSelect?.hostingController?.view.frame = frame - } + tabBarSelect?.onViewWillLayoutSubviews() } // MARK: - NotificationCenter @@ -391,6 +422,11 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS serverUrl == self.serverUrl else { return } + defer { + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() + self.updateHeadersView() + } + if self.layoutForView?.layout == layoutForView.layout { self.layoutForView = self.database.setLayoutForView(layoutForView: layoutForView) self.reloadDataSource() @@ -416,7 +452,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS self.collectionView.collectionViewLayout.invalidateLayout() - (self.navigationController as? NCMainNavigationController)?.setNavigationRightItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() } @objc func reloadDataSource(_ notification: NSNotification) { @@ -678,19 +714,17 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS } return NCBrandOptions.shared.brand } - + func accountSettingsDidDismiss(tableAccount: tableAccount?, controller: NCMainTabBarController?) { } // MARK: - SEARCH func searchController(enabled: Bool) { guard enableSearchBar else { return } - searchController?.searchBar.isUserInteractionEnabled = enabled if enabled { - searchController?.searchBar.alpha = 1 + navigationItem.searchController = searchController } else { - searchController?.searchBar.alpha = 0.3 - + navigationItem.searchController = nil } } @@ -845,7 +879,8 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS animations: { self.collectionView.reloadData() }, completion: nil) - (self.navigationController as? NCMainNavigationController)?.setNavigationRightItems() + (self.navigationController as? HiDriveMainNavigationController)?.setNavigationRightItems() + self.updateHeadersView() self.refreshControl.endRefreshing() } } diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommonSelectTabBar.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommonSelectTabBar.swift deleted file mode 100644 index b1f58ed307..0000000000 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommonSelectTabBar.swift +++ /dev/null @@ -1,245 +0,0 @@ -// -// NCCollectionViewCommonSelectionTabBar.swift -// Nextcloud -// -// Created by Milen on 01.02.24. -// Copyright © 2024 Marino Faggiana. All rights reserved. -// -// Author Marino Faggiana -// -// 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 . -// - -import Foundation -import UIKit -import SwiftUI - -protocol NCCollectionViewCommonSelectTabBarDelegate: AnyObject { - func selectAll() - func delete() - func move() - func share() - func saveAsAvailableOffline(isAnyOffline: Bool) - func lock(isAnyLocked: Bool) - func convertLivePhoto(metadataFirst: tableMetadata?, metadataLast: tableMetadata?) -} - -class NCCollectionViewCommonSelectTabBar: ObservableObject { - var controller: NCMainTabBarController? - var hostingController: UIViewController? - open weak var delegate: NCCollectionViewCommonSelectTabBarDelegate? - - @Published var isAnyOffline = false - @Published var canSetAsOffline = false - @Published var isAnyDirectory = false - @Published var isAllDirectory = false - @Published var isAnyLocked = false - @Published var canUnlock = true - @Published var enableLock = false - @Published var isSelectedEmpty = true - @Published var canConvertLivePhoto = false - @Published var metadatas: [tableMetadata] = [] - - init(controller: NCMainTabBarController? = nil, delegate: NCCollectionViewCommonSelectTabBarDelegate? = nil) { - let rootView = NCCollectionViewCommonSelectTabBarView(tabBarSelect: self) - hostingController = UIHostingController(rootView: rootView) - - self.controller = controller - self.delegate = delegate - - guard let controller, let hostingController else { return } - - controller.view.addSubview(hostingController.view) - - hostingController.view.frame = controller.tabBar.frame - hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] - hostingController.view.backgroundColor = .clear - hostingController.view.isHidden = true - } - - func show() { - guard let controller, let hostingController else { return } - - controller.tabBar.isHidden = true - if hostingController.view.isHidden { - hostingController.view.isHidden = false - hostingController.view.transform = .init(translationX: 0, y: hostingController.view.frame.height) - UIView.animate(withDuration: 0.2) { - hostingController.view.transform = .init(translationX: 0, y: 0) - } - } - } - - func hide() { - guard let controller, let hostingController else { return } - - hostingController.view.isHidden = true - controller.tabBar.isHidden = false - } - - func isHidden() -> Bool { - guard let hostingController else { return false } - return hostingController.view.isHidden - } - - func update(fileSelect: [String], metadatas: [tableMetadata]? = nil, userId: String? = nil) { - if let metadatas { - isAnyOffline = false - canSetAsOffline = true - isAnyDirectory = false - isAllDirectory = true - isAnyLocked = false - canUnlock = true - canConvertLivePhoto = false - self.metadatas = metadatas - - for metadata in metadatas { - if metadata.directory { - isAnyDirectory = true - } else { - isAllDirectory = false - } - - if !metadata.canSetAsAvailableOffline { - canSetAsOffline = false - } - - if metadata.lock { - isAnyLocked = true - if metadata.lockOwner != userId { - canUnlock = false - } - } - - guard !isAnyOffline else { continue } - - if metadata.directory, - let directory = NCManageDatabase.shared.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", - metadata.account, - metadata.serverUrl + "/" + metadata.fileName)) { - isAnyOffline = directory.offline - } else if let localFile = NCManageDatabase.shared.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId)) { - isAnyOffline = localFile.offline - } // else: file is not offline, continue - } - enableLock = !isAnyDirectory && canUnlock && !NCCapabilities.shared.getCapabilities(account: controller?.account).capabilityFilesLockVersion.isEmpty - // Convert Live Photo - if metadatas.count == 2, - let metadataFirst = metadatas.first, - !metadataFirst.isLivePhoto, - let metadataLast = metadatas.last, - !metadataLast.isLivePhoto, - ((metadataFirst.isVideo && metadataLast.isImage) || (metadataFirst.isImage && metadataLast.isVideo)) { - canConvertLivePhoto = true - } - } - self.isSelectedEmpty = fileSelect.isEmpty - } -} - -struct NCCollectionViewCommonSelectTabBarView: View { - @ObservedObject var tabBarSelect: NCCollectionViewCommonSelectTabBar - @Environment(\.verticalSizeClass) var sizeClass - - var body: some View { - VStack { - Spacer().frame(height: sizeClass == .compact ? 5 : 10) - - HStack { - Button { - tabBarSelect.delegate?.share() - } label: { - Image(systemName: "square.and.arrow.up") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(Color(NCBrandColor.shared.iconImageColor)) - .frame(maxWidth: .infinity) - .disabled(tabBarSelect.isSelectedEmpty || tabBarSelect.isAllDirectory) - - Button { - tabBarSelect.delegate?.move() - } label: { - Image(systemName: "rectangle.portrait.and.arrow.right") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(Color(NCBrandColor.shared.iconImageColor)) - .frame(maxWidth: .infinity) - .disabled(tabBarSelect.isSelectedEmpty) - - Button { - tabBarSelect.delegate?.delete() - } label: { - Image(systemName: "trash") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(.red) - .frame(maxWidth: .infinity) - .disabled(tabBarSelect.isSelectedEmpty) - - Menu { - Button(action: { - tabBarSelect.delegate?.convertLivePhoto(metadataFirst: tabBarSelect.metadatas.first, metadataLast: tabBarSelect.metadatas.last) - }, label: { - Label(NSLocalizedString("_convert_live_photo_", comment: ""), systemImage: "livephoto") - }) - .disabled(!tabBarSelect.canConvertLivePhoto) - - Button(action: { - tabBarSelect.delegate?.saveAsAvailableOffline(isAnyOffline: tabBarSelect.isAnyOffline) - }, label: { - Label(NSLocalizedString(tabBarSelect.isAnyOffline ? "_remove_available_offline_" : "_set_available_offline_", comment: ""), systemImage: tabBarSelect.isAnyOffline ? "icloud.slash" : "icloud.and.arrow.down") - - if !tabBarSelect.canSetAsOffline && !tabBarSelect.isAnyOffline { - Text(NSLocalizedString("_e2ee_set_as_offline_", comment: "")) - } - }) - .disabled(!tabBarSelect.isAnyOffline && (!tabBarSelect.canSetAsOffline || tabBarSelect.isSelectedEmpty)) - - Button(action: { - tabBarSelect.delegate?.lock(isAnyLocked: tabBarSelect.isAnyLocked) - }, label: { - Label(NSLocalizedString(tabBarSelect.isAnyLocked ? "_unlock_" : "_lock_", comment: ""), systemImage: tabBarSelect.isAnyLocked ? "lock.open" : "lock") - - if !tabBarSelect.enableLock { - Text(NSLocalizedString("_lock_no_permissions_selected_", comment: "")) - } - }) - .disabled(!tabBarSelect.enableLock || tabBarSelect.isSelectedEmpty) - - Button(action: { - tabBarSelect.delegate?.selectAll() - }, label: { - Label(NSLocalizedString("_select_all_", comment: ""), systemImage: "checkmark") - }) - } label: { - Image(systemName: "ellipsis.circle") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(Color(NCBrandColor.shared.iconImageColor)) - .frame(maxWidth: .infinity) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) - .background(.thinMaterial) - .overlay(Rectangle().frame(width: nil, height: 0.5, alignment: .top).foregroundColor(Color(UIColor.separator)), alignment: .top) - } -} - -#Preview { - NCCollectionViewCommonSelectTabBarView(tabBarSelect: NCCollectionViewCommonSelectTabBar()) -} diff --git a/iOSClient/Main/Collection Common/NCCollectionViewDataSource.swift b/iOSClient/Main/Collection Common/NCCollectionViewDataSource.swift index 776440d93f..11efc2b283 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewDataSource.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewDataSource.swift @@ -36,7 +36,7 @@ class NCCollectionViewDataSource: NSObject { private var metadatasForSection: [NCMetadataForSection] = [] private var layoutForView: NCDBLayoutForView? private var metadataIndexPath = ThreadSafeDictionary() - private var directoryOnTop: Bool = true + private(set) var directoryOnTop: Bool = true override init() { super.init() } diff --git a/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFooter.xib b/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFooter.xib index ced40b7812..c5aa186175 100644 --- a/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFooter.xib +++ b/iOSClient/Main/Collection Common/Section Header Footer/NCSectionFooter.xib @@ -4,6 +4,7 @@ + @@ -14,8 +15,8 @@ - - - - - - - - - + - - - - - + + + + - - - - - - - - - + @@ -122,11 +61,4 @@ - - - - - - - diff --git a/iOSClient/Media/NCMedia.swift b/iOSClient/Media/NCMedia.swift index 41166952e9..c749aeb936 100644 --- a/iOSClient/Media/NCMedia.swift +++ b/iOSClient/Media/NCMedia.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 12/02/2019. // Copyright © 2019 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -25,16 +26,11 @@ import Foundation import UIKit import NextcloudKit import RealmSwift +import Combine class NCMedia: UIViewController { @IBOutlet weak var collectionView: UICollectionView! - @IBOutlet weak var titleDate: UILabel! - @IBOutlet weak var activityIndicator: UIActivityIndicatorView! - @IBOutlet weak var selectOrCancelButton: UIButton! - @IBOutlet weak var menuButton: UIButton! - @IBOutlet weak var assistantButton: UIButton! - @IBOutlet weak var gradientView: UIView! - @IBOutlet weak var stackView: UIStackView! + @IBOutlet weak var fileActionsHeader: FileActionsHeader? let semaphoreSearchMedia = DispatchSemaphore(value: 1) let semaphoreNotificationCenter = DispatchSemaphore(value: 1) @@ -42,7 +38,7 @@ class NCMedia: UIViewController { let layout = NCMediaLayout() var layoutType = NCGlobal.shared.mediaLayoutRatio var documentPickerViewController: NCDocumentPickerViewController? - var tabBarSelect: NCMediaSelectTabBar! + var tabBarSelect: HiDriveCollectionViewCommonSelectToolbar! let utilityFileSystem = NCUtilityFileSystem() let global = NCGlobal.shared let utility = NCUtility() @@ -63,12 +59,14 @@ class NCMedia: UIViewController { var showOnlyVideos = false var timeIntervalSearchNewMedia: TimeInterval = 2.0 var timerSearchNewMedia: Timer? - let insetsTop: CGFloat = 65 let livePhotoImage = NCUtility().loadImage(named: "livephoto", colors: [.white]) let playImage = NCUtility().loadImage(named: "play.fill", colors: [.white]) var photoImage = UIImage() var videoImage = UIImage() var pinchGesture: UIPinchGestureRecognizer = UIPinchGestureRecognizer() + + private var accountButtonFactory: AccountButtonFactory! + var activeTransfersListener: AnyCancellable? = nil var lastScale: CGFloat = 1.0 var currentScale: CGFloat = 1.0 @@ -103,14 +101,14 @@ class NCMedia: UIViewController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .systemBackground + view.backgroundColor = NCBrandColor.shared.appBackgroundColor collectionView.register(UINib(nibName: "NCSectionFirstHeaderEmptyData", bundle: nil), forSupplementaryViewOfKind: mediaSectionHeader, withReuseIdentifier: "sectionFirstHeaderEmptyData") collectionView.register(UINib(nibName: "NCSectionFooter", bundle: nil), forSupplementaryViewOfKind: mediaSectionFooter, withReuseIdentifier: "sectionFooter") collectionView.register(UINib(nibName: "NCMediaCell", bundle: nil), forCellWithReuseIdentifier: "mediaCell") collectionView.alwaysBounceVertical = true - collectionView.contentInset = UIEdgeInsets(top: insetsTop, left: 0, bottom: 50, right: 0) - collectionView.backgroundColor = .systemBackground + collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0) + collectionView.backgroundColor = NCBrandColor.shared.appBackgroundColor collectionView.prefetchDataSource = self collectionView.dragInteractionEnabled = true collectionView.dragDelegate = self @@ -121,35 +119,11 @@ class NCMedia: UIViewController { collectionView.collectionViewLayout = layout layoutType = database.getLayoutForView(account: session.account, key: global.layoutViewMedia, serverUrl: "")?.layout ?? global.mediaLayoutRatio - tabBarSelect = NCMediaSelectTabBar(tabBarController: self.tabBarController, delegate: self) - - titleDate.text = "" - - menuButton.backgroundColor = .clear - menuButton.layer.cornerRadius = 15 - menuButton.layer.masksToBounds = true - menuButton.showsMenuAsPrimaryAction = true - menuButton.configuration = UIButton.Configuration.plain() - menuButton.setImage(UIImage(systemName: "ellipsis"), for: .normal) - menuButton.addBlur(style: .systemUltraThinMaterial) - - assistantButton.backgroundColor = .clear - assistantButton.layer.cornerRadius = 15 - assistantButton.layer.masksToBounds = true - assistantButton.configuration = UIButton.Configuration.plain() - assistantButton.setImage(UIImage(systemName: "sparkles"), for: .normal) - assistantButton.addBlur(style: .systemUltraThinMaterial) - - selectOrCancelButton.backgroundColor = .clear - selectOrCancelButton.layer.cornerRadius = 15 - selectOrCancelButton.layer.masksToBounds = true - selectOrCancelButton.setTitle( NSLocalizedString("_select_", comment: ""), for: .normal) - selectOrCancelButton.addBlur(style: .systemUltraThinMaterial) + tabBarSelect = HiDriveCollectionViewCommonSelectToolbar(controller: controller, delegate: self, displayedButtons: [.delete]) gradient.startPoint = CGPoint(x: 0, y: 0.1) gradient.endPoint = CGPoint(x: 0, y: 1) gradient.colors = [UIColor.black.withAlphaComponent(UIAccessibility.isReduceTransparencyEnabled ? 0.8 : 0.4).cgColor, UIColor.clear.cgColor] - gradientView.layer.insertSublayer(gradient, at: 0) collectionView.refreshControl = refreshControl refreshControl.action(for: .valueChanged) { _ in @@ -180,15 +154,35 @@ class NCMedia: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource(_:)), name: NSNotification.Name(rawValue: global.notificationCenterReloadDataSource), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(networkRemoveAll), name: UIApplication.didEnterBackgroundNotification, object: nil) + + accountButtonFactory = AccountButtonFactory(controller: controller, + onAccountDetailsOpen: { [weak self] in self?.setEditMode(false) }, + presentVC: { [weak self] vc in self?.present(vc, animated: true) }) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - navigationController?.setMediaAppreance() + navigationController?.setNavigationBarAppearance() + navigationItem.largeTitleDisplayMode = .never if dataSource.metadatas.isEmpty { loadDataSource() } + + setNavigationRightItems() + setNavigationLeftItems() + updateHeadersView() + setNavigationBarLogoIfNeeded() + + activeTransfersListener = TransfersListener + .shared + .activeTransfersListener + .sink { [weak self] in self?.setNavigationRightItems() } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + activeTransfersListener = nil } override func viewDidAppear(_ animated: Bool) { @@ -199,7 +193,6 @@ class NCMedia: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(enterForeground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil) searchNewMedia() - createMenu() } override func viewDidDisappear(_ animated: Bool) { @@ -224,11 +217,7 @@ class NCMedia: UIViewController { override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() - - if let frame = tabBarController?.tabBar.frame { - tabBarSelect.hostingController.view.frame = frame - } - gradient.frame = gradientView.bounds + tabBarSelect.onViewWillLayoutSubviews() } func searchNewMedia() { @@ -349,19 +338,6 @@ class NCMedia: UIViewController { // MARK: - extension NCMedia: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { - if !dataSource.metadatas.isEmpty { - isTop = scrollView.contentOffset.y <= -(insetsTop + view.safeAreaInsets.top - 25) - setColor() - setTitleDate() - setNeedsStatusBarAppearanceUpdate() - } else { - setColor() - } - } - - func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { - } func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if !decelerate { @@ -374,11 +350,6 @@ extension NCMedia: UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { searchNewMedia() } - - func scrollViewDidScrollToTop(_ scrollView: UIScrollView) { - let y = view.safeAreaInsets.top - scrollView.contentOffset.y = -(insetsTop + y) - } } // MARK: - @@ -396,3 +367,95 @@ extension NCMedia: NCSelectDelegate { searchNewMedia() } } + +// MARK: - +extension NCMedia { + func setNavigationRightItems() { + navigationItem.rightBarButtonItems = [createAccountButton(), createTransfersButtonIfNeeded()].compactMap { $0 } + } + + private func createAccountButton() -> UIBarButtonItem { + accountButtonFactory.createAccountButton() + } + + private func createTransfersButtonIfNeeded() -> UIBarButtonItem? { + guard TransfersListener.shared.areActiveTransfersPresent else { + return nil + } + let transfersButton = UIBarButtonItem(image: UIImage(systemName: "arrow.left.arrow.right.circle.fill"), + style: .plain) { [weak self] in + if let navigationController = UIStoryboard(name: "NCTransfers", bundle: nil).instantiateInitialViewController() as? UINavigationController, + let viewController = navigationController.topViewController as? NCTransfers { + viewController.modalPresentationStyle = .pageSheet + self?.present(navigationController, animated: true, completion: nil) + } + } + return transfersButton + } + + func setNavigationLeftItems() { + if isEditMode { + navigationItem.setLeftBarButtonItems(nil, animated: true) + return + } + let burgerMenuItem = UIBarButtonItem(image: UIImage(resource: .BurgerMenu.bars), + style: .plain, + action: { [weak self] in + self?.showBurgerMenu() + }) + burgerMenuItem.tintColor = UIColor(resource: .BurgerMenu.navigationBarButton) + navigationItem.setLeftBarButtonItems([burgerMenuItem], animated: true) + } + + func showBurgerMenu() { + mainTabBarController?.showBurgerMenu() + } + + private func setNavigationBarLogoIfNeeded() { + if self.navigationController?.viewControllers.count == 1 { + setNavigationBarLogo() + } + } + + func updateHeadersView() { + fileActionsHeader?.showViewModeButton(false) + fileActionsHeader?.setIsEditingMode(isEditingMode: isEditMode) + fileActionsHeader?.enableSelection(enable: self.dataSource.metadatas.count > 0) + updateHeadersMenu() + fileActionsHeader?.onSelectModeChange = { [weak self] isSelectionMode in + self?.setEditMode(isSelectionMode) + self?.updateHeadersView() + self?.fileActionsHeader?.setSelectionState(selectionState: .none) + } + + fileActionsHeader?.onSelectAll = { [weak self] in + guard let self = self else { return } + self.selectAllOrDeselectAll() + tabBarSelect.update(fileSelect: fileSelect) + self.fileActionsHeader?.setSelectionState(selectionState: selectionState) + } + } + + var selectionState: FileActionsHeaderSelectionState { + let selectedItemsCount = fileSelect.count + if selectedItemsCount == self.dataSource.metadatas.count { + return .all + } + + return selectedItemsCount == 0 ? .none : .some(selectedItemsCount) + } + + func selectAllOrDeselectAll() { + let metadatas = self.dataSource.metadatas + if !fileSelect.isEmpty, metadatas.count == fileSelect.count { + fileSelect = [] + } else { + fileSelect = metadatas.compactMap({ $0.ocId }) + } + collectionView.reloadData() + } + + func updateHeadersMenu() { + fileActionsHeader?.setSortingMenu(sortingMenuElements: createMenuElements(), title: NSLocalizedString("_media_options_", tableName: nil, bundle: Bundle.main, value: "Media Options", comment: ""), image: nil) + } +} diff --git a/iOSClient/Media/NCMediaDataSource.swift b/iOSClient/Media/NCMediaDataSource.swift index ddc537a262..75904fb914 100644 --- a/iOSClient/Media/NCMediaDataSource.swift +++ b/iOSClient/Media/NCMediaDataSource.swift @@ -41,7 +41,7 @@ extension NCMedia { DispatchQueue.main.async { self.collectionView.reloadData() self.refreshControl.endRefreshing() - self.setTitleDate() + self.updateHeadersView() } } @@ -114,10 +114,6 @@ extension NCMedia { greaterDateAny = greaterDate } - DispatchQueue.main.async { - self.activityIndicator.startAnimating() - } - NextcloudKit.shared.searchMedia(path: tableAccount.mediaPath, lessDate: lessDateAny, greaterDate: greaterDateAny, @@ -171,7 +167,6 @@ extension NCMedia { self.semaphoreSearchMedia.signal() DispatchQueue.main.async { - self.activityIndicator.stopAnimating() self.searchMediaInProgress = false if self.dataSource.metadatas.isEmpty { diff --git a/iOSClient/Media/NCMediaPinchGesture.swift b/iOSClient/Media/NCMediaPinchGesture.swift index 52e987daf7..a6f496e329 100644 --- a/iOSClient/Media/NCMediaPinchGesture.swift +++ b/iOSClient/Media/NCMediaPinchGesture.swift @@ -85,7 +85,7 @@ extension NCMedia { UIView.animate(withDuration: 0.30) { self.currentScale = 1.0 self.collectionView.transform = .identity - self.setTitleDate() +// self.setTitleDate() } default: break diff --git a/iOSClient/Menu/AppDelegate+Menu.swift b/iOSClient/Menu/AppDelegate+Menu.swift index c8bce52be1..a834f8b1d2 100644 --- a/iOSClient/Menu/AppDelegate+Menu.swift +++ b/iOSClient/Menu/AppDelegate+Menu.swift @@ -5,6 +5,7 @@ // Created by Philippe Weidmann on 24.01.20. // Copyright © 2020 Philippe Weidmann. All rights reserved. // Copyright © 2020 Marino Faggiana All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Philippe Weidmann // Author Marino Faggiana @@ -36,10 +37,11 @@ extension AppDelegate { let isDirectoryE2EE = NCUtilityFileSystem().isDirectoryE2EE(serverUrl: serverUrl, account: session.account) let directory = NCManageDatabase.shared.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", session.account, serverUrl)) let utility = NCUtility() - + let canCreateOfficeFiles = false + actions.append( NCMenuAction( - title: NSLocalizedString("_upload_photos_videos_", comment: ""), icon: utility.loadImage(named: "photo", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in + title: NSLocalizedString("_upload_photos_videos_", comment: ""), icon: NCImagesRepository.menuIconUploadPhotosVideos, action: { _ in NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { hasPermission in if hasPermission {NCPhotosPickerViewController(controller: controller, maxSelectedAssets: 0, singleSelectedMode: false) } @@ -50,58 +52,26 @@ extension AppDelegate { actions.append( NCMenuAction( - title: NSLocalizedString("_upload_file_", comment: ""), icon: utility.loadImage(named: "doc", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in + title: NSLocalizedString("_upload_file_", comment: ""), icon: NCImagesRepository.menuIconUploadFile, action: { _ in controller.documentPickerViewController = NCDocumentPickerViewController(controller: controller, isViewerMedia: false, allowsMultipleSelection: true) } ) ) - if NextcloudKit.shared.isNetworkReachable() && directEditingCreators != nil && directEditingCreators!.contains(where: { $0.editor == NCGlobal.shared.editorText}) && !isDirectoryE2EE { - actions.append( - NCMenuAction(title: NSLocalizedString("_create_nextcloudtext_document_", comment: ""), icon: utility.loadImage(named: "doc.text", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in - let directEditingCreator = directEditingCreators!.first(where: { $0.editor == NCGlobal.shared.editorText})! - - Task { - let fileName = await NCNetworking.shared.createFileName(fileNameBase: NSLocalizedString("_untitled_", comment: "") + ".md", account: session.account, serverUrl: serverUrl) - let fileNamePath = NCUtilityFileSystem().getFileNamePath(String(describing: fileName), serverUrl: serverUrl, session: session) - - NCCreateDocument().createDocument(controller: controller, fileNamePath: fileNamePath, fileName: String(describing: fileName), editorId: NCGlobal.shared.editorText, creatorId: directEditingCreator.identifier, templateId: NCGlobal.shared.templateDocument, account: session.account) - } - }) - ) - } - actions.append( NCMenuAction( - title: NSLocalizedString("_scans_document_", comment: ""), icon: utility.loadImage(named: "doc.text.viewfinder", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in + title: NSLocalizedString("_scans_document_", comment: ""), icon: NCImagesRepository.menuIconScan, action: { _ in NCDocumentCamera.shared.openScannerDocument(viewController: controller) } ) ) - actions.append( - NCMenuAction( - title: NSLocalizedString("_create_voice_memo_", comment: ""), icon: utility.loadImage(named: "mic", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in - NCAskAuthorization().askAuthorizationAudioRecord(viewController: controller) { hasPermission in - if hasPermission { - if let viewController = UIStoryboard(name: "NCAudioRecorderViewController", bundle: nil).instantiateInitialViewController() as? NCAudioRecorderViewController { - viewController.controller = controller - viewController.modalTransitionStyle = .crossDissolve - viewController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext - controller.present(viewController, animated: true, completion: nil) - } - } - } - } - ) - ) - if NCKeychain().isEndToEndEnabled(account: session.account) { actions.append(.seperator(order: 0)) } let titleCreateFolder = isDirectoryE2EE ? NSLocalizedString("_create_folder_e2ee_", comment: "") : NSLocalizedString("_create_folder_", comment: "") - let imageCreateFolder = isDirectoryE2EE ? NCImageCache.shared.getFolderEncrypted(account: session.account) : NCImageCache.shared.getFolder(account: session.account) + let imageCreateFolder = NCImagesRepository.menuIconCreateFolder actions.append( NCMenuAction(title: titleCreateFolder, icon: imageCreateFolder, action: { _ in @@ -115,7 +85,7 @@ extension AppDelegate { if !isDirectoryE2EE && NCKeychain().isEndToEndEnabled(account: session.account) { actions.append( NCMenuAction(title: NSLocalizedString("_create_folder_e2ee_", comment: ""), - icon: NCImageCache.shared.getFolderEncrypted(account: session.account), + icon: NCImagesRepository.menuIconCreateFolder, action: { _ in let alertController = UIAlertController.createFolder(serverUrl: serverUrl, session: session, markE2ee: true, sceneIdentifier: controller.sceneIdentifier) controller.present(alertController, animated: true, completion: nil) @@ -127,26 +97,11 @@ extension AppDelegate { actions.append(.seperator(order: 0)) } - if NCCapabilities.shared.getCapabilities(account: session.account).capabilityServerVersionMajor >= NCGlobal.shared.nextcloudVersion18 && directory?.richWorkspace == nil && !isDirectoryE2EE && NextcloudKit.shared.isNetworkReachable() { - actions.append( - NCMenuAction( - title: NSLocalizedString("_add_folder_info_", comment: ""), icon: NCUtility().loadImage(named: "list.dash.header.rectangle", colors: [NCBrandColor.shared.iconImageColor]), action: { _ in - let richWorkspaceCommon = NCRichWorkspaceCommon() - if let viewController = controller.currentViewController() { - if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView LIKE[c] %@", - session.account, - serverUrl, - NCGlobal.shared.fileNameRichWorkspace.lowercased())) == nil { - richWorkspaceCommon.createViewerNextcloudText(serverUrl: serverUrl, viewController: viewController, session: session) - } else { - richWorkspaceCommon.openViewerNextcloudText(serverUrl: serverUrl, viewController: viewController, session: session) - } - } - } - ) - ) - } - + guard canCreateOfficeFiles else { + controller.presentMenu(with: actions) + return + } + if NextcloudKit.shared.isNetworkReachable() && directEditingCreators != nil && directEditingCreators!.contains(where: { $0.editor == NCGlobal.shared.editorOnlyoffice && $0.identifier == NCGlobal.shared.onlyofficeDocx}) && !isDirectoryE2EE { let directEditingCreator = directEditingCreators!.first(where: { $0.editor == NCGlobal.shared.editorOnlyoffice && $0.identifier == NCGlobal.shared.onlyofficeDocx})! actions.append( @@ -208,7 +163,7 @@ extension AppDelegate { if NextcloudKit.shared.isNetworkReachable() && !isDirectoryE2EE { actions.append( NCMenuAction( - title: NSLocalizedString("_create_new_document_", comment: ""), icon: utility.loadImage(named: "doc.richtext", colors: [NCBrandColor.shared.documentIconColor]), action: { _ in + title: NSLocalizedString("_create_new_document_", comment: ""), icon: utility.loadImage(named: "doc.text", colors: [NCBrandColor.shared.documentIconColor]), action: { _ in let createDocument = NCCreateDocument() Task { diff --git a/iOSClient/Menu/NCCollectionViewCommon+Menu.swift b/iOSClient/Menu/NCCollectionViewCommon+Menu.swift index 6cb0d3e777..17cee25b98 100644 --- a/iOSClient/Menu/NCCollectionViewCommon+Menu.swift +++ b/iOSClient/Menu/NCCollectionViewCommon+Menu.swift @@ -65,6 +65,7 @@ extension NCCollectionViewCommon { title: metadata.fileNameView, boldTitle: true, icon: iconHeader, + isHeader: true, order: 0, action: nil ) @@ -80,7 +81,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_details_", comment: ""), - icon: utility.loadImage(named: "info.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconDetails, order: 10, action: { _ in NCActionCenter.shared.openShare(viewController: self, metadata: metadata, page: .activity) @@ -130,7 +131,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_view_in_folder_", comment: ""), - icon: utility.loadImage(named: "questionmark.folder", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconViewInFolder, order: 21, action: { _ in NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil, sceneIdentifier: sceneIdentifier) @@ -157,7 +158,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_e2e_set_folder_encrypted_", comment: ""), - icon: utility.loadImage(named: "lock", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconLock, order: 30, action: { _ in Task { @@ -179,7 +180,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_e2e_remove_folder_encrypted_", comment: ""), - icon: utility.loadImage(named: "lock", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconLock, order: 30, action: { _ in NextcloudKit.shared.markE2EEFolder(fileId: metadata.fileId, delete: true, account: metadata.account) { _, _, error in @@ -201,10 +202,11 @@ extension NCCollectionViewCommon { // // FAVORITE if !metadata.lock { + let favIcon = metadata.favorite ? NCImagesRepository.menuIconRemoveFromFavorite : NCImagesRepository.menuIconAddToFavorite actions.append( NCMenuAction( title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""), - icon: utility.loadImage(named: metadata.favorite ? "star.slash" : "star", colors: [NCBrandColor.shared.yellowFavorite]), + icon: favIcon, order: 50, action: { _ in NCNetworking.shared.favoriteMetadata(metadata) { error in @@ -239,11 +241,11 @@ extension NCCollectionViewCommon { // if NCNetworking.shared.isOnline, let metadataMOV = database.getMetadataLivePhoto(metadata: metadata), - let hudView = self.tabBarController?.view { + let hudView = self.mainTabBarController?.view { actions.append( NCMenuAction( title: NSLocalizedString("_livephoto_save_", comment: ""), - icon: NCUtility().loadImage(named: "livephoto", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconLivePhoto, order: 100, action: { _ in NCNetworking.shared.saveLivePhotoQueue.addOperation(NCOperationSaveLivePhoto(metadata: metadata, metadataMOV: metadataMOV, hudView: hudView)) @@ -283,7 +285,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_save_as_scan_", comment: ""), - icon: utility.loadImage(named: "doc.viewfinder", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconSaveAsScan, order: 110, action: { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { @@ -315,7 +317,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_rename_", comment: ""), - icon: utility.loadImage(named: "text.cursor", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconRename, order: 120, action: { _ in self.present(UIAlertController.renameFile(metadata: metadata), animated: true) @@ -339,7 +341,7 @@ extension NCCollectionViewCommon { actions.append( NCMenuAction( title: NSLocalizedString("_modify_", comment: ""), - icon: utility.loadImage(named: "pencil.tip.crop.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconModifyWithQuickLook, order: 150, action: { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { @@ -364,28 +366,6 @@ extension NCCollectionViewCommon { ) } - // - // COLOR FOLDER - // - if self is NCFiles, - metadata.directory { - actions.append( - NCMenuAction( - title: NSLocalizedString("_change_color_", comment: ""), - icon: utility.loadImage(named: "paintpalette", colors: [NCBrandColor.shared.iconImageColor]), - order: 160, - action: { _ in - if let picker = UIStoryboard(name: "NCColorPicker", bundle: nil).instantiateInitialViewController() as? NCColorPicker { - picker.metadata = metadata - let popup = NCPopupViewController(contentController: picker, popupWidth: 200, popupHeight: 320) - popup.backgroundAlpha = 0 - self.present(popup, animated: true) - } - } - ) - ) - } - // // DELETE // diff --git a/iOSClient/Menu/NCContextMenu.swift b/iOSClient/Menu/NCContextMenu.swift index 8f1c8ea408..a464958a86 100644 --- a/iOSClient/Menu/NCContextMenu.swift +++ b/iOSClient/Menu/NCContextMenu.swift @@ -33,7 +33,7 @@ class NCContextMenu: NSObject { func viewMenu(ocId: String, viewController: UIViewController, image: UIImage?) -> UIMenu { guard let metadata = self.database.getMetadataFromOcId(ocId), - let sceneIdentifier = (viewController.tabBarController as? NCMainTabBarController)?.sceneIdentifier else { return UIMenu() } + let sceneIdentifier = (viewController.mainTabBarController as? NCMainTabBarController)?.sceneIdentifier else { return UIMenu() } var downloadRequest: DownloadRequest? var titleDeleteConfirmFile = NSLocalizedString("_delete_file_", comment: "") let metadataMOV = self.database.getMetadataLivePhoto(metadata: metadata) @@ -44,14 +44,14 @@ class NCContextMenu: NSObject { // MENU ITEMS let detail = UIAction(title: NSLocalizedString("_details_", comment: ""), - image: utility.loadImage(named: "info.circle")) { _ in + image: NCImagesRepository.menuIconDetails) { _ in NCActionCenter.shared.openShare(viewController: viewController, metadata: metadata, page: .activity) } let favorite = UIAction(title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""), - image: utility.loadImage(named: metadata.favorite ? "star.slash" : "star", colors: [NCBrandColor.shared.yellowFavorite])) { _ in + image: metadata.favorite ? NCImagesRepository.menuIconRemoveFromFavorite : NCImagesRepository.menuIconAddToFavorite) { _ in NCNetworking.shared.favoriteMetadata(metadata) { error in if error != .success { NCContentPresenter().showError(error: error) @@ -60,7 +60,7 @@ class NCContextMenu: NSObject { } let share = UIAction(title: NSLocalizedString("_share_", comment: ""), - image: utility.loadImage(named: "square.and.arrow.up") ) { _ in + image: NCImagesRepository.menuIconShare ) { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, object: nil, @@ -99,18 +99,18 @@ class NCContextMenu: NSObject { } let viewInFolder = UIAction(title: NSLocalizedString("_view_in_folder_", comment: ""), - image: utility.loadImage(named: "questionmark.folder")) { _ in + image: NCImagesRepository.menuIconViewInFolder) { _ in NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil, sceneIdentifier: sceneIdentifier) } - let livePhotoSave = UIAction(title: NSLocalizedString("_livephoto_save_", comment: ""), image: utility.loadImage(named: "livephoto")) { _ in + let livePhotoSave = UIAction(title: NSLocalizedString("_livephoto_save_", comment: ""), image: NCImagesRepository.menuIconLivePhoto) { _ in if let metadataMOV = metadataMOV { NCNetworking.shared.saveLivePhotoQueue.addOperation(NCOperationSaveLivePhoto(metadata: metadata, metadataMOV: metadataMOV, hudView: viewController.view)) } } let modify = UIAction(title: NSLocalizedString("_modify_", comment: ""), - image: utility.loadImage(named: "pencil.tip.crop.circle")) { _ in + image: NCImagesRepository.menuIconModifyWithQuickLook) { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, object: nil, @@ -149,13 +149,14 @@ class NCContextMenu: NSObject { } let deleteConfirmFile = UIAction(title: titleDeleteConfirmFile, - image: utility.loadImage(named: "trash"), attributes: .destructive) { _ in + image: NCImagesRepository.menuIconTrash, attributes: .destructive) { _ in var alertStyle = UIAlertController.Style.actionSheet if UIDevice.current.userInterfaceIdiom == .pad { alertStyle = .alert } let alertController = UIAlertController(title: nil, message: nil, preferredStyle: alertStyle) + alertController.view.backgroundColor = NCBrandColor.shared.appBackgroundColor alertController.addAction(UIAlertAction(title: NSLocalizedString("_delete_file_", comment: ""), style: .destructive) { _ in NCNetworking.shared.deleteMetadatas([metadata], sceneIdentifier: sceneIdentifier) NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource) @@ -165,7 +166,7 @@ class NCContextMenu: NSObject { } let deleteConfirmLocal = UIAction(title: NSLocalizedString("_remove_local_file_", comment: ""), - image: utility.loadImage(named: "trash"), attributes: .destructive) { _ in + image: NCImagesRepository.menuIconTrash, attributes: .destructive) { _ in Task { var ocId: [String] = [] let error = await NCNetworking.shared.deleteCache(metadata, sceneIdentifier: sceneIdentifier) @@ -177,7 +178,6 @@ class NCContextMenu: NSObject { } let deleteSubMenu = UIMenu(title: NSLocalizedString("_delete_file_", comment: ""), - image: utility.loadImage(named: "trash"), options: .destructive, children: [deleteConfirmLocal, deleteConfirmFile]) diff --git a/iOSClient/Menu/NCMenu+FloatingPanel.swift b/iOSClient/Menu/NCMenu+FloatingPanel.swift index 4e2480de49..c9a44266f2 100644 --- a/iOSClient/Menu/NCMenu+FloatingPanel.swift +++ b/iOSClient/Menu/NCMenu+FloatingPanel.swift @@ -4,6 +4,7 @@ // // Created by Philippe Weidmann on 16.12.21. // Copyright © 2021 Henrik Storch All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -42,7 +43,7 @@ class NCMenuFloatingPanelLayout: FloatingPanelLayout { topInset = 48 return } - let screenHeight = UIDevice.current.orientation.isLandscape + let screenHeight = UIDevice.current.isVirtualOrientationLandscape ? min(window.frame.size.width, window.frame.size.height) : max(window.frame.size.width, window.frame.size.height) let bottomInset = window.rootViewController?.view.safeAreaInsets.bottom ?? 0 @@ -59,7 +60,7 @@ class NCMenuFloatingPanelLayout: FloatingPanelLayout { } func backdropAlpha(for state: FloatingPanelState) -> CGFloat { - return 0.2 + return 1 } } @@ -72,7 +73,12 @@ class NCMenuPanelController: FloatingPanelController { override func viewDidLoad() { super.viewDidLoad() - self.surfaceView.backgroundColor = .systemBackground + self.surfaceView.backgroundColor = NCBrandColor.shared.appBackgroundColor + + self.surfaceView.grabberHandleSize = .init(width: 72, height: 4) + self.surfaceView.grabberHandle.backgroundColor = UIColor(resource: .FileMenu.grabber) + + self.backdropView.backgroundColor = UIColor(resource: .FileMenu.overlay) self.isRemovalInteractionEnabled = true self.backdropView.dismissalTapGestureRecognizer.isEnabled = true self.surfaceView.layer.cornerRadius = 16 diff --git a/iOSClient/Menu/NCMenu.storyboard b/iOSClient/Menu/NCMenu.storyboard index e3b16fcbfe..6969f80cda 100644 --- a/iOSClient/Menu/NCMenu.storyboard +++ b/iOSClient/Menu/NCMenu.storyboard @@ -1,9 +1,9 @@ - + - + @@ -25,23 +25,23 @@ - + - - + + - + - + @@ -73,7 +73,7 @@ - + diff --git a/iOSClient/Menu/NCMenu.swift b/iOSClient/Menu/NCMenu.swift index 5ab8b221d5..1bf3263ec2 100644 --- a/iOSClient/Menu/NCMenu.swift +++ b/iOSClient/Menu/NCMenu.swift @@ -6,6 +6,7 @@ // Copyright © 2020 Philippe Weidmann. All rights reserved. // Copyright © 2020 Marino Faggiana All rights reserved. // Copyright © 2021 Henrik Storch All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Philippe Weidmann // Author Marino Faggiana @@ -35,8 +36,8 @@ extension Array where Element == NCMenuAction { class NCMenu: UITableViewController { var actions = [NCMenuAction]() - var menuColor = UIColor.systemBackground - var textColor = NCBrandColor.shared.textColor + var menuColor: UIColor = NCBrandColor.shared.appBackgroundColor + var textColor = UIColor(resource: .FileMenu.text) static func makeNCMenu(with actions: [NCMenuAction], menuColor: UIColor, textColor: UIColor) -> NCMenu? { let menuViewController = UIStoryboard(name: "NCMenu", bundle: nil).instantiateInitialViewController() as? NCMenu @@ -78,7 +79,7 @@ class NCMenu: UITableViewController { let action = actions[indexPath.row] guard action.title != NCMenuAction.seperatorIdentifier else { let cell = UITableViewCell() - cell.backgroundColor = .separator + cell.backgroundColor = UIColor(resource: .ListCell.separator) return cell } @@ -86,10 +87,17 @@ class NCMenu: UITableViewController { cell.accessibilityIdentifier = action.accessibilityIdentifier cell.tintColor = NCBrandColor.shared.customer cell.backgroundColor = menuColor - + + cell.selectedBackgroundView = UIView() + cell.selectedBackgroundView?.backgroundColor = UIColor(resource: .FileMenu.selectedRow) + let actionIconView = cell.viewWithTag(1) as? UIImageView let actionNameLabel = cell.viewWithTag(2) as? UILabel let actionDetailLabel = cell.viewWithTag(3) as? UILabel + + let iconWidthHeight = action.isHeader ? 36.0 : 20.0 + actionIconView?.widthAnchor.constraint(equalToConstant: iconWidthHeight).isActive = true + actionIconView?.heightAnchor.constraint(equalToConstant: iconWidthHeight).isActive = true if action.action == nil { cell.selectionStyle = .none @@ -111,19 +119,34 @@ class NCMenu: UITableViewController { actionNameLabel?.lineBreakMode = .byTruncatingMiddle if action.boldTitle { - actionNameLabel?.font = .systemFont(ofSize: 18, weight: .medium) + actionNameLabel?.font = .systemFont(ofSize: 16, weight: .medium) } else { - actionNameLabel?.font = .systemFont(ofSize: 18, weight: .regular) + actionNameLabel?.font = .systemFont(ofSize: 16, weight: .regular) } } - if action.destructive { + if !action.isHeader { actionIconView?.image = actionIconView?.image?.withRenderingMode(.alwaysTemplate) - actionIconView?.tintColor = .red - actionNameLabel?.textColor = .red } - - cell.accessoryType = action.selectable && action.selected ? .checkmark : .none + + if action.destructive { + let color = UIColor(resource: .destructiveAction) + actionIconView?.tintColor = color + actionNameLabel?.textColor = color + } else { + actionIconView?.tintColor = UIColor(resource: .FileMenu.icon) + } + + if (action.selectable && action.selected) { + let checkmarkImage = UIImage(named: "checkmarkIcon")?.templateRendered()?.withTintColor(NCBrandColor.shared.brandElement) + let checkmarkImageView = UIImageView(image: checkmarkImage) + checkmarkImageView.frame = CGRect(x: 0, y: 0, width: 19, height: 19) + checkmarkImageView.contentMode = .scaleAspectFit + + cell.accessoryView = checkmarkImageView + } else { + cell.accessoryView = .none + } return cell } diff --git a/iOSClient/Menu/NCMenuAction.swift b/iOSClient/Menu/NCMenuAction.swift index 3e5d733b26..f9f4375c02 100644 --- a/iOSClient/Menu/NCMenuAction.swift +++ b/iOSClient/Menu/NCMenuAction.swift @@ -4,6 +4,7 @@ // // Created by Henrik Storch on 17.02.22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // Author Marino Faggiana @@ -41,14 +42,17 @@ class NCMenuAction { var action: ((_ menuAction: NCMenuAction) -> Void)? var rowHeight: CGFloat { self.title == NCMenuAction.seperatorIdentifier ? NCMenuAction.seperatorHeight : self.details != nil ? 76 : 56 } var order: Int = 0 + var isHeader = false - init(title: String, boldTitle: Bool = false, destructive: Bool = false, details: String? = nil, icon: UIImage, order: Int = 0, accessibilityIdentifier: String? = nil, action: ((_ menuAction: NCMenuAction) -> Void)?) { + + init(title: String, boldTitle: Bool = false, destructive: Bool = false, details: String? = nil, icon: UIImage, isHeader: Bool = false, order: Int = 0, accessibilityIdentifier: String? = nil, action: ((_ menuAction: NCMenuAction) -> Void)?) { self.accessibilityIdentifier = accessibilityIdentifier self.title = title self.boldTitle = boldTitle self.destructive = destructive self.details = details self.icon = icon + self.isHeader = isHeader self.action = action self.selectable = false self.order = order @@ -86,7 +90,7 @@ extension NCMenuAction { static func selectAllAction(action: @escaping () -> Void) -> NCMenuAction { NCMenuAction( title: NSLocalizedString("_select_all_", comment: ""), - icon: NCUtility().loadImage(named: "checkmark.circle.fill", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconSelectAll, action: { _ in action() } ) } @@ -95,34 +99,31 @@ extension NCMenuAction { static func cancelAction(action: @escaping () -> Void) -> NCMenuAction { NCMenuAction( title: NSLocalizedString("_cancel_", comment: ""), - icon: NCUtility().loadImage(named: "xmark", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconClose, action: { _ in action() } ) } /// Delete files either from cache or from Nextcloud static func deleteAction(selectedMetadatas: [tableMetadata], metadataFolder: tableMetadata? = nil, controller: NCMainTabBarController?, order: Int = 0, completion: (() -> Void)? = nil) -> NCMenuAction { + var isDestructive = true var titleDelete = NSLocalizedString("_delete_", comment: "") var message = NSLocalizedString("_want_delete_", comment: "") - var icon = "trash" - var destructive = false - var color = NCBrandColor.shared.iconImageColor + var icon = NCImagesRepository.menuIconDelete let permissions = NCPermissions() if selectedMetadatas.count > 1 { titleDelete = NSLocalizedString("_delete_selected_files_", comment: "") - destructive = true } else if let metadata = selectedMetadatas.first { if NCManageDatabase.shared.isMetadataShareOrMounted(metadata: metadata, metadataFolder: metadataFolder) { titleDelete = NSLocalizedString("_leave_share_", comment: "") message = NSLocalizedString("_want_leave_share_", comment: "") - icon = "person.2.slash" + icon = NCImagesRepository.menuIconUnshare + isDestructive = false } else if metadata.directory { titleDelete = NSLocalizedString("_delete_folder_", comment: "") - destructive = true } else { titleDelete = NSLocalizedString("_delete_file_", comment: "") - destructive = true } if let metadataFolder = metadataFolder { @@ -130,7 +131,8 @@ extension NCMenuAction { let isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder.permissions.contains(permissions.permissionMounted) if isShare || isMounted { titleDelete = NSLocalizedString("_leave_share_", comment: "") - icon = "person.2.slash" + icon = NCImagesRepository.menuIconUnshare + isDestructive = false } } } // else: no metadata selected @@ -141,12 +143,11 @@ extension NCMenuAction { guard ix < 3 else { fileList += "\n - ..."; break } fileList += "\n - " + metadata.fileNameView } - if destructive { color = .red } return NCMenuAction( title: titleDelete, - destructive: destructive, - icon: NCUtility().loadImage(named: icon, colors: [color]), + destructive: isDestructive, + icon: icon, order: order, action: { _ in let alertController = UIAlertController.deleteFileOrFolder(titleString: titleDelete + "?", message: message + fileList, canDeleteServer: canDeleteServer, selectedMetadatas: selectedMetadatas, sceneIdentifier: controller?.sceneIdentifier) { _ in @@ -161,7 +162,7 @@ extension NCMenuAction { static func share(selectedMetadatas: [tableMetadata], controller: NCMainTabBarController?, order: Int = 0, completion: (() -> Void)? = nil) -> NCMenuAction { NCMenuAction( title: NSLocalizedString("_share_", comment: ""), - icon: NCUtility().loadImage(named: "square.and.arrow.up", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconShare, order: order, action: { _ in NCActionCenter.shared.openActivityViewController(selectedMetadata: selectedMetadatas, controller: controller) @@ -174,7 +175,7 @@ extension NCMenuAction { static func setAvailableOfflineAction(selectedMetadatas: [tableMetadata], isAnyOffline: Bool, viewController: UIViewController, order: Int = 0, completion: (() -> Void)? = nil) -> NCMenuAction { NCMenuAction( title: isAnyOffline ? NSLocalizedString("_remove_available_offline_", comment: "") : NSLocalizedString("_set_available_offline_", comment: ""), - icon: NCUtility().loadImage(named: "icloud.and.arrow.down", colors: [NCBrandColor.shared.iconImageColor]), + icon: isAnyOffline ? NCImagesRepository.menuIconAvailableOffline : NCImagesRepository.menuIconAddToOffline, order: order, action: { _ in if !isAnyOffline, selectedMetadatas.count > 3 { @@ -199,7 +200,7 @@ extension NCMenuAction { static func moveOrCopyAction(selectedMetadatas: [tableMetadata], viewController: UIViewController, order: Int = 0, completion: (() -> Void)? = nil) -> NCMenuAction { NCMenuAction( title: NSLocalizedString("_move_or_copy_", comment: ""), - icon: NCUtility().loadImage(named: "rectangle.portrait.and.arrow.right", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconMoveOrCopy, order: order, action: { _ in var fileNameError: NKError? @@ -217,7 +218,7 @@ extension NCMenuAction { if let fileNameError { viewController.present(UIAlertController.warning(message: "\(fileNameError.errorDescription) \(NSLocalizedString("_please_rename_file_", comment: ""))"), animated: true, completion: nil) } else { - let controller = viewController.tabBarController as? NCMainTabBarController + let controller = viewController.mainTabBarController NCActionCenter.shared.openSelectView(items: selectedMetadatas, controller: controller) completion?() } @@ -233,10 +234,10 @@ extension NCMenuAction { } else { titleKey = shouldLock ? "_lock_selected_files_" : "_unlock_selected_files_" } - let imageName = !shouldLock ? "lock_open" : "lock" + let image = !shouldLock ? NCImagesRepository.menuIconLockOpen : NCImagesRepository.menuIconLock return NCMenuAction( title: NSLocalizedString(titleKey, comment: ""), - icon: NCUtility().loadImage(named: imageName, colors: [NCBrandColor.shared.iconImageColor]), + icon: image, order: order, action: { _ in for metadata in metadatas where metadata.lock != shouldLock { @@ -247,3 +248,4 @@ extension NCMenuAction { ) } } + diff --git a/iOSClient/Menu/NCShare+Menu.swift b/iOSClient/Menu/NCShare+Menu.swift index b9f1abcc58..83df847bc7 100644 --- a/iOSClient/Menu/NCShare+Menu.swift +++ b/iOSClient/Menu/NCShare+Menu.swift @@ -4,6 +4,7 @@ // // Created by Henrik Storch on 16.03.22. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -34,7 +35,7 @@ extension NCShare { actions.append( NCMenuAction( title: NSLocalizedString("_share_add_sharelink_", comment: ""), - icon: utility.loadImage(named: "plus", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconAdd, action: { _ in self.makeNewLinkShare() } @@ -45,7 +46,7 @@ extension NCShare { actions.append( NCMenuAction( title: NSLocalizedString("_details_", comment: ""), - icon: utility.loadImage(named: "pencil", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconDetails, accessibilityIdentifier: "shareMenu/details", action: { _ in guard @@ -69,7 +70,7 @@ extension NCShare { NCMenuAction( title: NSLocalizedString("_share_unshare_", comment: ""), destructive: true, - icon: utility.loadImage(named: "person.2.slash"), + icon: NCImagesRepository.menuIconUnshare, action: { _ in Task { if share.shareType != NCShareCommon().SHARE_TYPE_LINK, let metadata = self.metadata, metadata.e2eEncrypted && capabilities.capabilityE2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { @@ -99,7 +100,7 @@ extension NCShare { actions.append( NCMenuAction( title: NSLocalizedString("_share_read_only_", comment: ""), - icon: utility.loadImage(named: "eye", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconReadOnly, selected: tableShare.permissions == (permissions.permissionReadShare + permissions.permissionShareShare) || tableShare.permissions == permissions.permissionReadShare, on: false, action: { _ in @@ -113,7 +114,7 @@ extension NCShare { actions.append( NCMenuAction( title: isDirectory ? NSLocalizedString("_share_allow_upload_", comment: "") : NSLocalizedString("_share_editing_", comment: ""), - icon: utility.loadImage(named: "pencil", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconEdit, selected: hasUploadPermission(tableShare: tableShare), on: false, action: { _ in diff --git a/iOSClient/Menu/NCSortMenu.swift b/iOSClient/Menu/NCSortMenu.swift new file mode 100644 index 0000000000..df3941aff6 --- /dev/null +++ b/iOSClient/Menu/NCSortMenu.swift @@ -0,0 +1,149 @@ +// +// NCSortMenu.swift +// Nextcloud +// +// Created by Marino Faggiana on 27/08/2020. +// Copyright © 2020 Marino Faggiana. All rights reserved. +// +// Author Marino Faggiana +// +// 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 . +// + +import UIKit +import FloatingPanel +import NextcloudKit + +class NCSortMenu: NSObject { + + private var sortButton: UIButton? + private var serverUrl: String = "" + private var hideDirectoryOnTop: Bool? + + private var key = "" + + func toggleMenu(viewController: UIViewController, account: String, key: String, sortButton: UIButton?, serverUrl: String, hideDirectoryOnTop: Bool = false) { + + self.key = key + self.sortButton = sortButton + self.serverUrl = serverUrl + self.hideDirectoryOnTop = hideDirectoryOnTop + + guard let layoutForView = NCManageDatabase.shared.getLayoutForView(account: account, key: key, serverUrl: serverUrl) else { return } + var actions = [NCMenuAction]() + var title = "" + var icon = UIImage() + + if layoutForView.ascending { + title = NSLocalizedString("_order_by_name_z_a_", comment: "") + icon = UIImage(named: "sortFileNameZA")!.image(color: UIColor.systemGray, size: 50) + } else { + title = NSLocalizedString("_order_by_name_a_z_", comment: "") + icon = UIImage(named: "sortFileNameAZ")!.image(color: UIColor.systemGray, size: 50) + } + + actions.append( + NCMenuAction( + title: title, + icon: icon, + selected: layoutForView.sort == "fileName", + on: layoutForView.sort == "fileName", + action: { _ in + layoutForView.sort = "fileName" + layoutForView.ascending = !layoutForView.ascending + self.actionMenu(layoutForView: layoutForView) + } + ) + ) + + if layoutForView.ascending { + title = NSLocalizedString("_order_by_date_more_recent_", comment: "") + icon = UIImage(named: "sortDateMoreRecent")!.image(color: UIColor.systemGray, size: 50) + } else { + title = NSLocalizedString("_order_by_date_less_recent_", comment: "") + icon = UIImage(named: "sortDateLessRecent")!.image(color: UIColor.systemGray, size: 50) + } + + actions.append( + NCMenuAction( + title: title, + icon: icon, + selected: layoutForView.sort == "date", + on: layoutForView.sort == "date", + action: { _ in + layoutForView.sort = "date" + layoutForView.ascending = !layoutForView.ascending + self.actionMenu(layoutForView: layoutForView) + } + ) + ) + + if layoutForView.ascending { + title = NSLocalizedString("_order_by_size_largest_", comment: "") + icon = UIImage(named: "sortLargest")!.image(color: UIColor.systemGray, size: 50) + } else { + title = NSLocalizedString("_order_by_size_smallest_", comment: "") + icon = UIImage(named: "sortSmallest")!.image(color: UIColor.systemGray, size: 50) + } + + actions.append( + NCMenuAction( + title: title, + icon: icon, + selected: layoutForView.sort == "size", + on: layoutForView.sort == "size", + action: { _ in + layoutForView.sort = "size" + layoutForView.ascending = !layoutForView.ascending + self.actionMenu(layoutForView: layoutForView) + } + ) + ) + + if !hideDirectoryOnTop { + actions.append( + NCMenuAction( + title: NSLocalizedString("_directory_on_top_no_", comment: ""), + icon: UIImage(named: "foldersOnTop")!.image(color: UIColor.systemGray, size: 50), + selected: layoutForView.directoryOnTop, + on: layoutForView.directoryOnTop, + action: { _ in + layoutForView.directoryOnTop = !layoutForView.directoryOnTop + self.actionMenu(layoutForView: layoutForView) + } + ) + ) + } + + viewController.presentMenu(with: actions) + } + + func actionMenu(layoutForView: NCDBLayoutForView) { + + switch layoutForView.sort { + case "fileName": + layoutForView.titleButtonHeader = layoutForView.ascending ? "_sorted_by_name_a_z_" : "_sorted_by_name_z_a_" + case "date": + layoutForView.titleButtonHeader = layoutForView.ascending ? "_sorted_by_date_less_recent_" : "_sorted_by_date_more_recent_" + case "size": + layoutForView.titleButtonHeader = layoutForView.ascending ? "_sorted_by_size_smallest_" : "_sorted_by_size_largest_" + default: + break + } + + self.sortButton?.setTitle(NSLocalizedString(layoutForView.titleButtonHeader, comment: ""), for: .normal) + NCManageDatabase.shared.setLayoutForView(layoutForView: layoutForView) + NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource) + } +} diff --git a/iOSClient/Menu/NCTrash+Menu.swift b/iOSClient/Menu/NCTrash+Menu.swift index 3f15cbf5e1..84b6891a4c 100644 --- a/iOSClient/Menu/NCTrash+Menu.swift +++ b/iOSClient/Menu/NCTrash+Menu.swift @@ -5,6 +5,7 @@ // Created by Marino Faggiana on 03/03/2021. // Copyright © 2021 Marino Faggiana. All rights reserved. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // Author Henrik Storch @@ -65,7 +66,7 @@ extension NCTrash { actions.append( NCMenuAction( title: NSLocalizedString("_restore_", comment: ""), - icon: utility.loadImage(named: "arrow.circlepath", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuRestore, action: { _ in self.restoreItem(with: objectId) } @@ -75,8 +76,7 @@ extension NCTrash { actions.append( NCMenuAction( title: NSLocalizedString("_delete_", comment: ""), - destructive: true, - icon: utility.loadImage(named: "trash", colors: [.red]), + icon: NCImagesRepository.menuIconTrash, action: { _ in self.deleteItem(with: objectId) } diff --git a/iOSClient/Menu/NCViewer+Menu.swift b/iOSClient/Menu/NCViewer+Menu.swift index 43104efd3b..c1aecc52f5 100644 --- a/iOSClient/Menu/NCViewer+Menu.swift +++ b/iOSClient/Menu/NCViewer+Menu.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 07/02/2020. // Copyright © 2020 Marino Faggiana All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -40,7 +41,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_details_", comment: ""), - icon: utility.loadImage(named: "info.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconDetails, action: { _ in NCActionCenter.shared.openShare(viewController: controller, metadata: metadata, page: .activity) } @@ -55,9 +56,9 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_view_in_folder_", comment: ""), - icon: utility.loadImage(named: "questionmark.folder", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconViewInFolder, action: { _ in - NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil, sceneIdentifier: controller.sceneIdentifier) + NCActionCenter.shared.openFileViewInFolder(serverUrl: metadata.serverUrl, fileNameBlink: metadata.fileName, fileNameOpen: nil, sceneIdentifier: controller.sceneIdentifier!) } ) ) @@ -71,7 +72,7 @@ extension NCViewer { actions.append( NCMenuAction( title: metadata.favorite ? NSLocalizedString("_remove_favorites_", comment: "") : NSLocalizedString("_add_favorites_", comment: ""), - icon: utility.loadImage(named: metadata.favorite ? "star.slash" : "star", colors: [NCBrandColor.shared.yellowFavorite]), + icon: metadata.favorite ? NCImagesRepository.menuIconRemoveFromFavorite : NCImagesRepository.menuIconAddToFavorite, action: { _ in NCNetworking.shared.favoriteMetadata(metadata) { error in if error != .success { @@ -105,7 +106,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_livephoto_save_", comment: ""), - icon: NCUtility().loadImage(named: "livephoto", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconLivePhoto, action: { _ in NCNetworking.shared.saveLivePhotoQueue.addOperation(NCOperationSaveLivePhoto(metadata: metadata, metadataMOV: metadataMOV, hudView: hudView)) } @@ -120,7 +121,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_save_as_scan_", comment: ""), - icon: utility.loadImage(named: "doc.viewfinder", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconSaveAsScan, action: { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, @@ -161,7 +162,7 @@ extension NCViewer { actions.append( NCMenuAction( title: title, - icon: utility.loadImage(named: "iphone.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconDownloadFullResolutionImage, action: { _ in guard let metadata = self.database.setMetadatasSessionInWaitDownload(metadatas: [metadata], session: NCNetworking.shared.sessionDownload, @@ -180,7 +181,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_search_", comment: ""), - icon: utility.loadImage(named: "magnifyingglass", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconSearch, action: { _ in NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterMenuSearchTextPDF) } @@ -190,7 +191,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_go_to_page_", comment: ""), - icon: utility.loadImage(named: "number.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconGoToPage, action: { _ in NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterMenuGotToPageInPDF) } @@ -205,7 +206,7 @@ extension NCViewer { actions.append( NCMenuAction( title: NSLocalizedString("_modify_", comment: ""), - icon: utility.loadImage(named: "pencil.tip.crop.circle", colors: [NCBrandColor.shared.iconImageColor]), + icon: NCImagesRepository.menuIconModifyWithQuickLook, action: { _ in if self.utilityFileSystem.fileProviderStorageExists(metadata) { NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterDownloadedFile, diff --git a/iOSClient/Menu/UIViewController+Menu.swift b/iOSClient/Menu/UIViewController+Menu.swift index 7e91db9aff..09f7c67d59 100644 --- a/iOSClient/Menu/UIViewController+Menu.swift +++ b/iOSClient/Menu/UIViewController+Menu.swift @@ -102,7 +102,7 @@ extension UIViewController { present(mail, animated: true) } - func presentMenu(with actions: [NCMenuAction], menuColor: UIColor = .systemBackground, textColor: UIColor = NCBrandColor.shared.textColor) { + func presentMenu(with actions: [NCMenuAction], menuColor: UIColor = UIColor(resource: .FileMenu.background), textColor: UIColor = NCBrandColor.shared.textColor) { guard !actions.isEmpty else { return } let actions = actions.sorted(by: { $0.order < $1.order }) guard let menuViewController = NCMenu.makeNCMenu(with: actions, menuColor: menuColor, textColor: textColor) else { diff --git a/iOSClient/More/NCMoreNavigationController.swift b/iOSClient/More/NCMoreNavigationController.swift deleted file mode 100644 index e8e83594a0..0000000000 --- a/iOSClient/More/NCMoreNavigationController.swift +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Nextcloud GmbH -// SPDX-FileCopyrightText: 2025 Marino Faggiana -// SPDX-License-Identifier: GPL-3.0-or-later - -import UIKit -import SwiftUI - -class NCMoreNavigationController: NCMainNavigationController { - override func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { - if viewController is NCCollectionViewCommon || viewController is NCActivity || viewController is NCTrash { - setNavigationBarAppearance() - } else { - setGroupAppearance() - } - } - - // MARK: - Right - - override func createRightMenu() -> UIMenu? { - guard let items = self.createRightMenuActions(), - let collectionViewCommon - else { - return nil - } - - if collectionViewCommon.layoutKey == global.layoutViewRecent { - return UIMenu(children: [items.select, items.viewStyleSubmenu]) - } else if collectionViewCommon.layoutKey == global.layoutViewOffline { - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu]) - } else if collectionViewCommon.layoutKey == global.layoutViewShares { - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu]) - } else { - let additionalSubmenu = UIMenu(title: "", options: .displayInline, children: [items.showDescription]) - return UIMenu(children: [items.select, items.viewStyleSubmenu, items.sortSubmenu, additionalSubmenu]) - } - } -} diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index 42b33287e6..0c874d582c 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -236,7 +236,6 @@ final class NCGlobal: Sendable { let selectorLoadFileQuickLook = "loadFileQuickLook" let selectorOpenIn = "openIn" let selectorUploadAutoUpload = "uploadAutoUpload" - let selectorUploadAutoUploadAll = "uploadAutoUploadAll" let selectorUploadFile = "uploadFile" let selectorUploadFileNODelete = "UploadFileNODelete" let selectorUploadFileShareExtension = "uploadFileShareExtension" @@ -289,7 +288,7 @@ final class NCGlobal: Sendable { let notificationCenterReloadDataNCShare = "reloadDataNCShare" let notificationCenterCloseRichWorkspaceWebView = "closeRichWorkspaceWebView" let notificationCenterReloadAvatar = "reloadAvatar" - let notificationCenterReloadHeader = "reloadHeader" + let notificationCenterReloadHeader = "reloadHeader" let notificationCenterClearCache = "clearCache" let notificationCenterChangeLayout = "changeLayout" // userInfo: account, serverUrl, layoutForView let notificationCenterCheckUserDelaultErrorDone = "checkUserDelaultErrorDone" // userInfo: account, controller @@ -355,7 +354,6 @@ final class NCGlobal: Sendable { let widgetActionNoAction = "nextcloud://open-action?action=no-action" let widgetActionUploadAsset = "nextcloud://open-action?action=upload-asset" let widgetActionScanDocument = "nextcloud://open-action?action=add-scan-document" - let widgetActionTextDocument = "nextcloud://open-action?action=create-text-document" let widgetActionVoiceMemo = "nextcloud://open-action?action=create-voice-memo" // APPCONFIG diff --git a/iOSClient/NCImageCache.swift b/iOSClient/NCImageCache.swift index 8277236a94..ae7b6c84bc 100644 --- a/iOSClient/NCImageCache.swift +++ b/iOSClient/NCImageCache.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 18/10/23. // Copyright © 2021 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -180,39 +181,65 @@ final class NCImageCache: @unchecked Sendable { } func getImageShared() -> UIImage { - return utility.loadImage(named: "person.fill.badge.plus", colors: NCBrandColor.shared.iconImageMultiColors) + return UIImage(resource: .Share.canShare).withTintColor(NCBrandColor.shared.brandElement) } func getImageCanShare() -> UIImage { - return utility.loadImage(named: "person.fill.badge.plus", colors: NCBrandColor.shared.iconImageMultiColors) + return UIImage(resource: .Share.canShare).withTintColor(NCBrandColor.shared.brandElement) } - func getImageShareByLink() -> UIImage { - return utility.loadImage(named: "link", colors: [NCBrandColor.shared.iconImageColor]) - } + func getImageShareByLink() -> UIImage { + return UIImage(resource: .Share.shared) + } + + + func getIconSharedByLink() -> UIImage { + UIImage(resource: .Share.Icon.byLink) + } + + func getIconSharedInternally() -> UIImage { + UIImage(resource: .Share.Icon.internally) + } + + func getIconSharedWithMe() -> UIImage { + UIImage(resource: .Share.Icon.withMe) + } + + func getFolderSharedByLink() -> UIImage { + UIImage(resource: .Share.Folder.byLink) + } + + func getFolderSharedInternally() -> UIImage { + UIImage(resource: .Share.Folder.internally) + } + + func getFolderSharedWithMe() -> UIImage { + UIImage(resource: .Share.Folder.withMe) + } + func getImageFavorite() -> UIImage { - return utility.loadImage(named: "star.fill", colors: [NCBrandColor.shared.yellowFavorite]) + return UIImage(resource: .FileFolderCell.star) } func getImageOfflineFlag() -> UIImage { - return utility.loadImage(named: "arrow.down.circle.fill", colors: [.systemGreen]) + return UIImage(resource: .offlineFlag) } func getImageLocal() -> UIImage { - return utility.loadImage(named: "checkmark.circle.fill", colors: [.systemGreen]) + return UIImage(resource: .local).withTintColor(NCBrandColor.shared.brandElement) } func getImageCheckedYes() -> UIImage { - return utility.loadImage(named: "checkmark.circle.fill", colors: [NCBrandColor.shared.iconImageColor2]) + return UIImage(resource: .FileSelection.listItemSelected) } func getImageCheckedNo() -> UIImage { - return utility.loadImage(named: "circle", colors: [NCBrandColor.shared.iconImageColor]) + return UIImage(resource: .FileSelection.listItemDeselected) } func getImageButtonMore() -> UIImage { - return utility.loadImage(named: "ellipsis", colors: [NCBrandColor.shared.iconImageColor]) + return UIImage(resource: .more).withTintColor(NCBrandColor.shared.brandElement) } func getImageButtonStop() -> UIImage { @@ -223,31 +250,35 @@ final class NCImageCache: @unchecked Sendable { return utility.loadImage(named: "lock.fill", colors: [NCBrandColor.shared.iconImageColor]) } + func getFolder() -> UIImage { + return UIImage(resource: .folder) + } + func getFolder(account: String) -> UIImage { - return UIImage(named: "folder")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(resource: .folder) } func getFolderEncrypted(account: String) -> UIImage { - return UIImage(named: "folderEncrypted")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(named: "folderEncrypted")!.image(color: NCBrandColor.shared.brandElement) } func getFolderSharedWithMe(account: String) -> UIImage { - return UIImage(named: "folder_shared_with_me")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(resource: .folderGroup) } func getFolderPublic(account: String) -> UIImage { - return UIImage(named: "folder_public")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(resource: .folderGroup) } func getFolderGroup(account: String) -> UIImage { - return UIImage(named: "folder_group")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(resource: .folderGroup) } func getFolderExternal(account: String) -> UIImage { - return UIImage(named: "folder_external")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(named: "folder_external")!.image(color: NCBrandColor.shared.brandElement) } func getFolderAutomaticUpload(account: String) -> UIImage { - return UIImage(named: "folderAutomaticUpload")!.image(color: NCBrandColor.shared.getElement(account: account)) + return UIImage(resource: .folderAutomaticUpload) } } diff --git a/iOSClient/NCImagesRepository.swift b/iOSClient/NCImagesRepository.swift new file mode 100644 index 0000000000..c5705d61d6 --- /dev/null +++ b/iOSClient/NCImagesRepository.swift @@ -0,0 +1,244 @@ +// +// NCImagesRepository.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 11.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation +import UIKit + +class NCImagesRepository: NSObject { + + private enum ImageName: String { + case favorite = "star.filled" + case addToFavorite = "star.hollow" + case livePhoto = "livephoto" + case details = "details" + case share = "menu.share" + case unshare = "unshare" + case trash = "trash_icon" + case delete = "delete" + case rename = "rename" + case viewInFolder = "viewInFolder" + case moveOrCopy = "moveOrCopy" + case addToOffline = "offline" + case availableOffline = "synced" + case goToPage = "goToPage" + case modifyWithQuickLook = "modifyWithQuickLook" + case search = "menu.search" + case lock = "item.lock" + case lockOpen = "item.lock.open" + case readOnly = "readOnly" + case edit = "allowEdit" + case add = "menu.add" + case selectAll = "checkmark.circle.fill" + case close = "xmark" + case photoOrVideo = "photoOrVideo" + case uploadFile = "uploadFile" + case scan = "scan" + case createFolder = "createFolder" + case restore = "restore" + + case mediaForward = "MediaPlayer/Forward" + case mediaFullscreen = "MediaPlayer/Fullscreen" + case mediaCloseFullscreen = "MediaPlayer/CloseFullscreen" + case mediaMessage = "MediaPlayer/Message" + case mediaPause = "MediaPlayer/Pause" + case mediaPlay = "MediaPlayer/Play" + case mediaRewind = "MediaPlayer/Rewind" + case mediaSound = "MediaPlayer/Sound" + } + + private static let utility = NCUtility() + + static var shareHeaderFavorite: UIImage { + utility.loadImage( + named: ImageName.favorite.rawValue, + colors: [NCBrandColor.shared.brandElement], + size: 20) + } + + static var trash: UIImage { + UIImage(resource: .deleted).withRenderingMode(.alwaysTemplate) + } + + // menu + static var menuIconRemoveFromFavorite: UIImage { + menuIcon(ImageName.favorite) + } + + static var menuIconAddToFavorite: UIImage { + menuIcon(ImageName.addToFavorite) + } + + static var menuIconDetails: UIImage { + menuIcon(ImageName.details) + } + + static var menuIconShare: UIImage { + menuIcon(ImageName.share) + } + + static var menuIconTrash: UIImage { + menuIcon(ImageName.trash) + } + + static var menuIconDelete: UIImage { + menuIcon(ImageName.delete) + } + + static var menuIconRename: UIImage { + menuIcon(ImageName.rename) + } + + static var menuIconViewInFolder: UIImage { + menuIcon(ImageName.viewInFolder) + } + + static var menuIconMoveOrCopy: UIImage { + menuIcon(ImageName.moveOrCopy) + } + + static var menuIconAddToOffline: UIImage { + menuIcon(ImageName.addToOffline) + } + + static var menuIconAvailableOffline: UIImage { + utility.loadImage(named: ImageName.availableOffline.rawValue) + } + + static var menuIconDownloadFullResolutionImage: UIImage { + menuIcon(ImageName.photoOrVideo) + } + + static var menuIconGoToPage: UIImage { + menuIcon(ImageName.goToPage) + } + + static var menuIconModifyWithQuickLook: UIImage { + menuIcon(ImageName.modifyWithQuickLook) + } + + static var menuIconSearch: UIImage { + menuIcon(ImageName.search) + } + + static var menuIconLivePhoto: UIImage { + menuIcon(ImageName.livePhoto) + } + + static var menuIconSaveAsScan: UIImage { + menuIcon(ImageName.scan) + } + + static var menuIconLock: UIImage { + menuIcon(ImageName.lock) + } + + static var menuIconLockOpen: UIImage { + menuIcon(ImageName.lockOpen) + } + + static var menuIconUnshare: UIImage { + menuIcon(ImageName.unshare) + } + + static var menuIconReadOnly: UIImage { + menuIcon(ImageName.readOnly) + } + + static var menuIconEdit: UIImage { + menuIcon(ImageName.edit) + } + + static var menuIconAdd: UIImage { + menuIcon(ImageName.add) + } + + static var menuIconSelectAll: UIImage { + menuIcon(ImageName.selectAll) + } + + static var menuIconClose: UIImage { + menuIcon(ImageName.close) + } + + static var menuIconUploadPhotosVideos: UIImage { + menuIcon(ImageName.photoOrVideo) + } + + static var menuIconUploadFile: UIImage { + menuIcon(ImageName.uploadFile) + } + + static var menuIconScan: UIImage { + menuIcon(ImageName.scan) + } + + static var menuIconCreateFolder: UIImage { + menuIcon(ImageName.createFolder) + } + + static var menuRestore: UIImage { + menuIcon(ImageName.restore) + } + + private static func menuIcon(_ imageName: ImageName) -> UIImage { + utility.loadImage( + named: imageName.rawValue, + colors: [.menuIconTint]) + } + + // media player + static let mediaBigIconSize: CGFloat = 48 + static let mediaMediumIconSize: CGFloat = 24 + + static var mediaIconForward: UIImage { + mediaIcon(ImageName.mediaForward, size: mediaBigIconSize) + } + + static var mediaIconFullscreen: UIImage { + mediaIcon(ImageName.mediaFullscreen) + } + + static var mediaIconCloseFullscreen: UIImage { + mediaIcon(ImageName.mediaCloseFullscreen) + } + + static var mediaIconMessage: UIImage { + mediaIcon(ImageName.mediaMessage) + } + + static var mediaIconPause: UIImage { + mediaIcon(ImageName.mediaPause, size: mediaBigIconSize) + } + + static var mediaIconPlay: UIImage { + mediaIcon(ImageName.mediaPlay, size: mediaBigIconSize) + } + + static var mediaIconRewind: UIImage { + mediaIcon(ImageName.mediaRewind, size: mediaBigIconSize) + } + + static var mediaIconSound: UIImage { + mediaIcon(ImageName.mediaSound) + } + + private static func mediaIcon(_ imageName: ImageName, size: CGFloat = mediaMediumIconSize) -> UIImage { + let color = UIColor(named: "MediaPlayer/IconTint") ?? .white + return UIImage(named: imageName.rawValue)?.image(color: color, size: size) ?? utility.loadImage(named: imageName.rawValue, size: size) + } +} + +extension UIColor { + static var menuIconTint: UIColor { + NCBrandColor.shared.menuIconColor + } + + static var menuFolderIconTint: UIColor { + NCBrandColor.shared.menuFolderIconColor + } +} diff --git a/iOSClient/Networking/NCAutoUpload.swift b/iOSClient/Networking/NCAutoUpload.swift index dbb5f32de2..b1b01d29bf 100644 --- a/iOSClient/Networking/NCAutoUpload.swift +++ b/iOSClient/Networking/NCAutoUpload.swift @@ -25,6 +25,7 @@ import UIKit import CoreLocation import NextcloudKit import Photos +import OrderedCollections class NCAutoUpload: NSObject { static let shared = NCAutoUpload() @@ -38,21 +39,22 @@ class NCAutoUpload: NSObject { func initAutoUpload(controller: NCMainTabBarController?, account: String, completion: @escaping (_ num: Int) -> Void) { applicationState = UIApplication.shared.applicationState - DispatchQueue.global().async { guard NCNetworking.shared.isOnline, let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", account)), - tableAccount.autoUpload else { + tableAccount.autoUploadStart else { return completion(0) } - NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { hasPermission in + NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { [self] hasPermission in guard hasPermission else { self.database.setAccountAutoUploadProperty("autoUpload", state: false) return completion(0) } + let albumIds = NCKeychain().getAutoUploadAlbumIds(account: account) + let selectedAlbums = PHAssetCollection.allAlbums.filter({albumIds.contains($0.localIdentifier)}) - self.uploadAssetsNewAndFull(controller: controller, selector: NCGlobal.shared.selectorUploadAutoUpload, log: "Init Auto Upload", account: account) { num in + self.uploadAssets(controller: controller, assetCollections: selectedAlbums, log: "Init Auto Upload", account: account) { num in completion(num) } } @@ -67,21 +69,21 @@ class NCAutoUpload: NSObject { }) } - func autoUploadFullPhotos(controller: NCMainTabBarController?, log: String, account: String) { + func autoUploadSelectedAlbums(controller: NCMainTabBarController?, assetCollections: [PHAssetCollection], log: String, account: String) { applicationState = UIApplication.shared.applicationState hud.initHudRing(view: controller?.view, text: nil, detailText: nil, tapToCancelDetailText: false) NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { hasPermission in guard hasPermission else { return } DispatchQueue.global().async { - self.uploadAssetsNewAndFull(controller: controller, selector: NCGlobal.shared.selectorUploadAutoUploadAll, log: log, account: account) { _ in + self.uploadAssets(controller: controller, assetCollections: assetCollections, log: log, account: account) { _ in self.hud.dismiss() } } } } - private func uploadAssetsNewAndFull(controller: NCMainTabBarController?, selector: String, log: String, account: String, completion: @escaping (_ num: Int) -> Void) { + private func uploadAssets(controller: NCMainTabBarController?, assetCollections: [PHAssetCollection] = [], log: String, account: String, completion: @escaping (_ num: Int) -> Void) { guard let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", account)) else { return completion(0) } @@ -89,7 +91,7 @@ class NCAutoUpload: NSObject { let autoUploadPath = self.database.getAccountAutoUploadPath(session: session) var metadatas: [tableMetadata] = [] - self.getCameraRollAssets(controller: controller, selector: selector, alignPhotoLibrary: false, account: account) { assets in + self.getCameraRollAssets(controller: controller, assetCollections: assetCollections, account: account) { assets in guard let assets, !assets.isEmpty else { NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Automatic upload, no new assets found [" + log + "]") return completion(0) @@ -98,12 +100,14 @@ class NCAutoUpload: NSObject { NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Automatic upload, new \(assets.count) assets found [" + log + "]") - NCNetworking.shared.createFolder(assets: assets, useSubFolder: tableAccount.autoUploadCreateSubfolder, selector: selector, session: session) + NCNetworking.shared.createFolder(assets: assets, useSubFolder: tableAccount.autoUploadCreateSubfolder, session: session) self.hud.setText(text: NSLocalizedString("_creating_db_photo_progress", comment: "")) self.hud.progress(0.0) self.endForAssetToUpload = false + var lastUploadDate = Date() + for asset in assets { var isLivePhoto = false var uploadSession: String = "" @@ -122,20 +126,16 @@ class NCAutoUpload: NSObject { isLivePhoto = true } - if selector == NCGlobal.shared.selectorUploadAutoUploadAll { - uploadSession = NCNetworking.shared.sessionUpload + if assetMediaType == PHAssetMediaType.image && tableAccount.autoUploadWWAnPhoto == false { + uploadSession = NCNetworking.shared.sessionUploadBackground + } else if assetMediaType == PHAssetMediaType.video && tableAccount.autoUploadWWAnVideo == false { + uploadSession = NCNetworking.shared.sessionUploadBackground + } else if assetMediaType == PHAssetMediaType.image && tableAccount.autoUploadWWAnPhoto { + uploadSession = NCNetworking.shared.sessionUploadBackgroundWWan + } else if assetMediaType == PHAssetMediaType.video && tableAccount.autoUploadWWAnVideo { + uploadSession = NCNetworking.shared.sessionUploadBackgroundWWan } else { - if assetMediaType == PHAssetMediaType.image && tableAccount.autoUploadWWAnPhoto == false { - uploadSession = NCNetworking.shared.sessionUploadBackground - } else if assetMediaType == PHAssetMediaType.video && tableAccount.autoUploadWWAnVideo == false { - uploadSession = NCNetworking.shared.sessionUploadBackground - } else if assetMediaType == PHAssetMediaType.image && tableAccount.autoUploadWWAnPhoto { - uploadSession = NCNetworking.shared.sessionUploadBackgroundWWan - } else if assetMediaType == PHAssetMediaType.video && tableAccount.autoUploadWWAnVideo { - uploadSession = NCNetworking.shared.sessionUploadBackgroundWWan - } else { - uploadSession = NCNetworking.shared.sessionUploadBackground - } + uploadSession = NCNetworking.shared.sessionUploadBackground } // MOST COMPATIBLE SEARCH --> HEIC --> JPG @@ -146,11 +146,7 @@ class NCAutoUpload: NSObject { fileNameSearchMetadata = (fileNameSearchMetadata as NSString).deletingPathExtension + ".jpg" } - if self.database.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", session.account, serverUrl, fileNameSearchMetadata)) != nil { - if selector == NCGlobal.shared.selectorUploadAutoUpload { - self.database.addPhotoLibrary([asset], account: session.account) - } - } else { + if self.database.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", session.account, serverUrl, fileNameSearchMetadata)) == nil { let metadata = self.database.createMetadata(fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, @@ -165,7 +161,7 @@ class NCAutoUpload: NSObject { } metadata.assetLocalIdentifier = asset.localIdentifier metadata.session = uploadSession - metadata.sessionSelector = selector + metadata.sessionSelector = NCGlobal.shared.selectorUploadAutoUpload metadata.status = NCGlobal.shared.metadataStatusWaitUpload metadata.sessionDate = Date() if assetMediaType == PHAssetMediaType.video { @@ -173,10 +169,13 @@ class NCAutoUpload: NSObject { } else if assetMediaType == PHAssetMediaType.image { metadata.classFile = NKCommon.TypeClassFile.image.rawValue } - if selector == NCGlobal.shared.selectorUploadAutoUpload { - NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Automatic upload added \(metadata.fileNameView) with Identifier \(metadata.assetLocalIdentifier)") - self.database.addPhotoLibrary([asset], account: account) + + let metadataCreationDate = metadata.creationDate as Date + + if lastUploadDate < metadataCreationDate { + lastUploadDate = metadataCreationDate } + metadatas.append(metadata) } @@ -193,65 +192,79 @@ class NCAutoUpload: NSObject { // MARK: - - @objc func alignPhotoLibrary(controller: NCMainTabBarController?, account: String) { - getCameraRollAssets(controller: controller, selector: NCGlobal.shared.selectorUploadAutoUploadAll, alignPhotoLibrary: true, account: account) { assets in - self.database.clearTable(tablePhotoLibrary.self, account: account) - guard let assets = assets else { return } + func processAssets(_ assetCollection: PHAssetCollection, _ fetchOptions: PHFetchOptions, _ tableAccount: tableAccount, _ account: String) -> [PHAsset] { + let assets: PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: fetchOptions) + var assetResult: [PHAsset] = [] - self.database.addPhotoLibrary(assets, account: account) - NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Align Photo Library \(assets.count)") + assets.enumerateObjects { asset, _, _ in + assetResult.append(asset) } + + return assetResult } - private func getCameraRollAssets(controller: NCMainTabBarController?, selector: String, alignPhotoLibrary: Bool, account: String, completion: @escaping (_ assets: [PHAsset]?) -> Void) { - NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { hasPermission in + private func getCameraRollAssets(controller: NCMainTabBarController?, assetCollections: [PHAssetCollection] = [], account: String, completion: @escaping (_ assets: [PHAsset]?) -> Void) { + NCAskAuthorization().askAuthorizationPhotoLibrary(controller: controller) { [self] hasPermission in guard hasPermission, let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", account)) else { return completion(nil) } - let assetCollection = PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.smartAlbum, subtype: PHAssetCollectionSubtype.smartAlbumUserLibrary, options: nil) - guard let assetCollection = assetCollection.firstObject else { return completion(nil) } - let predicateImage = NSPredicate(format: "mediaType == %i", PHAssetMediaType.image.rawValue) - let predicateVideo = NSPredicate(format: "mediaType == %i", PHAssetMediaType.video.rawValue) - var predicate: NSPredicate? + var newAssets: OrderedSet = [] let fetchOptions = PHFetchOptions() - var newAssets: [PHAsset] = [] - - if alignPhotoLibrary || (tableAccount.autoUploadImage && tableAccount.autoUploadVideo) { - predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicateImage, predicateVideo]) - } else if tableAccount.autoUploadImage { - predicate = predicateImage - } else if tableAccount.autoUploadVideo { - predicate = predicateVideo - } else { - return completion(nil) + var mediaPredicates: [NSPredicate] = [] + + if tableAccount.autoUploadImage { + mediaPredicates.append(NSPredicate(format: "mediaType == %i", PHAssetMediaType.image.rawValue)) } - fetchOptions.predicate = predicate - let assets: PHFetchResult = PHAsset.fetchAssets(in: assetCollection, options: fetchOptions) + if tableAccount.autoUploadVideo { + mediaPredicates.append(NSPredicate(format: "mediaType == %i", PHAssetMediaType.video.rawValue)) + } - if selector == NCGlobal.shared.selectorUploadAutoUpload, - let idAssets = self.database.getPhotoLibraryIdAsset(image: tableAccount.autoUploadImage, video: tableAccount.autoUploadVideo, account: account) { - assets.enumerateObjects { asset, _, _ in - var creationDateString = "" - if let creationDate = asset.creationDate { - creationDateString = String(describing: creationDate) - } - let idAsset = account + asset.localIdentifier + creationDateString - if !idAssets.contains(idAsset) { - if (asset.isFavorite && tableAccount.autoUploadFavoritesOnly) || !tableAccount.autoUploadFavoritesOnly { - newAssets.append(asset) - } - } - } + var datePredicates: [NSPredicate] = [] + + if let autoUploadSinceDate = tableAccount.autoUploadSinceDate { + datePredicates.append(NSPredicate(format: "creationDate > %@", autoUploadSinceDate as NSDate)) + } + + if let autoUploadLastUploadedDate = tableAccount.autoUploadLastUploadedDate { + datePredicates.append(NSPredicate(format: "creationDate > %@", autoUploadLastUploadedDate as NSDate)) + } + + // Combine media type predicates with OR (if any exist) + let finalMediaPredicate = mediaPredicates.isEmpty ? nil : NSCompoundPredicate(orPredicateWithSubpredicates: mediaPredicates) + let finalDatePredicate = datePredicates.isEmpty ? nil : NSCompoundPredicate(andPredicateWithSubpredicates: datePredicates) + + var finalPredicate: NSPredicate? + + if let finalMediaPredicate, let finalDatePredicate { + finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [finalMediaPredicate, finalDatePredicate]) + } else if let finalMediaPredicate { + finalPredicate = finalMediaPredicate + } else if let finalDatePredicate { + finalPredicate = finalDatePredicate + } + + fetchOptions.predicate = finalPredicate + + // Add assets into a set to avoid duplicate photos (same photo in multiple albums) + if assetCollections.isEmpty { + let assetCollection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: PHAssetCollectionSubtype.smartAlbumUserLibrary, options: nil) + guard let assetCollection = assetCollection.firstObject else { return completion(nil) } + let allAssets = processAssets(assetCollection, fetchOptions, tableAccount, account) + print(allAssets) + newAssets = OrderedSet(allAssets) + print(newAssets) } else { - assets.enumerateObjects { asset, _, _ in - if (asset.isFavorite && tableAccount.autoUploadFavoritesOnly) || !tableAccount.autoUploadFavoritesOnly { - newAssets.append(asset) - } + var allAssets: [PHAsset] = [] + for assetCollection in assetCollections { + allAssets += processAssets(assetCollection, fetchOptions, tableAccount, account) } + + newAssets = OrderedSet(allAssets) } - completion(newAssets) + + completion(Array(newAssets)) } } } diff --git a/iOSClient/Networking/NCNetworking+Upload.swift b/iOSClient/Networking/NCNetworking+Upload.swift index 6933e76be4..03d651020a 100644 --- a/iOSClient/Networking/NCNetworking+Upload.swift +++ b/iOSClient/Networking/NCNetworking+Upload.swift @@ -44,6 +44,19 @@ extension NCNetworking { NotificationCenter.default.postOnMainThread(name: NextcloudKit.shared.nkCommonInstance.notificationCenterChunkedFileStop.rawValue) } + let metadataCreationDate = metadata.creationDate as Date + + // Update last uploaded date for auto uploaded photos + if database.getTableAccount(account: metadata.account)?.autoUploadLastUploadedDate == nil { + self.database.updateAccountProperty(\.autoUploadLastUploadedDate, value: metadataCreationDate, account: metadata.account) + } else if metadata.sessionSelector == NCGlobal.shared.selectorUploadAutoUpload, + let autoUploadLastUploadedDate = database.getTableAccount(account: metadata.account)?.autoUploadLastUploadedDate { + + if autoUploadLastUploadedDate < metadataCreationDate { + self.database.updateAccountProperty(\.autoUploadLastUploadedDate, value: metadataCreationDate, account: metadata.account) + } + } + if metadata.isDirectoryE2EE { #if !EXTENSION_FILE_PROVIDER_EXTENSION && !EXTENSION_WIDGET Task { diff --git a/iOSClient/Networking/NCNetworking+WebDAV.swift b/iOSClient/Networking/NCNetworking+WebDAV.swift index 9ddf1e24a7..553d05f068 100644 --- a/iOSClient/Networking/NCNetworking+WebDAV.swift +++ b/iOSClient/Networking/NCNetworking+WebDAV.swift @@ -211,68 +211,72 @@ extension NCNetworking { serverUrl: String, overwrite: Bool, withPush: Bool, - metadata: tableMetadata? = nil, sceneIdentifier: String?, session: NCSession.Session, options: NKRequestOptions = NKRequestOptions()) async -> NKError { - let fileName = fileName.trimmingCharacters(in: .whitespacesAndNewlines) - var fileNameFolder = utility.removeForbiddenCharacters(fileName) - - if fileName != fileNameFolder { - let errorDescription = String(format: NSLocalizedString("_forbidden_characters_", comment: ""), self.global.forbiddenCharacters.joined(separator: " ")) - let error = NKError(errorCode: self.global.errorConflict, errorDescription: errorDescription) - return error - } - + var fileNameFolder = utility.removeForbiddenCharacters(fileName.trimmingCharacters(in: .whitespacesAndNewlines)) if !overwrite { fileNameFolder = utilityFileSystem.createFileName(fileNameFolder, serverUrl: serverUrl, account: session.account) } - if fileNameFolder.isEmpty { return .success } - let fileNameFolderUrl = serverUrl + "/" + fileNameFolder - await createFolder(serverUrlFileName: fileNameFolderUrl, account: session.account, options: options) - let results = await readFile(serverUrlFileName: fileNameFolderUrl, account: session.account) - - if let metadata, metadata.status == self.global.metadataStatusWaitCreateFolder { - if results.error == .success { - self.database.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@ AND serverUrl == %@", metadata.account, metadata.fileName, metadata.serverUrl)) - } else { - self.database.setMetadataSession(ocId: metadata.ocId, sessionError: results.error.errorDescription) - } - } - - if results.error == .success, let metadataFolder = results.metadata { - self.database.addMetadata(metadataFolder) - self.database.addDirectory(e2eEncrypted: metadataFolder.e2eEncrypted, - favorite: metadataFolder.favorite, - ocId: metadataFolder.ocId, - fileId: metadataFolder.fileId, - permissions: metadataFolder.permissions, + func writeDirectoryMetadata(_ metadata: tableMetadata) { + self.database.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@ AND serverUrl == %@", session.account, fileName, serverUrl)) + self.database.addMetadata(metadata) + self.database.addDirectory(e2eEncrypted: metadata.e2eEncrypted, + favorite: metadata.favorite, + ocId: metadata.ocId, + fileId: metadata.fileId, + permissions: metadata.permissions, serverUrl: fileNameFolderUrl, account: session.account) - NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterCreateFolder, userInfo: ["ocId": metadataFolder.ocId, "serverUrl": metadataFolder.serverUrl, "account": metadataFolder.account, "withPush": withPush, "sceneIdentifier": sceneIdentifier as Any]) NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl": serverUrl]) + + NotificationCenter.default.postOnMainThread(name: self.global.notificationCenterCreateFolder, userInfo: ["ocId": metadata.ocId, "serverUrl": metadata.serverUrl, "account": metadata.account, "withPush": withPush, "sceneIdentifier": sceneIdentifier as Any]) + } + + /* check exists folder */ + var result = await readFile(serverUrlFileName: fileNameFolderUrl, account: session.account) + + if result.error == .success, + let metadata = result.metadata { + writeDirectoryMetadata(metadata) + return .success } - return results.error + /* create folder */ + await createFolder(serverUrlFileName: fileNameFolderUrl, account: session.account, options: options) + result = await readFile(serverUrlFileName: fileNameFolderUrl, account: session.account) + + if result.error == .success, + let metadata = result.metadata { + writeDirectoryMetadata(metadata) + } else if let metadata = self.database.getMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@ AND serverUrl == %@", session.account, fileName, serverUrl)) { + self.database.setMetadataSession(ocId: metadata.ocId, sessionError: result.error.errorDescription) + } + + return result.error } func createFolder(assets: [PHAsset], useSubFolder: Bool, - selector: String, session: NCSession.Session) { var foldersCreated: [String] = [] func createMetadata(fileName: String, serverUrl: String) { + var metadata = tableMetadata() guard !foldersCreated.contains(serverUrl + "/" + fileName) else { return } - let metadata = NCManageDatabase.shared.createMetadata(fileName: fileName, + + if let result = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", session.account, serverUrl, fileName)) { + metadata = result + } else { + metadata = NCManageDatabase.shared.createMetadata(fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, serverUrl: serverUrl, @@ -281,10 +285,11 @@ extension NCNetworking { directory: true, session: session, sceneIdentifier: nil) + } metadata.status = NCGlobal.shared.metadataStatusWaitCreateFolder - metadata.sessionSelector = selector metadata.sessionDate = Date() + NCManageDatabase.shared.addMetadata(metadata) foldersCreated.append(serverUrl + "/" + fileName) diff --git a/iOSClient/Networking/NCNetworkingProcess.swift b/iOSClient/Networking/NCNetworkingProcess.swift index a1346ad1b8..8f6cabd653 100644 --- a/iOSClient/Networking/NCNetworkingProcess.swift +++ b/iOSClient/Networking/NCNetworkingProcess.swift @@ -124,7 +124,7 @@ class NCNetworkingProcess { let applicationState = await checkApplicationState() let httpMaximumConnectionsPerHostInDownload = NCBrandOptions.shared.httpMaximumConnectionsPerHostInDownload var httpMaximumConnectionsPerHostInUpload = NCBrandOptions.shared.httpMaximumConnectionsPerHostInUpload - let sessionUploadSelectors = [global.selectorUploadFileNODelete, global.selectorUploadFile, global.selectorUploadAutoUpload, global.selectorUploadAutoUploadAll] + let sessionUploadSelectors = [global.selectorUploadFileNODelete, global.selectorUploadFile, global.selectorUploadAutoUpload] let metadatasDownloading = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusDownloading)) let metadatasUploading = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusUploading)) let metadatasUploadError: [tableMetadata] = self.database.getMetadatas(predicate: NSPredicate(format: "status == %d", global.metadataStatusUploadError), sortedByKeyPath: "sessionDate", ascending: true) ?? [] @@ -308,17 +308,7 @@ class NCNetworkingProcess { continue } - /// For Auto Upload check if the folder exists - if metadata.sessionSelector == global.selectorUploadAutoUpload || metadata.sessionSelector == global.selectorUploadAutoUploadAll { - let results = await networking.fileExists(serverUrlFileName: metadata.serverUrl + "/" + metadata.fileName, account: metadata.account) - if let exists = results.exists, exists { - self.database.deleteMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@ AND serverUrl == %@", metadata.account, metadata.fileName, metadata.serverUrl)) - NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["serverUrl": metadata.serverUrl]) - continue - } - } - - let error = await networking.createFolder(fileName: metadata.fileName, serverUrl: metadata.serverUrl, overwrite: true, withPush: false, metadata: metadata, sceneIdentifier: nil, session: NCSession.shared.getSession(account: metadata.account), options: options) + let error = await networking.createFolder(fileName: metadata.fileName, serverUrl: metadata.serverUrl, overwrite: true, withPush: false, sceneIdentifier: nil, session: NCSession.shared.getSession(account: metadata.account), options: options) if error != .success { if metadata.sessionError.isEmpty { let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName diff --git a/iOSClient/Notification/NCNotification.swift b/iOSClient/Notification/NCNotification.swift index dd2c302d2d..1e9cb2aa0b 100644 --- a/iOSClient/Notification/NCNotification.swift +++ b/iOSClient/Notification/NCNotification.swift @@ -43,12 +43,12 @@ class NCNotification: UITableViewController, NCNotificationCellDelegate { super.viewDidLoad() title = NSLocalizedString("_notifications_", comment: "") - view.backgroundColor = .systemBackground + view.backgroundColor = NCBrandColor.shared.appBackgroundColor tableView.tableFooterView = UIView() tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 50.0 - tableView.backgroundColor = .systemBackground + tableView.backgroundColor = NCBrandColor.shared.appBackgroundColor refreshControl?.addTarget(self, action: #selector(getNetwokingNotification), for: .valueChanged) diff --git a/iOSClient/Offline/NCOffline.storyboard b/iOSClient/Offline/NCOffline.storyboard index c069d18610..592cf4cb8e 100644 --- a/iOSClient/Offline/NCOffline.storyboard +++ b/iOSClient/Offline/NCOffline.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -31,18 +31,31 @@ + + + + + + + + + - - + + + + + + diff --git a/iOSClient/Recent/NCRecent.storyboard b/iOSClient/Recent/NCRecent.storyboard index 72c12d2406..3cb92b971d 100644 --- a/iOSClient/Recent/NCRecent.storyboard +++ b/iOSClient/Recent/NCRecent.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -31,18 +31,31 @@ + + + + + + + + - - + + + + + + + diff --git a/iOSClient/Recent/NCRecent.swift b/iOSClient/Recent/NCRecent.swift index e9de1139e3..27cc2872d8 100644 --- a/iOSClient/Recent/NCRecent.swift +++ b/iOSClient/Recent/NCRecent.swift @@ -40,6 +40,11 @@ class NCRecent: NCCollectionViewCommon { // MARK: - View Life Cycle + override func viewDidLoad() { + super.viewDidLoad() + fileActionsHeader?.enableSorting(enable: false) + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) diff --git a/iOSClient/RichWorkspace/NCViewerRichWorkspace.swift b/iOSClient/RichWorkspace/NCViewerRichWorkspace.swift index d48f2293c6..5eb8ca9a06 100644 --- a/iOSClient/RichWorkspace/NCViewerRichWorkspace.swift +++ b/iOSClient/RichWorkspace/NCViewerRichWorkspace.swift @@ -46,7 +46,7 @@ import MarkdownKit override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .systemBackground + view.backgroundColor = NCBrandColor.shared.appBackgroundColor navigationController?.navigationBar.tintColor = NCBrandColor.shared.iconImageColor presentationController?.delegate = self diff --git a/iOSClient/Scan document/NCScan.swift b/iOSClient/Scan document/NCScan.swift index 8565c23779..7ea96342fd 100755 --- a/iOSClient/Scan document/NCScan.swift +++ b/iOSClient/Scan document/NCScan.swift @@ -60,26 +60,26 @@ class NCScan: UIViewController, NCScanCellCellDelegate { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .secondarySystemGroupedBackground + view.backgroundColor = NCBrandColor.shared.formRowBackgroundColor navigationController?.navigationBar.tintColor = NCBrandColor.shared.iconImageColor navigationItem.title = NSLocalizedString("_scanned_images_", comment: "") collectionViewSource.dragInteractionEnabled = true collectionViewSource.dragDelegate = self collectionViewSource.dropDelegate = self - collectionViewSource.backgroundColor = .secondarySystemGroupedBackground + collectionViewSource.backgroundColor = NCBrandColor.shared.formRowBackgroundColor collectionViewDestination.dragInteractionEnabled = true collectionViewDestination.dropDelegate = self collectionViewDestination.dragDelegate = self collectionViewDestination.reorderingCadence = .fast // default value - .immediate - collectionViewDestination.backgroundColor = .secondarySystemGroupedBackground + collectionViewDestination.backgroundColor = NCBrandColor.shared.formRowBackgroundColor cancel.title = NSLocalizedString("_cancel_", comment: "") save.title = NSLocalizedString("_save_", comment: "") labelTitlePDFzone.text = NSLocalizedString("_scan_label_document_zone_", comment: "") - labelTitlePDFzone.backgroundColor = .systemGray6 + labelTitlePDFzone.backgroundColor = NCBrandColor.shared.formBackgroundColor labelTitlePDFzone.textColor = NCBrandColor.shared.textColor segmentControlFilter.setTitle(NSLocalizedString("_filter_document_", comment: ""), forSegmentAt: 0) diff --git a/iOSClient/Scan document/NCUploadScanDocument.swift b/iOSClient/Scan document/NCUploadScanDocument.swift index 28c20fc4ab..32ae575b43 100644 --- a/iOSClient/Scan document/NCUploadScanDocument.swift +++ b/iOSClient/Scan document/NCUploadScanDocument.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 28/12/22. // Copyright © 2022 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -356,7 +357,8 @@ struct UploadScanDocumentView: View { .renderingMode(.template) .resizable() .scaledToFit() - .foregroundColor(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .foregroundColor(Color(.Share.commonIconTint)) + } } .contentShape(Rectangle()) @@ -405,12 +407,15 @@ struct UploadScanDocumentView: View { } HStack { Toggle(NSLocalizedString("_text_recognition_", comment: ""), isOn: $isTextRecognition) - .toggleStyle(SwitchToggleStyle(tint: Color(NCBrandColor.shared.getElement(account: model.session.account)))) + .toggleStyle(SwitchToggleStyle(tint: Color(NCBrandColor.shared.switchColor))) .onChange(of: isTextRecognition) { newValue in NCKeychain().textRecognitionStatus = newValue } } } + .applyGlobalFormSectionStyle() + .listRowSeparator(.hidden) + .complexModifier { view in view.listRowSeparator(.hidden) } @@ -438,10 +443,11 @@ struct UploadScanDocumentView: View { } } } - .buttonStyle(ButtonRounded(disabled: fileName.isEmpty || !footer.isEmpty, account: model.session.account)) + .buttonStyle(.primary) .disabled(fileName.isEmpty || !footer.isEmpty) } } + .applyGlobalFormSectionStyle() Section(header: Text(NSLocalizedString("_quality_image_title_", comment: ""))) { VStack { @@ -455,16 +461,15 @@ struct UploadScanDocumentView: View { PDFKitRepresentedView(quality: $quality, isTextRecognition: $isTextRecognition, uploadScanDocument: model) .frame(maxWidth: .infinity, minHeight: geo.size.height / 2) } - .complexModifier { view in - view.listRowSeparator(.hidden) - } + .applyGlobalFormSectionStyle() + .listRowSeparator(.hidden) } NCHUDView(showHUD: $model.showHUD, textLabel: NSLocalizedString("_wait_", comment: ""), image: "doc.badge.arrow.up", color: NCBrandColor.shared.getElement(account: model.session.account)) .offset(y: model.showHUD ? 5 : -200) .animation(.easeOut, value: model.showHUD) } } - .background(Color(UIColor.systemGroupedBackground)) + .applyGlobalFormStyle() .sheet(isPresented: $isPresentedSelect) { NCSelectViewControllerRepresentable(delegate: model, session: model.session) } diff --git a/iOSClient/SceneDelegate.swift b/iOSClient/SceneDelegate.swift index 0b79499293..1fe97b9915 100644 --- a/iOSClient/SceneDelegate.swift +++ b/iOSClient/SceneDelegate.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 25/03/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -34,12 +35,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { private var privacyProtectionWindow: UIWindow? private var isFirstScene: Bool = true private let database = NCManageDatabase.shared + + let sceneIdentifier: String = UUID().uuidString func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene), let appDelegate else { return } self.window = UIWindow(windowScene: windowScene) + setupUIAppearance() if !NCKeychain().appearanceAutomatic { self.window?.overrideUserInterfaceStyle = NCKeychain().appearanceInterfaceStyle } @@ -91,6 +95,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } } + private func setupUIAppearance() { + NCMainTabBar.setupAppearance() + } + func sceneDidDisconnect(_ scene: UIScene) { print("[DEBUG] Scene did disconnect") } @@ -110,6 +118,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { hidePrivacyProtectionWindow() if let window = SceneManager.shared.getWindow(scene: scene), let controller = SceneManager.shared.getController(scene: scene) { window.rootViewController = controller + + DataProtectionAgreementManager.shared.showAgreement(viewController: controller) + if NCKeychain().presentPasscode { NCPasscode.shared.presentPasscode(viewController: controller, delegate: self) { NCPasscode.shared.enableTouchFaceID() @@ -180,7 +191,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { return } - if tableAccount.autoUpload { + if tableAccount.autoUploadStart { NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Auto upload: true") if UIApplication.shared.backgroundRefreshStatus == .available { NextcloudKit.shared.nkCommonInstance.writeLog("[INFO] Auto upload in background: true") @@ -212,7 +223,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { guard let controller = SceneManager.shared.getController(scene: scene), - let url = URLContexts.first?.url else { return } + let url = URLContexts.first?.url, + let sceneIdentifier = controller.sceneIdentifier else { return } + let scheme = url.scheme let action = url.host @@ -336,7 +349,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { serverUrl = tableAccount.urlBase + "/" + davFiles } - NCActionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName, sceneIdentifier: controller.sceneIdentifier) + NCActionCenter.shared.openFileViewInFolder(serverUrl: serverUrl, fileNameBlink: nil, fileNameOpen: fileName, sceneIdentifier: sceneIdentifier) } } @@ -469,7 +482,10 @@ final class SceneManager: @unchecked Sendable { func getSceneIdentifier() -> [String] { var results: [String] = [] for controller in sceneController.keys { - results.append(controller.sceneIdentifier) + guard let sceneIdentifier = controller.sceneIdentifier else { + continue + } + results.append(sceneIdentifier) } return results } diff --git a/iOSClient/Select/NCSelect.swift b/iOSClient/Select/NCSelect.swift index 2fde6613ce..9ddbe93793 100644 --- a/iOSClient/Select/NCSelect.swift +++ b/iOSClient/Select/NCSelect.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 06/11/2018. // Copyright © 2018 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -79,7 +80,7 @@ class NCSelect: UIViewController, UIGestureRecognizerDelegate, UIAdaptivePresent navigationController?.setNavigationBarAppearance() navigationController?.navigationBar.prefersLargeTitles = true - view.backgroundColor = .systemBackground + view.backgroundColor = NCBrandColor.shared.appBackgroundColor collectionView.backgroundColor = .systemBackground selectCommandViewSelect?.separatorView.backgroundColor = .separator @@ -95,9 +96,10 @@ class NCSelect: UIViewController, UIGestureRecognizerDelegate, UIAdaptivePresent // Footer collectionView.register(UINib(nibName: "NCSectionFooter", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "sectionFooter") collectionView.alwaysBounceVertical = true - collectionView.backgroundColor = .systemBackground + collectionView.backgroundColor = NCBrandColor.shared.appBackgroundColor buttonCancel.title = NSLocalizedString("_cancel_", comment: "") + buttonCancel.tintColor = UIColor(named: "SelectToolbar/CancelTint") bottomContraint?.constant = UIApplication.shared.firstWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0 // Type of command view @@ -109,7 +111,6 @@ class NCSelect: UIViewController, UIGestureRecognizerDelegate, UIAdaptivePresent } self.view.addSubview(selectCommandViewSelect!) - selectCommandViewSelect?.setColor(account: session.account) selectCommandViewSelect?.selectView = self selectCommandViewSelect?.translatesAutoresizingMaskIntoConstraints = false @@ -125,7 +126,6 @@ class NCSelect: UIViewController, UIGestureRecognizerDelegate, UIAdaptivePresent selectCommandViewSelect = Bundle.main.loadNibNamed("NCSelectCommandViewCopyMove", owner: self, options: nil)?.first as? NCSelectCommandView self.view.addSubview(selectCommandViewSelect!) - selectCommandViewSelect?.setColor(account: session.account) selectCommandViewSelect?.selectView = self selectCommandViewSelect?.translatesAutoresizingMaskIntoConstraints = false if items.contains(where: { $0.lock }) { @@ -345,11 +345,11 @@ extension NCSelect: UICollectionViewDataSource { if metadata.e2eEncrypted { cell.imageItem.image = NCImageCache.shared.getFolderEncrypted(account: metadata.account) } else if isShare { - cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe(account: metadata.account) + cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe() } else if !metadata.shareType.isEmpty { metadata.shareType.contains(3) ? (cell.imageItem.image = NCImageCache.shared.getFolderPublic(account: metadata.account)) : - (cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe(account: metadata.account)) + (cell.imageItem.image = NCImageCache.shared.getFolderSharedWithMe()) } else if metadata.mountType == "group" { cell.imageItem.image = NCImageCache.shared.getFolderGroup(account: metadata.account) } else if isMounted { @@ -377,7 +377,7 @@ extension NCSelect: UICollectionViewDataSource { // image Favorite if metadata.favorite { - cell.imageFavorite.image = NCImageCache.shared.getImageFavorite() + cell.imageFavorite.image = UIImage(resource: .FileFolderCell.star) } cell.imageSelect.isHidden = true @@ -510,60 +510,33 @@ extension NCSelect { class NCSelectCommandView: UIView { @IBOutlet weak var separatorView: UIView! - @IBOutlet weak var createFolderButton: UIButton? - @IBOutlet weak var selectButton: UIButton? - @IBOutlet weak var copyButton: UIButton? - @IBOutlet weak var moveButton: UIButton? + @IBOutlet weak var createFolderButton: PrimaryButton? + @IBOutlet weak var selectButton: PrimaryButton? + @IBOutlet weak var copyButton: PrimaryButton? + @IBOutlet weak var moveButton: PrimaryButton? @IBOutlet weak var overwriteSwitch: UISwitch? @IBOutlet weak var overwriteLabel: UILabel? @IBOutlet weak var separatorHeightConstraint: NSLayoutConstraint! var selectView: NCSelect? - private let gradient: CAGradientLayer = CAGradientLayer() override func awakeFromNib() { + super.awakeFromNib() separatorHeightConstraint.constant = 0.5 separatorView.backgroundColor = .separator overwriteLabel?.text = NSLocalizedString("_overwrite_", comment: "") - selectButton?.layer.cornerRadius = 15 - selectButton?.layer.masksToBounds = true - selectButton?.setTitle(NSLocalizedString("_select_", comment: ""), for: .normal) - - createFolderButton?.layer.cornerRadius = 15 - createFolderButton?.layer.masksToBounds = true - createFolderButton?.setTitle(NSLocalizedString("_create_folder_", comment: ""), for: .normal) - - copyButton?.layer.cornerRadius = 15 - copyButton?.layer.masksToBounds = true - copyButton?.setTitle(NSLocalizedString("_copy_", comment: ""), for: .normal) - - moveButton?.layer.cornerRadius = 15 - moveButton?.layer.masksToBounds = true - moveButton?.setTitle(NSLocalizedString("_move_", comment: ""), for: .normal) - } - - func setColor(account: String) { - overwriteSwitch?.onTintColor = NCBrandColor.shared.getElement(account: account) - - selectButton?.backgroundColor = NCBrandColor.shared.getElement(account: account) - selectButton?.setTitleColor(UIColor(white: 1, alpha: 0.3), for: .highlighted) - selectButton?.setTitleColor(.white, for: .normal) - - createFolderButton?.backgroundColor = NCBrandColor.shared.getElement(account: account) - createFolderButton?.setTitleColor(UIColor(white: 1, alpha: 0.3), for: .highlighted) - createFolderButton?.setTitleColor(NCBrandColor.shared.getText(account: account), for: .normal) - - copyButton?.backgroundColor = NCBrandColor.shared.getElement(account: account) - copyButton?.setTitleColor(UIColor(white: 1, alpha: 0.3), for: .highlighted) - copyButton?.setTitleColor(NCBrandColor.shared.getText(account: account), for: .normal) - - moveButton?.backgroundColor = NCBrandColor.shared.getElement(account: account) - moveButton?.setTitleColor(UIColor(white: 1, alpha: 0.3), for: .highlighted) - moveButton?.setTitleColor(NCBrandColor.shared.getText(account: account), for: .normal) + setupButton(button: selectButton, titleKey: "_select_") + setupButton(button: createFolderButton, titleKey: "_create_folder_") + setupButton(button: copyButton, titleKey: "_copy_") + setupButton(button: moveButton, titleKey: "_move_") } + private func setupButton(button: UIButton?, titleKey: String) { + button?.setTitle(NSLocalizedString(titleKey, comment: ""), for: .normal) + } + @IBAction func createFolderButtonPressed(_ sender: UIButton) { selectView?.createFolderButtonPressed(sender) } @@ -611,7 +584,7 @@ struct NCSelectViewControllerRepresentable: UIViewControllerRepresentable { struct SelectView: UIViewControllerRepresentable { @Binding var serverUrl: String - var session: NCSession.Session! + var session: NCSession.Session class Coordinator: NSObject, NCSelectDelegate { var parent: SelectView diff --git a/iOSClient/Select/NCSelectCommandViewCopyMove.xib b/iOSClient/Select/NCSelectCommandViewCopyMove.xib index ddf3475d85..f448e297d2 100644 --- a/iOSClient/Select/NCSelectCommandViewCopyMove.xib +++ b/iOSClient/Select/NCSelectCommandViewCopyMove.xib @@ -1,9 +1,10 @@ - - + + - + + @@ -12,18 +13,18 @@ - + - + - + @@ -32,7 +33,7 @@ - - - - + @@ -103,7 +104,7 @@ - + @@ -125,17 +126,14 @@ - - - + + + + + + - - - - - - - + diff --git a/iOSClient/Select/NCSelectCommandViewSelect+CreateFolder.xib b/iOSClient/Select/NCSelectCommandViewSelect+CreateFolder.xib index bd1453a63a..f40f08c552 100644 --- a/iOSClient/Select/NCSelectCommandViewSelect+CreateFolder.xib +++ b/iOSClient/Select/NCSelectCommandViewSelect+CreateFolder.xib @@ -1,9 +1,10 @@ - - + + - + + @@ -12,41 +13,43 @@ - + - - + - - + @@ -74,17 +77,14 @@ - - - + + + + + + - - - - - - - + diff --git a/iOSClient/Select/NCSelectCommandViewSelect.xib b/iOSClient/Select/NCSelectCommandViewSelect.xib index 255f461331..c2297af1e2 100644 --- a/iOSClient/Select/NCSelectCommandViewSelect.xib +++ b/iOSClient/Select/NCSelectCommandViewSelect.xib @@ -1,9 +1,10 @@ - - + + - + + @@ -12,26 +13,25 @@ - + - - + @@ -39,7 +39,7 @@ - + @@ -56,17 +56,14 @@ - - - + + + + + + - - - - - - - + diff --git a/iOSClient/Settings/Advanced/File Name/NCFileNameView.swift b/iOSClient/Settings/Advanced/File Name/NCFileNameView.swift index 3e6bc65a74..e9590fb234 100644 --- a/iOSClient/Settings/Advanced/File Name/NCFileNameView.swift +++ b/iOSClient/Settings/Advanced/File Name/NCFileNameView.swift @@ -33,7 +33,7 @@ struct NCFileNameView: View { /// Toggle(NSLocalizedString("_maintain_original_filename_", comment: ""), isOn: $model.maintainFilenameOriginal) .font(.system(size: 16)) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.maintainFilenameOriginal, perform: { newValue in model.toggleMaintainFilenameOriginal(newValue: newValue) model.getFileName() @@ -42,13 +42,13 @@ struct NCFileNameView: View { if !model.maintainFilenameOriginal { Toggle(NSLocalizedString("_add_filenametype_", comment: ""), isOn: $model.addFileNameType) .font(.system(size: 16)) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.addFileNameType, perform: { newValue in model.toggleAddFilenameType(newValue: newValue) model.getFileName() }) } - } + }.applyGlobalFormSectionStyle() .transition(.slide) .animation(.easeInOut, value: model.maintainFilenameOriginal) @@ -58,6 +58,7 @@ struct NCFileNameView: View { } .navigationBarTitle(NSLocalizedString("_mode_filename_", comment: "")) .defaultViewModifier(model) + .applyGlobalFormStyle() .padding(.top, 0) .transition(.slide) } @@ -85,19 +86,19 @@ struct NCFileNameView: View { .font(.system(size: 16)) .foregroundColor(Color(UIColor.lightGray)) }, header: { - Text(NSLocalizedString("_filename_", comment: "")) + Text(NSLocalizedString("_filename_", comment: "")).listRowBackground(Color.clear) }, footer: { - Text(String(format: NSLocalizedString("_preview_filename_", comment: ""), "MM, MMM, DD, YY, YYYY, HH, hh, mm, ss, ampm")) - }) + Text(String(format: NSLocalizedString("_preview_filename_", comment: ""), "MM, MMM, DD, YY, YYYY, HH, hh, mm, ss, ampm")).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() } else { Section(content: { Text("IMG_0001.JPG") .foregroundColor(Color(UIColor.lightGray)) }, header: { - Text(NSLocalizedString("_filename_", comment: "")) + Text(NSLocalizedString("_filename_", comment: "")).listRowBackground(Color.clear) }, footer: { - Text(NSLocalizedString("_default_preview_filename_footer_", comment: "")) - }) + Text(NSLocalizedString("_default_preview_filename_footer_", comment: "")).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() } } diff --git a/iOSClient/Settings/Advanced/NCSettingsAdvancedModel.swift b/iOSClient/Settings/Advanced/NCSettingsAdvancedModel.swift index 104e9ebbcd..dc5de01c00 100644 --- a/iOSClient/Settings/Advanced/NCSettingsAdvancedModel.swift +++ b/iOSClient/Settings/Advanced/NCSettingsAdvancedModel.swift @@ -5,6 +5,7 @@ // Created by Aditya Tyagi on 08/03/24. // Created by Marino Faggiana on 30/05/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Aditya Tyagi // @@ -149,8 +150,6 @@ class NCSettingsAdvancedModel: ObservableObject, ViewOnAppearHandling { ufs.removeTemporaryDirectory() ufs.createDirectoryStandard() - NCAutoUpload.shared.alignPhotoLibrary(controller: self.controller, account: self.session.account) - NCActivityIndicator.shared.stop() self.calculateSize() @@ -194,7 +193,8 @@ class NCSettingsAdvancedModel: ObservableObject, ViewOnAppearHandling { // Instantiate NCViewerQuickLook with the log file URL, editing disabled, and no metadata let viewerQuickLook = NCViewerQuickLook(with: NSURL(fileURLWithPath: NextcloudKit.shared.nkCommonInstance.filenamePathLog) as URL, isEditingEnabled: false, metadata: nil) // Present the NCViewerQuickLook view controller - controller?.present(viewerQuickLook, animated: true, completion: nil) + let topController = controller?.presentedViewController ?? controller + topController?.present(viewerQuickLook, animated: true, completion: nil) } /// Clears the log file. diff --git a/iOSClient/Settings/Advanced/NCSettingsAdvancedView.swift b/iOSClient/Settings/Advanced/NCSettingsAdvancedView.swift index 29db4e4760..236d1be7ec 100644 --- a/iOSClient/Settings/Advanced/NCSettingsAdvancedView.swift +++ b/iOSClient/Settings/Advanced/NCSettingsAdvancedView.swift @@ -5,6 +5,7 @@ // Created by Aditya Tyagi on 08/03/24. // Created by Marino Faggiana on 30/05/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Aditya Tyagi // @@ -38,42 +39,37 @@ struct NCSettingsAdvancedView: View { /// Show Hidden Files Section(content: { Toggle(NSLocalizedString("_show_hidden_files_", comment: ""), isOn: $model.showHiddenFiles) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.showHiddenFiles) { _ in model.updateShowHiddenFiles() } - }) + }).applyGlobalFormSectionStyle() /// file name Section(content: { NavigationLink(destination: LazyView { NCFileNameView(model: NCFileNameModel(controller: model.controller)) }) { Text(NSLocalizedString("_filenamemask_", comment: "")) + .font(.system(size: 16)) } }, footer: { - Text(fileNameMaskFooter) - }) + Text(NSLocalizedString("_filenamemask_footer_", comment: "")).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() /// Most Compatible & Enable Live Photo Section(content: { Toggle(NSLocalizedString("_format_compatibility_", comment: ""), isOn: $model.mostCompatible) .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) .onChange(of: model.mostCompatible) { _ in model.updateMostCompatible() - } - }, footer: { - Text(NSLocalizedString("_format_compatibility_footer_", comment: "")) - }) - - Section(content: { + } + .font(.system(size: 16)) Toggle(NSLocalizedString("_upload_mov_livephoto_", comment: ""), isOn: $model.livePhoto) .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) .onChange(of: model.livePhoto) { _ in model.updateLivePhoto() - } - }, footer: { - Text(NSLocalizedString("_upload_mov_livephoto_footer_", comment: "")) - }) - + } + .font(.system(size: 16)) + }).applyGlobalFormSectionStyle() /// Remove from Camera Roll Section(content: { Toggle(NSLocalizedString("_remove_photo_CameraRoll_", comment: ""), isOn: $model.removeFromCameraRoll) @@ -81,26 +77,25 @@ struct NCSettingsAdvancedView: View { .onChange(of: model.removeFromCameraRoll) { _ in model.updateRemoveFromCameraRoll() } - }, footer: { - Text(NSLocalizedString("_remove_photo_CameraRoll_desc_", comment: "")) - }) + .font(.system(size: 16)) + }).applyGlobalFormSectionStyle() /// Section : Files App if !NCBrandOptions.shared.disable_openin_file { Section(content: { Toggle(NSLocalizedString("_disable_files_app_", comment: ""), isOn: $model.appIntegration) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.appIntegration) { _ in model.updateAppIntegration() } }, footer: { Text(NSLocalizedString("_disable_files_app_footer_", comment: "")) - }) + }).applyGlobalFormSectionStyle() } /// Section: Privacy if !NCBrandOptions.shared.disable_crash_service { Section(content: { Toggle(NSLocalizedString("_crashservice_title_", comment: ""), isOn: $model.crashReporter) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.crashReporter) { _ in model.updateCrashReporter() showCrashReporter.toggle() @@ -114,9 +109,7 @@ struct NCSettingsAdvancedView: View { }) }, header: { Text(NSLocalizedString("_privacy_", comment: "")) - }, footer: { - Text(NSLocalizedString("_privacy_footer_", comment: "")) - }) + }).applyGlobalFormSectionStyle() } /// Section: Diagnostic LOG if !NCBrandOptions.shared.disable_log { @@ -126,10 +119,10 @@ struct NCSettingsAdvancedView: View { model.viewLogFile() }, label: { HStack { - Image(systemName: "doc.badge.gearshape") + Image(.Settings.folderGear) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 20, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_view_log_", comment: "")) } @@ -149,10 +142,10 @@ struct NCSettingsAdvancedView: View { model.clearLogFile() }, label: { HStack { - Image(systemName: "xmark") + Image(.Settings.xmark) .resizable() .scaledToFit() - .frame(width: 25, height: 15) + .frame(width: 15, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_clear_log_", comment: "")) } @@ -162,10 +155,8 @@ struct NCSettingsAdvancedView: View { Button(NSLocalizedString("OK", comment: ""), role: .cancel) { } } }, header: { - Text(NSLocalizedString("_diagnostics_", comment: "")) - }, footer: { - Text(NSLocalizedString("_diagnostics_footer_", comment: "")) - }) + Text(NSLocalizedString("_diagnostics_", comment: "")).listRowBackground(Color.clear) + }, footer: { }).applyGlobalFormSectionStyle() /// Set Log Level() & Capabilities if model.isAdminGroup { Section(content: { @@ -173,19 +164,19 @@ struct NCSettingsAdvancedView: View { NCCapabilitiesView(model: NCCapabilitiesModel(controller: model.controller)) }) { HStack { - Image(systemName: "list.bullet") + Image(.Settings.bulletlist) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 20, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_capabilities_", comment: "")) } } }, header: { - Text(NSLocalizedString("_capabilities_", comment: "")) + Text(NSLocalizedString("_capabilities_", comment: "")).listRowBackground(Color.clear) }, footer: { - Text(NSLocalizedString("_capabilities_footer_", comment: "")) - }) + Text(NSLocalizedString("_capabilities_footer_", comment: "")).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() } } /// Delete in Cache & Clear Cache @@ -203,10 +194,10 @@ struct NCSettingsAdvancedView: View { showCacheAlert.toggle() }, label: { HStack { - Image(systemName: "xmark") + Image(.Settings.xmark) .resizable() .scaledToFit() - .frame(width: 15, height: 15) + .frame(width: 15, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_clear_cache_", comment: "")) } @@ -219,25 +210,27 @@ struct NCSettingsAdvancedView: View { Button(NSLocalizedString("_cancel_", comment: ""), role: .cancel) { } } }, header: { - Text(NSLocalizedString("_delete_files_desc_", comment: "")) + Text(NSLocalizedString("_delete_files_desc_", comment: "")).listRowBackground(Color.clear) }, footer: { Text(model.footerTitle) - .multilineTextAlignment(.leading) - }) + .font(.system(size: 12)) + .multilineTextAlignment(.leading).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() /// Reset Application Section(content: { Button(action: { showExitAlert.toggle() }, label: { HStack { - Image(systemName: "xmark") + Image(.Settings.xmark) .resizable() .scaledToFit() - .frame(width: 15, height: 15) - .foregroundColor(Color(UIColor.systemRed)) + .frame(width: 15, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_exit_", comment: "")) - .foregroundColor(Color(UIColor.systemRed)) + .foregroundColor(Color(UIColor(resource: .destructiveAction))) } + .font(.system(size: 16)) }) .tint(Color(UIColor.label)) .alert(NSLocalizedString("_want_exit_", comment: ""), isPresented: $showExitAlert) { @@ -252,11 +245,15 @@ struct NCSettingsAdvancedView: View { + Text("\n\n") ) - }) + .font(.system(size: 12)) + .listRowBackground(Color.clear) + .multilineTextAlignment(.leading) + }).applyGlobalFormSectionStyle() } .navigationBarTitle(NSLocalizedString("_advanced_", comment: "")) .navigationBarTitleDisplayMode(.inline) .defaultViewModifier(model) + .applyGlobalFormStyle() } private var fileNameMaskFooter: AttributedString { diff --git a/iOSClient/Settings/AutoUpload/Albums.swift b/iOSClient/Settings/AutoUpload/Albums.swift new file mode 100644 index 0000000000..a549d29e0b --- /dev/null +++ b/iOSClient/Settings/AutoUpload/Albums.swift @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: Nextcloud GmbH +// SPDX-FileCopyrightText: 2025 Milen Pivchev +// SPDX-License-Identifier: GPL-3.0-or-later + +import Photos + +class Albums: ObservableObject { + @Published var smartAlbums: [PHAssetCollection] = [] +} diff --git a/iOSClient/Settings/AutoUpload/NCAutoUploadModel.swift b/iOSClient/Settings/AutoUpload/NCAutoUploadModel.swift index cafc33c728..e0212afecd 100644 --- a/iOSClient/Settings/AutoUpload/NCAutoUploadModel.swift +++ b/iOSClient/Settings/AutoUpload/NCAutoUploadModel.swift @@ -27,12 +27,14 @@ import UIKit import Photos import NextcloudKit +enum AutoUploadTimespan: String, CaseIterable, Identifiable { + case allPhotos = "_all_photos_" + case newPhotosOnly = "_new_photos_only_" + var id: Self { self } +} + /// A model that allows the user to configure the `auto upload settings for Nextcloud` class NCAutoUploadModel: ObservableObject, ViewOnAppearHandling { - /// A state variable that indicates whether auto upload is enabled or not - @Published var autoUpload: Bool = false - /// A state variable that indicates whether to open NCSelect View or not - @Published var autoUploadFolder: Bool = false /// A state variable that indicates whether auto upload for photos is enabled or not @Published var autoUploadImage: Bool = false /// A state variable that indicates whether auto upload for photos is restricted to Wi-Fi only or not @@ -41,14 +43,21 @@ class NCAutoUploadModel: ObservableObject, ViewOnAppearHandling { @Published var autoUploadVideo: Bool = false /// A state variable that indicates whether auto upload for videos is enabled or not @Published var autoUploadWWAnVideo: Bool = false - /// A state variable that indicates whether only assets marked as favorites should be uploaded - @Published var autoUploadFavoritesOnly: Bool = false - /// A state variable that indicates whether auto upload for full resolution photos is enabled or not - @Published var autoUploadFull: Bool = false + /// A state variable that indicates whether auto upload is enabled or not + @Published var autoUploadStart: Bool = false /// A state variable that indicates whether auto upload creates subfolders based on date or not @Published var autoUploadCreateSubfolder: Bool = false /// A state variable that indicates the granularity of the subfolders, either daily, monthly, or yearly @Published var autoUploadSubfolderGranularity: Granularity = .monthly + /// A state variable that indicates the date from when new photos/videos will be uploaded. + @Published var autoUploadSinceDate: Date? + /// A state variable that indicates from whether new photos only or all photos will be uploaded. + @Published var autoUploadNewPhotosOnly: Bool = false + /// A state variable that indicates whether a warning should be shown if all photos must be uploaded. + @Published var showUploadAllPhotosWarning = false + /// A state variable that indicates whether Photos permissions have been granted or not. + @Published var photosPermissionsGranted = true + /// A state variable that shows error in view in case of an error @Published var showErrorAlert: Bool = false @Published var sectionName = "" @@ -57,6 +66,7 @@ class NCAutoUploadModel: ObservableObject, ViewOnAppearHandling { @Published var error: String = "" let database = NCManageDatabase.shared @Published var autoUploadPath = "\(NCManageDatabase.shared.getAccountAutoUploadFileName())" + /// Root View Controller var controller: NCMainTabBarController? /// A variable user for change the auto upload directory @@ -69,125 +79,99 @@ class NCAutoUploadModel: ObservableObject, ViewOnAppearHandling { /// Initialization code to set up the ViewModel with the active account init(controller: NCMainTabBarController?) { self.controller = controller - onViewAppear() } /// Triggered when the view appears. func onViewAppear() { if let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)) { - autoUpload = tableAccount.autoUpload autoUploadImage = tableAccount.autoUploadImage autoUploadWWAnPhoto = tableAccount.autoUploadWWAnPhoto autoUploadVideo = tableAccount.autoUploadVideo autoUploadWWAnVideo = tableAccount.autoUploadWWAnVideo - autoUploadFavoritesOnly = tableAccount.autoUploadFavoritesOnly - autoUploadFull = tableAccount.autoUploadFull + autoUploadStart = tableAccount.autoUploadStart autoUploadCreateSubfolder = tableAccount.autoUploadCreateSubfolder autoUploadSubfolderGranularity = Granularity(rawValue: tableAccount.autoUploadSubfolderGranularity) ?? .monthly + autoUploadSinceDate = tableAccount.autoUploadSinceDate + autoUploadNewPhotosOnly = tableAccount.autoUploadSinceDate != nil ? true : false } + serverUrl = NCUtilityFileSystem().getHomeServer(session: session) - if autoUpload { - requestAuthorization { value in - self.autoUpload = value - self.updateAccountProperty(\.autoUpload, value: value) - } - } + + requestAuthorization() + + if !autoUploadImage && !autoUploadVideo { autoUploadImage = true } } // MARK: - All functions - func requestAuthorization(completion: @escaping (Bool) -> Void = { _ in }) { + func requestAuthorization() { PHPhotoLibrary.requestAuthorization { status in - DispatchQueue.main.async { + DispatchQueue.main.async { [self] in let value = (status == .authorized) - if !value { - let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: NSLocalizedString("_access_photo_not_enabled_msg_", comment: ""), responseData: nil) - NCContentPresenter().messageNotification("_error_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .error) - } else if UIApplication.shared.backgroundRefreshStatus != .available { + photosPermissionsGranted = value + + if value, UIApplication.shared.backgroundRefreshStatus != .available { let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: NSLocalizedString("_access_background_app_refresh_denied_", comment: ""), responseData: nil) NCContentPresenter().messageNotification("_info_", error: error, delay: NCGlobal.shared.dismissAfterSecond, type: .info) } - completion(value) - } - } - } - - /// Updates the auto-upload setting. - func handleAutoUploadChange(newValue: Bool) { - if newValue { - requestAuthorization { value in - self.autoUpload = value - self.updateAccountProperty(\.autoUpload, value: value) - self.database.setAccountAutoUploadFileName("") - self.database.setAccountAutoUploadDirectory("", session: self.session) - NCAutoUpload.shared.alignPhotoLibrary(controller: self.controller, account: self.session.account) } - } else { - updateAccountProperty(\.autoUpload, value: newValue) - updateAccountProperty(\.autoUploadFull, value: newValue) - self.database.clearMetadatasUpload(account: session.account) } } /// Updates the auto-upload image setting. func handleAutoUploadImageChange(newValue: Bool) { - updateAccountProperty(\.autoUploadImage, value: newValue) - if newValue { - NCAutoUpload.shared.alignPhotoLibrary(controller: controller, account: session.account) - } + database.updateAccountProperty(\.autoUploadImage, value: newValue, account: session.account) } /// Updates the auto-upload image over WWAN setting. func handleAutoUploadWWAnPhotoChange(newValue: Bool) { - updateAccountProperty(\.autoUploadWWAnPhoto, value: newValue) + database.updateAccountProperty(\.autoUploadWWAnPhoto, value: newValue, account: session.account) } /// Updates the auto-upload video setting. func handleAutoUploadVideoChange(newValue: Bool) { - updateAccountProperty(\.autoUploadVideo, value: newValue) - if newValue { - NCAutoUpload.shared.alignPhotoLibrary(controller: controller, account: session.account) - } + database.updateAccountProperty(\.autoUploadVideo, value: newValue, account: session.account) } /// Updates the auto-upload video over WWAN setting. func handleAutoUploadWWAnVideoChange(newValue: Bool) { - updateAccountProperty(\.autoUploadWWAnVideo, value: newValue) + database.updateAccountProperty(\.autoUploadWWAnVideo, value: newValue, account: session.account) } - /// Updates the auto-upload favorite only. - func handleAutoUploadFavoritesOnlyChange(newValue: Bool) { - updateAccountProperty(\.autoUploadFavoritesOnly, value: newValue) - if newValue { - NCAutoUpload.shared.alignPhotoLibrary(controller: controller, account: session.account) - } + func handleAutoUploadNewPhotosOnly(newValue: Bool) { + let date = newValue ? Date.now : nil + autoUploadSinceDate = date + database.updateAccountProperty(\.autoUploadSinceDate, value: date, account: session.account) } /// Updates the auto-upload full content setting. - func handleAutoUploadFullChange(newValue: Bool) { - updateAccountProperty(\.autoUploadFull, value: newValue) + func handleAutoUploadChange(newValue: Bool, assetCollections: [PHAssetCollection]) { + if let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)), tableAccount.autoUploadStart == newValue { return } + + database.updateAccountProperty(\.autoUploadStart, value: newValue, account: session.account) + if newValue { - NCAutoUpload.shared.autoUploadFullPhotos(controller: self.controller, log: "Auto upload full", account: session.account) + NCAutoUpload.shared.autoUploadSelectedAlbums(controller: self.controller, assetCollections: assetCollections, log: "Auto upload selected albums", account: session.account) } else { - self.database.clearMetadatasUpload(account: session.account) + database.clearMetadatasUpload(account: session.account) } } /// Updates the auto-upload create subfolder setting. func handleAutoUploadCreateSubfolderChange(newValue: Bool) { - updateAccountProperty(\.autoUploadCreateSubfolder, value: newValue) + database.updateAccountProperty(\.autoUploadCreateSubfolder, value: newValue, account: session.account) } /// Updates the auto-upload subfolder granularity setting. func handleAutoUploadSubfolderGranularityChange(newValue: Granularity) { - updateAccountProperty(\.autoUploadSubfolderGranularity, value: newValue.rawValue) + database.updateAccountProperty(\.autoUploadSubfolderGranularity, value: newValue.rawValue, account: session.account) } - /// Updates a property of the active account in the database. - private func updateAccountProperty(_ keyPath: ReferenceWritableKeyPath, value: T) { - guard let activeAccount = self.database.getActiveTableAccount() else { return } - activeAccount[keyPath: keyPath] = value - self.database.updateAccount(activeAccount) + func resetAutoUploadLastUploadedDate() { + guard let activeAccount = database.getTableAccount(account: session.account) else { return } +// activeAccount[keyPath: keyPath] = value + activeAccount.autoUploadLastUploadedDate = nil + database.updateAccount(activeAccount) } /// Returns the path for auto-upload based on the active account's settings. @@ -214,8 +198,18 @@ class NCAutoUploadModel: ObservableObject, ViewOnAppearHandling { self.database.setAccountAutoUploadDirectory(path, session: session) } } + onViewAppear() } + + func createAlbumTitle(autoUploadAlbumIds: Set) -> String { + if autoUploadAlbumIds.count == 1 { + let album = PHAssetCollection.allAlbums.first(where: { autoUploadAlbumIds.first == $0.localIdentifier }) + return (album?.assetCollectionSubtype == .smartAlbumUserLibrary) ? NSLocalizedString("_camera_roll_", comment: "") : (album?.localizedTitle ?? "") + } else { + return NSLocalizedString("_multiple_albums_", comment: "") + } + } } /// An enum that represents the granularity of the subfolders for auto upload diff --git a/iOSClient/Settings/AutoUpload/NCAutoUploadView.swift b/iOSClient/Settings/AutoUpload/NCAutoUploadView.swift index 642a515d70..e736c86dbd 100644 --- a/iOSClient/Settings/AutoUpload/NCAutoUploadView.swift +++ b/iOSClient/Settings/AutoUpload/NCAutoUploadView.swift @@ -5,6 +5,7 @@ // Created by Aditya Tyagi on 06/03/24. // Created by Marino Faggiana on 30/05/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Aditya Tyagi // @@ -27,136 +28,232 @@ import UIKit /// A view that allows the user to configure the `auto upload settings for Nextcloud` struct NCAutoUploadView: View { - @ObservedObject var model: NCAutoUploadModel + @StateObject var model: NCAutoUploadModel + @StateObject var albumModel: AlbumModel + @State private var showUploadFolder = false + @State private var showSelectAlbums = false + @State private var showUploadAllPhotosWarning = false + @State private var startAutoUpload = false var body: some View { - Form { - /// Auto Upload - Section(content: { - Toggle(NSLocalizedString("_autoupload_", comment: ""), isOn: $model.autoUpload) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUpload) { newValue in - model.handleAutoUploadChange(newValue: newValue) - } - .font(.system(size: 16)) - }, footer: { - Text(NSLocalizedString("_autoupload_notice_", comment: "")) - }) - /// If `autoUpload` state will be true, we will animate out the whole `autoUploadOnView` section - if model.autoUpload { + ZStack { + if model.photosPermissionsGranted { autoUploadOnView - .transition(.slide) - .animation(.easeInOut, value: model.autoUpload) + } else { + noPermissionsView } } .navigationBarTitle(NSLocalizedString("_auto_upload_folder_", comment: "")) - .defaultViewModifier(model) + .navigationBarTitleDisplayMode(.inline) + .onAppear { + model.onViewAppear() + } .alert(model.error, isPresented: $model.showErrorAlert) { Button(NSLocalizedString("_ok_", comment: ""), role: .cancel) { } } - .sheet(isPresented: $model.autoUploadFolder) { + .sheet(isPresented: $showUploadFolder) { SelectView(serverUrl: $model.serverUrl, session: model.session) - .onDisappear { - model.setAutoUploadDirectory(serverUrl: model.serverUrl) - } + .onDisappear { + model.setAutoUploadDirectory(serverUrl: model.serverUrl) + model.resetAutoUploadLastUploadedDate() + } } + .sheet(isPresented: $showSelectAlbums) { + SelectAlbumView(model: albumModel) + } + .alert(NSLocalizedString("_auto_upload_all_photos_warning_title_", comment: ""), isPresented: $showUploadAllPhotosWarning, actions: { + Button("_confirm_") { + model.autoUploadStart = true + } + Button("_cancel_", role: .cancel) { + model.autoUploadStart = false + } + }, message: { + Text("_auto_upload_all_photos_warning_message_") + }) + .tint(.primary) } @ViewBuilder var autoUploadOnView: some View { - Section(content: { - Button(action: { - model.autoUploadFolder.toggle() - }, label: { - HStack { - Image(systemName: "folder") - .resizable() - .scaledToFit() - .font(Font.system(.body).weight(.light)) - .frame(width: 25, height: 25) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) - Text(NSLocalizedString("_autoupload_select_folder_", comment: "")) - } - .font(.system(size: 16)) - }) - .tint(Color(UIColor.label)) - }, footer: { - Text("\(NSLocalizedString("_autoupload_current_folder_", comment: "")): \(model.returnPath())") - }) - /// Auto Upload Photo - Section(content: { - Toggle(NSLocalizedString("_autoupload_photos_", comment: ""), isOn: $model.autoUploadImage) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadImage) { newValue in - model.handleAutoUploadImageChange(newValue: newValue) - } - .font(.system(size: 16)) - Toggle(NSLocalizedString("_wifi_only_", comment: ""), isOn: $model.autoUploadWWAnPhoto) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadWWAnPhoto) { newValue in - model.handleAutoUploadWWAnPhotoChange(newValue: newValue) - } - .font(.system(size: 16)) - }) - /// Auto Upload Video - Section(content: { - Toggle(NSLocalizedString("_autoupload_videos_", comment: ""), isOn: $model.autoUploadVideo) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadVideo) { newValue in - model.handleAutoUploadVideoChange(newValue: newValue) - } - .font(.system(size: 16)) - Toggle(NSLocalizedString("_wifi_only_", comment: ""), isOn: $model.autoUploadWWAnVideo) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadWWAnVideo) { newValue in - model.handleAutoUploadWWAnVideoChange(newValue: newValue) - } - .font(.system(size: 16)) - }) - /// Only upload favorites if desired - Section(content: { - Toggle(NSLocalizedString("_autoupload_favorites_", comment: ""), isOn: $model.autoUploadFavoritesOnly) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadFavoritesOnly) { newValue in - model.handleAutoUploadFavoritesOnlyChange(newValue: newValue) - } - .font(.system(size: 16)) - }) - /// Auto Upload create subfolder - Section(content: { - Toggle(NSLocalizedString("_autoupload_create_subfolder_", comment: ""), isOn: $model.autoUploadCreateSubfolder) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadCreateSubfolder) { newValue in - model.handleAutoUploadCreateSubfolderChange(newValue: newValue) - } - .font(.system(size: 16)) - Picker(NSLocalizedString("_autoupload_subfolder_granularity_", comment: ""), selection: $model.autoUploadSubfolderGranularity) { - Text(NSLocalizedString("_daily_", comment: "")).tag(Granularity.daily) - Text(NSLocalizedString("_monthly_", comment: "")).tag(Granularity.monthly) - Text(NSLocalizedString("_yearly_", comment: "")).tag(Granularity.yearly) - } - .font(.system(size: 16)) - .onChange(of: model.autoUploadSubfolderGranularity) { newValue in - model.handleAutoUploadSubfolderGranularityChange(newValue: newValue) + Form { + Group { + Section(content: { + Button(action: { + showUploadFolder.toggle() + }, label: { + HStack { + Image(.Settings.AutoUpload.folder) + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) + Text(NSLocalizedString("_destination_", comment: "")) + Text(model.returnPath()) + .frame(maxWidth: .infinity, alignment: .trailing) + } + }) + }) + .applyGlobalFormSectionStyle() + + Section(content: { + NavigationLink(destination: SelectAlbumView(model: albumModel)) { + Button(action: { + showSelectAlbums.toggle() + }, label: { + HStack { + Image(.Settings.AutoUpload.folderOpened) + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) + Text(NSLocalizedString("_upload_from_", comment: "")) + Text(NSLocalizedString(model.createAlbumTitle(autoUploadAlbumIds: albumModel.autoUploadAlbumIds), comment: "")) + .frame(maxWidth: .infinity, alignment: .trailing) + } + }) + } + .applyGlobalFormSectionStyle() + + Toggle(NSLocalizedString("_back_up_new_photos_only_", comment: ""), isOn: $model.autoUploadNewPhotosOnly) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadNewPhotosOnly) { newValue in + model.handleAutoUploadNewPhotosOnly(newValue: newValue) + } + .accessibilityIdentifier("NewPhotosToggle") + }, footer: { + if model.autoUploadNewPhotosOnly == true, let date = model.autoUploadSinceDate { + Text(String(format: NSLocalizedString("_new_photos_starting_", comment: ""), NCUtility().longDate(date))) + } + }) + .applyGlobalFormSectionStyle() + + /// Auto Upload Photo + Section(content: { + Toggle(NSLocalizedString("_autoupload_photos_", comment: ""), isOn: $model.autoUploadImage) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadImage) { newValue in + if !newValue { model.autoUploadVideo = true } + model.handleAutoUploadImageChange(newValue: newValue) + } + + if model.autoUploadImage { + Toggle(NSLocalizedString("_wifi_only_", comment: ""), isOn: $model.autoUploadWWAnPhoto) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadWWAnPhoto) { newValue in + model.handleAutoUploadWWAnPhotoChange(newValue: newValue) + } + } + }) + .applyGlobalFormSectionStyle() + + /// Auto Upload Video + Section(content: { + Toggle(NSLocalizedString("_autoupload_videos_", comment: ""), isOn: $model.autoUploadVideo) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadVideo) { newValue in + if !newValue { model.autoUploadImage = true } + model.handleAutoUploadVideoChange(newValue: newValue) + } + + if model.autoUploadVideo { + Toggle(NSLocalizedString("_wifi_only_", comment: ""), isOn: $model.autoUploadWWAnVideo) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadWWAnVideo) { newValue in + model.handleAutoUploadWWAnVideoChange(newValue: newValue) + } + } + }) + .applyGlobalFormSectionStyle() + + /// Auto Upload create subfolder + Section(content: { + Toggle(NSLocalizedString("_autoupload_create_subfolder_", comment: ""), isOn: $model.autoUploadCreateSubfolder) + .tint(Color(NCBrandColor.shared.switchColor)) + .onChange(of: model.autoUploadCreateSubfolder) { newValue in + model.handleAutoUploadCreateSubfolderChange(newValue: newValue) + } + + if model.autoUploadCreateSubfolder { + Picker(NSLocalizedString("_autoupload_subfolder_granularity_", comment: ""), selection: $model.autoUploadSubfolderGranularity) { + Text(NSLocalizedString("_daily_", comment: "")).tag(Granularity.daily) + Text(NSLocalizedString("_monthly_", comment: "")).tag(Granularity.monthly) + Text(NSLocalizedString("_yearly_", comment: "")).tag(Granularity.yearly) + } + .onChange(of: model.autoUploadSubfolderGranularity) { newValue in + model.handleAutoUploadSubfolderGranularityChange(newValue: newValue) + } + } + }, footer: { + Text(NSLocalizedString("_autoupload_create_subfolder_footer_", comment: "")) + }) + .applyGlobalFormSectionStyle() + } - }, footer: { - Text(NSLocalizedString("_autoupload_create_subfolder_footer_", comment: "")) - }) - /// Auto Upload Full - Section(content: { - Toggle(NSLocalizedString("_autoupload_fullphotos_", comment: ""), isOn: $model.autoUploadFull) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.autoUploadFull) { newValue in - model.handleAutoUploadFullChange(newValue: newValue) + .disabled(model.autoUploadStart) + + /// Auto Upload Full + Section(content: { +#if DEBUG + Button("[DEBUG] Reset last uploaded date") { + model.resetAutoUploadLastUploadedDate() + }.buttonStyle(.borderedProminent) + .foregroundStyle(Color(NCBrandColor.shared.customer)) +#endif + Toggle(isOn: model.autoUploadNewPhotosOnly || model.autoUploadStart ? $model.autoUploadStart : $showUploadAllPhotosWarning) { + Text(model.autoUploadStart ? "_stop_autoupload_" : "_start_autoupload_") + .font(.system(size: 16)) + .padding(.horizontal, 20) + .padding(.vertical, 7) } - .font(.system(size: 16)) - }, footer: { - Text( - NSLocalizedString("_autoupload_fullphotos_footer_", comment: "") + "\n \n") - }) + .font(.headline) + .toggleStyle(.button) + .tint(auToggleTextColor) + .background(auToggleBackground) + .clipShape(.capsule) + .onChange(of: model.autoUploadStart) { newValue in + albumModel.populateSelectedAlbums() + model.handleAutoUploadChange(newValue: newValue, assetCollections: albumModel.selectedAlbums) + } + }, footer: { + Text(NSLocalizedString("_autoupload_notice_", comment: "")) + .padding(.top, 20) + .padding(.bottom, 40) + }) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) + .listRowInsets(EdgeInsets()) + .background(Color(NCBrandColor.shared.formBackgroundColor)) + } + .applyGlobalFormStyle() + } + + private var auToggleTextColor: Color { + if #available(iOS 16.0, *) { + return Color(NCBrandColor.shared.customerText) + } + return Color(red: 0.078, green: 0.455, blue: 0.769) + } + + private var auToggleBackground: Color { + if #available(iOS 16.0, *) { + return Color(.Button.Primary.Background.selected) + } + return Color(.systemBackground) + } +} + +@ViewBuilder +var noPermissionsView: some View { + VStack { + Text("_access_photo_not_enabled_").font(.title3) + .padding() + Text("_access_photo_not_enabled_msg_") } + .padding(16) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color(UIColor.systemGroupedBackground)) } #Preview { - NCAutoUploadView(model: NCAutoUploadModel(controller: nil)) + NCAutoUploadView(model: NCAutoUploadModel(controller: nil), albumModel: AlbumModel(controller: nil)) } diff --git a/iOSClient/Settings/Display/NCDisplayModel.swift b/iOSClient/Settings/Display/NCDisplayModel.swift index 637e078f30..ebe1420069 100644 --- a/iOSClient/Settings/Display/NCDisplayModel.swift +++ b/iOSClient/Settings/Display/NCDisplayModel.swift @@ -30,8 +30,7 @@ class NCDisplayModel: ObservableObject, ViewOnAppearHandling { } /// Initializes the view model with default values. - init(controller: NCMainTabBarController?) { - self.controller = controller + init() { onViewAppear() } diff --git a/iOSClient/Settings/Display/NCDisplayView.swift b/iOSClient/Settings/Display/NCDisplayView.swift index 15b2e20f9b..d108fff56a 100644 --- a/iOSClient/Settings/Display/NCDisplayView.swift +++ b/iOSClient/Settings/Display/NCDisplayView.swift @@ -27,7 +27,7 @@ struct NCDisplayView: View { .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_light_", comment: "")) Image(systemName: colorScheme == .light ? "checkmark.circle.fill" : "circle") - .foregroundColor(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .foregroundColor(Color(NCBrandColor.shared.brandElement)) .imageScale(.large) .font(Font.system(.body).weight(.light)) .frame(width: 50, height: 50) @@ -45,7 +45,7 @@ struct NCDisplayView: View { .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_dark_", comment: "")) Image(systemName: colorScheme == .dark ? "checkmark.circle.fill" : "circle") - .foregroundColor(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .foregroundColor(Color(NCBrandColor.shared.brandElement)) .imageScale(.large) .font(Font.system(.body).weight(.light)) .frame(width: 50, height: 50) @@ -59,7 +59,7 @@ struct NCDisplayView: View { .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: -50)) Toggle(NSLocalizedString("_use_system_style_", comment: ""), isOn: $model.appearanceAutomatic) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .tint(Color(NCBrandColor.shared.switchColor)) .onChange(of: model.appearanceAutomatic) { _ in model.updateAppearanceAutomatic() } @@ -87,5 +87,5 @@ struct NCDisplayView: View { } #Preview { - NCDisplayView(model: NCDisplayModel(controller: nil)) + NCDisplayView(model: NCDisplayModel()) } diff --git a/iOSClient/Settings/NCKeychain.swift b/iOSClient/Settings/NCKeychain.swift index fa9b17d79a..61a83932ca 100644 --- a/iOSClient/Settings/NCKeychain.swift +++ b/iOSClient/Settings/NCKeychain.swift @@ -34,7 +34,7 @@ import KeychainAccess if let value = try? keychain.get("showDescription"), let result = Bool(value) { return result } - return true + return false } set { keychain["showDescription"] = String(newValue) diff --git a/iOSClient/Settings/SelectAlbum/AlbumModel.swift b/iOSClient/Settings/SelectAlbum/AlbumModel.swift new file mode 100644 index 0000000000..19ea929464 --- /dev/null +++ b/iOSClient/Settings/SelectAlbum/AlbumModel.swift @@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: Nextcloud GmbH +// SPDX-FileCopyrightText: 2025 Milen Pivchev +// SPDX-License-Identifier: GPL-3.0-or-later + +import Photos + +@MainActor class AlbumModel: NSObject, ObservableObject { + @Published var allPhotosCollection: PHAssetCollection? + @Published var smartAlbums: [PHAssetCollection] = [] + @Published var userAlbums: [PHAssetCollection] = [] + @Published var selectedAlbums: [PHAssetCollection] = [] + @Published var controller: NCMainTabBarController? + + var smartAlbumAssetCollections: PHFetchResult! + var userAlbumAssetCollections: PHFetchResult! + + var autoUploadAlbumIds: Set { + getSavedAlbumIds() + } + + var session: NCSession.Session { + NCSession.shared.getSession(controller: controller) + } + + init(controller: NCMainTabBarController?) { + self.controller = controller + super.init() + + initAlbums() + PHPhotoLibrary.shared().register(self) + } + + func refresh() { + var newSmartAlbums: [PHAssetCollection] = [] + var newUserAlbums: [PHAssetCollection] = [] +// smartAlbums.removeAll() +// userAlbums.removeAll() + + Task { @MainActor in +// smartAlbumAssetCollections = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil) + smartAlbumAssetCollections?.enumerateObjects { [self] collection, _, _ in + if collection.assetCollectionSubtype == .smartAlbumUserLibrary { + allPhotosCollection = collection + } else if collection.assetCount > 0 { + newSmartAlbums.append(collection) + } + } + + let options = PHFetchOptions() + options.predicate = NSPredicate(format: "estimatedAssetCount > 0") // Only normal albums have an estimated asset count. Smart albums do not and must be calculated manually via .assetCount +// userAlbumAssetCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: options) + + userAlbumAssetCollections?.enumerateObjects { collection, _, _ in + newUserAlbums.append(collection) + } + + smartAlbums = newSmartAlbums + userAlbums = newUserAlbums + + if let allPhotosCollection, autoUploadAlbumIds.isEmpty { + setSavedAlbumIds(selectedAlbums: [allPhotosCollection.localIdentifier]) + } + } + } + + func initAlbums() { + var newSmartAlbums: [PHAssetCollection] = [] + var newUserAlbums: [PHAssetCollection] = [] +// smartAlbums.removeAll() +// userAlbums.removeAll() + + Task { @MainActor in + smartAlbumAssetCollections = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil) + smartAlbumAssetCollections?.enumerateObjects { [self] collection, _, _ in + if collection.assetCollectionSubtype == .smartAlbumUserLibrary { + allPhotosCollection = collection + } else if collection.assetCount > 0 { + newSmartAlbums.append(collection) + } + } + + let options = PHFetchOptions() + options.predicate = NSPredicate(format: "estimatedAssetCount > 0") // Only normal albums have an estimated asset count. Smart albums do not and must be calculated manually via .assetCount + userAlbumAssetCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: options) + + userAlbumAssetCollections?.enumerateObjects { collection, _, _ in + newUserAlbums.append(collection) + } + + smartAlbums = newSmartAlbums + userAlbums = newUserAlbums + + if let allPhotosCollection, autoUploadAlbumIds.isEmpty { + setSavedAlbumIds(selectedAlbums: [allPhotosCollection.localIdentifier]) + } + } + } + + func populateSelectedAlbums() { + let savedAlbums = getSavedAlbumIds() + + selectedAlbums = savedAlbums.compactMap { selectedAlbum in + return smartAlbums.first(where: { $0.localIdentifier == selectedAlbum }) ?? userAlbums.first(where: { $0.localIdentifier == selectedAlbum }) + } + } + + func setSavedAlbumIds(selectedAlbums: Set) { + guard let account = controller?.account else { return } + + NCKeychain().setAutoUploadAlbumIds(account: account, albumIds: Array(selectedAlbums)) + } + + func getSavedAlbumIds() -> Set { + guard let account = controller?.account else { return [] } + + let albumIds = NCKeychain().getAutoUploadAlbumIds(account: account) + + return Set(albumIds) + } + + deinit { + PHPhotoLibrary.shared().unregisterChangeObserver(self) + } +} + +extension AlbumModel: PHPhotoLibraryChangeObserver { + nonisolated func photoLibraryDidChange(_ changeInstance: PHChange) { + Task { @MainActor in + // // + // //// Update the cached fetch results, and reload the table sections to match. + if let changeDetails = changeInstance.changeDetails(for: smartAlbumAssetCollections) { + smartAlbumAssetCollections = changeDetails.fetchResultAfterChanges + } + // // + if let changeDetails = changeInstance.changeDetails(for: userAlbumAssetCollections) { + userAlbumAssetCollections = changeDetails.fetchResultAfterChanges + // // + } + + refresh() + // +// let fetchResultChangeDetails = changeInstance.changeDetails(for: smartAlbumAssetCollections) +// guard (fetchResultChangeDetails) != nil else { +// print("No change in fetchResultChangeDetails") +// return; +// } +// print("Contains changes") +// smartAlbumAssetCollections = (fetchResultChangeDetails?.fetchResultAfterChanges)! +// let insertedObjects = fetchResultChangeDetails?.insertedObjects +// let removedObjects = fetchResultChangeDetails?.removedObjects +// let test = fetchResultChangeDetails?.changedIndexes +// +// insertedObjects?.forEach({ assetCollection in +// if assetCollection.assetCount > 0 { +// smartAlbums.append(assetCollection) +// } +// }) +// +// removedObjects?.forEach({ assetCollection in +// smartAlbums.removeAll(where: { $0 == assetCollection }) +// }) +// +// test?.forEach({ index in +// smartAlbums[index] = tes +// }) +// +// let fetchResultChangeDetails2 = changeInstance.changeDetails(for: userAlbumAssetCollections) +// guard (fetchResultChangeDetails2) != nil else { +// print("No change in fetchResultChangeDetails") +// return; +// } +// print("Contains changes") +// smartAlbumAssetCollections = (fetchResultChangeDetails?.fetchResultAfterChanges)! +// +// populateSelectedAlbums() +//// let insertedObjects = fetchResultChangeDetails?.insertedObjects +//// let removedObjects = fetchResultChangeDetails?.removedObjects + } + } +} diff --git a/iOSClient/Settings/SelectAlbum/PHAssetCollectionThumbnailLoader.swift b/iOSClient/Settings/SelectAlbum/PHAssetCollectionThumbnailLoader.swift new file mode 100644 index 0000000000..35b118cad2 --- /dev/null +++ b/iOSClient/Settings/SelectAlbum/PHAssetCollectionThumbnailLoader.swift @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Nextcloud GmbH +// SPDX-FileCopyrightText: 2025 Milen Pivchev +// SPDX-License-Identifier: GPL-3.0-or-later + +import SwiftUI +import Photos + +@MainActor class PHAssetCollectionThumbnailLoader: ObservableObject { + @Published var image: UIImage? + + func loadThumbnail(for album: PHAssetCollection?) { + let fetchOptions = PHFetchOptions() + fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] + fetchOptions.fetchLimit = 1 + + let assets: PHFetchResult + + if let album { + assets = PHAsset.fetchAssets(in: album, options: fetchOptions) + } else { + assets = PHAsset.fetchAssets(with: fetchOptions) + } + + guard let asset = assets.firstObject else { return } + + let options = PHImageRequestOptions() + options.isNetworkAccessAllowed = true + + PHImageManager.default().requestImage(for: asset, targetSize: .zero, contentMode: .aspectFill, options: options) { [weak self] image, _ in + self?.image = image + } + } +} diff --git a/iOSClient/Settings/SelectAlbum/SelectAlbumView.swift b/iOSClient/Settings/SelectAlbum/SelectAlbumView.swift new file mode 100644 index 0000000000..c48dccde9f --- /dev/null +++ b/iOSClient/Settings/SelectAlbum/SelectAlbumView.swift @@ -0,0 +1,123 @@ +// SPDX-FileCopyrightText: Nextcloud GmbH +// SPDX-FileCopyrightText: 2025 Milen Pivchev +// SPDX-License-Identifier: GPL-3.0-or-later + +import SwiftUI +import Photos + +struct SelectAlbumView: View { + @ObservedObject var model: AlbumModel + @State private var oldSelectedAlbums = Set() + @State var selectedAlbums = Set() + + var body: some View { + List { + Section { + SelectionButton(model: model, album: model.allPhotosCollection, assetCount: model.allPhotosCollection?.assetCount ?? 0, selection: $selectedAlbums) + } + + if !model.smartAlbums.isEmpty { + AlbumView(model: model, selectedAlbums: $selectedAlbums, albums: model.smartAlbums, sectionTitle: "_smart_albums_") + } + + if !model.userAlbums.isEmpty { + AlbumView(model: model, selectedAlbums: $selectedAlbums, albums: model.userAlbums, sectionTitle: "_albums_") + } + } + .safeAreaInset(edge: .bottom, content: { + Spacer().frame(height: 30) + }) + .onChange(of: selectedAlbums) { newValue in + if newValue.count > 1, oldSelectedAlbums.contains(model.allPhotosCollection?.localIdentifier ?? "") { + selectedAlbums.remove(model.allPhotosCollection?.localIdentifier ?? "") + } else if newValue.contains(model.allPhotosCollection?.localIdentifier ?? "") { + selectedAlbums = [model.allPhotosCollection?.localIdentifier ?? ""] + } else if newValue.isEmpty { + selectedAlbums = [model.allPhotosCollection?.localIdentifier ?? ""] + } + + oldSelectedAlbums = newValue + model.setSavedAlbumIds(selectedAlbums: selectedAlbums) + model.populateSelectedAlbums() + } + .onAppear { + selectedAlbums = model.getSavedAlbumIds() + } + .navigationBarTitle(NSLocalizedString("_upload_from_", comment: "")) + .navigationBarTitleDisplayMode(.inline) + } +} + +#Preview { + SelectAlbumView(model: AlbumModel(controller: nil)) +} + +struct AlbumView: View { + @ObservedObject var model: AlbumModel + @Binding var selectedAlbums: Set + var albums: [PHAssetCollection] + let sectionTitle: String + + var body: some View { + Section(NSLocalizedString(sectionTitle, comment: "")) { + ForEach(albums, id: \.localIdentifier) { album in + SelectionButton(model: model, album: album, assetCount: album.assetCount, selection: $selectedAlbums) + } + } + } +} + +struct SelectionButton: View { + let model: AlbumModel + let album: PHAssetCollection? + var assetCount: Int + @StateObject var loader = PHAssetCollectionThumbnailLoader() + @Binding var selection: Set + + var body: some View { + Button(action: { + withAnimation { + guard let album else { return } + + if selection.contains(album.localIdentifier) { + selection.remove(album.localIdentifier) + } else { + selection.insert(album.localIdentifier) + } + } + }) { + HStack { + Image(systemName: selection.contains(album?.localIdentifier ?? "") ? "checkmark.circle.fill" : "circle") + .foregroundColor(Color(NCBrandColor.shared.getElement(account: model.session.account))) + .imageScale(.large) + + if let image = loader.image { + Image(uiImage: image) + .resizable() + .scaledToFill() + .frame(width: 70, height: 70) + .clipped() + .cornerRadius(8) + } else { + Image(systemName: "photo.on.rectangle") + .imageScale(.large) + .frame(width: 70, height: 70) + .foregroundStyle(.tertiary) + .background(.quaternary.opacity(0.5)) + .clipped() + .cornerRadius(8) + } + + VStack(alignment: .leading) { + Text((album?.assetCollectionSubtype == .smartAlbumUserLibrary) ? NSLocalizedString("_camera_roll_", comment: "") : (album?.localizedTitle ?? "")) + Text(String(assetCount)) + .font(.footnote).foregroundStyle(.secondary) + } + } + } + .foregroundColor(.primary) + .onAppear { + loader.loadThumbnail(for: album) + } + } +} diff --git a/iOSClient/Settings/Settings/NCSettingsModel.swift b/iOSClient/Settings/Settings/NCSettingsModel.swift index 8e870e978f..45f7e4bb30 100644 --- a/iOSClient/Settings/Settings/NCSettingsModel.swift +++ b/iOSClient/Settings/Settings/NCSettingsModel.swift @@ -46,14 +46,6 @@ class NCSettingsModel: ObservableObject, ViewOnAppearHandling { @Published var controller: NCMainTabBarController? /// Footer var footerApp = "" - var footerServer = "" - var footerSlogan = "" - /// Get session - var session: NCSession.Session { - NCSession.shared.getSession(controller: controller) - } - - var changePasscode = false /// Initializes the view model with default values. init(controller: NCMainTabBarController?) { @@ -71,8 +63,6 @@ class NCSettingsModel: ObservableObject, ViewOnAppearHandling { resetWrongAttempts = keychain.resetAppCounterFail accountRequest = keychain.accountRequest footerApp = String(format: NCBrandOptions.shared.textCopyrightNextcloudiOS, NCUtility().getVersionApp(withBuild: true)) + "\n\n" - footerServer = String(format: NCBrandOptions.shared.textCopyrightNextcloudServer, capabilities.capabilityServerVersion) + "\n" - footerSlogan = capabilities.capabilityThemingName + " - " + capabilities.capabilityThemingSlogan + "\n\n" } // MARK: - All functions @@ -112,4 +102,8 @@ class NCSettingsModel: ObservableObject, ViewOnAppearHandling { func updateAccountRequest() { keychain.accountRequest = accountRequest } + + func dismiss() { + controller?.dismiss(animated: true) + } } diff --git a/iOSClient/Settings/Settings/NCSettingsView.swift b/iOSClient/Settings/Settings/NCSettingsView.swift index c3bc9f676f..fbfbf2a6f6 100644 --- a/iOSClient/Settings/Settings/NCSettingsView.swift +++ b/iOSClient/Settings/Settings/NCSettingsView.swift @@ -5,6 +5,7 @@ // Created by Aditya Tyagi on 03/03/24. // Created by Marino Faggiana on 30/05/24. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Aditya Tyagi // @@ -46,27 +47,27 @@ struct NCSettingsView: View { /// `Auto Upload` Section Section(content: { NavigationLink(destination: LazyView { - NCAutoUploadView(model: NCAutoUploadModel(controller: model.controller)) + NCAutoUploadView(model: NCAutoUploadModel(controller: model.controller), albumModel: AlbumModel(controller: model.controller)) }) { HStack { - Image(systemName: "photo.circle") + Image(.Settings.camera) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 20, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_settings_autoupload_", comment: "")) } } - }, footer: { - Text(NSLocalizedString("_autoupload_description_", comment: "")) }) + .font(.system(size: 16)) + .listRowBackground(Color(NCBrandColor.shared.formRowBackgroundColor)) /// `Privacy` Section Section(content: { Button(action: { showPasscode.toggle() }, label: { HStack { - Image(systemName: model.isLockActive ? "lock" : "lock.open") + lockImage(isLocked: model.isLockActive) .resizable() .scaledToFit() .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) @@ -76,77 +77,28 @@ struct NCSettingsView: View { } }) .tint(Color(NCBrandColor.shared.textColor)) - .disabled(NCBrandOptions.shared.enforce_passcode_lock) - }, header: { - Text(NSLocalizedString("_privacy_", comment: "")) - }, footer: { - if NCBrandOptions.shared.enforce_passcode_lock { - Text(NSLocalizedString("_lock_cannot_disable_mdm_", comment: "")) - } - }) - - if model.isLockActive { - Section(content: { - Group { - // Change passcode - Button(action: { - showChangePasscode.toggle() - }, label: { - VStack { - Text(NSLocalizedString("_change_lock_passcode_", comment: "")) - .tint(Color(NCBrandColor.shared.textColor)) - } - }) - /// Enable Touch ID - Toggle(NSLocalizedString("_enable_touch_face_id_", comment: ""), isOn: $model.enableTouchID) - .onChange(of: model.enableTouchID) { _ in - model.updateTouchIDSetting() - } - - if !NCBrandOptions.shared.enforce_passcode_lock { - /// Do not ask for passcode on startup - Toggle(NSLocalizedString("_lock_protection_no_screen_", comment: ""), isOn: $model.lockScreen) - .onChange(of: model.lockScreen) { _ in - model.updateLockScreenSetting() - } - } - - /// Reset app wrong attempts - Toggle(NSLocalizedString("_reset_wrong_passcode_option_", comment: ""), isOn: $model.resetWrongAttempts) - .onChange(of: model.resetWrongAttempts) { _ in - model.updateResetWrongAttemptsSetting() - } + /// Enable Touch ID + Toggle(NSLocalizedString("_enable_touch_face_id_", comment: ""), isOn: $model.enableTouchID) + .tint(Color(NCBrandColor.shared.switchColor)) + .font(.system(size: 16)) + .onChange(of: model.enableTouchID) { _ in + model.updateTouchIDSetting() } - }, footer: { - Text(String(format: NSLocalizedString("_reset_wrong_passcode_desc_", comment: ""), NCBrandOptions.shared.resetAppPasscodeAttempts)) - }) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - } - - Section { - /// Splash screen when app inactive - Toggle(NSLocalizedString("_privacy_screen_", comment: ""), isOn: $model.privacyScreen) - .onChange(of: model.privacyScreen) { _ in - model.updatePrivacyScreenSetting() + /// Reset app wrong attempts + Toggle(NSLocalizedString("_reset_wrong_passcode_", comment: ""), isOn: $model.resetWrongAttempts) + .tint(Color(NCBrandColor.shared.switchColor)) + .font(.system(size: 16)) + .onChange(of: model.resetWrongAttempts) { _ in + model.updateResetWrongAttemptsSetting() } - } - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - - /// Display - Section(header: Text(NSLocalizedString("_display_", comment: "")), content: { - NavigationLink(destination: LazyView { - NCDisplayView(model: NCDisplayModel(controller: model.controller)) - }) { - HStack { - Image(systemName: "sun.max.circle") - .resizable() - .scaledToFit() - .frame(width: 20, height: 20) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) - Text(NSLocalizedString("_display_", comment: "")) - } - } - }) + }, header: { + Text(NSLocalizedString("_privacy_", comment: "")).listRowBackground(Color.clear) + }, footer: { + Text(String(format: NSLocalizedString("_reset_wrong_passcode_desc_", comment: ""), NCBrandOptions.shared.resetAppPasscodeAttempts)) + .font(.system(size: 12)) + .listRowBackground(Color.clear) + .lineSpacing(1) + }).applyGlobalFormSectionStyle() /// Calender & Contacts if !NCBrandOptions.shared.disable_mobileconfig { Section(content: { @@ -154,10 +106,10 @@ struct NCSettingsView: View { model.getConfigFiles() }, label: { HStack { - Image(systemName: "calendar.badge.plus") + Image(.Settings.calendarUser) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 23, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_mobile_config_", comment: "")) } @@ -170,25 +122,10 @@ struct NCSettingsView: View { Text(NSLocalizedString("_calendar_contacts_footer_warning_", comment: "")) Spacer() Text(NSLocalizedString("_calendar_contacts_footer_", comment: "")) - } + .font(.system(size: 12)) + }.listRowBackground(Color.clear) - }) - } - /// Users - Section(content: { - Toggle(NSLocalizedString("_settings_account_request_", comment: ""), isOn: $model.accountRequest) - .tint(Color(NCBrandColor.shared.getElement(account: model.session.account))) - .onChange(of: model.accountRequest, perform: { _ in - model.updateAccountRequest() - }) - }, header: { - Text(NSLocalizedString("_users_", comment: "")) - }, footer: { - Text(NSLocalizedString("_users_footer_", comment: "")) - }) - /// E2EEncryption` Section - if capabilities.capabilityE2EEEnabled && NCGlobal.shared.e2eeVersions.contains(capabilities.capabilityE2EEApiVersion) { - E2EESection(model: model) + }).applyGlobalFormSectionStyle() } /// `Advanced` Section Section { @@ -196,15 +133,29 @@ struct NCSettingsView: View { NCSettingsAdvancedView(model: NCSettingsAdvancedModel(controller: model.controller), showExitAlert: false, showCacheAlert: false) }) { HStack { - Image(systemName: "gear") + Image(.Settings.gear) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 20, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_advanced_", comment: "")) } } - } + + NavigationLink(destination: LazyView { + DataProtectionSettingsScreen(model: DataProtectionModel(showFromSettings: true), isShowing: .constant(true)) + }) { + HStack { + Image(.Settings.dataprivacy) + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) + Text(NSLocalizedString("_data_protection_", comment: "")) + } + .font(.system(size: 16)) + } + }.applyGlobalFormSectionStyle() /// `Information` Section Section(header: Text(NSLocalizedString("_information_", comment: "")), content: { // Acknowledgements @@ -212,27 +163,27 @@ struct NCSettingsView: View { showAcknowledgements.toggle() }, label: { HStack { - Image("acknowledgements") + Image(.Settings.handshake) .resizable() - .renderingMode(.template) - .frame(width: 25, height: 25) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) + .scaledToFit() + .frame(width: 25, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_acknowledgements_", comment: "")) } }) .tint(Color(NCBrandColor.shared.textColor)) .sheet(isPresented: $showAcknowledgements) { - NCAcknowledgementsView(browserTitle: NSLocalizedString("_acknowledgements_", comment: "")) + NCBrowserWebView(urlBase: URL(string: NCBrandOptions.shared.acknowloedgements)!, browserTitle: NSLocalizedString("_acknowledgements_", comment: "")) } /// Terms & Privacy Conditions Button(action: { showBrowser.toggle() }, label: { HStack { - Image(systemName: "shield.checkerboard") + Image(.Settings.shieldHalved) .resizable() .scaledToFit() - .frame(width: 25, height: 25) + .frame(width: 20, height: 20) .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) Text(NSLocalizedString("_privacy_legal_", comment: "")) } @@ -241,31 +192,29 @@ struct NCSettingsView: View { .sheet(isPresented: $showBrowser) { NCBrowserWebView(urlBase: URL(string: NCBrandOptions.shared.privacy)!, browserTitle: NSLocalizedString("_privacy_legal_", comment: "")) } - /// Source Code Nextcloud App - if !NCBrandOptions.shared.disable_source_code_in_settings { - Button(action: { - showSourceCode.toggle() - }, label: { - HStack { - Image("gitHub") - .resizable() - .renderingMode(.template) - .frame(width: 25, height: 25) - .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) - Text(NSLocalizedString("_source_code_", comment: "")) - } - }) - .tint(Color(NCBrandColor.shared.textColor)) - .sheet(isPresented: $showSourceCode) { - NCBrowserWebView(urlBase: URL(string: NCBrandOptions.shared.sourceCode)!, browserTitle: NSLocalizedString("_source_code_", comment: "")) + /// Source Code + Button(action: { + showSourceCode.toggle() + }, label: { + HStack { + Image(.Settings.github) + .resizable() + .frame(width: 20, height: 20) + .foregroundColor(Color(NCBrandColor.shared.iconImageColor)) + Text(NSLocalizedString("_source_code_", comment: "")) } + .font(.system(size: 16)) + }) + .tint(Color(NCBrandColor.shared.textColor)) + .sheet(isPresented: $showSourceCode) { + NCBrowserWebView(urlBase: URL(string: NCBrandOptions.shared.sourceCode)!, browserTitle: NSLocalizedString("_source_code_", comment: "")) } - }) + }).applyGlobalFormSectionStyle() /// `Watermark` Section Section(content: { }, footer: { - Text(model.footerApp + model.footerServer + model.footerSlogan) - }) + Text(model.footerApp).listRowBackground(Color.clear) + }).applyGlobalFormSectionStyle() } .sheet(isPresented: $showPasscode) { SetupPasscodeView(isLockActive: $model.isLockActive) @@ -274,8 +223,23 @@ struct NCSettingsView: View { SetupPasscodeView(isLockActive: $model.isLockActive, changePasscode: true) } .navigationBarTitle(NSLocalizedString("_settings_", comment: "")) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(action: { + model.dismiss() + }, label: { + Text(NSLocalizedString("_close_", comment: "")) + .foregroundStyle(Color(NCBrandColor.shared.iconImageColor)) + }) + } + } .defaultViewModifier(model) + .applyGlobalFormStyle() } + + private func lockImage(isLocked: Bool) -> Image { + isLocked ? Image(.itemLock) : Image(.itemLockOpen) + } } struct E2EESection: View { diff --git a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift index a57e926429..0f65f63264 100644 --- a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift +++ b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift @@ -4,6 +4,7 @@ // // Created by T-systems on 09/08/21. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -45,6 +46,7 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg handler: { _ in self.navigationController?.popViewController(animated: true) })) alert.addAction(UIAlertAction(title: NSLocalizedString("_continue_editing_", comment: ""), style: .default)) + alert.view.backgroundColor = NCBrandColor.shared.appBackgroundColor self.present(alert, animated: true) return @@ -113,6 +115,9 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg super.viewDidLoad() self.shareConfig = NCShareConfig(parentMetadata: metadata, share: share) + tableView.backgroundColor = UIColor(resource: .Share.Advanced.background) + tableView.separatorColor = UIColor(resource: .Share.Advanced.tableCellSeparator) + // Only persisted shares have tokens which are provided by the server. // A download limit requires a token to exist. // Hence it can only be looked up if the share is already persisted at this point. @@ -130,9 +135,12 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg tableView.estimatedRowHeight = tableView.rowHeight tableView.rowHeight = UITableView.automaticDimension + self.setNavigationTitle() self.navigationItem.hidesBackButton = true - // disable pull to dimiss + self.navigationController?.setNavigationBarAppearance(backround: UIColor(resource: .Share.Advanced.background)) + + // disbale pull to dimiss isModalInPresentation = true } @@ -177,6 +185,21 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg return NSLocalizedString("_advanced_", comment: "") } else { return nil } } + + override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { + guard let headerView = view as? UITableViewHeaderFooterView else { return } + + var contentConfiguration = UIListContentConfiguration.plainHeader() + contentConfiguration.text = self.tableView(tableView, titleForHeaderInSection: section) + contentConfiguration.textProperties.color = UIColor(resource: .Share.Advanced.sectionTitle) + headerView.contentConfiguration = contentConfiguration + + headerView.configurationUpdateHandler = { (headerFooterView: UITableViewHeaderFooterView, state: UIViewConfigurationState) -> Void in + var backgroundConfiguration = UIBackgroundConfiguration.clear() + backgroundConfiguration.backgroundColor = state.isPinned ? UIColor(resource: .Share.Advanced.sectionTitleBackground) : .clear + headerView.backgroundConfiguration = backgroundConfiguration + } + } override func numberOfSections(in tableView: UITableView) -> Int { return 2 @@ -201,6 +224,13 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg noteCell.detailTextLabel?.numberOfLines = 0 return noteCell } + + cell.configurationUpdateHandler = { (cell: UITableViewCell, state: UICellConfigurationState) -> Void in + var backgroundConfiguration = UIBackgroundConfiguration.clear() + backgroundConfiguration.backgroundColor = UIColor(resource: state.isHighlighted ? .Share.Advanced.Cell.backgroundHighlighted : .Share.Advanced.Cell.backgroundNormal) + cell.backgroundConfiguration = backgroundConfiguration + } + if let cell = cell as? NCShareDateCell { cell.onReload = tableView.reloadData } return cell } diff --git a/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.swift b/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.swift index 1cd9c88dff..243ed8bcea 100644 --- a/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.swift +++ b/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.swift @@ -4,6 +4,7 @@ // // Created by T-systems on 09/08/21. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -30,7 +31,7 @@ protocol NCShareAdvanceFotterDelegate: AnyObject { class NCShareAdvancePermissionFooter: UIView { @IBOutlet weak var buttonCancel: UIButton! - @IBOutlet weak var buttonNext: UIButton! + @IBOutlet weak var buttonNext: PrimaryButton! weak var delegate: NCShareAdvanceFotterDelegate? func setupUI(delegate: NCShareAdvanceFotterDelegate?, account: String) { @@ -38,20 +39,10 @@ class NCShareAdvancePermissionFooter: UIView { backgroundColor = .clear buttonCancel.setTitle(NSLocalizedString("_cancel_", comment: ""), for: .normal) - buttonCancel.layer.cornerRadius = 25 - buttonCancel.layer.masksToBounds = true - buttonCancel.layer.borderWidth = 1 - buttonCancel.layer.borderColor = NCBrandColor.shared.textColor2.cgColor - buttonCancel.backgroundColor = .secondarySystemBackground buttonCancel.addTarget(self, action: #selector(cancelClicked), for: .touchUpInside) - buttonCancel.setTitleColor(NCBrandColor.shared.textColor2, for: .normal) buttonNext.setTitle(NSLocalizedString(delegate?.isNewShare == true ? "_share_" : "_save_", comment: ""), for: .normal) - buttonNext.layer.cornerRadius = 25 - buttonNext.layer.masksToBounds = true - buttonNext.backgroundColor = NCBrandColor.shared.getElement(account: account) buttonNext.addTarget(self, action: #selector(nextClicked), for: .touchUpInside) - buttonNext.setTitleColor(.white, for: .normal) } @objc func cancelClicked() { diff --git a/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.xib b/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.xib index b4ec72ed06..df7953ebb5 100644 --- a/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.xib +++ b/iOSClient/Share/Advanced/NCShareAdvancePermissionFooter.xib @@ -15,7 +15,7 @@ - - + @@ -137,9 +116,8 @@ - - - + + @@ -392,7 +370,6 @@ - diff --git a/iOSClient/Share/NCShare.swift b/iOSClient/Share/NCShare.swift index 0745a56025..f6a9d13d9d 100644 --- a/iOSClient/Share/NCShare.swift +++ b/iOSClient/Share/NCShare.swift @@ -5,6 +5,7 @@ // Created by Marino Faggiana on 17/07/2019. // Copyright © 2019 Marino Faggiana. All rights reserved. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // Author Henrik Storch @@ -36,11 +37,12 @@ class NCShare: UIViewController, NCSharePagingContent { @IBOutlet weak var sharedWithYouByImage: UIImageView! @IBOutlet weak var sharedWithYouByLabel: UILabel! @IBOutlet weak var searchFieldTopConstraint: NSLayoutConstraint! - @IBOutlet weak var searchField: UISearchBar! - var textField: UIView? { searchField } + + @IBOutlet weak var searchPlaceholder: UIView! + private var shareSearchHost: ShareSearchFieldHost? + var textField: UIView? { shareSearchHost?.view } @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var btnContact: UIButton! weak var appDelegate = UIApplication.shared.delegate as? AppDelegate @@ -70,18 +72,31 @@ class NCShare: UIViewController, NCSharePagingContent { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .systemBackground - + view.backgroundColor = NCBrandColor.shared.appBackgroundColor + viewContainerConstraint.constant = height searchFieldTopConstraint.constant = 0 - searchField.placeholder = NSLocalizedString("_shareLinksearch_placeholder_", comment: "") - searchField.autocorrectionType = .no + shareSearchHost = ShareSearchFieldHost(onSearchTextChanged: { [weak self] text in + self?.searchTextDidChange(text) + }, onContactButtonTap: { [weak self] in + self?.selectContactClicked() + }) + shareSearchHost?.placeholder = NSLocalizedString("_shareLinksearch_placeholder_", comment: "") + if let shareSearchHost { + searchPlaceholder.addSubview(shareSearchHost.view) + shareSearchHost.view.translatesAutoresizingMaskIntoConstraints = false + searchPlaceholder.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([searchPlaceholder.leadingAnchor.constraint(equalTo: shareSearchHost.view.leadingAnchor), + searchPlaceholder.trailingAnchor.constraint(equalTo: shareSearchHost.view.trailingAnchor), + searchPlaceholder.topAnchor.constraint(equalTo: shareSearchHost.view.topAnchor), + searchPlaceholder.bottomAnchor.constraint(equalTo: shareSearchHost.view.bottomAnchor)]) + } tableView.dataSource = self tableView.delegate = self tableView.allowsSelection = false - tableView.backgroundColor = .systemBackground + tableView.backgroundColor = NCBrandColor.shared.appBackgroundColor tableView.contentInset = UIEdgeInsets(top: 8, left: 0, bottom: 10, right: 0) tableView.register(UINib(nibName: "NCShareLinkCell", bundle: nil), forCellReuseIdentifier: "cellLink") @@ -95,8 +110,7 @@ class NCShare: UIViewController, NCSharePagingContent { if capabilities.capabilityE2EEApiVersion == NCGlobal.shared.e2eeVersionV12 || (capabilities.capabilityE2EEApiVersion == NCGlobal.shared.e2eeVersionV20 && direcrory?.e2eEncrypted ?? false) { searchFieldTopConstraint.constant = -50 - searchField.alpha = 0 - btnContact.alpha = 0 + textField?.alpha = 0 } } else { checkSharedWithYou() @@ -109,9 +123,11 @@ class NCShare: UIViewController, NCSharePagingContent { let isVisible = (self.navigationController?.topViewController as? NCSharePaging)?.page == .sharing networking?.readShare(showLoadingIndicator: isVisible) } - - searchField.searchTextField.font = .systemFont(ofSize: 14) - searchField.delegate = self + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarAppearance() } func makeNewLinkShare() { @@ -131,9 +147,11 @@ class NCShare: UIViewController, NCSharePagingContent { guard !metadata.ownerId.isEmpty, metadata.ownerId != session.userId else { return } if !canReshare { - searchField.isUserInteractionEnabled = false - searchField.alpha = 0.5 - searchField.placeholder = NSLocalizedString("_share_reshare_disabled_", comment: "") + if let shareSearchHost { + shareSearchHost.view.isUserInteractionEnabled = false + shareSearchHost.view.alpha = 0.5 + shareSearchHost.placeholder = NSLocalizedString("_share_reshare_disabled_", comment: "") + } } searchFieldTopConstraint.constant = 45 @@ -146,28 +164,6 @@ class NCShare: UIViewController, NCSharePagingContent { sharedWithYouByImage.addGestureRecognizer(shareAction) let shareLabelAction = UITapGestureRecognizer(target: self, action: #selector(openShareProfile)) sharedWithYouByLabel.addGestureRecognizer(shareLabelAction) - - let fileName = NCSession.shared.getFileName(urlBase: session.urlBase, user: metadata.ownerId) - let results = NCManageDatabase.shared.getImageAvatarLoaded(fileName: fileName) - - if results.image == nil { - let etag = self.database.getTableAvatar(fileName: fileName)?.etag - - NextcloudKit.shared.downloadAvatar( - user: metadata.ownerId, - fileNameLocalPath: utilityFileSystem.directoryUserData + "/" + fileName, - sizeImage: NCGlobal.shared.avatarSize, - avatarSizeRounded: NCGlobal.shared.avatarSizeRounded, - etag: etag, - account: metadata.account) { _, imageAvatar, _, etag, _, error in - if error == .success, let etag = etag, let imageAvatar = imageAvatar { - self.database.addAvatar(fileName: fileName, etag: etag) - self.sharedWithYouByImage.image = imageAvatar - } else if error.errorCode == NCGlobal.shared.errorNotModified, let imageAvatar = self.database.setAvatarLoaded(fileName: fileName) { - self.sharedWithYouByImage.image = imageAvatar - } - } - } } // MARK: - Notification Center @@ -206,7 +202,7 @@ class NCShare: UIViewController, NCSharePagingContent { self.present(UIAlertController.password(titleKey: "_enforce_password_protection_", completion: completion), animated: true) } - @IBAction func selectContactClicked(_ sender: Any) { + private func selectContactClicked() { let cnPicker = CNContactPickerViewController() cnPicker.delegate = self cnPicker.displayedPropertyKeys = [CNContactEmailAddressesKey] @@ -246,13 +242,15 @@ extension NCShare: NCShareNetworkingDelegate { let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = CGRect(x: 0, y: 0, width: 500, height: 20) - appearance.backgroundColor = .systemBackground + appearance.backgroundColor = UIColor(resource: .Share.SearchUserCell.Background.normal) + appearance.selectionBackgroundColor = UIColor(resource: .Share.SearchUserCell.Background.pressed) appearance.cornerRadius = 10 appearance.shadowColor = .black appearance.shadowOpacity = 0.2 appearance.shadowRadius = 30 appearance.animationduration = 0.25 - appearance.textColor = .darkGray + appearance.textColor = UIColor(resource: .Share.SearchUserCell.title) + appearance.selectedTextColor = UIColor(resource: .Share.SearchUserCell.title) for sharee in sharees { var label = sharee.label @@ -262,10 +260,12 @@ extension NCShare: NCShareNetworkingDelegate { dropDown.dataSource.append(label) } - dropDown.anchorView = searchField - dropDown.bottomOffset = CGPoint(x: 10, y: searchField.bounds.height) - dropDown.width = searchField.bounds.width - 20 - dropDown.direction = .bottom + if let shareSearchHost { + dropDown.anchorView = shareSearchHost.view + dropDown.bottomOffset = CGPoint(x: 10, y: shareSearchHost.view.bounds.height) + dropDown.width = shareSearchHost.view.bounds.width - 20 + dropDown.direction = .bottom + } dropDown.cellNib = UINib(nibName: "NCSearchUserDropDownCell", bundle: nil) dropDown.customCellConfiguration = { (index: Index, _, cell: DropDownCell) in @@ -298,6 +298,12 @@ extension NCShare: NCShareNetworkingDelegate { func downloadLimitSet(to limit: Int, by token: String) { database.createDownloadLimit(account: metadata.account, count: 0, limit: limit, token: token) } + + func showOKAlert(title: String?, message: String?) { + let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in })) + return present(alertController, animated: true) + } } // MARK: - UITableViewDelegate @@ -373,18 +379,8 @@ extension NCShare: UITableViewDataSource { cell.setupCellUI(userId: session.userId) let fileName = NCSession.shared.getFileName(urlBase: session.urlBase, user: tableShare.shareWith) - let results = NCManageDatabase.shared.getImageAvatarLoaded(fileName: fileName) - - if results.image == nil { - cell.fileAvatarImageView?.image = utility.loadUserImage(for: tableShare.shareWith, displayName: tableShare.shareWithDisplayname, urlBase: metadata.urlBase) - } else { - cell.fileAvatarImageView?.image = results.image - } - - if !(results.tableAvatar?.loaded ?? false), - NCNetworking.shared.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { - NCNetworking.shared.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: tableShare.shareWith, fileName: fileName, account: metadata.account, view: tableView)) - } + + cell.fileAvatarImageView?.image = utility.loadUserImage(for: tableShare.shareWith, displayName: tableShare.shareWithDisplayname, urlBase: metadata.urlBase) return cell } @@ -401,7 +397,7 @@ extension NCShare: CNContactPickerDelegate { if contact.emailAddresses.count > 1 { showEmailList(arrEmail: contact.emailAddresses.map({$0.value as String})) } else if let email = contact.emailAddresses.first?.value as? String { - searchField?.text = email + shareSearchHost?.text = email networking?.getSharees(searchString: email) } } @@ -416,7 +412,7 @@ extension NCShare: CNContactPickerDelegate { selected: false, on: false, action: { _ in - self.searchField?.text = email + self.shareSearchHost?.text = email self.networking?.getSharees(searchString: email) } ) @@ -428,16 +424,14 @@ extension NCShare: CNContactPickerDelegate { } } -// MARK: - UISearchBarDelegate - -extension NCShare: UISearchBarDelegate { - func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { - NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(searchSharees), object: nil) +// MARK: - Search +extension NCShare { + func searchTextDidChange(_ searchText: String) { if searchText.isEmpty { dropDown.hide() } else { - perform(#selector(searchSharees), with: nil, afterDelay: 0.5) + searchSharees() } } @@ -449,7 +443,7 @@ extension NCShare: UISearchBarDelegate { let emailPred = NSPredicate(format: "SELF MATCHES %@", emailRegEx) return emailPred.evaluate(with: email) } - guard let searchString = searchField.text, !searchString.isEmpty else { return } + guard let searchString = shareSearchHost?.text, !searchString.isEmpty else { return } if searchString.contains("@"), !isValidEmail(searchString) { return } networking?.getSharees(searchString: searchString) } diff --git a/iOSClient/Share/NCShareHeader.swift b/iOSClient/Share/NCShareHeader.swift index a18f2b6114..5db3bc9feb 100644 --- a/iOSClient/Share/NCShareHeader.swift +++ b/iOSClient/Share/NCShareHeader.swift @@ -44,7 +44,9 @@ class NCShareHeader: UIView { imageView.isHidden = true } else { if metadata.directory { - imageView.image = metadata.e2eEncrypted ? NCImageCache.shared.getFolderEncrypted(account: metadata.account) : NCImageCache.shared.getFolder(account: metadata.account) + imageView.image = (metadata.e2eEncrypted ? UIImage(resource: .folderEncrypted) : UIImage(resource: .folder)) + .withTintColor(UIColor(resource: .Share.commonIconTint)) + .withRenderingMode(.alwaysOriginal) } else if !metadata.iconName.isEmpty { imageView.image = NCUtility().loadImage(named: metadata.iconName, useTypeIconFile: true, account: metadata.account) } else { @@ -60,6 +62,8 @@ class NCShareHeader: UIView { info.text = utilityFileSystem.transformedSize(metadata.size) + ", " + NCUtility().getRelativeDateTitle(metadata.date as Date) tagListView.addTags(Array(metadata.tags)) + + tagListView.backgroundColor = .clear setNeedsLayout() layoutIfNeeded() diff --git a/iOSClient/Share/NCShareLinkCell.swift b/iOSClient/Share/NCShareLinkCell.swift index 1db528ce16..4bea0106c0 100644 --- a/iOSClient/Share/NCShareLinkCell.swift +++ b/iOSClient/Share/NCShareLinkCell.swift @@ -4,6 +4,7 @@ // // Created by Henrik Storch on 15.11.2021. // Copyright © 2021 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -42,10 +43,12 @@ class NCShareLinkCell: UITableViewCell { } func setupCellUI() { - var menuImageName = "ellipsis" + var menuImageResource: ImageResource = .Share.threeDots + let commonIconTint = UIColor(resource: .Share.commonIconTint) menuButton.isHidden = isInternalLink descriptionLabel.isHidden = !isInternalLink + descriptionLabel.textColor = UIColor(resource: .Share.Advanced.Cell.subtitle) copyButton.isHidden = !isInternalLink && tableShare == nil if #available(iOS 18.0, *) { // use NCShareLinkCell image @@ -53,14 +56,15 @@ class NCShareLinkCell: UITableViewCell { copyButton.setImage(UIImage(systemName: "doc.on.doc")?.withTintColor(.label, renderingMode: .alwaysOriginal), for: .normal) } copyButton.accessibilityLabel = NSLocalizedString("_copy_", comment: "") - + copyButton.setImage(UIImage(resource: .Share.internalLink).withTintColor(commonIconTint), for: .normal) + copyButton.imageView?.contentMode = .scaleAspectFit menuButton.accessibilityLabel = NSLocalizedString("_more_", comment: "") menuButton.accessibilityIdentifier = "showShareLinkDetails" if isInternalLink { labelTitle.text = NSLocalizedString("_share_internal_link_", comment: "") descriptionLabel.text = NSLocalizedString("_share_internal_link_des_", comment: "") - imageItem.image = NCUtility().loadImage(named: "square.and.arrow.up.circle.fill", colors: [NCBrandColor.shared.iconImageColor2]) + imageItem.image = UIImage(resource: .Share.squareAndArrowUpCircleFill) } else { labelTitle.text = NSLocalizedString("_share_link_", comment: "") if let tableShare = tableShare { @@ -68,13 +72,13 @@ class NCShareLinkCell: UITableViewCell { labelTitle.text? += " (\(tableShare.label))" } } else { - menuImageName = "plus" + menuImageResource = .Share.plus menuButton.accessibilityLabel = NSLocalizedString("_add_", comment: "") menuButton.accessibilityIdentifier = "addShareLink" } - imageItem.image = NCUtility().loadImage(named: "link.circle.fill", colors: [NCBrandColor.shared.getElement(account: tableShare?.account)]) - menuButton.setImage(NCUtility().loadImage(named: menuImageName, colors: [NCBrandColor.shared.iconImageColor]), for: .normal) + imageItem.image = UIImage(resource: .Share.linkCircleFill) + menuButton.setImage(UIImage(resource: menuImageResource).withTintColor(commonIconTint), for: .normal) } labelTitle.textColor = NCBrandColor.shared.textColor diff --git a/iOSClient/Share/NCShareLinkCell.xib b/iOSClient/Share/NCShareLinkCell.xib index caf3d7dc2e..c38f2fd119 100755 --- a/iOSClient/Share/NCShareLinkCell.xib +++ b/iOSClient/Share/NCShareLinkCell.xib @@ -18,23 +18,23 @@ - - + + - + - + + @@ -85,10 +87,10 @@ - + - + @@ -129,4 +131,12 @@ + + + + + + + + diff --git a/iOSClient/Transfers/NCTransfers.swift b/iOSClient/Transfers/NCTransfers.swift index 899efa5a46..fb4b72f0b4 100644 --- a/iOSClient/Transfers/NCTransfers.swift +++ b/iOSClient/Transfers/NCTransfers.swift @@ -235,7 +235,6 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { cell.fileOcId = metadata.ocId cell.fileOcIdTransfer = metadata.ocIdTransfer cell.fileUser = metadata.ownerId - cell.filePreviewImageView?.image = imageCache.getImageFile() cell.filePreviewImageView?.backgroundColor = nil cell.labelTitle.text = metadata.fileNameView cell.labelTitle.textColor = NCBrandColor.shared.textColor @@ -243,64 +242,63 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { var pathText = metadata.serverUrl.replacingOccurrences(of: serverUrlHome, with: "") if pathText.isEmpty { pathText = "/" } cell.labelPath.text = pathText - cell.setButtonMore(image: imageCache.getImageButtonStop()) - - /// Image item - if !metadata.iconName.isEmpty { - cell.filePreviewImageView?.image = utility.loadImage(named: metadata.iconName, useTypeIconFile: true, account: metadata.account) + cell.setButtonMore(image: UIImage(resource: .Transfers.stop)) + + if metadata.iconName == NKCommon.TypeClassFile.directory.rawValue { + cell.filePreviewImageView?.image = UIImage(resource: .folder) } else { - cell.filePreviewImageView?.image = imageCache.getImageFile() + cell.filePreviewImageView?.image = UIImage(resource: .fileUnsupported) } - + /// Status and Info let user = (metadata.user == session.user ? "" : " - " + metadata.account) switch metadata.status { case NCGlobal.shared.metadataStatusWaitCreateFolder: - cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.waiting) cell.labelStatus.text = NSLocalizedString("_status_wait_create_folder_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitDelete: - cell.fileStatusImage?.image = utility.loadImage(named: "trash.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.trash) cell.labelStatus.text = NSLocalizedString("_status_wait_delete_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitFavorite: - cell.fileStatusImage?.image = utility.loadImage(named: "star.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.favorite) cell.labelStatus.text = NSLocalizedString("_status_wait_favorite_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitCopy: - cell.fileStatusImage?.image = utility.loadImage(named: "c.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.copy) cell.labelStatus.text = NSLocalizedString("_status_wait_copy_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitMove: - cell.fileStatusImage?.image = utility.loadImage(named: "m.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.move) cell.labelStatus.text = NSLocalizedString("_status_wait_move_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitRename: - cell.fileStatusImage?.image = utility.loadImage(named: "a.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.rename) cell.labelStatus.text = NSLocalizedString("_status_wait_rename_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusWaitDownload: - cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.waitToDownload) cell.labelStatus.text = NSLocalizedString("_status_wait_download_", comment: "") + user cell.labelInfo.text = utilityFileSystem.transformedSize(metadata.size) case NCGlobal.shared.metadataStatusDownloading: if #available(iOS 17.0, *) { - cell.fileStatusImage?.image = utility.loadImage(named: "arrowshape.down.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.downloading) } cell.labelStatus.text = NSLocalizedString("_status_downloading_", comment: "") + user cell.labelInfo.text = utilityFileSystem.transformedSize(metadata.size) + " - " + self.utilityFileSystem.transformedSize(transfer.totalBytes) case NCGlobal.shared.metadataStatusWaitUpload: - cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.upload) cell.labelStatus.text = NSLocalizedString("_status_wait_upload_", comment: "") + user cell.labelInfo.text = "" case NCGlobal.shared.metadataStatusUploading: if #available(iOS 17.0, *) { - cell.fileStatusImage?.image = utility.loadImage(named: "arrowshape.up.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.upload) } cell.labelStatus.text = NSLocalizedString("_status_uploading_", comment: "") + user cell.labelInfo.text = utilityFileSystem.transformedSize(metadata.size) + " - " + self.utilityFileSystem.transformedSize(transfer.totalBytes) case NCGlobal.shared.metadataStatusDownloadError, NCGlobal.shared.metadataStatusUploadError: - cell.fileStatusImage?.image = utility.loadImage(named: "exclamationmark.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileStatusImage?.image = UIImage(resource: .Transfers.error) cell.labelStatus.text = NSLocalizedString("_status_upload_error_", comment: "") + user cell.labelInfo.text = metadata.sessionError default: @@ -334,12 +332,11 @@ class NCTransfers: NCCollectionViewCommon, NCTransferCellDelegate { // MARK: - DataSource override func reloadDataSource() { - if let results = self.database.getResultsMetadatas(predicate: NSPredicate(format: "status != %i", NCGlobal.shared.metadataStatusNormal), sortedByKeyPath: "sessionDate", ascending: true) { + self.dataSource.removeAll() + if let results = self.database.getResultsMetadatas(predicate: NSPredicate(format: "status != %i", NCGlobal.shared.metadataStatusNormal), sortedByKeyPath: "sessionDate", ascending: true) { self.dataSource = NCCollectionViewDataSource(metadatas: Array(results.freeze()), layoutForView: layoutForView) - } else { - self.dataSource.removeAll() } - + if self.dataSource.isEmpty() { NCTransferProgress.shared.removeAll() } diff --git a/iOSClient/Transfers/TransfersListener.swift b/iOSClient/Transfers/TransfersListener.swift new file mode 100644 index 0000000000..1308015888 --- /dev/null +++ b/iOSClient/Transfers/TransfersListener.swift @@ -0,0 +1,46 @@ +// +// TransfersListener.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 23.04.2025. +// Copyright © 2025 STRATO GmbH. All rights reserved. +// + +import Combine + +class TransfersListener { + + static let shared = TransfersListener() + + private var timer: Timer? + + let activeTransfersListener: PassthroughSubject = .init() + private(set) var areActiveTransfersPresent: Bool = false + + init() { + NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { _ in + self.timer?.invalidate() + self.timer = nil + } + + NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: nil) { _ in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + if UIApplication.shared.applicationState == .active { + self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in + self.onTimerTick() + }) + } + } + } + } + + private func onTimerTick() { + areActiveTransfersPresent = calculatePresenceOfActiveTransfers() + activeTransfersListener.send() + } + + private func calculatePresenceOfActiveTransfers() -> Bool { + let resultsCount = NCManageDatabase.shared.getResultsMetadatas(predicate: NSPredicate(format: "status != %i", NCGlobal.shared.metadataStatusNormal))?.count ?? 0 + return resultsCount > 0 + } +} diff --git a/iOSClient/Trash/Cell/NCTrashCellProtocol.swift b/iOSClient/Trash/Cell/NCTrashCellProtocol.swift index 8c82abf6db..b57933646c 100644 --- a/iOSClient/Trash/Cell/NCTrashCellProtocol.swift +++ b/iOSClient/Trash/Cell/NCTrashCellProtocol.swift @@ -37,7 +37,7 @@ extension NCTrashCellProtocol where Self: UICollectionViewCell { mutating func setupCellUI(tableTrash: tableTrash, image: UIImage?) { self.objectId = tableTrash.fileId self.labelTitle.text = tableTrash.trashbinFileName - self.labelTitle.textColor = NCBrandColor.shared.textColor + self.labelTitle.textColor = UIColor(resource: .ListCell.title) if self is NCTrashListCell { self.labelInfo?.text = NCUtility().getRelativeDateTitle(tableTrash.trashbinDeletionTime as Date) } else { diff --git a/iOSClient/Trash/Cell/NCTrashGridCell.swift b/iOSClient/Trash/Cell/NCTrashGridCell.swift index 81743c6653..b413c252ba 100644 --- a/iOSClient/Trash/Cell/NCTrashGridCell.swift +++ b/iOSClient/Trash/Cell/NCTrashGridCell.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 19/03/2024. // Copyright © 2024 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -35,7 +36,6 @@ class NCTrashGridCell: UICollectionViewCell, NCTrashCellProtocol { @IBOutlet weak var labelInfo: UILabel! @IBOutlet weak var labelSubinfo: UILabel! @IBOutlet weak var buttonMore: UIButton! - @IBOutlet weak var imageVisualEffect: UIVisualEffectView! weak var delegate: NCTrashGridCellDelegate? var objectId = "" @@ -62,13 +62,11 @@ class NCTrashGridCell: UICollectionViewCell, NCTrashCellProtocol { imageItem.layer.cornerRadius = 6 imageItem.layer.masksToBounds = true - imageVisualEffect.layer.cornerRadius = 6 - imageVisualEffect.clipsToBounds = true - imageVisualEffect.alpha = 0.5 - labelTitle.text = "" labelInfo.text = "" labelSubinfo.text = "" + + imageSelect.image = UIImage(resource: .FileSelection.gridItemSelected) } override func snapshotView(afterScreenUpdates afterUpdates: Bool) -> UIView? { @@ -105,14 +103,8 @@ class NCTrashGridCell: UICollectionViewCell, NCTrashCellProtocol { buttonMore.isHidden = false setA11yActions() } - if status { - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - imageSelect.isHidden = false - imageVisualEffect.isHidden = false - } else { - imageSelect.isHidden = true - imageVisualEffect.isHidden = true - } + setBorderForGridViewCell(isSelected: status) + imageSelect.isHidden = !status } func writeInfoDateSize(date: NSDate, size: Int64) { diff --git a/iOSClient/Trash/Cell/NCTrashGridCell.xib b/iOSClient/Trash/Cell/NCTrashGridCell.xib index 607f2744c6..47c93eec3a 100644 --- a/iOSClient/Trash/Cell/NCTrashGridCell.xib +++ b/iOSClient/Trash/Cell/NCTrashGridCell.xib @@ -1,9 +1,9 @@ - + - + @@ -21,15 +21,6 @@ - @@ -88,10 +79,8 @@ - - @@ -108,8 +97,6 @@ - - @@ -118,15 +105,14 @@ - + - diff --git a/iOSClient/Trash/Cell/NCTrashListCell.swift b/iOSClient/Trash/Cell/NCTrashListCell.swift index 56cf6fa63c..8416b1d82d 100644 --- a/iOSClient/Trash/Cell/NCTrashListCell.swift +++ b/iOSClient/Trash/Cell/NCTrashListCell.swift @@ -72,13 +72,13 @@ class NCTrashListCell: UICollectionViewCell, NCTrashCellProtocol { ] - imageRestore.image = NCUtility().loadImage(named: "arrow.circlepath", colors: [NCBrandColor.shared.iconImageColor]) - imageMore.image = NCUtility().loadImage(named: "trash", colors: [.red]) + imageRestore.image = UIImage(resource: .restoreFromDeleted).withTintColor(NCBrandColor.shared.iconImageColor) + imageMore.image = NCImagesRepository.menuIconTrash.image(color: .red) imageItem.layer.cornerRadius = 6 imageItem.layer.masksToBounds = true - separator.backgroundColor = .separator - separatorHeightConstraint.constant = 0.5 + separator.backgroundColor = UIColor(resource: .ListCell.separator) + separatorHeightConstraint.constant = 1 } @IBAction func touchUpInsideMore(_ sender: Any) { @@ -107,18 +107,9 @@ class NCTrashListCell: UICollectionViewCell, NCTrashCellProtocol { backgroundView = nil } if status { - var blurEffectView: UIView? - blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .systemMaterial)) - blurEffectView?.backgroundColor = .lightGray - blurEffectView?.frame = self.bounds - blurEffectView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] - imageSelect.image = NCImageCache.shared.getImageCheckedYes() - backgroundView = blurEffectView - separator.isHidden = true + imageSelect.image = NCImageCache.shared.getImageCheckedYes().withTintColor(NCBrandColor.shared.brandElement) } else { - imageSelect.image = NCImageCache.shared.getImageCheckedNo() - backgroundView = nil - separator.isHidden = false + imageSelect.image = NCImageCache.shared.getImageCheckedNo().withTintColor(UIColor(resource: .FileSelection.listItemDeselected)) } } diff --git a/iOSClient/Trash/Cell/NCTrashListCell.xib b/iOSClient/Trash/Cell/NCTrashListCell.xib index 15946f2a5b..7f72e6a54e 100644 --- a/iOSClient/Trash/Cell/NCTrashListCell.xib +++ b/iOSClient/Trash/Cell/NCTrashListCell.xib @@ -1,9 +1,10 @@ - + - + + @@ -11,35 +12,35 @@ - + - + - + + - - + - - + + - + - - + + - + @@ -79,10 +80,10 @@ - + - - + + @@ -91,23 +92,23 @@ - + - + - + + + - - - + @@ -128,4 +129,12 @@ + + + + + + + + diff --git a/iOSClient/Trash/NCTrash+CollectionView.swift b/iOSClient/Trash/NCTrash+CollectionView.swift index d784f776a8..30587e971f 100644 --- a/iOSClient/Trash/NCTrash+CollectionView.swift +++ b/iOSClient/Trash/NCTrash+CollectionView.swift @@ -4,6 +4,7 @@ // // Created by Henrik Storch on 18.01.22. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // @@ -24,8 +25,17 @@ import UIKit import RealmSwift -// MARK: UICollectionViewDelegate +// MARK: UICollectionViewDelegate extension NCTrash: UICollectionViewDelegate { + var selectionState: FileActionsHeaderSelectionState { + let selectedItemsCount = selectOcId.count + if selectedItemsCount == datasource?.count { + return .all + } + + return selectedItemsCount == 0 ? .none : .some(selectedItemsCount) + } + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let resultTableTrash = datasource?[indexPath.item] else { return } guard !isEditMode else { @@ -34,8 +44,9 @@ extension NCTrash: UICollectionViewDelegate { } else { selectOcId.append(resultTableTrash.fileId) } + vHeader.setSelectionState(selectionState: selectionState) collectionView.reloadItems(at: [indexPath]) - tabBarSelect.update(selectOcId: selectOcId) + selectionToolbar.update(fileSelect: selectOcId) return } diff --git a/iOSClient/Trash/NCTrash+SelectTabBarDelegate.swift b/iOSClient/Trash/NCTrash+SelectTabBarDelegate.swift index fe773d7b4c..94dd0ddd80 100644 --- a/iOSClient/Trash/NCTrash+SelectTabBarDelegate.swift +++ b/iOSClient/Trash/NCTrash+SelectTabBarDelegate.swift @@ -22,7 +22,7 @@ import Foundation import UIKit -extension NCTrash: NCTrashSelectTabBarDelegate { +extension NCTrash: HiDriveCollectionViewCommonSelectToolbarDelegate { func onListSelected() { if layoutForView?.layout == NCGlobal.shared.layoutGrid { layoutForView?.layout = NCGlobal.shared.layoutList @@ -50,7 +50,7 @@ extension NCTrash: NCTrashSelectTabBarDelegate { } else { selectOcId = datasource.compactMap({ $0.fileId }) } - tabBarSelect.update(selectOcId: selectOcId) + selectionToolbar.update(fileSelect: selectOcId) collectionView.reloadData() } @@ -68,7 +68,7 @@ extension NCTrash: NCTrashSelectTabBarDelegate { isEditMode = editMode selectOcId.removeAll() - setNavigationRightItems() + updateSelectionToolbar() navigationController?.interactivePopGestureRecognizer?.isEnabled = !editMode navigationItem.hidesBackButton = editMode diff --git a/iOSClient/Trash/NCTrash.storyboard b/iOSClient/Trash/NCTrash.storyboard index c7dbd8669c..5aee6d656e 100644 --- a/iOSClient/Trash/NCTrash.storyboard +++ b/iOSClient/Trash/NCTrash.storyboard @@ -1,10 +1,11 @@ - + - + + @@ -16,8 +17,15 @@ + + + + + + + - + @@ -36,13 +44,17 @@ + + + - + + @@ -50,4 +62,9 @@ + + + + + diff --git a/iOSClient/Trash/NCTrash.swift b/iOSClient/Trash/NCTrash.swift index a899cf7ceb..694ff5d8ea 100644 --- a/iOSClient/Trash/NCTrash.swift +++ b/iOSClient/Trash/NCTrash.swift @@ -5,6 +5,7 @@ // Created by Marino Faggiana on 02/10/2018. // Copyright © 2018 Marino Faggiana. All rights reserved. // Copyright © 2022 Henrik Storch. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Henrik Storch // Author Marino Faggiana @@ -30,6 +31,8 @@ import RealmSwift class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegate { @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var vHeader: FileActionsHeader! + var filePath = "" var titleCurrentFolder = NSLocalizedString("_trash_view_", comment: "") var blinkFileId: String? @@ -37,9 +40,14 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat let utilityFileSystem = NCUtilityFileSystem() let database = NCManageDatabase.shared let utility = NCUtility() - var isEditMode = false + var isEditMode = false { + didSet { + vHeader.setIsEditingMode(isEditingMode: isEditMode) + updateSelectionToolbar() + } + } var selectOcId: [String] = [] - var tabBarSelect: NCTrashSelectTabBar! + var selectionToolbar: HiDriveCollectionViewCommonSelectToolbar! var datasource: Results? var layoutForView: NCDBLayoutForView? var listLayout: NCListLayout! @@ -55,11 +63,10 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat override func viewDidLoad() { super.viewDidLoad() + selectionToolbar = HiDriveCollectionViewCommonSelectToolbar(controller: nil, delegate: self, displayedButtons: [.restore, .delete]) - tabBarSelect = NCTrashSelectTabBar(tabBarController: tabBarController, delegate: self) - - view.backgroundColor = .systemBackground - self.navigationController?.navigationBar.prefersLargeTitles = true + view.backgroundColor = NCBrandColor.shared.appBackgroundColor + self.navigationController?.navigationBar.prefersLargeTitles = false collectionView.register(UINib(nibName: "NCTrashListCell", bundle: nil), forCellWithReuseIdentifier: "listCell") collectionView.register(UINib(nibName: "NCTrashGridCell", bundle: nil), forCellWithReuseIdentifier: "gridCell") @@ -68,7 +75,7 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat collectionView.register(UINib(nibName: "NCSectionFooter", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "sectionFooter") collectionView.alwaysBounceVertical = true - collectionView.backgroundColor = .systemBackground + collectionView.backgroundColor = NCBrandColor.shared.appBackgroundColor listLayout = NCListLayout() gridLayout = NCGridLayout() @@ -78,9 +85,31 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat refreshControl.tintColor = NCBrandColor.shared.textColor2 refreshControl.addTarget(self, action: #selector(loadListingTrash), for: .valueChanged) + updateHeadersView() + NotificationCenter.default.addObserver(self, selector: #selector(reloadDataSource), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterReloadDataSource), object: nil) } + private func updateHeadersView() { + vHeader?.setIsEditingMode(isEditingMode: isEditMode) + vHeader?.setViewModeMenu(viewMenuElements: createViewModeMenuActions(), image: viewModeImage?.templateRendered()) + vHeader?.enableSelection(enable: !(datasource?.isEmpty ?? true)) + + vHeader?.onSelectModeChange = { [weak self] isSelectionMode in + self?.setEditMode(isSelectionMode) + self?.updateHeadersView() + self?.vHeader?.setSelectionState(selectionState: .none) + } + + vHeader?.onSelectAll = { [weak self] in + guard let self = self else { return } + self.selectAll() + let selectionState: FileActionsHeaderSelectionState = self.selectOcId.count == 0 ? .none : .all + self.vHeader?.setSelectionState(selectionState: selectionState) + } + updateSelectionToolbar() + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -96,11 +125,17 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat } isEditMode = false - setNavigationRightItems() - + setNavigationLeftItems() + updateHeadersView() + reloadDataSource() loadListingTrash() } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + selectionToolbar.controller = mainTabBarController + } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) @@ -112,47 +147,30 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() - - if let frame = tabBarController?.tabBar.frame { - tabBarSelect.hostingController?.view.frame = frame - } + selectionToolbar.onViewWillLayoutSubviews() } // MARK: - Layout - func setNavigationRightItems() { - func createMenuActions() -> [UIMenuElement] { - guard let layoutForView = self.database.getLayoutForView(account: session.account, key: layoutKey, serverUrl: ""), - let datasource else { return [] } - let select = UIAction(title: NSLocalizedString("_select_", comment: ""), image: utility.loadImage(named: "checkmark.circle", colors: [NCBrandColor.shared.iconImageColor]), attributes: datasource.isEmpty ? .disabled : []) { _ in - self.setEditMode(true) - } - let list = UIAction(title: NSLocalizedString("_list_", comment: ""), image: utility.loadImage(named: "list.bullet", colors: [NCBrandColor.shared.iconImageColor]), state: layoutForView.layout == NCGlobal.shared.layoutList ? .on : .off) { _ in - self.onListSelected() - self.setNavigationRightItems() - } - let grid = UIAction(title: NSLocalizedString("_icons_", comment: ""), image: utility.loadImage(named: "square.grid.2x2", colors: [NCBrandColor.shared.iconImageColor]), state: layoutForView.layout == NCGlobal.shared.layoutGrid ? .on : .off) { _ in - self.onGridSelected() - self.setNavigationRightItems() - } - let viewStyleSubmenu = UIMenu(title: "", options: .displayInline, children: [list, grid]) - - return [select, viewStyleSubmenu] - } - + func updateSelectionToolbar() { if isEditMode { - tabBarSelect.update(selectOcId: selectOcId) - tabBarSelect.show() - let select = UIBarButtonItem(title: NSLocalizedString("_cancel_", comment: ""), style: .done) { - self.setEditMode(false) + selectionToolbar.update(fileSelect: selectOcId) + selectionToolbar.show() + } else if navigationItem.rightBarButtonItems == nil || (!isEditMode && !selectionToolbar.isHidden()) { + selectionToolbar.hide() + } + } + + func setNavigationLeftItems() { + if layoutKey == NCGlobal.shared.layoutViewTrash { + navigationItem.leftItemsSupplementBackButton = true + if navigationController?.viewControllers.count == 1 { + navigationItem.setLeftBarButtonItems([UIBarButtonItem(title: NSLocalizedString("_close_", comment: ""), + style: .plain, + action: { [weak self] in + self?.dismiss(animated: true) + })], animated: true) } - navigationItem.rightBarButtonItems = [select] - } else if navigationItem.rightBarButtonItems == nil || (!isEditMode && !tabBarSelect.isHidden()) { - tabBarSelect.hide() - let menu = UIBarButtonItem(image: utility.loadImage(named: "ellipsis.circle", colors: [NCBrandColor.shared.iconImageColor]), menu: UIMenu(children: createMenuActions())) - navigationItem.rightBarButtonItems = [menu] - } else { - navigationItem.rightBarButtonItems?.first?.menu = navigationItem.rightBarButtonItems?.first?.menu?.replacingChildren(createMenuActions()) } } @@ -197,7 +215,7 @@ class NCTrash: UIViewController, NCTrashListCellDelegate, NCTrashGridCellDelegat @objc func reloadDataSource(withQueryDB: Bool = true) { datasource = self.database.getResultsTrash(filePath: getFilePath(), account: session.account) collectionView.reloadData() - setNavigationRightItems() + updateHeadersView() guard let blinkFileId, let datasource else { return } for itemIx in 0.. [UIMenuElement] { + let layoutForView = collectionView.collectionViewLayout + + let listImage = UIImage(resource: .FileSelection.viewModeList).templateRendered() + let gridImage = UIImage(resource: .FileSelection.viewModeGrid).templateRendered() + + let list = UIAction(title: NSLocalizedString("_list_", comment: ""), image: listImage, state: layoutForView == listLayout ? .on : .off) { [weak self] _ in + self?.onListSelected() + self?.updateHeadersView() + } + + let grid = UIAction(title: NSLocalizedString("_icons_", comment: ""), image: gridImage, state: layoutForView == gridLayout ? .on : .off) { [weak self] _ in + self?.onGridSelected() + self?.updateHeadersView() + } + return [list, grid] + } +} diff --git a/iOSClient/Trash/NCTrashSelectTabBar.swift b/iOSClient/Trash/NCTrashSelectTabBar.swift deleted file mode 100644 index cca186bc70..0000000000 --- a/iOSClient/Trash/NCTrashSelectTabBar.swift +++ /dev/null @@ -1,138 +0,0 @@ -// -// NCTrashSelectTabBar.swift -// Nextcloud -// -// Created by Milen on 05.02.24. -// Copyright © 2024 Marino Faggiana. All rights reserved. -// -// 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 . -// - -import Foundation -import UIKit -import SwiftUI - -protocol NCTrashSelectTabBarDelegate: AnyObject { - func selectAll() - func recover() - func delete() -} - -class NCTrashSelectTabBar: ObservableObject { - var tabBarController: UITabBarController? - var hostingController: UIViewController? - open weak var delegate: NCTrashSelectTabBarDelegate? - - @Published var isSelectedEmpty = true - - init(tabBarController: UITabBarController? = nil, delegate: NCTrashSelectTabBarDelegate? = nil) { - let rootView = NCTrashSelectTabBarView(tabBarSelect: self) - hostingController = UIHostingController(rootView: rootView) - - self.tabBarController = tabBarController - self.delegate = delegate - - guard let tabBarController, let hostingController else { return } - - tabBarController.view.addSubview(hostingController.view) - - hostingController.view.frame = tabBarController.tabBar.frame - hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] - hostingController.view.backgroundColor = .clear - hostingController.view.isHidden = true - } - - func show() { - guard let tabBarController, let hostingController else { return } - - tabBarController.tabBar.isHidden = true - - if hostingController.view.isHidden { - hostingController.view.isHidden = false - - hostingController.view.transform = .init(translationX: 0, y: hostingController.view.frame.height) - - UIView.animate(withDuration: 0.2) { - hostingController.view.transform = .init(translationX: 0, y: 0) - } - } - } - - func hide() { - guard let tabBarController, let hostingController else { return } - - hostingController.view.isHidden = true - tabBarController.tabBar.isHidden = false - } - - func update(selectOcId: [String]) { - isSelectedEmpty = selectOcId.isEmpty - } - - func isHidden() -> Bool { - guard let hostingController else { return false } - return hostingController.view.isHidden - } -} - -struct NCTrashSelectTabBarView: View { - @ObservedObject var tabBarSelect: NCTrashSelectTabBar - @Environment(\.verticalSizeClass) var sizeClass - - var body: some View { - VStack { - Spacer().frame(height: sizeClass == .compact ? 5 : 10) - HStack { - Button { - tabBarSelect.delegate?.recover() - } label: { - Image(systemName: "arrow.circlepath") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(Color(NCBrandColor.shared.iconImageColor)) - .frame(maxWidth: .infinity) - .disabled(tabBarSelect.isSelectedEmpty) - - Button { - tabBarSelect.delegate?.delete() - } label: { - Image(systemName: "trash") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(.red) - .frame(maxWidth: .infinity) - .disabled(tabBarSelect.isSelectedEmpty) - - Button { - tabBarSelect.delegate?.selectAll() - } label: { - Image(systemName: "checkmark") - .font(Font.system(.body).weight(.light)) - .imageScale(sizeClass == .compact ? .medium : .large) - } - .tint(Color(NCBrandColor.shared.iconImageColor)) - .frame(maxWidth: .infinity) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) - .background(.thinMaterial) - .overlay(Rectangle().frame(width: nil, height: 0.5, alignment: .top).foregroundColor(Color(UIColor.separator)), alignment: .top) - } -} - -#Preview { - NCTrashSelectTabBarView(tabBarSelect: NCTrashSelectTabBar()) -} diff --git a/iOSClient/UserStatus/NCUserStatus.swift b/iOSClient/UserStatus/NCUserStatus.swift index 93d9d2bbe4..05b77f1a6a 100644 --- a/iOSClient/UserStatus/NCUserStatus.swift +++ b/iOSClient/UserStatus/NCUserStatus.swift @@ -79,8 +79,8 @@ class NCUserStatus: UIViewController { navigationController?.navigationBar.tintColor = NCBrandColor.shared.iconImageColor navigationItem.title = NSLocalizedString("_online_status_", comment: "") - view.backgroundColor = .systemBackground - tableView.backgroundColor = .systemBackground + view.backgroundColor = NCBrandColor.shared.appBackgroundColor + tableView.backgroundColor = NCBrandColor.shared.appBackgroundColor borderColorButton = NCBrandColor.shared.getElement(account: account).cgColor buttonCancel.image = utility.loadImage(named: "xmark", colors: [NCBrandColor.shared.iconImageColor]) diff --git a/iOSClient/Utility/AccountButtonFactory.swift b/iOSClient/Utility/AccountButtonFactory.swift new file mode 100644 index 0000000000..191fc7f8b5 --- /dev/null +++ b/iOSClient/Utility/AccountButtonFactory.swift @@ -0,0 +1,79 @@ +// +// AccountButtonFactory.swift +// Nextcloud +// +// Created by Sergey Kaliberda on 12.09.2024. +// Copyright © 2024 STRATO GmbH +// + +import UIKit +import SwiftUI +import RealmSwift +import NextcloudKit +import EasyTipView + +class AccountButtonFactory { + let database = NCManageDatabase.shared + let utility = NCUtility() + let appDelegate = (UIApplication.shared.delegate as? AppDelegate)! + private let controller: NCMainTabBarController? + + private var onAccountDetailsOpen: (() -> Void) + private var presentVC: ((UIViewController) -> Void) + private var onMenuOpened: (() -> Void)? + + init(controller: NCMainTabBarController?, + onAccountDetailsOpen: (@escaping () -> Void), + presentVC: (@escaping (UIViewController) -> Void), + onMenuOpened: (() -> Void)? = nil) { + self.controller = controller + self.onAccountDetailsOpen = onAccountDetailsOpen + self.presentVC = presentVC + self.onMenuOpened = onMenuOpened + } + + func createAccountButton() -> UIBarButtonItem { + let session = NCSession.shared.getSession(controller: controller) + guard let tableAccount = self.database.getTableAccount(predicate: NSPredicate(format: "account == %@", session.account)) else { + return UIBarButtonItem() + } + let image = utility.loadUserImage(for: tableAccount.account, displayName: tableAccount.displayName, urlBase: tableAccount.urlBase) + let accountButton = AccountSwitcherButton(type: .custom) + let accounts = NCManageDatabase.shared.getAllAccountOrderAlias() + + accountButton.setImage(image, for: .normal) + accountButton.setImage(image, for: .highlighted) + accountButton.semanticContentAttribute = .forceLeftToRight + accountButton.sizeToFit() + accountButton.action(for: .touchUpInside, { [weak self] _ in + let accountSettingsModel = NCAccountSettingsModel(controller: self?.controller, delegate: self) + let accountSettingsView = NCAccountSettingsView(model: accountSettingsModel) + let accountSettingsController = UIHostingController(rootView: accountSettingsView) + self?.presentVC(accountSettingsController) + }) + return UIBarButtonItem(customView: accountButton) + } +} + +extension AccountButtonFactory: NCAccountSettingsModelDelegate { + func accountSettingsDidDismiss(tableAccount: tableAccount?, controller: NCMainTabBarController?) { + let session = NCSession.shared.getSession(controller: controller) + let currentAccount = session.account + if database.getAllTableAccount().isEmpty { + appDelegate.openLogin(selector: NCGlobal.shared.introLogin) + } else if let account = tableAccount?.account, account != currentAccount { + NCAccount().changeAccount(account, userProfile: nil, controller: controller) { } + } + } +} + +// MARK: - + +private class AccountSwitcherButton: UIButton { + var onMenuOpened: (() -> Void)? + + override func contextMenuInteraction(_ interaction: UIContextMenuInteraction, willDisplayMenuFor configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionAnimating?) { + super.contextMenuInteraction(interaction, willDisplayMenuFor: configuration, animator: animator) + onMenuOpened?() + } +} diff --git a/iOSClient/Utility/NCUtility+Date.swift b/iOSClient/Utility/NCUtility+Date.swift index 55fa93f48c..3f1dde0f57 100644 --- a/iOSClient/Utility/NCUtility+Date.swift +++ b/iOSClient/Utility/NCUtility+Date.swift @@ -24,6 +24,10 @@ import UIKit extension NCUtility { + func longDate(_ date: Date) -> String { + return DateFormatter.localizedString(from: date, dateStyle: .long, timeStyle: .none) + } + /// Returns a localized string representing the given date in a user-friendly format. /// The function handles the following cases: /// - If the date is today: Returns "Today". diff --git a/iOSClient/Utility/NCUtility+Image.swift b/iOSClient/Utility/NCUtility+Image.swift index def503dea4..ac490ad1ef 100644 --- a/iOSClient/Utility/NCUtility+Image.swift +++ b/iOSClient/Utility/NCUtility+Image.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 06/11/23. // Copyright © 2023 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -47,7 +48,7 @@ extension NCUtility { case NKCommon.TypeIconFile.txt.rawValue: image = UIImage(systemName: "doc.text", withConfiguration: UIImage.SymbolConfiguration(weight: .thin))?.applyingSymbolConfiguration(UIImage.SymbolConfiguration(paletteColors: [NCBrandColor.shared.iconImageColor2])) case NKCommon.TypeIconFile.url.rawValue: image = UIImage(systemName: "network", withConfiguration: UIImage.SymbolConfiguration(weight: .thin))?.applyingSymbolConfiguration(UIImage.SymbolConfiguration(paletteColors: [NCBrandColor.shared.iconImageColor2])) case NKCommon.TypeIconFile.xls.rawValue: image = UIImage(systemName: "tablecells", withConfiguration: UIImage.SymbolConfiguration(weight: .thin))?.applyingSymbolConfiguration(UIImage.SymbolConfiguration(paletteColors: [NCBrandColor.shared.spreadsheetIconColor])) - default: image = UIImage(systemName: "doc", withConfiguration: UIImage.SymbolConfiguration(weight: .thin))?.applyingSymbolConfiguration(UIImage.SymbolConfiguration(paletteColors: [NCBrandColor.shared.iconImageColor2])) + default: image = UIImage(resource: .fileUnsupported) } } @@ -81,26 +82,13 @@ extension NCUtility { return UIImage(systemName: "doc")! } } + + private var userImage: UIImage { + UIImage(resource: .userAvatar) + } func loadUserImage(for user: String, displayName: String?, urlBase: String) -> UIImage { - let fileName = NCSession.shared.getFileName(urlBase: urlBase, user: user) - let localFilePath = utilityFileSystem.directoryUserData + "/" + fileName - - if var localImage = UIImage(contentsOfFile: localFilePath) { - let rect = CGRect(x: 0, y: 0, width: 30, height: 30) - UIGraphicsBeginImageContextWithOptions(rect.size, false, 3.0) - UIBezierPath(roundedRect: rect, cornerRadius: rect.size.height).addClip() - localImage.draw(in: rect) - localImage = UIGraphicsGetImageFromCurrentImageContext() ?? localImage - UIGraphicsEndImageContext() - return localImage - } else if let image = NCManageDatabase.shared.getImageAvatarLoaded(fileName: fileName).image { - return image - } else if let displayName = displayName, !displayName.isEmpty, let avatarImg = createAvatar(displayName: displayName, size: 30) { - return avatarImg - } else { - return loadImage(named: "person.crop.circle", colors: [NCBrandColor.shared.iconImageColor]) - } + userImage } func imageFromVideo(url: URL, at time: TimeInterval) -> UIImage? { diff --git a/iOSClient/Utility/UIDevice+VirtualOrientation.swift b/iOSClient/Utility/UIDevice+VirtualOrientation.swift new file mode 100644 index 0000000000..58ae30c74f --- /dev/null +++ b/iOSClient/Utility/UIDevice+VirtualOrientation.swift @@ -0,0 +1,19 @@ +// +// UIDevice+VirtualOrientation.swift +// Nextcloud +// +// Created by Vitaliy Tolkach on 23.04.2025. +// Copyright © 2025 STRATO GmbH. All rights reserved. +// + +import UIKit + +extension UIDevice { + var isVirtualOrientationLandscape: Bool { + guard !UIDevice.current.orientation.isLandscape else { return true } + if let orientation = (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.windowScene?.interfaceOrientation { + return orientation.isLandscape + } + return false + } +} diff --git a/iOSClient/Viewer/NCViewer.swift b/iOSClient/Viewer/NCViewer.swift index 6fb405966a..4aab66d456 100644 --- a/iOSClient/Viewer/NCViewer.swift +++ b/iOSClient/Viewer/NCViewer.swift @@ -172,9 +172,11 @@ class NCViewer: NSObject { let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), isEditingEnabled: false, metadata: metadata) viewController.present(viewerQuickLook, animated: true) } else { - // Document Interaction Controller - if let controller = viewController.tabBarController as? NCMainTabBarController { - NCActionCenter.shared.openDocumentController(metadata: metadata, controller: controller) + // Document Interaction Controller + if let mainTabBarController = viewController.tabBarController as? NCMainTabBarController { + NCActionCenter.shared.openDocumentController(metadata: metadata, controller: mainTabBarController) + } else { + NCActionCenter.shared.openDocumentController(metadata: metadata, viewController: viewController) } } } diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift index 36399d3a32..caf08f5adf 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift @@ -4,6 +4,7 @@ // // Created by Marino Faggiana on 01/07/21. // Copyright © 2021 Marino Faggiana. All rights reserved. +// Copyright © 2024 STRATO GmbH // // Author Marino Faggiana // @@ -46,7 +47,7 @@ class NCPlayerToolBar: UIView { @IBOutlet weak var playbackSlider: NCPlayerToolBarSlider! @IBOutlet weak var labelLeftTime: UILabel! @IBOutlet weak var labelCurrentTime: UILabel! - @IBOutlet weak var repeatButton: UIButton! + @IBOutlet weak var repeatButton: UIButton? enum sliderEventType { case began @@ -67,7 +68,6 @@ class NCPlayerToolBar: UIView { private let global = NCGlobal.shared private let database = NCManageDatabase.shared private weak var viewerMediaPage: NCViewerMediaPage? - private var buttonImage = UIImage() // MARK: - View Life Cycle @@ -76,12 +76,12 @@ class NCPlayerToolBar: UIView { self.backgroundColor = UIColor.black.withAlphaComponent(0.1) - fullscreenButton.setImage(utility.loadImage(named: "arrow.up.left.and.arrow.down.right", colors: [.white]), for: .normal) + fullscreenButton.setImage(NCImagesRepository.mediaIconFullscreen, for: .normal) - subtitleButton.setImage(utility.loadImage(named: "captions.bubble", colors: [.white]), for: .normal) + subtitleButton.setImage(NCImagesRepository.mediaIconMessage, for: .normal) subtitleButton.isEnabled = false - audioButton.setImage(utility.loadImage(named: "speaker.zzz", colors: [.white]), for: .normal) + audioButton.setImage(NCImagesRepository.mediaIconSound, for: .normal) audioButton.isEnabled = false if UIDevice.current.userInterfaceIdiom == .pad { @@ -93,21 +93,18 @@ class NCPlayerToolBar: UIView { playerButtonView.spacing = pointSize playerButtonView.isHidden = true - buttonImage = UIImage(systemName: "gobackward.10", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - backButton.setImage(buttonImage, for: .normal) - - buttonImage = UIImage(systemName: "play.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - playButton.setImage(buttonImage, for: .normal) - - buttonImage = UIImage(systemName: "goforward.10", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - forwardButton.setImage(buttonImage, for: .normal) + backButton.setImage(NCImagesRepository.mediaIconRewind, for: .normal) + playButton.setImage(NCImagesRepository.mediaIconPlay, for: .normal) + forwardButton.setImage(NCImagesRepository.mediaIconForward, for: .normal) playbackSlider.addTapGesture() - playbackSlider.setThumbImage(UIImage(systemName: "circle.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 15)), for: .normal) + playbackSlider.setThumbImage(UIImage(systemName: "circle.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 24)), for: .normal) + playbackSlider.thumbTintColor = UIColor(resource: .MediaPlayer.sliderThumb) + playbackSlider.minimumTrackTintColor = UIColor(resource: .MediaPlayer.sliderMin) + playbackSlider.maximumTrackTintColor = UIColor(resource: .MediaPlayer.sliderMax) playbackSlider.value = 0 - playbackSlider.tintColor = .white playbackSlider.addTarget(self, action: #selector(playbackValChanged(slider:event:)), for: .valueChanged) - repeatButton.setImage(utility.loadImage(named: "repeat", colors: [NCBrandColor.shared.iconImageColor2]), for: .normal) + repeatButton?.setImage(utility.loadImage(named: "repeat", colors: [NCBrandColor.shared.iconImageColor2]), for: .normal) utilityView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap(gestureRecognizer:)))) playbackSliderView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap(gestureRecognizer:)))) @@ -145,8 +142,7 @@ class NCPlayerToolBar: UIView { playerButtonView.isHidden = true - buttonImage = UIImage(systemName: "play.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - playButton.setImage(buttonImage, for: .normal) + playButton.setImage(NCImagesRepository.mediaIconPlay, for: .normal) playbackSlider.value = position @@ -204,14 +200,12 @@ class NCPlayerToolBar: UIView { } func playButtonPause() { - buttonImage = UIImage(systemName: "pause.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - playButton.setImage(buttonImage, for: .normal) + playButton.setImage(NCImagesRepository.mediaIconPause, for: .normal) MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = 1 } func playButtonPlay() { - buttonImage = UIImage(systemName: "play.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: pointSize))!.withTintColor(.white, renderingMode: .alwaysOriginal) - playButton.setImage(buttonImage, for: .normal) + playButton.setImage(NCImagesRepository.mediaIconPlay, for: .normal) MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = 0 } @@ -251,9 +245,9 @@ class NCPlayerToolBar: UIView { @IBAction func tapFullscreen(_ sender: Any) { isFullscreen = !isFullscreen if isFullscreen { - fullscreenButton.setImage(utility.loadImage(named: "arrow.down.right.and.arrow.up.left", colors: [.white]), for: .normal) + fullscreenButton.setImage(NCImagesRepository.mediaIconCloseFullscreen, for: .normal) } else { - fullscreenButton.setImage(utility.loadImage(named: "arrow.up.left.and.arrow.down.right", colors: [.white]), for: .normal) + fullscreenButton.setImage(NCImagesRepository.mediaIconFullscreen, for: .normal) } viewerMediaPage?.changeScreenMode(mode: viewerMediaScreenMode) } @@ -303,10 +297,10 @@ class NCPlayerToolBar: UIView { @IBAction func tapRepeat(_ sender: Any) { if playRepeat { playRepeat = false - repeatButton.setImage(utility.loadImage(named: "repeat", colors: [NCBrandColor.shared.iconImageColor2]), for: .normal) + repeatButton?.setImage(utility.loadImage(named: "repeat", colors: [NCBrandColor.shared.iconImageColor2]), for: .normal) } else { playRepeat = true - repeatButton.setImage(utility.loadImage(named: "repeat", colors: [.white]), for: .normal) + repeatButton?.setImage(utility.loadImage(named: "repeat", colors: [.white]), for: .normal) } } } diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib index 172f9daf67..86314bf8e9 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib @@ -11,118 +11,139 @@ - + - + - - - + + + + + + + + + + + + + + - + - - - - - + - - + + - - + + + + - + - + + + + + - - - + - - + @@ -137,7 +158,7 @@ - + @@ -150,7 +171,6 @@ - @@ -158,12 +178,20 @@ - - - - - - - + + + + + + + + + + + + + + + diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift index 1c0cb8617c..717f501398 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift @@ -88,6 +88,7 @@ class NCViewerMedia: UIViewController { scrollView.delegate = self scrollView.maximumZoomScale = 4 scrollView.minimumZoomScale = 1 + scrollView.backgroundColor = NCBrandColor.shared.appBackgroundColor view.addGestureRecognizer(doubleTapGestureRecognizer) diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard index 1d84e13bfa..1eafabb4f1 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.storyboard @@ -1,9 +1,10 @@ - - + + - + + @@ -18,17 +19,17 @@ - + - + - + @@ -73,14 +74,14 @@ - + - + - + @@ -90,28 +91,28 @@ - + - + - + - + - + - + @@ -193,11 +194,11 @@ - + @@ -223,7 +224,7 @@ - + @@ -233,133 +234,133 @@ - + - + - - + + - + - + @@ -388,10 +389,10 @@ - + - + @@ -399,7 +400,7 @@ - + - + - + @@ -437,20 +438,18 @@ - + -

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%0Do-pR@Kflx6pb+Hnu_bP$h;q~+aH<%8q` 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 E2Z61$Bme*a literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon114@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon114@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..742f9b5c11d00cb69a120705cb685d4c1bf3061d GIT binary patch literal 6523 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 literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon152@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon152@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20b3bdf67b71712d2a15f8b7b3217d7a989a27ff GIT binary patch literal 8981 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 literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon180@3x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon180@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..11b972dd5169caa526144e60e20eb0c19e884b6a GIT binary patch literal 10742 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 literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon20@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..21320f1f5b4708a435c05a2898c611f17fc7c382 GIT binary patch literal 699 zcmV;s0!00ZP)`+z9QnL(PJ>YV7w~G;YKU?7W*DQI}5-6B;#SN8hYCz z#9hG>Wgr>j;i;W8h7EDoaQApEgULD^1NDy3v(KTk*~Y>{)!(+NVt|3J2D)1#0Hl`w z@nn3FWQ$Ah@H}sRWf6pq7MH=!dTt#F)3d*ZhOpn=@JybbkwtW+!-KI9-K`O>zxz$w zvuPYlxP7dS(Nvz-KbFvC7Q<6nKF#I1*&ZRhLuh|7&y5d%Nj8T#9J4@mr9)rGqAEqt zD`}!7Io1ll`Yc6HDR}<3!9QzMJ;qWQhJL2$@7Tq+YY7UTa_7qeM;jc@CtOq&R5{b^ zaI(qa(byuHqB3zMPXFmBBQtqMQw2~(oClMN2(}R}?5(9KV)N>InuVP5@?s5;lWWGK>|l hiuM((n^)GI{sU9)Hp}~EP455z002ovPDHLkV1o71IZglo literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x-1.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc918c35a3e2d8050fbc2d12cb76fd578154db6 GIT binary patch literal 1307 zcmV+$1?2jPP)`kVoeM!m5NFQ14U>0pqLQ=IhFs-)70mW)nd`TzP37?)?B&5X{GZ&9^u=OZJCSllm z0WC-+4Vy(5sX$c`5zKdKC=C*3J%-ZW!;updgl;8_OXH?~)w4 zbi_!R2M3{R(d#2m+H>d{cH^KOhb%#d38WNaEre((Cp3ZMM4 zz`u)n$0;RUpZ%tZ>SC*tC(v{%)s_`mhF|ETuhS#_H&az!K0VFI&AJH~1kaNQ?sRnu za5(Jk@Ol676%6%v(GdvWPnJ3OV~P1X93SeXuhV0^ROish9OKh<2J!(1wl3qL-VDbE z^E`IEhzJ~dw41@TSt<=UbG6F5=ga(4(I};)^V10h$oL-TURlGomAQl$f6mr9Ix){X z+w=Tds4oGz*Wbyu zl{v1@H`sOb8auzd#_uyV`g;Q2-kt~G&`-0JYt1M?6s6WsJ{Xw;;EgR^Y%KUp-fFPx z>ms|qDe?DwlP!1q46VyVLFbvMgZm2^0M1-l;OD7D#)=h&FE4--`j@6_PK3sWFBWSF z&rV&bFj}l}p;+U)zbXK1%KIiu05433iD`53*>#<4UY=z`Pr&mVx)RC;@a`W`>Lx{e3?lAKP?)j4+Q76-N$7%NtJ z;@EW-n_-{}fhU~ayON!&vV1W%&y#C%+?P*2V!Tx6so`lVO+^s=VDQcN0Gdr0zI=0f`oh-Be)OF5XU1a~}Zr1l?7+T-Sjrj%&JhCdsk*8O%V^x;vN|V>lmiTI- z%s?TazdK;Dp`5x>;q`Mf%vLpwJ|y?inA#+Yy1(y1;CWOXj~?jFadO{kmUkp06JV~| zWZ#LKoS&)@P6t_EXeu;_Cyj7|knG`64GTcKBH6 z;gMOU%FPxX(Fh|c!`TlnBr8%|!;T!zJ8fp4b~<9iv21Iv+fCxu7T04t2jPqzw&S!L zad32~-E+H?7v>tNE)sW>xWh#2xVdV(QMA^YQt2+0sJ*RYhxMhUf2KzeI~@=r)jDao zJvdN{i#V+<*`#Aw5>Vp6-a^OiCkjN#k(|=+%^u<9J+KU8qU4#IRs~nylqM)OX=LM=k++ RLHGaw002ovPDHLkV1l7vZV3PY literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc918c35a3e2d8050fbc2d12cb76fd578154db6 GIT binary patch literal 1307 zcmV+$1?2jPP)`kVoeM!m5NFQ14U>0pqLQ=IhFs-)70mW)nd`TzP37?)?B&5X{GZ&9^u=OZJCSllm z0WC-+4Vy(5sX$c`5zKdKC=C*3J%-ZW!;updgl;8_OXH?~)w4 zbi_!R2M3{R(d#2m+H>d{cH^KOhb%#d38WNaEre((Cp3ZMM4 zz`u)n$0;RUpZ%tZ>SC*tC(v{%)s_`mhF|ETuhS#_H&az!K0VFI&AJH~1kaNQ?sRnu za5(Jk@Ol676%6%v(GdvWPnJ3OV~P1X93SeXuhV0^ROish9OKh<2J!(1wl3qL-VDbE z^E`IEhzJ~dw41@TSt<=UbG6F5=ga(4(I};)^V10h$oL-TURlGomAQl$f6mr9Ix){X z+w=Tds4oGz*Wbyu zl{v1@H`sOb8auzd#_uyV`g;Q2-kt~G&`-0JYt1M?6s6WsJ{Xw;;EgR^Y%KUp-fFPx z>ms|qDe?DwlP!1q46VyVLFbvMgZm2^0M1-l;OD7D#)=h&FE4--`j@6_PK3sWFBWSF z&rV&bFj}l}p;+U)zbXK1%KIiu05433iD`53*>#<4UY=z`Pr&mVx)RC;@a`W`>Lx{e3?lAKP?)j4+Q76-N$7%NtJ z;@EW-n_-{}fhU~ayON!&vV1W%&y#C%+?P*2V!Tx6so`lVO+^s=VDQcN0Gdr0zI=0f`oh-Be)OF5XU1a~}Zr1l?7+T-Sjrj%&JhCdsk*8O%V^x;vN|V>lmiTI- z%s?TazdK;Dp`5x>;q`Mf%vLpwJ|y?inA#+Yy1(y1;CWOXj~?jFadO{kmUkp06JV~| zWZ#LKoS&)@P6t_EXeu;_Cyj7|knG`64GTcKBH6 z;gMOU%FPxX(Fh|c!`TlnBr8%|!;T!zJ8fp4b~<9iv21Iv+fCxu7T04t2jPqzw&S!L zad32~-E+H?7v>tNE)sW>xWh#2xVdV(QMA^YQt2+0sJ*RYhxMhUf2KzeI~@=r)jDao zJvdN{i#V+<*`#Aw5>Vp6-a^OiCkjN#k(|=+%^u<9J+KU8qU4#IRs~nylqM)OX=LM=k++ RLHGaw002ovPDHLkV1l7vZV3PY literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x-1.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..db726b23927d3fc06a39aab27e21134d8b007a11 GIT binary patch literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..db726b23927d3fc06a39aab27e21134d8b007a11 GIT binary patch literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..db726b23927d3fc06a39aab27e21134d8b007a11 GIT binary patch literal 1754 zcmV<01||84P)J$r7#_TkXhcgu4InCof?A-J7MwCOo$FaXoH^(0eJ(QtaWd(d-M#l( z|N7TuuYFX{<}m?ah$Uh6^>?F=_YbS}-33rH|WSUR(yFK!)Nj(%LBIB_vCN zvWQ_Wf_W=seN>!jE(yBSbxD}5X3RTtk+K5JTWu$UW_2j;;^Hipc^8Puyk~$W%ZS0C z|3e_pqYSm148ir{g@6Ox3f7(AVgsZO>i?*fZ7^>|12Jhg%TNr+HkiMVGGs*xjsv0x zc+)b}KJ%^0P*M<-C{TikLMZ{1BS0`#TfdzA(+=?j%aVSixr3i3+ER zwo8V)#grwEE>Vt5)p&{$=S&tM>F5i9M8bmHF}|R=8O4h?&Sw3R3>}u+AUGde;Irc; zUKq|dfHo92?Dy<+J?e;edW6PWP^j#iN2HxDCD`2z_9glBuK6sOm7v*Ys${eN%N#$Q zu5uyWkjlO>BF==rxi@3+M1ic7i@ z4BgSo^0^%VY&%xskzLcgwyK+luF8aDPt4e?`|=!z&ena9C{*V4!{WLynXnjsU?GEj zsaTh7+Lz639ra&;{Pe2^Dq6YN&8?W9Gz_+!rz2V~6m_lV z6NI`g1V6!(A*vg)CA`lTe?LG?ldU`>9Zz`upop+x-cBr zD+kgo&*bX|!tuPazk^4v&d_1O(%A`~yUut0zSC9XWKro?e-pPZr4kl(hV^GH_O8E(Iceua-F&dXrdyioHt=>oPLEwFL-89w~|8~~jO#V2d~oq8DPQu;F%LwC+& zPTI-CFOHXZ{)ZeNkIY2Mo-Els^i_^>-8Q-*m44+==p>n+P4eu@KGs~;MQ>+<-_KNd z|IjoaAI@V7%*!U(y?y};8nv=m6F&MQ&+vE|Tj09>G#duH=t()?&X#R%-TDuI%QsYV-Bq6<*(8U}DB8#YNh6;j(#Yw%>Cx1KH+BU9N1i zZs#OFPE_23Ekchn=5&x&^LvG#X~Ayz;AEMbhsM}4k|!d;5n$)>8E)A!&X42eP#H2W zQt|f}m3sMCkHHIly|Jh#$?8k9TrsDEgrykGRoOLGVziMw&0eFldhMc8n+{5R2h##% zR5-NR4Ydo>fAtY@>+(A1h-)L>)xdOHux0mU`8p!IZf&1=lDL930nIMb&F(M8H8Rp* zzYN8K46L^d>*GL57^Kd8=(xjG+>Ch%%OWhxGOmg-85^770hfea+LU>SW8OC)c;z)Ph^00`#uz05=0hO0 zeO9xKH3S>%_y)w6p(e5-j50uKOnVKhx1dEbM6wkbXFl_h$q)mw?H8Em1v1Kot&$;@ wdGi2h`U2BD&|~7PO``-tY!NWZ7&id_2W(*V99G+e>i_@%07*qoM6N<$f|M0ZWB>pF literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon50@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3424f05526a8e065c1046244d94694bab704b3b3 GIT binary patch literal 2458 zcmV;L31#+)P)<9{0WcvCrABv(LR} zB(dkmAulVC{5s7|T+gN}1?Wld}`!RYoKeZh>n4~7EDqJXglLI$kJ&`|juwuH!f!}U0GEo4|6x3L!^}e{yWOuRB^V_bIT~blgl)vygR1!&8)u zV47eYTkgy6qkstpq7kceZqG_RgtccUXiP@h2IfO)&ka~5z$wUIK$isb2sr-#c+{oHZJ zJp110PDI{F@7V-EO!^+ZII4mHh_L{ewbvxD>*HB$>PR8xK)Y%L9Dl!r zhfmMo$WTcHMb{4ijI$v017Hk#&>2+US>};Z(4}^J{k=K0PN^Y z;hEcWNV$?>S#SJLYsx{=k*4ak=NLkApAo~hl})&J%{<)FmIMPZT_(J8v4A~2lQ=b8 z^cZH?y>=eHusp3f+H)?O7&>z?+|`-Ft?fx6vwm>``!_UW=PQ%K{+d=7 zyVhiI+tLKGaRvg=J6geS&J^+2^F`DYe|ZUTFf4uG9C6m%XqYR0?a!KdTe7W?!KuR0B}vl)gt!vz_j+Tw6$jtz!>4FbF%`7!=Qn9_Iv^N z9GygsCq2G?V+sd0H2ZF2+wvsd9G&(ui0cmwjjLN^n#@)RkDs29qX7Z?UY|hN)i+jd zFs^W0L_q&oIaJRhr)N;D2_<-9pn%H-v4B+zTu;5!Zy6dDKj4oC>YSqp7#D@KXKl{% zG}pq_h{u3BnyBJTb=0$|4UGiCz?G8NkclyTQxrXSWar0np$@EC5EqKgcWQHJ^rLFK z?pd9YH9>^!D^h4p$X-{-dO>dXi|pB*d)#ub*_*H7jn|FP~ieCy`$$otoK|8WW3*QT+3rF`Dpdw3L2^iO-LMBmcR zk2iLt@VC#k3X>;4DB;o5Q+R6g!iF}VIbXncj^uq+VytrXahk_x*WnSoI5-`ui~v0N zuQ5D%CXf9+<66G&?`px9Z*1}eMX8JX?v5n>ut_ow0Q=s|+A=Oaxg?GDtP92%hG(jH^@AcVOjYadjq;0_eA!Zhp4ju2HZ+Dh9tuVp zHd!@?Mro#gAk0EG2TmIp$99%#Jx@~FGcONyr17T%wcetgQc4wi?wfn%HhnblZOP|I zK$+eI!d`=gC#0;YbC&OhZCnvHqaUQ(4if?8>^I8!s_v8uCdjG^#>Q&kl+p?&>e;gx z8r7)R2ctVmintAojaA)olT`u6U{$qm1LK6BugXYA1rw|{gn+5fYQS;Jk*f*Dku)pD zL}W~3zKoed;jBiF7!WN^H)a;shu5BU$5mUrYZ=PS zLKbUk?wj=x027_nM!6rBq9pY5wZPEG9XBIvv}ccUNtR;F!m1)@Wt9Sf2m_-AMGwS( Y0WgWycN}Ttv;Y7A07*qoM6N<$g4av5bN~PV literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon57@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc2dfd64bfa1fa9a3b1372cf41a9b351651a9f8 GIT binary patch literal 2974 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 X-|2njv+t6W00000NkvXXu0mjfQ@=6J literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon58@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1180065d65ad7f32288e11a3179dbabf20d81a2 GIT binary patch literal 2769 zcmV;?3NH1DP) zK~!jg)mm+ERYw_q_S~=Bo0}UF!lyKZR9ae#QV@%@s8FU;f(1L&I-}ER#~FVx9Xe&y zT9qGFsC6uY&^op4SbylyQO7ZAETYijk0PbTLV(g~$`D9vh9u;Jo8*RjbI5ZVg176^dz0TQmg3KFh`8^TY5he6&oRmR}95im%>3&SAqn%j~qRB*xt zL?Egc>pEAQ1TaL~h!_E}AsDh)=ffhwKysrY%Iig215rOXL=4i~hKltuNaUp2s$wPI zZs?lD%0zwl6~vMWLl6)FLoZgv@E9p#6M<&%A4`1P zI->lp;Lx{~iOS<6Tx=i=C!K43jIi`$i9Mqu>f7tY%0zwl6~vMmBXX`KlUOJi&b0-_ zSVuG<)<{&v@EuMl{b-1qFrua(E08+ig`w<35?g`jHK!j9(J+iC>BsVMWTJjMxpz%s z|JTzG4_zJ6pjcOchNuZcM>G(IA!4U0{RrDMiZ0ebl-Ex>{Y*u!6+@Z09t(;w8ODc6 zEWayaC{8AmepI5@nttL0fPnz=w&!jQk$>Vq1Tf~@A?H4~CFVAjF$fHdfS5(Nt1*qW z^HNwkGl7|D3l@OBF~X_-5?=kVh_=omiZ*dPFpsE%;eI$`nRgDM*pheZ;no8nMvg53 zEVK6<1&<*7Yw37JJnpD?i~)RQVFueiokL?y3}L0GU}N{mQM`C|6gCGR?JG^m6mB}sIs_k-He<|GNj{dLg^>& zjX&R*NwM9Si{a5*r{Rmu8O*JALU7=!jlW+gVDHI1+WU&mxOFl1uByXlXQu)pj$JCE zt#b?=L*pO<8f)UXyD^2;^HO3EV&SwnezhitFYO;h*&|O3jWrgwEY4tKQ_}4SptoS- zm98S5IeitK`7%T;1OgN043^&0;S62nI1>zb;HDb<>RmvheWY z40ha>jm%@m@(h}4ydIIoO4~HAa?7V`k%{|Hk^ubj^cAf7-G8wBF?obk|nPATJm(bQZCShz_mX&yv3E0y z7VyX|RsMu3OtNt|wY%#CXEJJOu9h7B`kg!;Io!wd_LIc1!xWnV`@NGZS}1A$-@(3O{a_RBX2 z6M{Qo-G4(h%=0m@AeRt2MiC4B&SgO^e5rWf^tEulS&0^~(Gnki+ zp)ni7cb8UU%i@e=bD*mz3`IZgSZdc$qxer&%#ChCYAIH`uHMpm#3Tbx{F;XHN=(>vC zCx&r)pv>FrwrQ?VZlM(m0G0*J&LohqfbNkpN+g>2OtYyN4%|BjOJ)RjFj30I{5bAv z?M3%!St9CPCu0n=GBJ$XKyRUpvUYFmsu1P@mfU%Um}ci9Pa5GndsS>rGKPIEv#{p6 ziS0>G_7!pe{yub%lmkSK2LWzHC9&?gt~~8as~{nv2No7W>JTyV#WFUucH_~*edrnW zL&{XH6m4ujHiR{Qxa5j-P^a>wktKJY;dgXT*11yBfoiKg#&B#?afVGFug2QO43^DG zVRm&43=BPmGEVgsaj0tyzwa19-W?03^rNc}9Iu3=FqVA!H0d^~(ZmLwm@u>g0vLjT zNsHBEXt!wygp8)%Yo=L+=rE-GNhS>5TJjx+L6GruDGUHC?O_;{mpO)9>k&0!=w4EV z9lr5;e)y)x(26o(cn$*Fw7`jjPOJu4he5syh`n1;EW$BNV#D73=(lM`v1Xzs44Ejr z5b&r?LaZx*+g8RPXtrtM;|_|IiB2T_sMCI6%z448MAcNi=n8DpjBly;;=BkDIZh>d{ZHz)lz&2J+*5d;K6 z#w1oHN_tzBD1~EaJH~+FHJ7$&q&Shq3eL6TLlB@4o$~Y}i49`tY=bX?6(=UKKuE5w zgmJCu$HgE6hE8nYZCWI;|A*BrNk=@?b4l79XR X-|2njv+t6W00000NkvXXu0mjfQ@=6J literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon60@3x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e976420cae27ac3529ed5a374921780aa04cc97 GIT binary patch literal 3008 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 Z{{@#|Pm%F9<-Gs^002ovPDHLkV1oTP@6-SQ literal 0 HcmV?d00001 diff --git a/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon76@1x.png b/Brand/Custom.xcassets/AppIcon.appiconset/nextcloud-icon76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..644b00d94947c53600d1e7cdd321bfde89d6d3a4 GIT binary patch literal 4054 zcmV;{4=M18P)^VksbB#@8F$z<^QwvOnBr7$9d2x!+Ju8Bhj;c1f~^L1!}P zyao)#6hl&Pkke3(sb)jzX7rL_G6sW;G9m0kQT*wCxJ?Lm8mEg zp@EZ4<}bWs5rODKnxxz0Ji^h@ZgA6PjG}bPH!1yhpB^eJ%Ui62%db|LBptY(kQr7Rd$$u9^sDl zAdLklK;ik3CiOcWAy1)u1Qn$umPVRnVF_i2NyGz5qij=L6kN%q5xJ8nJA`f{OPZoP zY}sLIY%*a)@d|Ci@T7(J2uHSL(k#g!(iq)g$_{A_lY=h=X=FkVa3TntwN`q7)AiEO zFO4)AydP;wzruwnpD&*@4jctT;FeQ%Fk!@!M!4WHK-hsVPbrjPDrv=IQyoY%ogPME zNISJI#WQ>X(2!3l*&9h@V=fb-UC0q_VTf71NJXgJFb)3v)q(h#Cn zW5Eef@VW;KPuZbI$8eM#PDloYk&up6Fl1CH(uj$QToAaEEjysu$dab$wn;N(2{&Wu zq`CGnYXUiSGNgs~2uHRY(ij^x(iq)B2>MK)>es^v@@E**1gIQG+K4GT5BF(U-;`O>+g6I`w+s(r2KoT&7 zyzS<4AuK(z-l#jhY=jF&Bh6(}vRCM&IXvp%9K8T0*O|C+W;HIIP>ETM6)=@8Q2_W? zUmlw}Gx)=v6yEL1NqQlH_am(c-j6gm7elpKz@be5M%C&zLHAzujaWF~OWEMHdf3fT zU_wn4tLE2X*^~rJl2_YyID;R)Ie_=Ob95f(%WvaY>DO#F6bOd$Wx%Lfy-)b>{JKB1 z-ECz;Lo>itD(k&rW;IqVs7Fmj2~0^XR{$P*KZ$$aO(O3sH99!SD8-}z(ufGvE0q=U zqOC8i08YB>Fd(qoywz#@CpbR1-ne zG;l0cz^DBMqzkHv^di!CFp58-bioGXOb1xYo3%im(_DeuKhuEACnZo9GiBX4Fp$Gj zdy-hQvmd=f1vm3rs;{1wz;}JfIy9Ka`u%Ba?i|9AQ~}unFg9Ug-q;wHO^IWAeUz2^ z!o*74J+~UG-brdnrmDigEoUci-Sjx7)#rLp6fwH^vfmd&8WD`F%b z-YaxAK?Gx_fqNG<;hVGT0vG7+bOGOa{W#X|PdVzEt0H)BMT(Nhxf?r==bUT**_Id{T~ddZDt)}%1c2w-hH%IB zL2G`B9iZHpt{}hm#3Ke?{L(mldrmM}0MHmW@zm1MxOrBMqi*H-^(M`Ou^MBv1#5f3hEMC*h&8sjEzIJ;UKlgbHPyWu$AJ(huAl93nf zj$|I!Z0N?}!Gfl5;kXzs98-aFnj&~~NgblWT#W`R4qA{li{3WA?)|V)U74! z_|l10STUofw3)4D8o-*18*$xPHHa~;`STrpc<1O)aAu|-IF!ue_N^z_Ij=u6fz^xZ zq|8}bTY7p7S5A)kW>6#X&?oL0rKWoID-&?hxVWacCtbkL-s-_yM}|;UVd9$U)wtp8 zTD95%0Avb6BdjY`z^o@bk#fS&P?ilnJE`m1#w(j~{^$y#w;hwp)VtF zZgUiO&8=eB!?wOW=B@4Ztkr1hkuv6KwNcDt$m$%(VbSv)IFige#=m|rg;&~Bcw*@o zZ9L~)Fa3KEsjQGlVeUbddt3Kzr+ECQwv`&w6D@Ngr zdYV0_)kQG7F@g`f^AIv=7B{ByoWOCxg)IrzWA55=9ES(;mXsStFSaG|!oDPLvC_77 z4nbX5Y2gge5S3=LKDKsdLd~_gGlSoKl+vDd^rQvu*xt{|%pYrA2&TX_-6e~X)>1>6 zw?}OFGzl4*yq*5ir-PwDbSCre3RT7?3j}azP|ucJ`}+aw;z*g!R=Bk@i)2=4G9sE%fcFE*KL&CWDyzD}lBSD`Xxj&YjQG@5cI6kytYCAfZ$78$tvGT$Ot?%wPy79