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..122002a703 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,151 @@ +variables: + outputDirPath: "./build/sym" + IPA_PATH: "${outputDirPath}/${scheme}.ipa" + DSYM_PATH: "*.dSYM.zip" + scheme: "Nextcloud" + dev_configuration: "Alpha" + 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 + - gem install fastlane --user-install + - 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 Alpha -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/Alpha/File_Provider_Extension.entitlements b/Brand/Alpha/File_Provider_Extension.entitlements new file mode 100755 index 0000000000..2078b93e0e --- /dev/null +++ b/Brand/Alpha/File_Provider_Extension.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/File_Provider_Extension.plist b/Brand/Alpha/File_Provider_Extension.plist new file mode 100755 index 0000000000..c3068c30cc --- /dev/null +++ b/Brand/Alpha/File_Provider_Extension.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 + + NSExtensionFileProviderDocumentGroup + group.com.viseven.ionos.easystorage + NSExtensionFileProviderSupportsEnumeration + + NSExtensionFileProviderSupportsPickingFolders + + NSExtensionPointIdentifier + com.apple.fileprovider-nonui + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).FileProviderExtension + + + diff --git a/Brand/Alpha/File_Provider_Extension_UI.entitlements b/Brand/Alpha/File_Provider_Extension_UI.entitlements new file mode 100644 index 0000000000..2078b93e0e --- /dev/null +++ b/Brand/Alpha/File_Provider_Extension_UI.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/File_Provider_Extension_UI.plist b/Brand/Alpha/File_Provider_Extension_UI.plist new file mode 100644 index 0000000000..cdaaf4dd7a --- /dev/null +++ b/Brand/Alpha/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/Alpha/Notification_Service_Extension.entitlements b/Brand/Alpha/Notification_Service_Extension.entitlements new file mode 100644 index 0000000000..2e5c24b65c --- /dev/null +++ b/Brand/Alpha/Notification_Service_Extension.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/Notification_Service_Extension.plist b/Brand/Alpha/Notification_Service_Extension.plist new file mode 100644 index 0000000000..7cba1da5f6 --- /dev/null +++ b/Brand/Alpha/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/Alpha/Share.entitlements b/Brand/Alpha/Share.entitlements new file mode 100755 index 0000000000..2e5c24b65c --- /dev/null +++ b/Brand/Alpha/Share.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/Share.plist b/Brand/Alpha/Share.plist new file mode 100755 index 0000000000..248b825a4d --- /dev/null +++ b/Brand/Alpha/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/Alpha/Widget.entitlements b/Brand/Alpha/Widget.entitlements new file mode 100644 index 0000000000..2e5c24b65c --- /dev/null +++ b/Brand/Alpha/Widget.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/Widget.plist b/Brand/Alpha/Widget.plist new file mode 100644 index 0000000000..d4e598ee31 --- /dev/null +++ b/Brand/Alpha/Widget.plist @@ -0,0 +1,16 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/Brand/Alpha/WidgetDashboardIntentHandler.entitlements b/Brand/Alpha/WidgetDashboardIntentHandler.entitlements new file mode 100644 index 0000000000..2e5c24b65c --- /dev/null +++ b/Brand/Alpha/WidgetDashboardIntentHandler.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)com.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/WidgetDashboardIntentHandler.plist b/Brand/Alpha/WidgetDashboardIntentHandler.plist new file mode 100644 index 0000000000..9b9988eb82 --- /dev/null +++ b/Brand/Alpha/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/Alpha/iOSClient.entitlements b/Brand/Alpha/iOSClient.entitlements new file mode 100755 index 0000000000..e564d0c656 --- /dev/null +++ b/Brand/Alpha/iOSClient.entitlements @@ -0,0 +1,28 @@ + + + + + aps-environment + development + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.com.viseven.ionos.easystorage + + 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.viseven.ionos.easystorage + + + diff --git a/Brand/Alpha/iOSClient.plist b/Brand/Alpha/iOSClient.plist new file mode 100755 index 0000000000..ef1fd63940 --- /dev/null +++ b/Brand/Alpha/iOSClient.plist @@ -0,0 +1,199 @@ + + + + + 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 + + LSMinimumSystemVersion + 12.3 + 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 + + 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/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/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/LaunchScreen.storyboard b/Brand/LaunchScreen.storyboard index 26840f6195..98ab5fbb66 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-IONOS.swift b/Brand/NCBrand-IONOS.swift new file mode 100644 index 0000000000..ca43e440c2 --- /dev/null +++ b/Brand/NCBrand-IONOS.swift @@ -0,0 +1,165 @@ +// +// NCBrand-IONOS.swift +// Nextcloud +// +// Created by Mariia Perehozhuk on 26.06.2024. +// Copyright © 2024 STRATO GmbH +// + +import Foundation +import UIKit + +class NCBrandOptionsIONOS: NCBrandOptions, @unchecked Sendable { + + private let custom_brand = "IONOS HiDrive Next" + private let custom_textCopyrightNextcloudiOS = "HiDrive Next iOS %@ © 2025" + private let custom_loginBaseUrl = "https://storage.ionos.fr" + private let custom_privacy = "https://wl.hidrive.com/easy/ios/privacy.html" + private let custom_sourceCode = "https://wl.hidrive.com/easy/0181" + + + //MARK: - override custom values if not default (changed by Brander) + override var brand: String { + get { + if super.brand == "Nextcloud" { + return custom_brand + } + return super.brand + } + set { + super.brand = newValue + } + } + + override var textCopyrightNextcloudiOS: String { + get { + if super.textCopyrightNextcloudiOS == "Nextcloud Hydrogen for iOS %@ © 2025" { + return custom_textCopyrightNextcloudiOS + } + return super.textCopyrightNextcloudiOS + } + set { + super.textCopyrightNextcloudiOS = newValue + } + } + + override var loginBaseUrl: String { + get { + if super.loginBaseUrl == "https://cloud.nextcloud.com" { + return custom_loginBaseUrl + } + return super.loginBaseUrl + } + set { + super.loginBaseUrl = newValue + } + } + + override var privacy: String { + get { + if super.privacy == "https://nextcloud.com/privacy" { + return custom_privacy + } + return super.privacy + } + set { + super.privacy = newValue + } + } + + override var sourceCode: String { + get { + if super.sourceCode == "https://github.com/nextcloud/ios" { + return custom_brand + } + return super.sourceCode + } + set { + super.sourceCode = newValue + } + } + + //MARK: - + override init() { + super.init() + disable_intro = true + disable_request_login_url = true + disable_crash_service = true + +#if ALPHA + capabilitiesGroup = "group.com.viseven.ionos.easystorage" +#elseif BETA + capabilitiesGroup = "group.de.strato.ionos.easystorage.beta" +#elseif APPSTORE + capabilitiesGroup = "group.com.ionos.hidrivenext" +#else + capabilitiesGroup = "group.com.viseven.ionos.easystorage" +#endif + } +} + +extension NCBrandOptions { + var acknowloedgements: String { + "https://wl.hidrive.com/easy/0171" + } +} + +class NCBrandColorIONOS: NCBrandColor, @unchecked Sendable { + + static let ionosBrand = UIColor(red: 20.0 / 255.0, green: 116.0 / 255.0, blue: 196.0 / 255.0, alpha: 1.0) // BLUE IONOS : #1474C4 + + override func getElement(account: String?) -> UIColor { + if customer == UIColor(red: 0.0 / 255.0, green: 130.0 / 255.0, blue: 201.0 / 255.0, alpha: 1.0) { // default NC color + return NCBrandColorIONOS.ionosBrand + } + return super.getElement(account: account) + } +} + +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 + } + } + + var hudBackgroundColor: UIColor { + UIColor(resource: .AppBackground.main) + } + + var hudTextColor: UIColor { + UIColor(resource: .ListCell.title) + } +} diff --git a/Brand/NCBrand.swift b/Brand/NCBrand.swift index 0a3ba484a3..0a1c9dbe7f 100755 --- a/Brand/NCBrand.swift +++ b/Brand/NCBrand.swift @@ -26,11 +26,11 @@ 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 { - static let shared = NCBrandOptions() +class NCBrandOptions: @unchecked Sendable { + static let shared = NCBrandOptionsIONOS() var brand: String = "Nextcloud" var textCopyrightNextcloudiOS: String = "Nextcloud Hydrogen for iOS %@ © 2025" @@ -130,8 +130,8 @@ final class NCBrandOptions: @unchecked Sendable { } } -final class NCBrandColor: @unchecked Sendable { - static let shared = NCBrandColor() +class NCBrandColor: @unchecked Sendable { + static let shared = NCBrandColorIONOS() /// This is rewrited from customet theme, default is Nextcloud color /// 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..28c78a1b79 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -3,10 +3,30 @@ 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 */; }; + 0F9DB9BA2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9BB2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9BC2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9BD2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9BE2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9BF2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9C02DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9DB9C12DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */; }; + 0F9E787D2DD77EB8007980BF /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; + 0F9E787E2DD77EB8007980BF /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; + 0F9E787F2DD77ECE007980BF /* Custom.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F700222B1EC479840080073F /* Custom.xcassets */; }; + 0F9E78802DD77ECE007980BF /* Custom.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F700222B1EC479840080073F /* Custom.xcassets */; }; + 0F9E78812DD77F0A007980BF /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; + 0F9E78822DD77F0A007980BF /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42F5047F2C6F553D001AA432 /* Colors.xcassets */; }; 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 +35,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 +147,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 +181,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 +247,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 +256,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 +266,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 +364,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 +532,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 +667,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 +856,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 +893,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 +912,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 +1073,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 +1264,16 @@ /* 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 = ""; }; + 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCBrand-IONOS.swift"; 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 +1281,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 +1356,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 +1374,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 +1408,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 +1432,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 +1444,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 +1471,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 +1491,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 +1498,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 +1518,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 +1551,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 +1567,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 +1578,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 +1646,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 +1683,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 +1700,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 +1709,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 +1725,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 +1799,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 +1839,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 +1973,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 +2020,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 +2074,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 +2186,7 @@ AA3C85E92D36BBDE00F74F12 /* UITestBackend */, AA8E03DB2D2FBAAD00E7E89C /* DownloadLimitUITests.swift */, F3374A932D674454002A38F9 /* AssistantUITests.swift */, + F33D303D2D8B129600531D64 /* AutoUploadUITests.swift */, AA74AA962D3172CE00BE3458 /* UITestError.swift */, ); path = NextcloudUITests; @@ -2155,6 +2200,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 +2242,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 +2317,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 +2440,7 @@ AF2D7C7D2742559100ADF566 /* NCShareUserCell.swift */, AF93471727E2361E002537EE /* NCShareHeader.xib */, AF93471527E2361E002537EE /* NCShareHeader.swift */, + 42D34FD82D79A5B00020C106 /* ShareSearchField.swift */, AFCE353827E5DE0400FEA6C2 /* Shareable.swift */, AA8E03D92D2ED83300E7E89C /* TransientShare.swift */, ); @@ -2404,6 +2481,7 @@ isa = PBXGroup; children = ( F7346E2228B0FEBA006CE2D2 /* Assets.xcassets */, + FC930DC42CEDE33000C9B237 /* Colors.xcassets */, F72EA95528B7BAD100C88F0C /* Dashboard */, F72EA95628B7BAE700C88F0C /* Files */, F76DEE9A28F808BC0041B1C9 /* Lockscreen */, @@ -2411,6 +2489,7 @@ F75DD764290AB369002EB562 /* Intent */, F7346E2028B0FA3A006CE2D2 /* Widget-Brinding-header.h */, F7346E1528B0EF5C006CE2D2 /* Widget.swift */, + FC930DC62CEE377700C9B237 /* WidgetCommon.swift */, ); path = Widget; sourceTree = ""; @@ -2506,9 +2585,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 +2600,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 +2641,7 @@ children = ( F768820B2C0DD1E7001CF441 /* Settings */, F76882162C0DD1E7001CF441 /* AutoUpload */, + F389C9F32CEE381E00049762 /* SelectAlbum */, F768821C2C0DD1E7001CF441 /* Display */, F76882052C0DD1E7001CF441 /* Advanced */, F768821F2C0DD1E7001CF441 /* Helpers */, @@ -2615,6 +2696,7 @@ F76882162C0DD1E7001CF441 /* AutoUpload */ = { isa = PBXGroup; children = ( + F39A1EE12D0AF8A200DAD522 /* Albums.swift */, F76882172C0DD1E7001CF441 /* NCAutoUploadModel.swift */, F768821B2C0DD1E7001CF441 /* NCAutoUploadView.swift */, ); @@ -2701,7 +2783,6 @@ children = ( F7725A5F251F33BB00D125E0 /* NCFiles.storyboard */, F7725A5E251F33BB00D125E0 /* NCFiles.swift */, - F722133A2D40EF8C002F7438 /* NCFilesNavigationController.swift */, ); path = Files; sourceTree = ""; @@ -2752,7 +2833,6 @@ AF3FDCC12796ECC300710F60 /* NCTrash+CollectionView.swift */, F7E402322BA89551007E5609 /* NCTrash+Networking.swift */, F7E402302BA891EB007E5609 /* NCTrash+SelectTabBarDelegate.swift */, - F321DA892B71205A00DDA0E6 /* NCTrashSelectTabBar.swift */, ); path = Trash; sourceTree = ""; @@ -2841,8 +2921,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 +2934,6 @@ children = ( F717402B24F699A5000C87D5 /* NCFavorite.storyboard */, F717402C24F699A5000C87D5 /* NCFavorite.swift */, - F7A03E2E2D425A14007AA677 /* NCFavoriteNavigationController.swift */, ); path = Favorites; sourceTree = ""; @@ -2951,6 +3032,7 @@ F702F2FC25EE5D2C008F8E80 /* NYMnemonic */, F7D4BF2B2CA2E8D800A5E746 /* TOPasscodeViewController */, F76D364528A4F8BF00214537 /* NCActivityIndicator.swift */, + 422CA3EE2C932F7200241F29 /* AccountButtonFactory.swift */, F733598025C1C188002ABA72 /* NCAskAuthorization.swift */, F77C97382953131000FDDD09 /* NCCameraRoll.swift */, F765608E23BF813500765969 /* NCContentPresenter.swift */, @@ -2968,6 +3050,7 @@ F33EE6F12BF4C9B200CA1A51 /* PKCS12.swift */, F33918C32C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift */, F39170A82CB8201B006127BC /* FileAutoRenamer+Extensions.swift */, + 0F5219402DB8F7C000E57667 /* UIDevice+VirtualOrientation.swift */, ); path = Utility; sourceTree = ""; @@ -2994,6 +3077,7 @@ F7362A1E220C853A005101B5 /* LaunchScreen.storyboard */, F78E2D6429AF02DB0024D4F3 /* Database.swift */, F76B3CCD1EAE01BD00921AC9 /* NCBrand.swift */, + 0F9DB9B92DD2381B00E31A24 /* NCBrand-IONOS.swift */, ); path = Brand; sourceTree = ""; @@ -3061,7 +3145,6 @@ F3BB46502A39EC2D00461F6E /* Cells */, F7CB68992541676B0050EC94 /* NCMore.storyboard */, F73F537E1E929C8500F8678D /* NCMore.swift */, - F7A03E322D426115007AA677 /* NCMoreNavigationController.swift */, ); path = More; sourceTree = ""; @@ -3172,6 +3255,7 @@ F7E9C41320F4CA870040CF18 /* Transfers */ = { isa = PBXGroup; children = ( + 425AD0C22DB8CC040063F2ED /* TransfersListener.swift */, F760329D252F0F8E0015A421 /* NCTransferCell.swift */, F760329E252F0F8E0015A421 /* NCTransferCell.xib */, F74DE14225135B6800917068 /* NCTransfers.storyboard */, @@ -3196,7 +3280,7 @@ F7D60CAE2C941ACB008FBFDD /* NCMediaPinchGesture.swift */, F78B87E82B62550800C65ADC /* NCMediaDownloadThumbnail.swift */, F755CB3F2B8CB13C00CE27E9 /* NCMediaLayout.swift */, - F741C2232B6B9FD600E849BB /* NCMediaSelectTabBar.swift */, + 420113DB2D1303E00063BF54 /* NCMediaSelectTabBar.swift */, ); path = Media; sourceTree = ""; @@ -3237,7 +3321,6 @@ isa = PBXGroup; children = ( AA8E041E2D3114E200E7E89C /* README.md */, - F7B8B82F25681C3400967775 /* GoogleService-Info.plist */, F7C1CDD91E6DFC6F005D92BE /* Brand */, F7F67BAA1A24D27800EE80DA /* iOSClient */, F7F67BAB1A24D27800EE80DA /* Supporting Files */, @@ -3258,24 +3341,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 +3679,7 @@ F77B0F981D118A16002130FE /* Embed Foundation Extensions */, AFBFD01327551A54002244BC /* ShellScript */, F76DA934277B75710082465B /* Embed Frameworks */, + D5FE6AC22C88A5AC0071802E /* Run Script Firebase dSYM upload */, ); buildRules = ( ); @@ -3627,6 +3720,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 +3763,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 +3801,9 @@ F771E3CF20E2392D00AFB62D = { CreatedOnToolsVersion = 9.4.1; LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; }; F77B0DEB1D118A16002130FE = { LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.Push = { enabled = 1; @@ -3731,51 +3827,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 +3902,7 @@ F33EE6DF2BF4BDA500CA1A51 /* XCRemoteSwiftPackageReference "swift-nio-ssl" */, F33EE6EE2BF4C0FF00CA1A51 /* XCRemoteSwiftPackageReference "swift-nio" */, F7D4BF4E2CA2ECCB00A5E746 /* XCRemoteSwiftPackageReference "vlckit-spm" */, + F3374AEE2D78B01B002A38F9 /* XCRemoteSwiftPackageReference "swift-collections" */, ); productRefGroup = F7F67B9F1A24D27800EE80DA; projectDirPath = ""; @@ -3830,6 +3927,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 62A63F302C8AF7730048653E /* Colors.xcassets in Resources */, F7E4022F2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, F746EC53273906C50052598D /* NCViewCertificateDetails.storyboard in Resources */, ); @@ -3863,6 +3961,7 @@ F7490E8D29882F5B009DCE94 /* Custom.xcassets in Resources */, F7490E8E2988334A009DCE94 /* Localizable.strings in Resources */, F7E4022E2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, + 0F9E787E2DD77EB8007980BF /* Colors.xcassets in Resources */, AA517B812D660EFE00F8D37C /* Localizable.stringsdict in Resources */, F722F0112CFF569500065FB5 /* MainInterface.storyboard in Resources */, ); @@ -3872,6 +3971,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 */, @@ -3894,10 +3995,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0F9E78812DD77F0A007980BF /* Colors.xcassets in Resources */, 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 */, + 0F9E787F2DD77ECE007980BF /* Custom.xcassets in Resources */, F7346E2328B0FEBA006CE2D2 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3906,6 +4011,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0F9E787D2DD77EB8007980BF /* Colors.xcassets in Resources */, F7E4022D2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, F746EC52273906C40052598D /* NCViewCertificateDetails.storyboard in Resources */, ); @@ -3934,6 +4040,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 +4055,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 +4080,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 +4095,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 */, @@ -4002,6 +4112,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0F9E78822DD77F0A007980BF /* Colors.xcassets in Resources */, + 0F9E78802DD77ECE007980BF /* Custom.xcassets in Resources */, F7E4022B2BA85D1D007E5609 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -4027,6 +4139,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 */ @@ -4066,6 +4197,7 @@ F749B64F297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */, F359D86D2A7D03420023F405 /* NCUtility+Exif.swift in Sources */, F73EF7AD2B0223900087E6E9 /* NCManageDatabase+Comments.swift in Sources */, + 0F9DB9BA2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, F7C9B9232B582F550064EA91 /* NCManageDatabase+SecurityGuard.swift in Sources */, F73EF7CD2B0225610087E6E9 /* NCManageDatabase+PhotoLibrary.swift in Sources */, F33918CA2C7CD8F2002D9AA1 /* FileNameValidator+Extensions.swift in Sources */, @@ -4103,6 +4235,7 @@ F372087D2BAB4C0F006B5430 /* TestConstants.swift in Sources */, F78E2D6C29AF02DB0024D4F3 /* Database.swift in Sources */, F7817CFE29801A3500FFBC65 /* Data+Extension.swift in Sources */, + 0F9DB9C02DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4122,6 +4255,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 +4308,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 */, @@ -4186,6 +4321,7 @@ F724377E2C10B92300C7C68D /* NCPermissions.swift in Sources */, F73EF7B42B0224350087E6E9 /* NCManageDatabase+DirectEditing.swift in Sources */, F7490E8229882C80009DCE94 /* NCManageDatabase+E2EE.swift in Sources */, + 0F9DB9BE2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, F7490E7829882C28009DCE94 /* NCUtility.swift in Sources */, F3E173C52C9B1067006D177A /* AwakeMode.swift in Sources */, F71433E62C778FFB00E20B5A /* NotificationCenter+MainThread.swift in Sources */, @@ -4203,6 +4339,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,12 +4362,15 @@ 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 */, F77C973A2953143A00FDDD09 /* NCCameraRoll.swift in Sources */, F740BEF02A35C2AD00E9B6D5 /* UILabel+Extension.swift in Sources */, F7C30E01291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */, + 0F9DB9BF2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, AF4BF61A27562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */, AF4BF615275629E20081CEEF /* NCManageDatabase+Account.swift in Sources */, F798F0E225880608000DAFFD /* UIColor+Extension.swift in Sources */, @@ -4293,6 +4433,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 */, @@ -4329,6 +4470,7 @@ files = ( F793E5A128B76541005E4B02 /* NotificationCenter+MainThread.swift in Sources */, F76DEE9928F808AF0041B1C9 /* LockscreenWidgetView.swift in Sources */, + 0F9DB9BC2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, F7817D0029802D3D00FFBC65 /* NCViewCertificateDetails.swift in Sources */, F78302F928B4C3E600B84583 /* NCManageDatabase+Account.swift in Sources */, F7E0710128B13BB00001B882 /* DashboardData.swift in Sources */, @@ -4341,6 +4483,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 */, @@ -4437,6 +4580,7 @@ F7817D0229802D7700FFBC65 /* NCViewCertificateDetails.swift in Sources */, F7434B3820E2400600417916 /* NCBrand.swift in Sources */, F7327E332B73A86700A462C7 /* NCNetworking+WebDAV.swift in Sources */, + 0F9DB9BD2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, F7411C572D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */, F724377F2C10B92400C7C68D /* NCPermissions.swift in Sources */, F785EE9E2461A09900B3F945 /* NCNetworking.swift in Sources */, @@ -4458,6 +4602,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 +4673,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 +4720,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 +4757,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 +4803,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 +4821,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 +4860,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 +4882,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 +4891,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 +4912,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 +4923,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 +4941,11 @@ 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 */, + 0F9DB9C12DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, D5B6AA7827200C7200D49C24 /* NCActivityTableViewCell.swift in Sources */, F745B253222D88AE00346520 /* NCLoginQRCode.swift in Sources */, F769454822E9F20D000A798A /* NCShareNetworking.swift in Sources */, @@ -4786,8 +4958,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 +4968,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 */, @@ -4865,6 +5040,7 @@ F7A8D73928F17E25008BBE1C /* NCManageDatabase+Metadata.swift in Sources */, F73EF7E92B0226B90087E6E9 /* NCManageDatabase+UserStatus.swift in Sources */, F73EF7B12B0224350087E6E9 /* NCManageDatabase+DirectEditing.swift in Sources */, + 0F9DB9BB2DD2381B00E31A24 /* NCBrand-IONOS.swift in Sources */, F343A4B52A1E084200DDA874 /* PHAsset+Extension.swift in Sources */, F72FD3B7297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */, F7A8D74128F18254008BBE1C /* UIColor+Extension.swift in Sources */, @@ -4998,53 +5174,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 +5189,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 +5203,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"; @@ -5165,157 +5214,1202 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 2C33C48723E2C475005F963B /* Debug */ = { + 0F8968702DD349B700810B87 /* Alpha */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Notification_Service_Extension.entitlements"; + 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 = 0; + DEBUG_INFORMATION_FORMAT = dwarf; + 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_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", - EXTENSION, - EXTENSION_NOTIFICATION_SERVICE, + DEBUG, + NC, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/Notification_Service_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.Notification-Service-Extension"; + 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 © 2025 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"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) NC DEBUG"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Alpha; + }; + 0F8968712DD349B700810B87 /* Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = IONOSAppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Alpha/iOSClient.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CURRENT_PROJECT_VERSION = 10; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/iOSClient.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage"; 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"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; TARGETED_DEVICE_FAMILY = "1,2"; + _EXPERIMENTAL_SWIFT_EXPLICIT_MODULES = NO; }; - name = Debug; + name = Alpha; }; - 2C33C48823E2C475005F963B /* Release */ = { + 0F8968722DD349B700810B87 /* Alpha */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Notification_Service_Extension.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/Alpha/Widget.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", EXTENSION, - EXTENSION_NOTIFICATION_SERVICE, + EXTENSION_WIDGET, ); - INFOPLIST_FILE = "$(SRCROOT)/Brand/Notification_Service_Extension.plist"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.Notification-Service-Extension"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/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; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Widget"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage 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_NOTIFICATION_SERVICE"; - SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Notification Service Extension/Notification_Service_Extension-Bridging-Header.h"; + 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"; }; - name = Release; + name = Alpha; }; - AF8ED1FF2757821000B8DBC4 /* Debug */ = { + 0F8968732DD349B700810B87 /* Alpha */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - ENABLE_HARDENED_RUNTIME = YES; + 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/Alpha//WidgetDashboardIntentHandler.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEBUG_INFORMATION_FORMAT = dwarf; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_WIDGETDASHBOARDINTENTHANDLER, + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/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; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.WidgetDashboardIntentHandler; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage WidgetDashboardIntentHandler"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage WidgetDashboardIntentHandler"; 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; + 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"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; }; - name = Debug; + name = Alpha; }; - AF8ED2002757821000B8DBC4 /* Release */ = { + 0F8968742DD349B700810B87 /* Alpha */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - ENABLE_HARDENED_RUNTIME = YES; + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Alpha/Share.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_SHARE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/Share.plist"; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.ionos.easystorage.Share; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Share"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage 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 = Alpha; + }; + 0F8968752DD349B700810B87 /* Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Alpha/File_Provider_Extension.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/File_Provider_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.File-Provider-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage File-Provider-Extension"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage 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 = Alpha; + }; + 0F8968762DD349B700810B87 /* Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Alpha/File_Provider_Extension_UI.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_FILE_PROVIDER_EXTENSION_UI, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/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 = "Ad Hoc Easy Storage File-Provider-Extension-UI"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "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 = Alpha; + }; + 0F8968772DD349B700810B87 /* Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Alpha/Notification_Service_Extension.entitlements"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_NOTIFICATION_SERVICE, + ); + INFOPLIST_FILE = "$(SRCROOT)/Brand/Alpha/Notification_Service_Extension.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.viseven.ionos.easystorage.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Ad Hoc Easy Storage Notification-Service-Extension"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Easy Storage Notification-Service-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_NOTIFICATION_SERVICE"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Notification Service Extension/Notification_Service_Extension-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Alpha; + }; + 0F8968782DD349B700810B87 /* Alpha */ = { + 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 = Alpha; + }; + 0F8968792DD349B700810B87 /* Alpha */ = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ""; + 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_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = 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 = Alpha; + }; + 0F89687A2DD349B700810B87 /* Alpha */ = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = INCLUDE_SOURCE; + 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_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; + }; + name = Alpha; + }; + 2C33C48723E2C475005F963B /* Debug */ = { + isa = XCBuildConfiguration; + 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"; + 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; + 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 = Debug; + }; + 2C33C48823E2C475005F963B /* Release */ = { + isa = XCBuildConfiguration; + 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"; + 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; + 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 = Release; + }; + AF8ED1FF2757821000B8DBC4 /* Debug */ = { + 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 = Debug; + }; + AF8ED2002757821000B8DBC4 /* Release */ = { + 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 = Release; + }; + C0046CE22A17B98400D87C9D /* Debug */ = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = INCLUDE_SOURCE; + 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_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; + }; + name = Debug; + }; + C0046CE32A17B98400D87C9D /* Release */ = { + 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; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C04E2F272A17BB4E001BAD85 /* Debug */ = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ""; + 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_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = 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 = Debug; + }; + C04E2F282A17BB4E001BAD85 /* Release */ = { + 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_INSTALL_OBJC_HEADER = YES; + 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; + }; + 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; + ASSETCATALOG_COMPILER_APPICON_NAME = IONOSAppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/iOSClient.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CURRENT_PROJECT_VERSION = 10; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6UU53QCET7; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NC, + ); + 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"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "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_OBJC_BRIDGING_HEADER = "$(SRCROOT)/iOSClient/Nextcloud-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Beta; + }; + D5C2D2142C9AC00B00E7579D /* Beta */ = { + 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/Beta/Widget.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_WIDGET, + ); + 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; + 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_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 = Beta; + }; + D5C2D2152C9AC00B00E7579D /* Beta */ = { + 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/Beta//WidgetDashboardIntentHandler.entitlements"; + CODE_SIGN_IDENTITY = "Apple 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/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_WIDGETDASHBOARDINTENTHANDLER"; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Beta; + }; + D5C2D2162C9AC00B00E7579D /* Beta */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/Beta/Share.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_SHARE, + ); + 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; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudTests; + 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 = IONOSAppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/iOSClient.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CURRENT_PROJECT_VERSION = 10; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 5TDLCVD243; + 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"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "AppStore com.ionos.hidrivenext"; 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; + 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"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; }; - name = Release; + name = AppStore; }; - C0046CE22A17B98400D87C9D /* Debug */ = { + D5C617982CABE20500105DC6 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 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; - 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; + CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/AppStore/Widget.entitlements"; + CODE_SIGN_IDENTITY = "Apple Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", "$(inherited)", + EXTENSION, + EXTENSION_WIDGET, ); - 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 = INCLUDE_SOURCE; + 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; - OTHER_CFLAGS = "-v"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudUITests.NextcloudUITests; + 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 = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + 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"; - TEST_HOST = "$(TEST_HOST)"; - TEST_TARGET_NAME = Nextcloud; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = AppStore; }; - C0046CE32A17B98400D87C9D /* Release */ = { + D5C617992CABE20500105DC6 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; + ALWAYS_SEARCH_USER_PATHS = YES; 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; @@ -5323,39 +6417,168 @@ 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; + 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"; - DEVELOPMENT_TEAM = NKUJUXUJ3B; ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + EXTENSION, + EXTENSION_WIDGETDASHBOARDINTENTHANDLER, + ); 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; + 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; - OTHER_CFLAGS = "-v"; + 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 = it.twsweb.NextcloudUITests.NextcloudUITests; + 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_EMIT_LOC_STRINGS = NO; SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(TEST_HOST)"; - TEST_TARGET_NAME = Nextcloud; - VALIDATE_PRODUCT = YES; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; }; - name = Release; + name = AppStore; }; - C04E2F272A17BB4E001BAD85 /* Debug */ = { + D5C6179F2CABE20500105DC6 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -5369,45 +6592,34 @@ 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); 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 = INCLUDE_SOURCE; + 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_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; + 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 = Debug; + name = AppStore; }; - C04E2F282A17BB4E001BAD85 /* Release */ = { + D5C617A02CABE20500105DC6 /* 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"; @@ -5417,10 +6629,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; @@ -5430,8 +6640,9 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-v"; OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.NextcloudIntegrationTests.NextcloudIntegrationTests; + PRODUCT_BUNDLE_IDENTIFIER = com.viseven.Nextcloud.NextcloudUITests.NextcloudUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -5441,17 +6652,20 @@ 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 = "$(BUILT_PRODUCTS_DIR)/Nextcloud.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Nextcloud"; + TEST_HOST = "$(TEST_HOST)"; + TEST_TARGET_NAME = Nextcloud; VALIDATE_PRODUCT = YES; }; - name = Release; + 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, @@ -5461,9 +6675,10 @@ 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"; + 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; @@ -5478,6 +6693,7 @@ 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, @@ -5487,9 +6703,9 @@ INFOPLIST_KEY_CFBundleDisplayName = "File Provider Extension UI"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "it.twsweb.Nextcloud.File-Provider-Extension-UI"; + 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; @@ -5504,15 +6720,17 @@ 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"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; + 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; @@ -5528,15 +6746,16 @@ 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"; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = it.twsweb.Nextcloud.Share; + 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 +6776,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 +6785,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 +6813,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 +6822,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 +6845,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 +6870,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; @@ -5667,14 +6894,17 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/Brand/iOSClient.entitlements"; - DEVELOPMENT_TEAM = NKUJUXUJ3B; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 10; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = R7V5Z67X53; 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; @@ -5690,14 +6920,15 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; 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 +6952,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 +6964,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 +6994,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 +7007,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 +7050,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 +7079,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 +7116,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 +7142,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; @@ -5925,7 +7161,10 @@ isa = XCConfigurationList; buildConfigurations = ( 2C33C48723E2C475005F963B /* Debug */, + 0F8968772DD349B700810B87 /* Alpha */, 2C33C48823E2C475005F963B /* Release */, + D5C2D2192C9AC00B00E7579D /* Beta */, + D5C6179D2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5934,7 +7173,10 @@ isa = XCConfigurationList; buildConfigurations = ( AF8ED1FF2757821000B8DBC4 /* Debug */, + 0F8968782DD349B700810B87 /* Alpha */, AF8ED2002757821000B8DBC4 /* Release */, + D5C2D21A2C9AC00B00E7579D /* Beta */, + D5C6179E2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5943,7 +7185,10 @@ isa = XCConfigurationList; buildConfigurations = ( C0046CE22A17B98400D87C9D /* Debug */, + 0F89687A2DD349B700810B87 /* Alpha */, C0046CE32A17B98400D87C9D /* Release */, + D5C2D21C2C9AC00B00E7579D /* Beta */, + D5C617A02CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5952,7 +7197,10 @@ isa = XCConfigurationList; buildConfigurations = ( C04E2F272A17BB4E001BAD85 /* Debug */, + 0F8968792DD349B700810B87 /* Alpha */, C04E2F282A17BB4E001BAD85 /* Release */, + D5C2D21B2C9AC00B00E7579D /* Beta */, + D5C6179F2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5961,7 +7209,10 @@ isa = XCConfigurationList; buildConfigurations = ( F70716EE2987F81600E72C1D /* Debug */, + 0F8968762DD349B700810B87 /* Alpha */, F70716EF2987F81600E72C1D /* Release */, + D5C2D2182C9AC00B00E7579D /* Beta */, + D5C6179C2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5970,7 +7221,10 @@ isa = XCConfigurationList; buildConfigurations = ( F7145A261D12E3B700CAFEEC /* Debug */, + 0F8968742DD349B700810B87 /* Alpha */, F7145A271D12E3B700CAFEEC /* Release */, + D5C2D2162C9AC00B00E7579D /* Beta */, + D5C6179A2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5979,7 +7233,10 @@ isa = XCConfigurationList; buildConfigurations = ( F7346E1D28B0EF5E006CE2D2 /* Debug */, + 0F8968722DD349B700810B87 /* Alpha */, F7346E1E28B0EF5E006CE2D2 /* Release */, + D5C2D2142C9AC00B00E7579D /* Beta */, + D5C617982CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5988,7 +7245,10 @@ isa = XCConfigurationList; buildConfigurations = ( F771E3F020E2392E00AFB62D /* Debug */, + 0F8968752DD349B700810B87 /* Alpha */, F771E3F120E2392E00AFB62D /* Release */, + D5C2D2172C9AC00B00E7579D /* Beta */, + D5C6179B2CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -5997,7 +7257,10 @@ isa = XCConfigurationList; buildConfigurations = ( F77B0F9B1D118A16002130FE /* Debug */, + 0F8968712DD349B700810B87 /* Alpha */, F77B0F9C1D118A16002130FE /* Release */, + D5C2D2132C9AC00B00E7579D /* Beta */, + D5C617972CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6006,7 +7269,10 @@ isa = XCConfigurationList; buildConfigurations = ( F7C9739B28F17132002C43E2 /* Debug */, + 0F8968732DD349B700810B87 /* Alpha */, F7C9739C28F17132002C43E2 /* Release */, + D5C2D2152C9AC00B00E7579D /* Beta */, + D5C617992CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6015,7 +7281,10 @@ isa = XCConfigurationList; buildConfigurations = ( F7F67BC91A24D27800EE80DA /* Debug */, + 0F8968702DD349B700810B87 /* Alpha */, F7F67BCA1A24D27800EE80DA /* Release */, + D5C2D2122C9AC00B00E7579D /* Beta */, + D5C617962CABE20500105DC6 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -6023,6 +7292,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 +7329,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 +7513,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"> - - + + + + + + + + + + @@ -161,7 +179,7 @@ buildConfiguration = "Debug"> 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..93d0bf89a2 100644 --- a/Share/NCShareExtension+DataSource.swift +++ b/Share/NCShareExtension+DataSource.swift @@ -106,10 +106,7 @@ extension NCShareExtension: UICollectionViewDataSource { setupDirectoryCell(cell, indexPath: indexPath, with: metadata) } - if metadata.favorite { - cell.imageFavorite.image = NCImageCache.shared.getImageFavorite() - } - + cell.imageFavorite.image = metadata.favorite ? NCImageCache.shared.getImageFavorite() : nil cell.imageSelect.isHidden = true cell.backgroundView = nil cell.hideButtonMore(true) @@ -139,11 +136,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 0000000000..7b099a3dfe Binary files /dev/null and b/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_CapalitiesView.DefaultPreviewConfiguration.heic differ 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 0000000000..d0c5ba1c50 Binary files /dev/null and b/Tests/NextcloudSnapshotTests/__Snapshots__/NextcloudSnapshotTests/test_HUDView.DefaultPreviewConfiguration.heic differ 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..fb313371a2 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/ButtonBackground.colorset/Contents.json b/iOSClient/Colors.xcassets/Transfers/ButtonBackground.colorset/Contents.json new file mode 100644 index 0000000000..a50911a940 --- /dev/null +++ b/iOSClient/Colors.xcassets/Transfers/ButtonBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xBE", + "green" : "0x72", + "red" : "0x36" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD1", + "green" : "0x94", + "red" : "0x50" + } + }, + "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..2ee4bbf8f8 --- /dev/null +++ b/iOSClient/Components/Buttons/ButtonStyleGuide.swift @@ -0,0 +1,208 @@ +// +// 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() + } +} + +// MARK SaveButtonStyle +struct SaveButtonStyle: 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 { + isEnabled ? Color(.Button.Primary.Background.selected) : 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 == SaveButtonStyle { + static var saveButton: 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/GUI/NCHud.swift b/iOSClient/GUI/NCHud.swift index 32a9f75cf5..1d388ce709 100644 --- a/iOSClient/GUI/NCHud.swift +++ b/iOSClient/GUI/NCHud.swift @@ -13,7 +13,8 @@ import JGProgressHUD class NCHud: NSObject { private let hud = JGProgressHUD() private var view: UIView? - + private let dimColor = UIColor.black.withAlphaComponent(0.4) + public init(_ view: UIView? = nil) { if let view { self.view = view @@ -28,6 +29,8 @@ class NCHud: NSObject { } self.hud.indicatorView = JGProgressHUDIndicatorView() + self.hud.backgroundColor = self.dimColor + self.hud.contentView.backgroundColor = NCBrandColor.shared.hudBackgroundColor self.hud.textLabel.text = text self.hud.textLabel.textColor = NCBrandColor.shared.iconImageColor @@ -60,7 +63,10 @@ class NCHud: NSObject { let indicatorView = self.hud.indicatorView as? JGProgressHUDRingIndicatorView indicatorView?.ringWidth = 1.5 indicatorView?.ringColor = NCBrandColor.shared.iconImageColor - + indicatorView?.ringBackgroundColor = NCBrandColor.shared.iconImageColor2 + + self.hud.backgroundColor = self.dimColor + self.hud.contentView.backgroundColor = NCBrandColor.shared.hudBackgroundColor self.hud.textLabel.text = text self.hud.textLabel.textColor = NCBrandColor.shared.iconImageColor 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 0000000000..6021496449 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic.png differ 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 0000000000..06b658f763 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x-1.png differ diff --git a/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x.png b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x.png new file mode 100644 index 0000000000..635addc77c Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByAlphabetic.imageset/MenuGroupByAlphabetic@3x.png differ 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 0000000000..336b9c51b4 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate.png differ diff --git a/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@2x.png b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@2x.png new file mode 100644 index 0000000000..74e1ebfa6a Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@2x.png differ 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 0000000000..2fe97b2405 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByDate.imageset/MenuGroupByDate@3x.png differ 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 0000000000..6b04ce66ba Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile.png differ 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 0000000000..3b31a4482a Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@2x.png differ diff --git a/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@3x.png b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@3x.png new file mode 100644 index 0000000000..a90dfd79eb Binary files /dev/null and b/iOSClient/Images.xcassets/MenuGroupByFile.imageset/MenuGroupByFile@3x.png differ 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 0000000000..a35bd06791 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName.png differ diff --git a/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@2x.png b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@2x.png new file mode 100644 index 0000000000..56c20ff42b Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@2x.png differ diff --git a/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@3x.png b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@3x.png new file mode 100644 index 0000000000..507d4b99d0 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrderByFileName.imageset/MenuOrderByFileName@3x.png differ 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 0000000000..26cc076d0b Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@2x.png b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@2x.png new file mode 100644 index 0000000000..e5bcfd733c Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@2x.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@3x.png b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@3x.png new file mode 100644 index 0000000000..b59790550a Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdeyByDate.imageset/MenuOrdeyByDate@3x.png differ 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 0000000000..2314f6244a Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente.png differ 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 0000000000..075545e1ae Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@2x.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@3x.png b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@3x.png new file mode 100644 index 0000000000..62112d98c9 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoAscendente.imageset/MenuOrdinamentoAscendente@3x.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/Contents.json b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/Contents.json new file mode 100644 index 0000000000..393a100166 --- /dev/null +++ b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "MenuOrdinamentoDiscendente.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MenuOrdinamentoDiscendente@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MenuOrdinamentoDiscendente@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente.png b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente.png new file mode 100644 index 0000000000..edbddbffc3 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@2x.png b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@2x.png new file mode 100644 index 0000000000..f698700156 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@2x.png differ diff --git a/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@3x.png b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@3x.png new file mode 100644 index 0000000000..d53cff0361 Binary files /dev/null and b/iOSClient/Images.xcassets/MenuOrdinamentoDiscendente.imageset/MenuOrdinamentoDiscendente@3x.png differ 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 0000000000..3bc239ccf9 Binary files /dev/null and b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall.png differ 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 0000000000..485b92a256 Binary files /dev/null and b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@2x.png differ diff --git a/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@3x.png b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@3x.png new file mode 100644 index 0000000000..fa487ba8ea Binary files /dev/null and b/iOSClient/Images.xcassets/WiFiSmall.imageset/WiFiSmall@3x.png differ 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 0000000000..d8967d1de6 Binary files /dev/null and b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify.png differ 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 0000000000..17b56ef130 Binary files /dev/null and b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@2x.png differ diff --git a/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@3x.png b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@3x.png new file mode 100644 index 0000000000..f6a3f257db Binary files /dev/null and b/iOSClient/Images.xcassets/actionSheetModify.imageset/actionSheetModify@3x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeFailure.imageset/Contents.json b/iOSClient/Images.xcassets/activityTypeFailure.imageset/Contents.json new file mode 100644 index 0000000000..85b2321170 --- /dev/null +++ b/iOSClient/Images.xcassets/activityTypeFailure.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "activityTypeFailure.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "activityTypeFailure@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "activityTypeFailure@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure.png b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure.png new file mode 100644 index 0000000000..1d37484fd7 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure.png differ diff --git a/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@2x.png b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@2x.png new file mode 100644 index 0000000000..69be6ad1b1 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@2x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@3x.png b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@3x.png new file mode 100644 index 0000000000..770e66bc5a Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeFailure.imageset/activityTypeFailure@3x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeInfo.imageset/Contents.json b/iOSClient/Images.xcassets/activityTypeInfo.imageset/Contents.json new file mode 100644 index 0000000000..273f51bf48 --- /dev/null +++ b/iOSClient/Images.xcassets/activityTypeInfo.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "activityTypeInfo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "activityTypeInfo@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "activityTypeInfo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo.png b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo.png new file mode 100644 index 0000000000..527ac1b7e9 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo.png differ 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 0000000000..6cb5f15a34 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@2x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@3x.png b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@3x.png new file mode 100644 index 0000000000..b361ee0b85 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfo.imageset/activityTypeInfo@3x.png differ 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 0000000000..72e74ae5b8 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer.png differ 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 0000000000..2bc1443c19 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@2x.png differ 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 0000000000..a48d98b9f4 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeInfoServer.imageset/activityTypeInfoServer@3x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeSuccess.imageset/Contents.json b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/Contents.json new file mode 100644 index 0000000000..d3c47f9815 --- /dev/null +++ b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "activityTypeSuccess.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "activityTypeSucces@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "activityTypeSuccess@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSucces@2x.png b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSucces@2x.png new file mode 100644 index 0000000000..28e57fa267 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSucces@2x.png differ diff --git a/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png new file mode 100644 index 0000000000..f9c151a727 Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess.png differ 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 0000000000..6cfba6c4fd Binary files /dev/null and b/iOSClient/Images.xcassets/activityTypeSuccess.imageset/activityTypeSuccess@3x.png differ diff --git a/iOSClient/Images.xcassets/addFolderInfo.imageset/Contents.json b/iOSClient/Images.xcassets/addFolderInfo.imageset/Contents.json new file mode 100644 index 0000000000..5e57ccc831 --- /dev/null +++ b/iOSClient/Images.xcassets/addFolderInfo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "addFolderInfo.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/addFolderInfo.imageset/addFolderInfo.pdf b/iOSClient/Images.xcassets/addFolderInfo.imageset/addFolderInfo.pdf new file mode 100644 index 0000000000..e735795099 Binary files /dev/null and b/iOSClient/Images.xcassets/addFolderInfo.imageset/addFolderInfo.pdf differ diff --git a/iOSClient/Images.xcassets/lock.imageset/Contents.json b/iOSClient/Images.xcassets/application.imageset/Contents.json similarity index 83% rename from iOSClient/Images.xcassets/lock.imageset/Contents.json rename to iOSClient/Images.xcassets/application.imageset/Contents.json index b0c59c9baa..3b9c152375 100644 --- a/iOSClient/Images.xcassets/lock.imageset/Contents.json +++ b/iOSClient/Images.xcassets/application.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "lock-outline.svg", + "filename" : "application.pdf", "idiom" : "universal" } ], diff --git a/iOSClient/Images.xcassets/application.imageset/application.pdf b/iOSClient/Images.xcassets/application.imageset/application.pdf new file mode 100644 index 0000000000..8260068619 Binary files /dev/null and b/iOSClient/Images.xcassets/application.imageset/application.pdf differ diff --git a/iOSClient/Images.xcassets/audioPlay.imageset/Contents.json b/iOSClient/Images.xcassets/audioPlay.imageset/Contents.json new file mode 100644 index 0000000000..0efd94c42a --- /dev/null +++ b/iOSClient/Images.xcassets/audioPlay.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "play.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/audioPlay.imageset/play.pdf b/iOSClient/Images.xcassets/audioPlay.imageset/play.pdf new file mode 100644 index 0000000000..54a7ce1700 Binary files /dev/null and b/iOSClient/Images.xcassets/audioPlay.imageset/play.pdf differ 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 0000000000..ddebfd8ceb Binary files /dev/null and b/iOSClient/Images.xcassets/circle.grid.cross.down.fill.imageset/sortCreatedDate.pdf differ 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 0000000000..0a500b1a47 Binary files /dev/null and b/iOSClient/Images.xcassets/circle.grid.cross.right.fill.imageset/sortUploadDate.pdf differ 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 0000000000..6736d87ad5 Binary files /dev/null and b/iOSClient/Images.xcassets/circle.grid.cross.up.fill.imageset/sortModifiedDate.pdf differ 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 0000000000..d9d96bea85 Binary files /dev/null and b/iOSClient/Images.xcassets/circle.imageset/checkedNo.pdf differ 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 0000000000..2ceae8c760 Binary files /dev/null and b/iOSClient/Images.xcassets/cityzip.imageset/cityzip.pdf differ 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 0000000000..5b391d1af6 Binary files /dev/null and b/iOSClient/Images.xcassets/closeCircle.imageset/closeCircle.pdf differ diff --git a/iOSClient/Images.xcassets/cloudDownload.imageset/Contents.json b/iOSClient/Images.xcassets/cloudDownload.imageset/Contents.json new file mode 100644 index 0000000000..63c1601220 --- /dev/null +++ b/iOSClient/Images.xcassets/cloudDownload.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "cloudDownload.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/cloudDownload.imageset/cloudDownload.pdf b/iOSClient/Images.xcassets/cloudDownload.imageset/cloudDownload.pdf new file mode 100644 index 0000000000..600f62feda Binary files /dev/null and b/iOSClient/Images.xcassets/cloudDownload.imageset/cloudDownload.pdf differ diff --git a/iOSClient/Images.xcassets/cloudUpload.imageset/Contents.json b/iOSClient/Images.xcassets/cloudUpload.imageset/Contents.json new file mode 100644 index 0000000000..8d7e531cd6 --- /dev/null +++ b/iOSClient/Images.xcassets/cloudUpload.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "cloudUpload.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/cloudUpload.imageset/cloudUpload.pdf b/iOSClient/Images.xcassets/cloudUpload.imageset/cloudUpload.pdf new file mode 100644 index 0000000000..a2db324c08 Binary files /dev/null and b/iOSClient/Images.xcassets/cloudUpload.imageset/cloudUpload.pdf differ 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 0000000000..d4b0623eb0 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_document.imageset/create_file_document@2x.png differ diff --git a/iOSClient/Images.xcassets/create_file_document.imageset/document_menu.png b/iOSClient/Images.xcassets/create_file_document.imageset/document_menu.png new file mode 100644 index 0000000000..de680454d4 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_document.imageset/document_menu.png differ diff --git a/iOSClient/Images.xcassets/create_file_document.imageset/document_menu@3x.png b/iOSClient/Images.xcassets/create_file_document.imageset/document_menu@3x.png new file mode 100644 index 0000000000..f300a8b58e Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_document.imageset/document_menu@3x.png differ 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 0000000000..80aac7f831 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_ppt.imageset/create_file_ppt@2x.png differ 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 0000000000..5287c637e7 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu.png differ diff --git a/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu@3x.png b/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu@3x.png new file mode 100644 index 0000000000..8407a73cb7 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_ppt.imageset/file_ppt_menu@3x.png differ diff --git a/iOSClient/Images.xcassets/create_file_xls.imageset/Contents.json b/iOSClient/Images.xcassets/create_file_xls.imageset/Contents.json new file mode 100644 index 0000000000..32339f608f --- /dev/null +++ b/iOSClient/Images.xcassets/create_file_xls.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "file_xls_menu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "create_file_xls@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "file_xls_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_xls.imageset/create_file_xls@2x.png b/iOSClient/Images.xcassets/create_file_xls.imageset/create_file_xls@2x.png new file mode 100644 index 0000000000..73458d7755 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_xls.imageset/create_file_xls@2x.png differ 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 0000000000..474a66c601 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu.png differ 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 0000000000..b959d7c9a8 Binary files /dev/null and b/iOSClient/Images.xcassets/create_file_xls.imageset/file_xls_menu@3x.png differ 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 0000000000..c7a4ff62f0 Binary files /dev/null and b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan.png differ 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 0000000000..d0b2037c59 Binary files /dev/null and b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@2x.png differ 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 0000000000..b6526408be Binary files /dev/null and b/iOSClient/Images.xcassets/deleteScan.imageset/deleteScan@3x.png differ diff --git a/iOSClient/Images.xcassets/disclosureIndicator.imageset/Contents.json b/iOSClient/Images.xcassets/disclosureIndicator.imageset/Contents.json new file mode 100644 index 0000000000..da15f89512 --- /dev/null +++ b/iOSClient/Images.xcassets/disclosureIndicator.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "disclosureIndicator@2x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/disclosureIndicator.imageset/disclosureIndicator@2x.png b/iOSClient/Images.xcassets/disclosureIndicator.imageset/disclosureIndicator@2x.png new file mode 100644 index 0000000000..7f4605655a Binary files /dev/null and b/iOSClient/Images.xcassets/disclosureIndicator.imageset/disclosureIndicator@2x.png differ diff --git a/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/Contents.json b/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/Contents.json new file mode 100644 index 0000000000..f3789cc3bb --- /dev/null +++ b/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "e2eReadPassphrase.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/e2eReadPassphrase.pdf b/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/e2eReadPassphrase.pdf new file mode 100644 index 0000000000..d0ef6af164 Binary files /dev/null and b/iOSClient/Images.xcassets/e2eReadPassphrase.imageset/e2eReadPassphrase.pdf differ diff --git a/iOSClient/Images.xcassets/favoriteSmall.imageset/Contents.json b/iOSClient/Images.xcassets/favoriteSmall.imageset/Contents.json new file mode 100644 index 0000000000..dbb4c2c5e1 --- /dev/null +++ b/iOSClient/Images.xcassets/favoriteSmall.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "videoFavoriteOn.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/favoriteSmall.imageset/videoFavoriteOn.pdf b/iOSClient/Images.xcassets/favoriteSmall.imageset/videoFavoriteOn.pdf new file mode 100644 index 0000000000..7b18400a76 Binary files /dev/null and b/iOSClient/Images.xcassets/favoriteSmall.imageset/videoFavoriteOn.pdf differ diff --git a/iOSClient/Images.xcassets/file_application.imageset/Contents.json b/iOSClient/Images.xcassets/file_application.imageset/Contents.json new file mode 100644 index 0000000000..31e255fd34 --- /dev/null +++ b/iOSClient/Images.xcassets/file_application.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_application.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_application.imageset/file_application.pdf b/iOSClient/Images.xcassets/file_application.imageset/file_application.pdf new file mode 100644 index 0000000000..987c78d183 Binary files /dev/null and b/iOSClient/Images.xcassets/file_application.imageset/file_application.pdf differ 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 0000000000..f892f149f9 Binary files /dev/null and b/iOSClient/Images.xcassets/file_audio.imageset/file_audio.pdf differ 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 0000000000..74613b5ac9 Binary files /dev/null and b/iOSClient/Images.xcassets/file_code.imageset/file_code.pdf differ 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 0000000000..3b01f096bc Binary files /dev/null and b/iOSClient/Images.xcassets/file_compress.imageset/file_compress.pdf differ 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 0000000000..700d307684 Binary files /dev/null and b/iOSClient/Images.xcassets/file_movie.imageset/file_movie.pdf differ 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 0000000000..1b754ff9af Binary files /dev/null and b/iOSClient/Images.xcassets/file_pdf.imageset/Untitled.pdf differ diff --git a/iOSClient/Images.xcassets/file_ppt.imageset/Contents.json b/iOSClient/Images.xcassets/file_ppt.imageset/Contents.json new file mode 100644 index 0000000000..312d432284 --- /dev/null +++ b/iOSClient/Images.xcassets/file_ppt.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "file_ppt.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/file_ppt.imageset/file_ppt.pdf b/iOSClient/Images.xcassets/file_ppt.imageset/file_ppt.pdf new file mode 100644 index 0000000000..ace5d3adfd Binary files /dev/null and b/iOSClient/Images.xcassets/file_ppt.imageset/file_ppt.pdf differ 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 0000000000..04dabb7faa Binary files /dev/null and b/iOSClient/Images.xcassets/file_txt.imageset/file_txt.pdf differ 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 0000000000..ec7222b8fc Binary files /dev/null and b/iOSClient/Images.xcassets/file_xls.imageset/file_xls.pdf differ diff --git a/iOSClient/Images.xcassets/folder.imageset/folder.svg b/iOSClient/Images.xcassets/folder.imageset/folder.svg deleted file mode 100644 index b3bf667783..0000000000 --- a/iOSClient/Images.xcassets/folder.imageset/folder.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - 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 0000000000..432ec04afa Binary files /dev/null and b/iOSClient/Images.xcassets/grid.imageset/Untitled.pdf differ 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 0000000000..cd3f50839c Binary files /dev/null and b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud.png differ diff --git a/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@2x.png b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@2x.png new file mode 100644 index 0000000000..5c9ab644cd Binary files /dev/null and b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@2x.png differ 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 0000000000..4a9d396894 Binary files /dev/null and b/iOSClient/Images.xcassets/loginPassword.imageset/passwordNextcloud@3x.png differ 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 0000000000..d76926e7d6 Binary files /dev/null and b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud.png differ diff --git a/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@2x.png b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@2x.png new file mode 100644 index 0000000000..9c5853d14d Binary files /dev/null and b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@2x.png differ 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 0000000000..8450538e3d Binary files /dev/null and b/iOSClient/Images.xcassets/loginURL.imageset/baseurlNextcloud@3x.png differ 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 0000000000..95a6baaef1 Binary files /dev/null and b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud.png differ 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 0000000000..51bd35db1c Binary files /dev/null and b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@2x.png differ diff --git a/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@3x.png b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@3x.png new file mode 100644 index 0000000000..fd54f635e6 Binary files /dev/null and b/iOSClient/Images.xcassets/loginUser.imageset/userNextcloud@3x.png differ diff --git a/iOSClient/Images.xcassets/mediaPlay.imageset/Contents.json b/iOSClient/Images.xcassets/mediaPlay.imageset/Contents.json new file mode 100644 index 0000000000..db15d73769 --- /dev/null +++ b/iOSClient/Images.xcassets/mediaPlay.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "play.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/mediaPlay.imageset/play.png b/iOSClient/Images.xcassets/mediaPlay.imageset/play.png new file mode 100644 index 0000000000..9dfae947ea Binary files /dev/null and b/iOSClient/Images.xcassets/mediaPlay.imageset/play.png differ diff --git a/iOSClient/Images.xcassets/menuLogoUser.imageset/Contents.json b/iOSClient/Images.xcassets/menuLogoUser.imageset/Contents.json new file mode 100644 index 0000000000..02f557bf47 --- /dev/null +++ b/iOSClient/Images.xcassets/menuLogoUser.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "menuLogoUser.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menuLogoUser@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menuLogoUser@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser.png b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser.png new file mode 100644 index 0000000000..1d1ca01288 Binary files /dev/null and b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser.png differ 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 0000000000..7dbcfa2767 Binary files /dev/null and b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@2x.png differ diff --git a/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@3x.png b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@3x.png new file mode 100644 index 0000000000..40ed64e0ab Binary files /dev/null and b/iOSClient/Images.xcassets/menuLogoUser.imageset/menuLogoUser@3x.png differ 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 0000000000..a63fd72eaf Binary files /dev/null and b/iOSClient/Images.xcassets/moreBig.imageset/moreBig.png differ 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 0000000000..4dda5c1668 Binary files /dev/null and b/iOSClient/Images.xcassets/moreBig.imageset/moreBig@2x.png differ diff --git a/iOSClient/Images.xcassets/moreBig.imageset/moreBig@3x.png b/iOSClient/Images.xcassets/moreBig.imageset/moreBig@3x.png new file mode 100644 index 0000000000..1652e91f3b Binary files /dev/null and b/iOSClient/Images.xcassets/moreBig.imageset/moreBig@3x.png differ 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 0000000000..f06ecbf37c Binary files /dev/null and b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty.png differ 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 0000000000..b004371d02 Binary files /dev/null and b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@2x.png differ diff --git a/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@3x.png b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@3x.png new file mode 100644 index 0000000000..9ff7153798 Binary files /dev/null and b/iOSClient/Images.xcassets/moreEmpty.imageset/moreEmpty@3x.png differ 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 0000000000..4440d0415f Binary files /dev/null and b/iOSClient/Images.xcassets/navigationMore.imageset/more-round.png differ diff --git a/iOSClient/Images.xcassets/folder_public.imageset/Contents.json b/iOSClient/Images.xcassets/navigationSort.imageset/Contents.json similarity index 86% rename from iOSClient/Images.xcassets/folder_public.imageset/Contents.json rename to iOSClient/Images.xcassets/navigationSort.imageset/Contents.json index ce84569fca..30a6d892c1 100644 --- a/iOSClient/Images.xcassets/folder_public.imageset/Contents.json +++ b/iOSClient/Images.xcassets/navigationSort.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "folder_link.svg", + "filename" : "Untitled.pdf", "idiom" : "universal" } ], diff --git a/iOSClient/Images.xcassets/navigationSort.imageset/Untitled.pdf b/iOSClient/Images.xcassets/navigationSort.imageset/Untitled.pdf new file mode 100644 index 0000000000..7d1fa8c47c Binary files /dev/null and b/iOSClient/Images.xcassets/navigationSort.imageset/Untitled.pdf differ diff --git a/iOSClient/Images.xcassets/networkInProgress.imageset/Contents.json b/iOSClient/Images.xcassets/networkInProgress.imageset/Contents.json new file mode 100644 index 0000000000..5cd67041ca --- /dev/null +++ b/iOSClient/Images.xcassets/networkInProgress.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "networkInProgress.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/networkInProgress.imageset/networkInProgress.pdf b/iOSClient/Images.xcassets/networkInProgress.imageset/networkInProgress.pdf new file mode 100644 index 0000000000..5441ff5fd7 Binary files /dev/null and b/iOSClient/Images.xcassets/networkInProgress.imageset/networkInProgress.pdf differ diff --git a/iOSClient/Images.xcassets/noPreview.imageset/Contents.json b/iOSClient/Images.xcassets/noPreview.imageset/Contents.json new file mode 100644 index 0000000000..05a0360065 --- /dev/null +++ b/iOSClient/Images.xcassets/noPreview.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "noPreview.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/noPreview.imageset/noPreview.pdf b/iOSClient/Images.xcassets/noPreview.imageset/noPreview.pdf new file mode 100644 index 0000000000..321ef3dab5 Binary files /dev/null and b/iOSClient/Images.xcassets/noPreview.imageset/noPreview.pdf differ 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 0000000000..4e5cb56cba Binary files /dev/null and b/iOSClient/Images.xcassets/noPreviewAudio.imageset/noPreviewAudio.pdf differ 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 0000000000..f710e31f4d Binary files /dev/null and b/iOSClient/Images.xcassets/noPreviewVideo.imageset/noPreviewVideo.pdf differ 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 0000000000..777d945c77 Binary files /dev/null and b/iOSClient/Images.xcassets/nonetwork.imageset/nonetwork.pdf differ 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 0000000000..1cd41c8713 Binary files /dev/null and b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic.png differ 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 0000000000..aed44f6548 Binary files /dev/null and b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@2x.png differ 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 0000000000..bd918083c6 Binary files /dev/null and b/iOSClient/Images.xcassets/notaMusic.imageset/notaMusic@3x.png differ diff --git a/iOSClient/Images.xcassets/offOutlineAudio.imageset/Contents.json b/iOSClient/Images.xcassets/offOutlineAudio.imageset/Contents.json new file mode 100644 index 0000000000..a3f76c948d --- /dev/null +++ b/iOSClient/Images.xcassets/offOutlineAudio.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/offOutlineAudio.imageset/Untitled.pdf b/iOSClient/Images.xcassets/offOutlineAudio.imageset/Untitled.pdf new file mode 100644 index 0000000000..bef40d5022 Binary files /dev/null and b/iOSClient/Images.xcassets/offOutlineAudio.imageset/Untitled.pdf differ 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 0000000000..e46da2947e Binary files /dev/null and b/iOSClient/Images.xcassets/offOutlineImage.imageset/image.pdf differ 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 0000000000..6174b23e81 Binary files /dev/null and b/iOSClient/Images.xcassets/offOutlineVideo.imageset/Untitled.pdf differ 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 0000000000..41a50a2571 Binary files /dev/null and b/iOSClient/Images.xcassets/passcode.imageset/passcode.png differ 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 0000000000..1a7859c3c8 Binary files /dev/null and b/iOSClient/Images.xcassets/passcode.imageset/passcode@2x.png differ diff --git a/iOSClient/Images.xcassets/passcode.imageset/passcode@3x.png b/iOSClient/Images.xcassets/passcode.imageset/passcode@3x.png new file mode 100644 index 0000000000..b83b8f904a Binary files /dev/null and b/iOSClient/Images.xcassets/passcode.imageset/passcode@3x.png differ diff --git a/iOSClient/Images.xcassets/pip.enter.imageset/Contents.json b/iOSClient/Images.xcassets/pip.enter.imageset/Contents.json new file mode 100644 index 0000000000..d737f573c8 --- /dev/null +++ b/iOSClient/Images.xcassets/pip.enter.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "pip.enter.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/pip.enter.imageset/pip.enter.svg b/iOSClient/Images.xcassets/pip.enter.imageset/pip.enter.svg new file mode 100644 index 0000000000..8fa725a8ba --- /dev/null +++ b/iOSClient/Images.xcassets/pip.enter.imageset/pip.enter.svg @@ -0,0 +1 @@ + \ 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 0000000000..cf4b343bee Binary files /dev/null and b/iOSClient/Images.xcassets/search.imageset/search.pdf differ 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 0000000000..037bb6d632 Binary files /dev/null and b/iOSClient/Images.xcassets/share.imageset/share.pdf differ 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 0000000000..7a8c5c9193 Binary files /dev/null and b/iOSClient/Images.xcassets/shareAdd.imageset/shareAdd.pdf differ diff --git a/iOSClient/Images.xcassets/shareFill.imageset/Contents.json b/iOSClient/Images.xcassets/shareFill.imageset/Contents.json new file mode 100644 index 0000000000..5d0e2aab26 --- /dev/null +++ b/iOSClient/Images.xcassets/shareFill.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/shareFill.imageset/share.pdf b/iOSClient/Images.xcassets/shareFill.imageset/share.pdf new file mode 100644 index 0000000000..8d7d8346e7 Binary files /dev/null and b/iOSClient/Images.xcassets/shareFill.imageset/share.pdf differ diff --git a/iOSClient/Images.xcassets/shareInternalLink.imageset/Contents.json b/iOSClient/Images.xcassets/shareInternalLink.imageset/Contents.json new file mode 100644 index 0000000000..f5b01a429b --- /dev/null +++ b/iOSClient/Images.xcassets/shareInternalLink.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "shareInternalLink.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/shareInternalLink.imageset/shareInternalLink.pdf b/iOSClient/Images.xcassets/shareInternalLink.imageset/shareInternalLink.pdf new file mode 100644 index 0000000000..12ca2227f5 Binary files /dev/null and b/iOSClient/Images.xcassets/shareInternalLink.imageset/shareInternalLink.pdf differ diff --git a/iOSClient/Images.xcassets/shareMenu.imageset/Contents.json b/iOSClient/Images.xcassets/shareMenu.imageset/Contents.json new file mode 100644 index 0000000000..f1879b92be --- /dev/null +++ b/iOSClient/Images.xcassets/shareMenu.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "shareMenu.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/shareMenu.imageset/shareMenu.pdf b/iOSClient/Images.xcassets/shareMenu.imageset/shareMenu.pdf new file mode 100644 index 0000000000..46c899f329 Binary files /dev/null and b/iOSClient/Images.xcassets/shareMenu.imageset/shareMenu.pdf differ diff --git a/iOSClient/Images.xcassets/shareMounted.imageset/Contents.json b/iOSClient/Images.xcassets/shareMounted.imageset/Contents.json new file mode 100644 index 0000000000..d24d893c57 --- /dev/null +++ b/iOSClient/Images.xcassets/shareMounted.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "shareMounted.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/iOSClient/Images.xcassets/shareMounted.imageset/shareMounted.pdf b/iOSClient/Images.xcassets/shareMounted.imageset/shareMounted.pdf new file mode 100644 index 0000000000..53c160d2c1 Binary files /dev/null and b/iOSClient/Images.xcassets/shareMounted.imageset/shareMounted.pdf differ 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 0000000000..6c262ee817 Binary files /dev/null and b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share.png differ diff --git a/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share@3x.png b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share@3x.png new file mode 100644 index 0000000000..56205c9bbf Binary files /dev/null and b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/share@3x.png differ 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 0000000000..1960d136df Binary files /dev/null and b/iOSClient/Images.xcassets/sharePhotoBrowser.imageset/sharePhotoBrowser@2x.png differ 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 0000000000..40caf0cbcf Binary files /dev/null and b/iOSClient/Images.xcassets/sharebylink.imageset/sharebylink.pdf differ 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 0000000000..0cfcc22aaa Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent.png differ diff --git a/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@2x.png b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@2x.png new file mode 100644 index 0000000000..fa7a1b3066 Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@2x.png differ 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 0000000000..114b84422a Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateLessRecent.imageset/sortDateLessRecent@3x.png differ diff --git a/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/Contents.json b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/Contents.json new file mode 100644 index 0000000000..16f652eaab --- /dev/null +++ b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortDateLess.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortDateLess@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortDateLess@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess.png b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess.png new file mode 100644 index 0000000000..8ab41141fc Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess.png differ diff --git a/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@2x.png b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@2x.png new file mode 100644 index 0000000000..6159e5e7b8 Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@2x.png differ diff --git a/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@3x.png b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@3x.png new file mode 100644 index 0000000000..b3312e3dbf Binary files /dev/null and b/iOSClient/Images.xcassets/sortDateMoreRecent.imageset/sortDateLess@3x.png differ diff --git a/iOSClient/Images.xcassets/sortFileNameAZ.imageset/Contents.json b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/Contents.json new file mode 100644 index 0000000000..ab8789256f --- /dev/null +++ b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortFileNameAZ.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortFileNameAZ@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortFileNameAZ@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ.png b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ.png new file mode 100644 index 0000000000..5e22268850 Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ.png differ diff --git a/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@2x.png b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@2x.png new file mode 100644 index 0000000000..30f013aac8 Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@2x.png differ diff --git a/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@3x.png b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@3x.png new file mode 100644 index 0000000000..df08fb5823 Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameAZ.imageset/sortFileNameAZ@3x.png differ diff --git a/iOSClient/Images.xcassets/sortFileNameZA.imageset/Contents.json b/iOSClient/Images.xcassets/sortFileNameZA.imageset/Contents.json new file mode 100644 index 0000000000..bd7d648b08 --- /dev/null +++ b/iOSClient/Images.xcassets/sortFileNameZA.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "sortFileNameZA.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sortFileNameZA@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "sortFileNameZA@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA.png b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA.png new file mode 100644 index 0000000000..e1824bb123 Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA.png differ diff --git a/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@2x.png b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@2x.png new file mode 100644 index 0000000000..f12f246d88 Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@2x.png differ 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 0000000000..d6fdf0031f Binary files /dev/null and b/iOSClient/Images.xcassets/sortFileNameZA.imageset/sortFileNameZA@3x.png differ 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 0000000000..f1bc9f749f Binary files /dev/null and b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest.png differ 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 0000000000..261ec9c26c Binary files /dev/null and b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@2x.png differ 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 0000000000..c48a7077d1 Binary files /dev/null and b/iOSClient/Images.xcassets/sortLargest.imageset/sortLargest@3x.png differ 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 0000000000..cee841c113 Binary files /dev/null and b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest.png differ diff --git a/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@2x.png b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@2x.png new file mode 100644 index 0000000000..c37faf3d0c Binary files /dev/null and b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@2x.png differ 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 0000000000..ff8333664a Binary files /dev/null and b/iOSClient/Images.xcassets/sortSmallest.imageset/sortSmallest@3x.png differ diff --git a/iOSClient/Images.xcassets/speaker0.imageset/Contents.json b/iOSClient/Images.xcassets/speaker0.imageset/Contents.json new file mode 100644 index 0000000000..cc93e05978 --- /dev/null +++ b/iOSClient/Images.xcassets/speaker0.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "speaker0.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg b/iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg new file mode 100644 index 0000000000..a70f4507ee --- /dev/null +++ b/iOSClient/Images.xcassets/speaker0.imageset/speaker0.svg @@ -0,0 +1,8 @@ + + + + + + + + \ 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 0000000000..ea4a54a7af Binary files /dev/null and b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload.png differ 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 0000000000..86523e479d Binary files /dev/null and b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@2x.png differ diff --git a/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@3x.png b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@3x.png new file mode 100644 index 0000000000..30b1858034 Binary files /dev/null and b/iOSClient/Images.xcassets/statusdownload.imageset/statusdownload@3x.png differ 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 0000000000..ec243f09c0 Binary files /dev/null and b/iOSClient/Images.xcassets/statuserror.imageset/statuserror.png differ 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 0000000000..83e5cb20f7 Binary files /dev/null and b/iOSClient/Images.xcassets/statuserror.imageset/statuserror@2x.png differ 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 0000000000..886dd8b538 Binary files /dev/null and b/iOSClient/Images.xcassets/statuserror.imageset/statuserror@3x.png differ 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 0000000000..95e89fae88 Binary files /dev/null and b/iOSClient/Images.xcassets/statusupload.imageset/statusupload.png differ 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 0000000000..6a22c8f3d1 Binary files /dev/null and b/iOSClient/Images.xcassets/statusupload.imageset/statusupload@2x.png differ 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 0000000000..8740be36ed Binary files /dev/null and b/iOSClient/Images.xcassets/statusupload.imageset/statusupload@3x.png differ 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 25f0cd639b..e9a6038f8e 100644 Binary files a/iOSClient/Images.xcassets/star.fill.imageset/tabBarFavorites.pdf and b/iOSClient/Images.xcassets/tabBarFiles.imageset/tabBarFiles.pdf differ diff --git a/iOSClient/Images.xcassets/tabBarMore.imageset/Contents.json b/iOSClient/Images.xcassets/tabBarMore.imageset/Contents.json new file mode 100644 index 0000000000..27f050f497 --- /dev/null +++ b/iOSClient/Images.xcassets/tabBarMore.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "tabBarMore.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/iOSClient/Images.xcassets/media.imageset/tabBarMedia.pdf b/iOSClient/Images.xcassets/tabBarMore.imageset/tabBarMore.pdf similarity index 96% rename from iOSClient/Images.xcassets/media.imageset/tabBarMedia.pdf rename to iOSClient/Images.xcassets/tabBarMore.imageset/tabBarMore.pdf index 515ca27a10..9a950a9b28 100644 Binary files a/iOSClient/Images.xcassets/media.imageset/tabBarMedia.pdf and b/iOSClient/Images.xcassets/tabBarMore.imageset/tabBarMore.pdf differ 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 0000000000..c124efb15d Binary files /dev/null and b/iOSClient/Images.xcassets/talk-template.imageset/talk.png differ diff --git a/iOSClient/Images.xcassets/talk.imageset/Contents.json b/iOSClient/Images.xcassets/talk.imageset/Contents.json new file mode 100644 index 0000000000..9384b676cd --- /dev/null +++ b/iOSClient/Images.xcassets/talk.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "talk.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/talk.imageset/talk.png b/iOSClient/Images.xcassets/talk.imageset/talk.png new file mode 100644 index 0000000000..c124efb15d Binary files /dev/null and b/iOSClient/Images.xcassets/talk.imageset/talk.png differ diff --git a/iOSClient/Images.xcassets/talk_bar.imageset/Contents.json b/iOSClient/Images.xcassets/talk_bar.imageset/Contents.json new file mode 100644 index 0000000000..76ba0d1ebe --- /dev/null +++ b/iOSClient/Images.xcassets/talk_bar.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "talk.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "talk_bar 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "talk_bar 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/Images.xcassets/talk_bar.imageset/talk.png b/iOSClient/Images.xcassets/talk_bar.imageset/talk.png new file mode 100644 index 0000000000..ff9f79e531 Binary files /dev/null and b/iOSClient/Images.xcassets/talk_bar.imageset/talk.png differ 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 0000000000..f86c0a3574 Binary files /dev/null and b/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 1.png differ 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 0000000000..a1a2edcf07 Binary files /dev/null and b/iOSClient/Images.xcassets/talk_bar.imageset/talk_bar 2.png differ 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/IONOSAppIcon.appiconset/AppIcon.png b/iOSClient/IonosImages.xcassets/IONOSAppIcon.appiconset/AppIcon.png new file mode 100644 index 0000000000..32154cc06f Binary files /dev/null and b/iOSClient/IonosImages.xcassets/IONOSAppIcon.appiconset/AppIcon.png differ diff --git a/iOSClient/IonosImages.xcassets/IONOSAppIcon.appiconset/Contents.json b/iOSClient/IonosImages.xcassets/IONOSAppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..cefcc878e0 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOSAppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} 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/IONOSLogo.imageset/Contents.json b/iOSClient/IonosImages.xcassets/IONOSLogo.imageset/Contents.json new file mode 100644 index 0000000000..657215e93d --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOSLogo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "logo@3x 2.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOSLogo.imageset/logo@3x 2.png b/iOSClient/IonosImages.xcassets/IONOSLogo.imageset/logo@3x 2.png new file mode 100644 index 0000000000..1893643244 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/IONOSLogo.imageset/logo@3x 2.png differ 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..b660cbed40 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "data_protection@3x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection@3x.png b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection@3x.png new file mode 100644 index 0000000000..8da8586587 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/IONOS_icons/data_protection.imageset/data_protection@3x.png differ 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/gradientBackground.imageset/Contents.json b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/Contents.json new file mode 100644 index 0000000000..8d19a75c09 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "GradientBackgroundPhone.svg", + "idiom" : "iphone" + }, + { + "filename" : "GradientBackgroundPad.svg", + "idiom" : "ipad" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPad.svg b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPad.svg new file mode 100644 index 0000000000..195a4fb301 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPad.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg new file mode 100644 index 0000000000..af13dc0786 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/gradientBackground.imageset/GradientBackgroundPhone.svg @@ -0,0 +1,9 @@ + + + + + + + + + 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..a8eb66a529 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_by_link_folder@3x.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_by_link_folder 1@3x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1@3x.png b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1@3x.png new file mode 100644 index 0000000000..8701bb2aaa Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder 1@3x.png differ diff --git a/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder@3x.png b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder@3x.png new file mode 100644 index 0000000000..aa33bb469c Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/byLink.imageset/shared_by_link_folder@3x.png differ 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..90bde523be --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_internally_folder@3x.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_internally_folder 1@3x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1@3x.png b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1@3x.png new file mode 100644 index 0000000000..cd868857b8 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder 1@3x.png differ diff --git a/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder@3x.png b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder@3x.png new file mode 100644 index 0000000000..20a5a6f8a4 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/internally.imageset/shared_internally_folder@3x.png differ 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..aee486c017 --- /dev/null +++ b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "shared_with_me_folder@3x.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "shared_with_me_folder 1@3x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1@3x.png b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1@3x.png new file mode 100644 index 0000000000..67e197f719 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder 1@3x.png differ diff --git a/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder@3x.png b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder@3x.png new file mode 100644 index 0000000000..c1ffd21f46 Binary files /dev/null and b/iOSClient/IonosImages.xcassets/share/folder/withMe.imageset/shared_with_me_folder@3x.png differ 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..38b7146762 100644 --- a/iOSClient/Login/NCLogin.storyboard +++ b/iOSClient/Login/NCLogin.storyboard @@ -1,12 +1,11 @@ - + - - + + - @@ -18,129 +17,123 @@ - - - - - - + + - - - - - - - - - - - + + + + - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - + + - + + + @@ -164,11 +157,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..74b8b00821 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift @@ -27,6 +27,7 @@ import NextcloudKit import RealmSwift extension NCCollectionViewCommon: UICollectionViewDataSource { + func numberOfSections(in collectionView: UICollectionView) -> Int { return self.dataSource.numberOfSections() } @@ -104,13 +105,14 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { } } - /// Status - /// - if metadata.isLivePhoto { - cell.fileStatusImage?.image = utility.loadImage(named: "livephoto", colors: isLayoutPhoto ? [.white] : [NCBrandColor.shared.iconImageColor2]) - } else if metadata.isVideo { - cell.fileStatusImage?.image = utility.loadImage(named: "play.circle", colors: NCBrandColor.shared.iconImageMultiColors) - } + /// Status + /// + cell.fileStatusImage?.image = nil + if metadata.isLivePhoto { + cell.fileStatusImage?.image = utility.loadImage(named: "livephoto", colors: isLayoutPhoto ? [.white] : [NCBrandColor.shared.iconImageColor2]) + } else if metadata.isVideo { + cell.fileStatusImage?.image = utility.loadImage(named: "play.circle", colors: NCBrandColor.shared.iconImageMultiColors) + } /// Edit mode if fileSelect.contains(metadata.ocId) { @@ -126,6 +128,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 +265,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 +333,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 @@ -320,22 +345,15 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { } } + // image Favorite + cell.fileFavoriteImage?.image = metadata.favorite ? imageCache.getImageFavorite() : nil if metadata.favorite { - 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 { @@ -345,59 +363,42 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { cell.setButtonMore(image: imageCache.getImageButtonMore()) } - // Staus - if metadata.isLivePhoto { - cell.fileStatusImage?.image = utility.loadImage(named: "livephoto", colors: isLayoutPhoto ? [.white] : [NCBrandColor.shared.iconImageColor2]) - a11yValues.append(NSLocalizedString("_upload_mov_livephoto_", comment: "")) - } else if metadata.isVideo { - cell.fileStatusImage?.image = utility.loadImage(named: "play.circle", colors: NCBrandColor.shared.iconImageMultiColors) - } - switch metadata.status { - case NCGlobal.shared.metadataStatusWaitCreateFolder: - cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) - cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_create_folder_", comment: "") - case NCGlobal.shared.metadataStatusWaitFavorite: - cell.fileStatusImage?.image = utility.loadImage(named: "star.circle", colors: NCBrandColor.shared.iconImageMultiColors) - cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_favorite_", comment: "") - case NCGlobal.shared.metadataStatusWaitCopy: - cell.fileStatusImage?.image = utility.loadImage(named: "c.circle", colors: NCBrandColor.shared.iconImageMultiColors) - cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_copy_", comment: "") - case NCGlobal.shared.metadataStatusWaitMove: - cell.fileStatusImage?.image = utility.loadImage(named: "m.circle", colors: NCBrandColor.shared.iconImageMultiColors) - cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_move_", comment: "") - case NCGlobal.shared.metadataStatusWaitRename: - cell.fileStatusImage?.image = utility.loadImage(named: "a.circle", colors: NCBrandColor.shared.iconImageMultiColors) - cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_rename_", comment: "") - case NCGlobal.shared.metadataStatusWaitDownload: - cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) - case NCGlobal.shared.metadataStatusDownloading: - if #available(iOS 17.0, *) { - cell.fileStatusImage?.image = utility.loadImage(named: "arrowshape.down.circle", colors: NCBrandColor.shared.iconImageMultiColors) - } - case NCGlobal.shared.metadataStatusDownloadError, NCGlobal.shared.metadataStatusUploadError: - cell.fileStatusImage?.image = utility.loadImage(named: "exclamationmark.circle", colors: NCBrandColor.shared.iconImageMultiColors) - default: - 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)) - } - } + // Status + cell.fileStatusImage?.image = nil + + if metadata.isLivePhoto { + cell.fileStatusImage?.image = utility.loadImage(named: "livephoto", colors: isLayoutPhoto ? [.white] : [NCBrandColor.shared.iconImageColor2]) + a11yValues.append(NSLocalizedString("_upload_mov_livephoto_", comment: "")) + } else if metadata.isVideo { + cell.fileStatusImage?.image = utility.loadImage(named: "play.circle", colors: NCBrandColor.shared.iconImageMultiColors) + } + switch metadata.status { + case NCGlobal.shared.metadataStatusWaitCreateFolder: + cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_create_folder_", comment: "") + case NCGlobal.shared.metadataStatusWaitFavorite: + cell.fileStatusImage?.image = utility.loadImage(named: "star.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_favorite_", comment: "") + case NCGlobal.shared.metadataStatusWaitCopy: + cell.fileStatusImage?.image = utility.loadImage(named: "c.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_copy_", comment: "") + case NCGlobal.shared.metadataStatusWaitMove: + cell.fileStatusImage?.image = utility.loadImage(named: "m.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_move_", comment: "") + case NCGlobal.shared.metadataStatusWaitRename: + cell.fileStatusImage?.image = utility.loadImage(named: "a.circle", colors: NCBrandColor.shared.iconImageMultiColors) + cell.fileInfoLabel?.text = NSLocalizedString("_status_wait_rename_", comment: "") + case NCGlobal.shared.metadataStatusWaitDownload: + cell.fileStatusImage?.image = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: NCBrandColor.shared.iconImageMultiColors) + case NCGlobal.shared.metadataStatusDownloading: + if #available(iOS 17.0, *) { + cell.fileStatusImage?.image = utility.loadImage(named: "arrowshape.down.circle", colors: NCBrandColor.shared.iconImageMultiColors) + } + case NCGlobal.shared.metadataStatusDownloadError, NCGlobal.shared.metadataStatusUploadError: + cell.fileStatusImage?.image = utility.loadImage(named: "exclamationmark.circle", colors: NCBrandColor.shared.iconImageMultiColors) + default: + break + } // URL if metadata.classFile == NKCommon.TypeClassFile.url.rawValue { @@ -428,8 +429,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..056e354dc0 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,11 +39,11 @@ 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 { @@ -51,29 +52,21 @@ struct NCSettingsAdvancedView: View { Text(NSLocalizedString("_filenamemask_", comment: "")) } }, 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: { + } 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: "")) - }) - + } + }).applyGlobalFormSectionStyle() /// Remove from Camera Roll Section(content: { Toggle(NSLocalizedString("_remove_photo_CameraRoll_", comment: ""), isOn: $model.removeFromCameraRoll) @@ -81,26 +74,24 @@ struct NCSettingsAdvancedView: View { .onChange(of: model.removeFromCameraRoll) { _ in model.updateRemoveFromCameraRoll() } - }, footer: { - Text(NSLocalizedString("_remove_photo_CameraRoll_desc_", comment: "")) - }) + }).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 +105,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 +115,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 +138,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 +151,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 +160,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 +190,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,24 +206,24 @@ 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) - }) + .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))) } }) .tint(Color(UIColor.label)) @@ -252,11 +239,14 @@ struct NCSettingsAdvancedView: View { + Text("\n\n") ) - }) + .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..c6aefe72b1 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,231 @@ 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_") + .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..9a7fda64ff 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,26 @@ 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: "")) }) + .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 +76,25 @@ 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)) + .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)) + .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)) + .listRowBackground(Color.clear) + .lineSpacing(1) + }).applyGlobalFormSectionStyle() /// Calender & Contacts if !NCBrandOptions.shared.disable_mobileconfig { Section(content: { @@ -154,10 +102,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 +118,9 @@ struct NCSettingsView: View { Text(NSLocalizedString("_calendar_contacts_footer_warning_", comment: "")) Spacer() Text(NSLocalizedString("_calendar_contacts_footer_", comment: "")) - } + }.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 +128,28 @@ 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: "")) + } + } + }.applyGlobalFormSectionStyle() /// `Information` Section Section(header: Text(NSLocalizedString("_information_", comment: "")), content: { // Acknowledgements @@ -212,27 +157,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 +186,28 @@ 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: "")) } + }) + .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 +216,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..def0b71e9e 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 = metadata.isVideo ? .black : 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 @@ - + - diff --git a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift index 532292c49f..1157bcb197 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift @@ -579,7 +579,7 @@ extension NCViewerMediaPage: UIGestureRecognizerDelegate { var velocityCheck: Bool = false - if UIDevice.current.orientation.isLandscape { + if UIDevice.current.isVirtualOrientationLandscape { velocityCheck = velocity.x < 0 } else { velocityCheck = velocity.y < 0 diff --git a/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift b/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift index 3976f7a101..cb5fd17870 100644 --- a/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift +++ b/iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift @@ -76,7 +76,7 @@ class NCViewerPDF: UIViewController, NCViewerPDFSearchDelegate { navigationItem.rightBarButtonItem = UIBarButtonItem(image: NCImageCache.shared.getImageButtonMore(), style: .plain, target: self, action: #selector(self.openMenuMore)) } } - defaultBackgroundColor = pdfView.backgroundColor + defaultBackgroundColor = NCBrandColor.shared.appBackgroundColor view.backgroundColor = defaultBackgroundColor navigationController?.navigationBar.prefersLargeTitles = false @@ -113,7 +113,7 @@ class NCViewerPDF: UIViewController, NCViewerPDFSearchDelegate { ]) // MODAL - if self.navigationController?.presentingViewController != nil { + if (self.navigationController?.presentingViewController != nil) && ((self.navigationController?.viewControllers.count ?? 0) <= 1) { self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: NSLocalizedString("_close_", comment: ""), style: .plain, target: self, action: #selector(viewDismiss)) } @@ -166,6 +166,7 @@ class NCViewerPDF: UIViewController, NCViewerPDFSearchDelegate { pdfThumbnailView.translatesAutoresizingMaskIntoConstraints = false pdfThumbnailView.pdfView = pdfView + pdfThumbnailView.pdfView?.backgroundColor = NCBrandColor.shared.appBackgroundColor pdfThumbnailView.layoutMode = .vertical pdfThumbnailView.thumbnailSize = CGSize(width: thumbnailViewHeight, height: thumbnailViewHeight) pdfThumbnailView.backgroundColor = .clear diff --git a/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift b/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift index aa700a0c1d..daa4202fd3 100644 --- a/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift +++ b/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift @@ -196,7 +196,7 @@ private var hasChangesQuickLook: Bool = false let cropViewController = Mantis.cropViewController(image: image, config: config, cropToolbar: toolbar) cropViewController.delegate = self - cropViewController.backgroundColor = .systemBackground + cropViewController.backgroundColor = NCBrandColor.shared.appBackgroundColor cropViewController.modalPresentationStyle = .fullScreen self.present(cropViewController, animated: true) diff --git a/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLookView.swift b/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLookView.swift index 751ddba612..e35d5002ac 100644 --- a/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLookView.swift +++ b/iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLookView.swift @@ -88,7 +88,8 @@ struct NCViewerQuickLookView: UIViewControllerRepresentable { @objc func dismiss() { parent.model.stopTimer() parent.isPresentedQuickLook = false - if let imageData = image, let image = image?.resizeImage(size: CGSize(width: 300, height: 300), isAspectRation: true) { + if let imageData = image, + let image = image?.resizeImage(size: CGSize(width: 240, height: 240), isAspectRation: true) { parent.model.previewStore[parent.index].image = image parent.model.previewStore[parent.index].data = imageData.jpegData(compressionQuality: 0.9) } @@ -167,7 +168,7 @@ struct NCViewerQuickLookView: UIViewControllerRepresentable { let cropViewController = Mantis.cropViewController(image: image, config: config, cropToolbar: toolbar) cropViewController.delegate = self - cropViewController.backgroundColor = .systemBackground + cropViewController.backgroundColor = NCBrandColor.shared.appBackgroundColor cropViewController.modalPresentationStyle = .fullScreen viewController?.present(cropViewController, animated: true) diff --git a/iOSClient/Viewer/NCViewerRichdocument/NCViewerRichDocument.swift b/iOSClient/Viewer/NCViewerRichdocument/NCViewerRichDocument.swift index 05c4b125c9..23ab599ac9 100644 --- a/iOSClient/Viewer/NCViewerRichdocument/NCViewerRichDocument.swift +++ b/iOSClient/Viewer/NCViewerRichdocument/NCViewerRichDocument.swift @@ -67,6 +67,8 @@ class NCViewerRichDocument: UIViewController, WKNavigationDelegate, WKScriptMess webView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor, constant: 0).isActive = true webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true + webView.backgroundColor = NCBrandColor.shared.appBackgroundColor + webView.scrollView.backgroundColor = NCBrandColor.shared.appBackgroundColor bottomConstraint = webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0) bottomConstraint?.isActive = true