diff --git a/.github/ISSUE_TEMPLATE/release_template.md b/.github/ISSUE_TEMPLATE/release_template.md index cb205e5b3..51ee450e3 100644 --- a/.github/ISSUE_TEMPLATE/release_template.md +++ b/.github/ISSUE_TEMPLATE/release_template.md @@ -21,6 +21,8 @@ Xcode version to work with: - [ ] [TRFX] Check for missing translations. Ping @cscherm - [ ] [DIS] Update [changelog](https://github.com/owncloud/ios-app/blob/master/CHANGELOG.md) - [ ] [DEV] Update In-App Release Notes (changelog) in ownCloud/Release Notes/ReleaseNotes.plist +- [ ] [DEV] Changelog: Created a folder for the new version like $majorVersion.$minorVersion.$patchVersion_YYYY-MM-DD +- [ ] [DEV] Changelog: Moved all changelog files from the unreleased folder to the new version folder - [ ] [QA] Design Test plan - [ ] [QA] Regression Test plan - [ ] [DOC] Update user manual with the new functionalities diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index cac2e1990..c0ebedeef 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -40,4 +40,5 @@ Please note that any kind of change first has to be submitted to the master bran - [ ] I have read the [**CONTRIBUTING**](https://github.com/owncloud/ios-app/blob/master/CONTRIBUTING.md) document. - [ ] I have added tests to cover my changes. - [ ] All new and existing tests passed. +- [ ] Added changelog files for the fixed issues in folder changelog/unreleased diff --git a/.github/workflows/calens.yml b/.github/workflows/calens.yml new file mode 100644 index 000000000..fbecf707c --- /dev/null +++ b/.github/workflows/calens.yml @@ -0,0 +1,26 @@ +name: Calens Changelog +# This workflow is triggered on pushes to the repository. +on: + push: + branches: + - fix/* + - feature/* + - milestone/* + +jobs: + build: + runs-on: ubuntu-18.04 + name: Generate Calens Changelog + steps: + - uses: actions/checkout@v2 + - name: Run Calens Docker + uses: addnab/docker-run-action@v1 + with: + options: -v ${{github.workspace}}:/workspace -w /workspace + image: toolhippie/calens:latest + run: calens >| CHANGELOG.md + - name: Commit files + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Calens changelog updated + file_pattern: CHANGELOG.md diff --git a/.gitmodules b/.gitmodules index 4af86d585..f72bc886d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "ios-sdk"] path = ios-sdk url = https://github.com/owncloud/ios-sdk.git -[submodule "PocketSVG"] - path = external/PocketSVG - url = https://github.com/pocketsvg/PocketSVG.git diff --git a/.swiftlint.yml b/.swiftlint.yml index 975ea6f57..c604212fb 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -34,6 +34,7 @@ disabled_rules: - implicit_getter - computed_accessors_order - unneeded_notification_center_removal + - function_parameter_count custom_rules: empty_line_after_guard_statement: included: ".*\\.swift" diff --git a/CHANGELOG.md b/CHANGELOG.md index 091a2cd8b..f1e0bedeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,176 @@ -# ChangeLog +Changelog for ownCloud iOS Client [11.5.0] (2020-02-10) +======================================= +The following sections list the changes in ownCloud iOS Client 11.5.0 relevant to +ownCloud admins and users. + + + +Summary +------- + +* Bugfix - Added paragraph on top of Acknowledgements page: [#4284](https://github.com/owncloud/enterprise/issues/4284) +* Bugfix - Fixed Branded UI on iPad: [#4367](https://github.com/owncloud/enterprise/issues/4367) +* Bugfix - Improved AppStore Review Request Time: [#845](https://github.com/owncloud/ios-app/pull/845) +* Bugfix - Changed wording in documentation: [#867](https://github.com/owncloud/ios-app/pull/867) +* Bugfix - Fix bookmark name editing: [#877](https://github.com/owncloud/ios-app/pull/877) +* Bugfix - Media Player Behaviour: [#884](https://github.com/owncloud/ios-app/pull/884) +* Change - MDM Enhancements: [#4104](https://github.com/owncloud/enterprise/issues/4104) +* Change - Full Screen PDF View: [#428](https://github.com/owncloud/ios-app/issues/428) +* Change - Unified Branding with MDM support: [#697](https://github.com/owncloud/ios-app/issues/697) +* Change - Class Settings Metadata Support: [#831](https://github.com/owncloud/ios-app/issues/831) +* Change - Video upload improvements: [#847](https://github.com/owncloud/ios-app/issues/847) +* Change - Enhanced drag & drop support: [#850](https://github.com/owncloud/ios-app/pull/850) +* Change - New photo picker / permissions model for iOS 14: [#851](https://github.com/owncloud/ios-app/issues/851) +* Change - Corporate Color + UI Refinements: [#860](https://github.com/owncloud/ios-app/issues/860) +* Change - Improved Right-to-Left Language UI-Design: [#861](https://github.com/owncloud/ios-app/issues/861) +* Change - Enforce User ID when updating token-based bookmarks: [#869](https://github.com/owncloud/ios-app/pull/869) +* Change - TLS certificate comparison: [#872](https://github.com/owncloud/ios-app/pull/872) +* Change - New Issue view / presentation: [#874](https://github.com/owncloud/ios-app/pull/874) +* Change - Automated Calens Changelog Creation: [#879](https://github.com/owncloud/ios-app/pull/879) + +Details +------- + +* Bugfix - Added paragraph on top of Acknowledgements page: [#4284](https://github.com/owncloud/enterprise/issues/4284) + + - adds a paragraph on top of the Acknowledgements to provide additional context - adds + PLCrashReporter license to acknowledgements + + https://github.com/owncloud/enterprise/issues/4284 + +* Bugfix - Fixed Branded UI on iPad: [#4367](https://github.com/owncloud/enterprise/issues/4367) + + - UI fix for branded login on the iPad - Fill color for branded button was not used + + https://github.com/owncloud/enterprise/issues/4367 + https://github.com/owncloud/enterprise/issues/4366 + +* Bugfix - Improved AppStore Review Request Time: [#845](https://github.com/owncloud/ios-app/pull/845) + + Changed request time for In-App review and fixed storing the first launch date + + https://github.com/owncloud/ios-app/pull/845 + +* Bugfix - Changed wording in documentation: [#867](https://github.com/owncloud/ios-app/pull/867) + + Changed wording so it no longer suggests username is editable + + https://github.com/owncloud/ios-app/pull/867 + +* Bugfix - Fix bookmark name editing: [#877](https://github.com/owncloud/ios-app/pull/877) + + When editing bookmarks: + + - if a name was set, it wasn't shown in the edit interface - bookmark name edits/additions would + get lost - bookmark name edits would not be presented in the list unless scrolling out of view and + back in + + https://github.com/owncloud/ios-app/pull/877 + +* Bugfix - Media Player Behaviour: [#884](https://github.com/owncloud/ios-app/pull/884) + + Fix for an issue when playing multiple items in the same directory. If e.g. image item is the next + one, multi media playback would stop. + + https://github.com/owncloud/ios-app/pull/884 + +* Change - MDM Enhancements: [#4104](https://github.com/owncloud/enterprise/issues/4104) + + - Passcode lock enforcement via class setting. User can be forced to set-up a passcode when he + first starts the app - Auto-generated MDM documentation + + https://github.com/owncloud/enterprise/issues/4104 + +* Change - Full Screen PDF View: [#428](https://github.com/owncloud/ios-app/issues/428) + + - A PDF file can be opened in fullscreen view and hides unnecessary UI elements. (Tap to trigger + full screen view) - Thumbnails positioned based on vertical size class after rotating the + device to give the displayed document more screen real estate. + + https://github.com/owncloud/ios-app/issues/428 + +* Change - Unified Branding with MDM support: [#697](https://github.com/owncloud/ios-app/issues/697) + + Refactored Branding, introducing a new Branding class, unifying branding support with class + settings while offering support for the legacy format and laying the ground for retrieving + branding assets from a remote server. + + https://github.com/owncloud/ios-app/issues/697 + https://github.com/owncloud/ios-app/issues/792 + +* Change - Class Settings Metadata Support: [#831](https://github.com/owncloud/ios-app/issues/831) + + Support for class settings metadata. + + https://github.com/owncloud/ios-app/issues/831 + +* Change - Video upload improvements: [#847](https://github.com/owncloud/ios-app/issues/847) + + - Added ability to upload slo-mo videos etc - Added option to allow uploading original videos + + https://github.com/owncloud/ios-app/issues/847 + +* Change - Enhanced drag & drop support: [#850](https://github.com/owncloud/ios-app/pull/850) + + Fix drag and drop and improve support to run the iOS app on M1 Macs: + + - add drag-out support for files that are not locally available yet - improve drag-in support + for files, picking the best available representation that can be retrieved as data - support + for drag & drop in the log file browser + + https://github.com/owncloud/ios-app/pull/850 + +* Change - New photo picker / permissions model for iOS 14: [#851](https://github.com/owncloud/ios-app/issues/851) + + - Using new PHPhotoPicker introduced in iOS14 instead of our custom picker. - Dealing with the + photo permission model introduced in iOS14 where user can grant access just to specific photo + assets or albums + + https://github.com/owncloud/ios-app/issues/851 + +* Change - Corporate Color + UI Refinements: [#860](https://github.com/owncloud/ios-app/issues/860) + + The corporate color of the UI themes was updated and furthermore some colors was adopted for a + better contrast. This PR includes also some refinements for some UI elements. + + https://github.com/owncloud/ios-app/issues/860 + +* Change - Improved Right-to-Left Language UI-Design: [#861](https://github.com/owncloud/ios-app/issues/861) + + Fixed missing views, which missed Right-to-Left language support. + + https://github.com/owncloud/ios-app/issues/861 + +* Change - Enforce User ID when updating token-based bookmarks: [#869](https://github.com/owncloud/ios-app/pull/869) + + This PR requires the user ID to remain the same when updating token-based bookmarks. If the user + logs in as a user other than the one with which the bookmark was originally created, an error will + be presented. + + https://github.com/owncloud/ios-app/pull/869 + +* Change - TLS certificate comparison: [#872](https://github.com/owncloud/ios-app/pull/872) + + When logging into an account and experiencing a different certificate that does not fulfill + the rules for automatic acceptance as replacement, the issue it brings up now shows the + differences between the two certificates to allow an informed decision by the user. + + https://github.com/owncloud/ios-app/pull/872 + +* Change - New Issue view / presentation: [#874](https://github.com/owncloud/ios-app/pull/874) + + As fixing an iPad layout issue in the old issues view proved too cumbersome, I've replaced the + entire implementation with a new issue view, based on code already there and in use for cards and + tables. + + https://github.com/owncloud/ios-app/pull/874 + +* Change - Automated Calens Changelog Creation: [#879](https://github.com/owncloud/ios-app/pull/879) + + This PR uses GitHub Actions to automatically generate a changelog file with Calens and commits + the new CHANGELOG.md into the current branch. + + https://github.com/owncloud/ios-app/pull/879 ## Release version 11.4.5 (January 2021) diff --git a/Gemfile.lock b/Gemfile.lock index 0325bf950..f8b25938d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,33 +6,33 @@ GEM public_suffix (>= 2.0.2, < 5.0) atomos (0.1.3) aws-eventstream (1.1.0) - aws-partitions (1.376.0) - aws-sdk-core (3.108.0) + aws-partitions (1.394.0) + aws-sdk-core (3.109.3) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.38.0) - aws-sdk-core (~> 3, >= 3.99.0) + aws-sdk-kms (1.39.0) + aws-sdk-core (~> 3, >= 3.109.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.81.1) - aws-sdk-core (~> 3, >= 3.104.3) + aws-sdk-s3 (1.84.1) + aws-sdk-core (~> 3, >= 3.109.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) aws-sigv4 (1.2.2) aws-eventstream (~> 1, >= 1.0.2) - babosa (1.0.3) - badge (0.11.0) + babosa (1.0.4) + badge (0.12.0) curb (~> 0.9) fastimage (>= 1.6) fastlane (>= 2.0) - mini_magick (~> 4.9.5) + mini_magick (>= 4.9.4, < 5.0.0) claide (1.0.3) colored (1.2) colored2 (3.1.2) commander-fastlane (4.4.6) highline (~> 1.7.2) - curb (0.9.10) + curb (0.9.11) declarative (0.0.20) declarative-option (0.1.0) digest-crc (0.6.1) @@ -40,17 +40,18 @@ GEM domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) - emoji_regex (3.0.0) - excon (0.76.0) - faraday (1.0.1) + emoji_regex (3.2.1) + excon (0.78.0) + faraday (1.1.0) multipart-post (>= 1.2, < 3) + ruby2_keywords faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.0) - fastlane (2.160.0) + fastlane (2.167.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) aws-sdk-s3 (~> 1.0) @@ -86,8 +87,8 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-badge (1.3.0) - badge (~> 0.11.0) + fastlane-plugin-badge (1.4.0) + badge (~> 0.12.0) fastlane-plugin-json (1.0.0) gh_inspector (1.1.3) google-api-client (0.38.0) @@ -101,17 +102,17 @@ GEM google-cloud-core (1.5.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.3) + google-cloud-env (1.4.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.1) - google-cloud-storage (1.29.0) + google-cloud-storage (1.29.1) addressable (~> 2.5) digest-crc (~> 0.4) google-api-client (~> 0.33) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.13.1) + googleauth (0.14.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -126,7 +127,7 @@ GEM json (2.3.1) jwt (2.2.2) memoist (0.16.2) - mini_magick (4.9.5) + mini_magick (4.11.0) mini_mime (1.0.2) multi_json (1.15.0) multipart-post (2.0.0) @@ -142,6 +143,7 @@ GEM uber (< 0.2.0) retriable (3.1.2) rouge (2.0.7) + ruby2_keywords (0.0.2) rubyzip (2.3.0) security (0.1.3) signet (0.14.0) @@ -166,7 +168,7 @@ GEM unf_ext (0.0.7.7) unicode-display_width (1.7.0) word_wrap (1.0.0) - xcodeproj (1.18.0) + xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) diff --git a/Podfile.lock b/Podfile.lock index 93167dc1a..6700af4b7 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -13,4 +13,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 9075b8f92281024401a0039c3477c9a16650b092 -COCOAPODS: 1.9.3 +COCOAPODS: 1.10.0 diff --git a/changelog/11.5.0_2020-02-10/4104 b/changelog/11.5.0_2020-02-10/4104 new file mode 100644 index 000000000..6bd46cf6e --- /dev/null +++ b/changelog/11.5.0_2020-02-10/4104 @@ -0,0 +1,6 @@ +Change: MDM Enhancements + +- Passcode lock enforcement via class setting. User can be forced to set-up a passcode when he first starts the app +- Auto-generated MDM documentation + +https://github.com/owncloud/enterprise/issues/4104 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/428 b/changelog/11.5.0_2020-02-10/428 new file mode 100644 index 000000000..9339d87c1 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/428 @@ -0,0 +1,6 @@ +Change: Full Screen PDF View + +- A PDF file can be opened in fullscreen view and hides unnecessary UI elements. (Tap to trigger full screen view) +- Thumbnails positioned based on vertical size class after rotating the device to give the displayed document more screen real estate. + +https://github.com/owncloud/ios-app/issues/428 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/4284 b/changelog/11.5.0_2020-02-10/4284 new file mode 100644 index 000000000..295a43bdb --- /dev/null +++ b/changelog/11.5.0_2020-02-10/4284 @@ -0,0 +1,6 @@ +Bugfix: Added paragraph on top of Acknowledgements page + +- adds a paragraph on top of the Acknowledgements to provide additional context +- adds PLCrashReporter license to acknowledgements + +https://github.com/owncloud/enterprise/issues/4284 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/4367 b/changelog/11.5.0_2020-02-10/4367 new file mode 100644 index 000000000..3f8c0c06e --- /dev/null +++ b/changelog/11.5.0_2020-02-10/4367 @@ -0,0 +1,7 @@ +Bugfix: Fixed Branded UI on iPad + +- UI fix for branded login on the iPad +- Fill color for branded button was not used + +https://github.com/owncloud/enterprise/issues/4367 +https://github.com/owncloud/enterprise/issues/4366 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/697 b/changelog/11.5.0_2020-02-10/697 new file mode 100644 index 000000000..7ecab2f27 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/697 @@ -0,0 +1,6 @@ +Change: Unified Branding with MDM support + +Refactored Branding, introducing a new Branding class, unifying branding support with class settings while offering support for the legacy format and laying the ground for retrieving branding assets from a remote server. + +https://github.com/owncloud/ios-app/issues/697 +https://github.com/owncloud/ios-app/issues/792 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/831 b/changelog/11.5.0_2020-02-10/831 new file mode 100644 index 000000000..753019a2d --- /dev/null +++ b/changelog/11.5.0_2020-02-10/831 @@ -0,0 +1,5 @@ +Change: Class Settings Metadata Support + +Support for class settings metadata. + +https://github.com/owncloud/ios-app/issues/831 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/845 b/changelog/11.5.0_2020-02-10/845 new file mode 100644 index 000000000..129b4f261 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/845 @@ -0,0 +1,5 @@ +Bugfix: Improved AppStore Review Request Time + +Changed request time for In-App review and fixed storing the first launch date + +https://github.com/owncloud/ios-app/pull/845 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/847 b/changelog/11.5.0_2020-02-10/847 new file mode 100644 index 000000000..499f26b1e --- /dev/null +++ b/changelog/11.5.0_2020-02-10/847 @@ -0,0 +1,6 @@ +Change: Video upload improvements + +- Added ability to upload slo-mo videos etc +- Added option to allow uploading original videos + +https://github.com/owncloud/ios-app/issues/847 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/850 b/changelog/11.5.0_2020-02-10/850 new file mode 100644 index 000000000..cc2a094b8 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/850 @@ -0,0 +1,9 @@ +Change: Enhanced drag & drop support + +Fix drag and drop and improve support to run the iOS app on M1 Macs: + +- add drag-out support for files that are not locally available yet +- improve drag-in support for files, picking the best available representation that can be retrieved as data +- support for drag & drop in the log file browser + +https://github.com/owncloud/ios-app/pull/850 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/851 b/changelog/11.5.0_2020-02-10/851 new file mode 100644 index 000000000..3d0565cf5 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/851 @@ -0,0 +1,6 @@ +Change: New photo picker / permissions model for iOS 14 + +- Using new PHPhotoPicker introduced in iOS14 instead of our custom picker. +- Dealing with the photo permission model introduced in iOS14 where user can grant access just to specific photo assets or albums + +https://github.com/owncloud/ios-app/issues/851 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/860 b/changelog/11.5.0_2020-02-10/860 new file mode 100644 index 000000000..5eaeafd14 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/860 @@ -0,0 +1,6 @@ +Change: Corporate Color + UI Refinements + +The corporate color of the UI themes was updated and furthermore some colors was adopted for a better contrast. +This PR includes also some refinements for some UI elements. + +https://github.com/owncloud/ios-app/issues/860 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/861 b/changelog/11.5.0_2020-02-10/861 new file mode 100644 index 000000000..32c6101fc --- /dev/null +++ b/changelog/11.5.0_2020-02-10/861 @@ -0,0 +1,5 @@ +Change: Improved Right-to-Left Language UI-Design + +Fixed missing views, which missed Right-to-Left language support. + +https://github.com/owncloud/ios-app/issues/861 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/867 b/changelog/11.5.0_2020-02-10/867 new file mode 100644 index 000000000..a11ab8b36 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/867 @@ -0,0 +1,5 @@ +Bugfix: Changed wording in documentation + +Changed wording so it no longer suggests username is editable + +https://github.com/owncloud/ios-app/pull/867 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/869 b/changelog/11.5.0_2020-02-10/869 new file mode 100644 index 000000000..9d36dfc8f --- /dev/null +++ b/changelog/11.5.0_2020-02-10/869 @@ -0,0 +1,5 @@ +Change: Enforce User ID when updating token-based bookmarks + +This PR requires the user ID to remain the same when updating token-based bookmarks. If the user logs in as a user other than the one with which the bookmark was originally created, an error will be presented. + +https://github.com/owncloud/ios-app/pull/869 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/872 b/changelog/11.5.0_2020-02-10/872 new file mode 100644 index 000000000..bf6c1444d --- /dev/null +++ b/changelog/11.5.0_2020-02-10/872 @@ -0,0 +1,5 @@ +Change: TLS certificate comparison + +When logging into an account and experiencing a different certificate that does not fulfill the rules for automatic acceptance as replacement, the issue it brings up now shows the differences between the two certificates to allow an informed decision by the user. + +https://github.com/owncloud/ios-app/pull/872 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/874 b/changelog/11.5.0_2020-02-10/874 new file mode 100644 index 000000000..edde12333 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/874 @@ -0,0 +1,5 @@ +Change: New Issue view / presentation + +As fixing an iPad layout issue in the old issues view proved too cumbersome, I've replaced the entire implementation with a new issue view, based on code already there and in use for cards and tables. + +https://github.com/owncloud/ios-app/pull/874 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/877 b/changelog/11.5.0_2020-02-10/877 new file mode 100644 index 000000000..f64c7c5ac --- /dev/null +++ b/changelog/11.5.0_2020-02-10/877 @@ -0,0 +1,9 @@ +Bugfix: Fix bookmark name editing + +When editing bookmarks: + +- if a name was set, it wasn't shown in the edit interface +- bookmark name edits/additions would get lost +- bookmark name edits would not be presented in the list unless scrolling out of view and back in + +https://github.com/owncloud/ios-app/pull/877 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/879 b/changelog/11.5.0_2020-02-10/879 new file mode 100644 index 000000000..d3a310923 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/879 @@ -0,0 +1,5 @@ +Change: Automated Calens Changelog Creation + +This PR uses GitHub Actions to automatically generate a changelog file with Calens and commits the new CHANGELOG.md into the current branch. + +https://github.com/owncloud/ios-app/pull/879 \ No newline at end of file diff --git a/changelog/11.5.0_2020-02-10/884 b/changelog/11.5.0_2020-02-10/884 new file mode 100644 index 000000000..1b20da810 --- /dev/null +++ b/changelog/11.5.0_2020-02-10/884 @@ -0,0 +1,5 @@ +Bugfix: Media Player Behaviour + +Fix for an issue when playing multiple items in the same directory. If e.g. image item is the next one, multi media playback would stop. + +https://github.com/owncloud/ios-app/pull/884 \ No newline at end of file diff --git a/changelog/CHANGELOG-Release.tmpl b/changelog/CHANGELOG-Release.tmpl new file mode 100644 index 000000000..b066da9e0 --- /dev/null +++ b/changelog/CHANGELOG-Release.tmpl @@ -0,0 +1,28 @@ +{{- range $index, $changes := . }}{{ with $changes -}} +Changelog for ownCloud iOS Client {{ .Version }} ({{ .Date }}) +======= + +Summary +------- +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{- end }}{{ end }} + +Details +------- +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{ range $par := .Paragraphs }} + {{ wrapIndent $par 80 3 }} +{{ end -}} +{{ range $url := .IssueURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .PRURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .OtherURLs }} + {{ $url -}} +{{ end }} +{{ end }}{{ end }} +{{ end }}{{ end -}} \ No newline at end of file diff --git a/changelog/CHANGELOG.tmpl b/changelog/CHANGELOG.tmpl new file mode 100644 index 000000000..77effb417 --- /dev/null +++ b/changelog/CHANGELOG.tmpl @@ -0,0 +1,291 @@ +{{ $allVersions := . }} +{{- range $index, $changes := . }}{{ with $changes -}} +Changelog for ownCloud iOS Client [{{ .Version }}] ({{ .Date }}) +======================================= +The following sections list the changes in ownCloud iOS Client {{ .Version }} relevant to +ownCloud admins and users. + +{{/* creating version compare links */ -}} +{{ $next := add1 $index -}} +{{ if ne (len $allVersions) $next -}} +{{ $previousVersion := (index $allVersions $next).Version -}} +{{ if eq .Version "unreleased" -}} +[{{ .Version }}]: https://github.com/owncloud/client/compare/v{{ $previousVersion }}...master +{{- else -}} +[{{ .Version }}]: https://github.com/owncloud/client/compare/v{{ $previousVersion }}...v{{ .Version }} +{{- end -}} +{{ end -}} + +{{- /* last version managed by calens, end of the loop */ -}} +{{ if eq .Version "2.6.2" -}} +[{{ .Version }}]: https://github.com/owncloud/client/compare/v2.6.1...v{{ .Version }} +{{- end }} + +Summary +------- +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{- end }}{{ end }} + +Details +------- +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{ range $par := .Paragraphs }} + {{ wrapIndent $par 80 3 }} +{{ end -}} +{{ range $url := .IssueURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .PRURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .OtherURLs }} + {{ $url -}} +{{ end }} +{{ end }}{{ end }} +{{ end }}{{ end -}} + +{{/* Start of old changelog */ -}} + +## Release version 11.4.5 (January 2021) + +- Fix: Crash in Detail View (#855) +- Fix: Upload Improvements (PR #857) + +## Release version 11.4.4 (End-November 2020) + +- Fix: iPad on iOS 12 (#4293) +- Fix: Improvements on Apple Silicon macOS + +## Release version 11.4.3 (Mid-November 2020) + +- Fix: iOS 14 UI Adaptions (#834) + +## Release version 11.4.2 (November 2020) + +- Support for new Display Sizes +- Favorites in Directory Picker (#814) +- Rename Filename in Scan View (#822) +- Fix: Save Attachments from Mail.app (#816) +- Fix: Authentication Error in FileProvider (#808) +- Fix: New Folder in FileProvider (#827) + +## Release version 11.4.1 (September 2020) + +- Image Metadata (#679) +- Pro Photo Upload (#685, #688) +- Fix: Media Upload Path (#784) +- Fix: File List (#786) +- Fix: Markup (#783) +- Fix: Shortcuts (#785) +- Fix: Share Sheet (#782) +- Fix: Multiple Selection (#735) +- Fix: File Provider (#747) +- Fix: General Improvements (#790, #792, #793) +- Fix: Create Public Link (#803) + +## Release version 11.4 (August 2020) + +- Branding Support (#2, #120) +- Migration (#270) +- Cellular Options (PR #709) +- Share Sheet (#539) +- Camera Access (#615) +- Better Issue Handling (#362, #505, #513, #585, SDK: #63) +- Folders on top (#431) +- Contextual Menu (#717) +- Multitouch gestures (#725) +- Inline Authentication (PR #682) +- Image Upload: Change file name (PR #714) +- App Version Information (#740) +- Improved Media Upload (#647) +- Media Streaming (#766) +- Public Link Creation (#671) +- Diagnostics (PR #762) +- Item Counter (PR #771) +- Universal Links / Deep Linking (PR #609) +- Shortcuts: Get File Info +- Fix: Avoid duplicate photo upload (PR #714) +- Fix: Markup (#729, 698) +- Fix: Audio Playback (#683) +- Fix: Serveral UI Improvements (PR #654, #264) +- Fix: File Provider (#754, …) +- Fix: Quick Access (#745) +- Fix: Sort by Type (#670) + +## Release version 1.3.2 (April 2020) + +- iPad: Mouse and Trackpad support (#655) +- Fix: Shortcut - Save Action (#651) +- Fix: Keep open files up-to-date (#630) + +## Release version 1.3.1 (March 2020) + +- Fix: Shortcut - Save Action (#622) +- Fix: Markup Documents (#617, #618) +- Fix: Offline Usage (#3828) +- Fix: Available Offline (PR #616) +- Fix: Permissions (#623) + +## Release version 1.3.0 (February 2020) + +- Document Scanner on iOS 13 (PR #494) +- Markup Documents on iOS 13 (#541) +- Shortcut Support on iOS 13 (#463) +- New Quick Access Collections (PR #600) +- Cleaner File List Layout (PR #594) +- Added Sort Bar in Directory Picker (#590) +- Fix: Blank File List on UI restoration (#601) +- Fix: Share Sheet on iPad for log files (#606) + +## Release version 1.2.1 (January 2020) + +- Fix: Passcode Lock Screen on iOS 13 (#582) + +## Release version 1.2.0 (December 2019) + +- Multiple Window Support (iPadOS) (#488) +- Keyboard Commands (iPadOS) (#282) +- Media Player Improvements (#59, #374) +- Better File Previews (#481) +- Arabic Language Support +- Fix: Sort alphabetically (PR #546) +- Fix: Share Sheet on iPad (#568) +- Fix: FileProvider File Type Issue (#557) +- Fix: FileProvider Offline Browsing (PR #547) +- Fix: FileProvider Saving from Microsoft Word (PR #574) +- Fix: Photo Upload (#504) + +## Release version 1.1.2 (October 2019) + +- Fix for long delays before starting a request on iOS 13.1 (PR #531) + +## Release version 1.1.1 (October 2019) + +- Dark mode support (PR #489) +- iOS 13 support (#502) +- Background media playback fixed (PR #522) +- Displaying long file name improved (#516) +- Fixed naming of uploaded edited photos (#520) +- Fixed crash in File Provider (#502) +- UI fixes (#511, #502) + +## Release version 1.1.0 (September 2019) + +- Available Offline Support (#134, #135) +- Background Sync Support (#386) +- Background Image Upload (#116) +- Import Files from Share Sheet (#76) +- Added "Create Folder" Action in Directory Picker (#443) +- Added Change Sort Order for all Sort Methods (#470) +- Added Index Bar in File list (#413) +- Image Gallery improvements (#322) +- UI improvements for the Navigation Bar (#477) +- Added Activity Indicator for deleting Local Copies (#393) +- Sharing fixes (#439, #415) +- Fixed min length for searching sharing users (#454) + +## Release version 1.0.4 (August 2019) + +- Authentication improvements (PR #459) +- Fixed background crash (PR #462) +- Log file improvements (#444) + +## TestFlight Build 129 (July 2019) + +- Import files from Share Sheet (#76) +- Create Folder in Directory Picker (#443) + +## TestFlight Build 126 (July 2019) + +- Native Media Player, with support for streaming (#395) +- Name Conflict Detection (#377) +- Activity Indicator for deleting offline copies (#393) +- Improved Log File (#446) +- Image Gallery improvement (#322) +- Error handling for corrupted files (#357) + +## Release version 1.0.3 (July 2019) + +- Add support for local user names with @ inside in sharing (PR #453) + +## Release version 1.0.2 (July 2019) + +- Favorites crash fixed (#423) +- Account Auto-Connect +- Add support for server setting version.hide (#426) +- OAuth2 improvements (#293) + +## Release version 1.0.1 (June 2019) +- Passcode lock for iOS Files.app +- Access log files after log session ended +- Translation fixed +- Sharing bug fixed +- Fixed bug when creating a new folder + +## TestFlight Build 123 (June 2019) +- Finally: Sharing !! (#275, #292, #351, #358) +- Option to convert HEIF/HEVC to JPEG/MP4 before upload (#363) +- Option to show/hide hidden files in the file list (#390) +- Debugging: log rotation (#382) +- Clear cached local files (#376) + +## TestFlight Build 119 (May 2019) +- Drag and drop between apps (iPad Split View) (#48) +- Drag directly to file actions (#250) +- Multi-select: more file actions (#250) +- Swipe to next image (#277) +- Display quota (#337) +- Navigation to any parent folder (#354) + +## TestFlight Build 111 (March 2019) +- Upload multiple images and videos in the app (Select all!!!) (#173 ) +- "Open in…" with offline files (#227) +- Basic appconfig.org implementation (#272) + +## TestFlight Build 103 (February 2019) +- Multi-select files/folders for move and delete (#234) +- Copy file/folder to another location (#207) +- Accessibility improvements (#239) +- Multi Language: cs_CZ, de, de_DE, en_GB, ko, mk, nb_NO, nn_NO, pt_BR, pt_PT, ru, sq, th_TH, zh_CN (#231) + +## TestFlight Build 85 (November 2018) +- Upload (single) images and (multiple) files in the app (#146) +- Open in another app (#132) + +## TestFlight Build 83 (November 2018) +- PDF viewer with search and TOC (#138) + +## TestFlight Build 79 (November 2018) +- iOS Files app integration (#67) + - Upload to Files app + - Download in Files app + - Edit and save files via Files app + - Move, rename, delete in Files app +- File size and dates in file list (#117) +- Settings > Logging + +## TestFlight Build 73 (October 2018) +- Menu for file/folder info and actions (#106) +- Move of individual files/folders from menu (#110) +- Move multiple files/folders with drag and drop (#110) +- Basic file preview (#114) + +## TestFlight Build Build 54 (August 2018) +- Touch ID and Face ID (#54) +- File/folder deletion (#91) +- File/folder rename (#102) +- Filtering/search the current folder (#64) + +## TestFlight Build 34 (June 2018) +* Sort options for files and folders (#55) +* Passcode lock with delay option and brute force (activate in "Settings", no Touch ID and Face ID yet) (#34) + +## TestFlight Build 31 (May 2018) +* Account creation with OAuth 2.0 and basic auth +* Edit, re-order and delete accounts (#38) +* Inspect SSL-certificates +* Folder navigation (online and offline) +* Thumbnails in file view (#32) +* Different themes (click "Help" on bottom left) diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 000000000..fab41b484 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,19 @@ +# Changelog + +We are using [calens](https://github.com/restic/calens) to properly generate a +changelog before we are tagging a new release. + +## Create Changelog items +Create a file according to the [template](TEMPLATE) for each +changelog in the [unreleased](./unreleased) folder. The following change types are possible: `Bugfix, Change, Enhancement, Security`. + +## Automated Changelog build and commit +- After each merge to master, the CHANGELOG.md file is automatically updated and the new version will be committed to master while skipping CI. + +## Create a new Release +- copy the files from the [unreleased](./unreleased) folder into a folder matching the +schema `0.3.0_2020-01-10` + +## Test the Changelog generator manually +- execute `docker run --rm -v $(pwd):$(pwd) -w $(pwd) toolhippie/calens:latest` +in the root folder of the project. diff --git a/changelog/TEMPLATE.txt b/changelog/TEMPLATE.txt new file mode 100644 index 000000000..d20abdc21 --- /dev/null +++ b/changelog/TEMPLATE.txt @@ -0,0 +1,12 @@ +Bugfix: Fix behavior for foobar (in the present tense, max length 80 chars) + +We've fixed the behavior for foobar, a long-standing annoyance for ownCloud +users. + +The text in the paragraphs is written in past tense. The last section is a list +of issue URLs, PR URLs and other URLs. The first issue ID (or the first PR ID, +in case there aren't any issue links) is used as the primary ID. + +https://github.com/owncloud/ios-app/issues/1234 +https://github.com/owncloud/ios-app/pull/55555 +https://doc.owncloud.com/server/admin_manual/configuration/server/config_sample_php_parameters.html \ No newline at end of file diff --git a/doc/CONFIGURATION.json b/doc/CONFIGURATION.json new file mode 100644 index 000000000..7ed20947d --- /dev/null +++ b/doc/CONFIGURATION.json @@ -0,0 +1,1548 @@ +[ + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.CollaborateAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.collaborate.enabled", + "key" : "com.owncloud.action.collaborate.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.CopyAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.copy.enabled", + "key" : "com.owncloud.action.copy.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloudAppShared.CreateFolderAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.createFolder.enabled", + "key" : "com.owncloud.action.createFolder.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.DeleteAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.delete.enabled", + "key" : "com.owncloud.action.delete.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.DiscardSceneAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.discardscene.enabled", + "key" : "com.owncloud.action.discardscene.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.DuplicateAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.duplicate.enabled", + "key" : "com.owncloud.action.duplicate.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.FavoriteAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.favorite.enabled", + "key" : "com.owncloud.action.favorite.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.LinksAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.links.enabled", + "key" : "com.owncloud.action.links.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.MakeAvailableOfflineAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.makeAvailableOffline.enabled", + "key" : "com.owncloud.action.makeAvailableOffline.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.MakeUnavailableOfflineAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.makeUnavailableOffline.enabled", + "key" : "com.owncloud.action.makeUnavailableOffline.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.DocumentEditingAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.markup.enabled", + "key" : "com.owncloud.action.markup.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.MediaEditingAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.mediaediting.enabled", + "key" : "com.owncloud.action.mediaediting.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.MoveAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.move.enabled", + "key" : "com.owncloud.action.move.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.OpenInAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.openin.enabled", + "key" : "com.owncloud.action.openin.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.OpenSceneAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.openscene.enabled", + "key" : "com.owncloud.action.openscene.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.RenameAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.rename.enabled", + "key" : "com.owncloud.action.rename.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.ScanAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.scan.enabled", + "key" : "com.owncloud.action.scan.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.DisplayExifMetadataAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.show-exif.enabled", + "key" : "com.owncloud.action.show-exif.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.UnfavoriteAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.unfavorite.enabled", + "key" : "com.owncloud.action.unfavorite.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.UnshareAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.unshare.enabled", + "key" : "com.owncloud.action.unshare.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.UploadCameraMediaAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.upload.camera_media.enabled", + "key" : "com.owncloud.action.upload.camera_media.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.UploadFileAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.uploadfile.enabled", + "key" : "com.owncloud.action.uploadfile.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Actions", + "categoryTag" : "actions", + "classIdentifier" : "action", + "className" : "ownCloud.UploadMediaAction", + "description" : "Controls whether action can be accessed in the app UI.", + "flatIdentifier" : "action.com.owncloud.action.uploadphotos.enabled", + "key" : "com.owncloud.action.uploadphotos.enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : "https://itunes.apple.com/app/id1359583808?mt=8", + "description" : "URL for the app in the App Store.", + "flatIdentifier" : "app.app-store-link", + "key" : "app-store-link", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : true, + "description" : "Enable/disable review prompt.", + "flatIdentifier" : "app.enable-review-prompt", + "key" : "enable-review-prompt", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : true, + "description" : "Enable/disable UI animations.", + "flatIdentifier" : "app.enable-ui-animations", + "key" : "enable-ui-animations", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : true, + "description" : "Controls if the app is built for beta or release purposes.", + "flatIdentifier" : "app.is-beta-build", + "key" : "is-beta-build", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : true, + "description" : "Enables/disables the recommend to a friend entry in the settings.", + "flatIdentifier" : "app.recommend-to-friend-enabled", + "key" : "recommend-to-friend-enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "App", + "categoryTag" : "app", + "classIdentifier" : "app", + "className" : "ownCloudAppShared.VendorServices", + "defaultValue" : true, + "description" : "Controls whether a warning should be shown on the first run of a beta version.", + "flatIdentifier" : "app.show-beta-warning", + "key" : "show-beta-warning", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "index.php/apps/oauth2/authorize", + "description" : "OAuth2 authorization endpoint.", + "flatIdentifier" : "authentication-oauth2.oa2-authorization-endpoint", + "key" : "oa2-authorization-endpoint", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "mxd5OQDk6es5LzOzRvidJNfXLUZS2oN3oUFeXPP8LpPrhx3UroJFduGEYIBOxkY1", + "description" : "OAuth2 Client ID.", + "flatIdentifier" : "authentication-oauth2.oa2-client-id", + "key" : "oa2-client-id", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "KFeFWWEZO9TkisIQzR3fo7hfiMXlOpaqP8CFuTbSHzV1TUuGECglPxpiVKJfOXIx", + "description" : "OAuth2 Client Secret.", + "flatIdentifier" : "authentication-oauth2.oa2-client-secret", + "key" : "oa2-client-secret", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "description" : "OAuth2 Expiration Override - lets OAuth2 tokens expire after the provided number of seconds (useful to prompt quick `refresh_token` requests for testing)", + "flatIdentifier" : "authentication-oauth2.oa2-expiration-override-seconds", + "key" : "oa2-expiration-override-seconds", + "status" : "debugOnly", + "type" : "int" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "oc://ios.owncloud.com", + "description" : "OAuth2 Redirect URI.", + "flatIdentifier" : "authentication-oauth2.oa2-redirect-uri", + "key" : "oa2-redirect-uri", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OAuth2", + "categoryTag" : "oauth2", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "index.php/apps/oauth2/api/v1/token", + "description" : "OAuth2 token endpoint.", + "flatIdentifier" : "authentication-oauth2.oa2-token-endpoint", + "key" : "oa2-token-endpoint", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OIDC", + "categoryTag" : "oidc", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "oc://ios.owncloud.com", + "description" : "OpenID Connect Redirect URI", + "flatIdentifier" : "authentication-oauth2.oidc-redirect-uri", + "key" : "oidc-redirect-uri", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "OIDC", + "categoryTag" : "oidc", + "classIdentifier" : "authentication-oauth2", + "className" : "OCAuthenticationMethodOAuth2", + "defaultValue" : "openid offline_access email profile", + "description" : "OpenID Connect Scope", + "flatIdentifier" : "authentication-oauth2.oidc-scope", + "key" : "oidc-scope", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Authentication", + "categoryTag" : "authentication", + "classIdentifier" : "authentication", + "className" : "OCAuthenticationMethod", + "defaultValue" : "operating-system", + "description" : "Alternative browser session class to use instead of `ASWebAuthenticationSession`. Please also see Compile Time Configuration if you want to use this.", + "flatIdentifier" : "authentication.browser-session-class", + "key" : "browser-session-class", + "possibleValues" : [ + { + "description" : "Use UIWebView for browser sessions. Requires compilation with `OC_FEATURE_AVAILABLE_UIWEBVIEW_BROWSER_SESSION=1` preprocessor flag.", + "value" : "UIWebView" + }, + { + "description" : "Use ASWebAuthenticationSession for browser sessions.", + "value" : "operating-system" + } + ], + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Authentication", + "categoryTag" : "authentication", + "classIdentifier" : "authentication", + "className" : "OCAuthenticationMethod", + "defaultValue" : false, + "description" : "Indicates whether the app should ask iOS for a private authentication (web) session for OAuth2 or OpenID Connect. Private authentication sessions do not share cookies and other browsing data with the user's normal browser. Apple only promises that [this setting](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/3237231-prefersephemeralwebbrowsersessio) will be honored if the user has set Safari as default browser.", + "flatIdentifier" : "authentication.browser-session-prefers-ephermal", + "key" : "browser-session-prefers-ephermal", + "status" : "supported", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Bookmarks", + "categoryTag" : "bookmarks", + "classIdentifier" : "bookmark", + "className" : "ownCloud.BookmarkViewController", + "description" : "The default URL for the creation of new bookmarks.", + "flatIdentifier" : "bookmark.default-url", + "key" : "default-url", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Bookmarks", + "categoryTag" : "bookmarks", + "classIdentifier" : "bookmark", + "className" : "ownCloud.BookmarkViewController", + "defaultValue" : true, + "description" : "Controls whether the server URL in the text field during the creation of new bookmarks can be changed.", + "flatIdentifier" : "bookmark.url-editable", + "key" : "url-editable", + "status" : "supported", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "description" : "App name to use throughout the app.", + "flatIdentifier" : "branding.app-name", + "key" : "app-name", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : true, + "description" : "Controls whether the user can add accounts.", + "flatIdentifier" : "branding.can-add-account", + "key" : "can-add-account", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : true, + "description" : "Controls whether the user can edit accounts.", + "flatIdentifier" : "branding.can-edit-account", + "key" : "can-edit-account", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "description" : "Organization name to use throughout the app.", + "flatIdentifier" : "branding.organization-name", + "key" : "organization-name", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "description" : "Array of dictionaries, each specifying a static profile.", + "flatIdentifier" : "branding.profile-definitions", + "key" : "profile-definitions", + "status" : "advanced", + "type" : "dictionaryArray" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : "ios-app@owncloud.com", + "description" : "Email address to send feedback to. Set to `null` to disable this feature.", + "flatIdentifier" : "branding.send-feedback-address", + "key" : "send-feedback-address", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "description" : "Array of dictionaries, each specifying a theme.", + "flatIdentifier" : "branding.theme-definitions", + "key" : "theme-definitions", + "status" : "advanced", + "type" : "dictionaryArray" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "description" : "Dictionary defining generic colors that can be used in the definitions.", + "flatIdentifier" : "branding.theme-generic-colors", + "key" : "theme-generic-colors", + "status" : "advanced", + "type" : "dictionary" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : "https://doc.owncloud.com/ios-app/", + "description" : "URL to documentation for the app. Opened when selecting \"Documentation\" in the settings.", + "flatIdentifier" : "branding.url-documentation", + "key" : "url-documentation", + "status" : "advanced", + "type" : "urlString" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : "https://www.owncloud.com/help", + "description" : "URL to help for the app. Opened when selecting \"Help\" in the settings.", + "flatIdentifier" : "branding.url-help", + "key" : "url-help", + "status" : "advanced", + "type" : "urlString" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : "https://owncloud.org/privacy-policy/", + "description" : "URL to privacy information for the app. Opened when selecting \"Privacy\" in the settings.", + "flatIdentifier" : "branding.url-privacy", + "key" : "url-privacy", + "status" : "advanced", + "type" : "urlString" + }, + { + "autoExpansion" : "none", + "category" : "Branding", + "categoryTag" : "branding", + "classIdentifier" : "branding", + "className" : "Branding", + "defaultValue" : "https://raw.githubusercontent.com/owncloud/ios-app/master/LICENSE", + "description" : "URL to terms of use for the app. Opened when selecting \"Terms Of Use\" in the settings.", + "flatIdentifier" : "branding.url-terms-of-use", + "key" : "url-terms-of-use", + "status" : "advanced", + "type" : "urlString" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : true, + "description" : "Allow the use of background URL sessions. Note: depending on iOS version, the app may still choose not to use them. This settings is overriden by `force-background-url-sessions`.", + "flags" : 4, + "flatIdentifier" : "connection.allow-background-url-sessions", + "key" : "allow-background-url-sessions", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : true, + "description" : "Allow the use of cellular connections.", + "flags" : 4, + "flatIdentifier" : "connection.allow-cellular", + "key" : "allow-cellular", + "status" : "recommended", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : false, + "description" : "Controls whether private links are requested with regular PROPFINDs.", + "flags" : 4, + "flatIdentifier" : "connection.always-request-private-link", + "key" : "always-request-private-link", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "trailing", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "connection", + "className" : "OCConnection", + "description" : "Array of allowed authentication methods. Nil/Missing for no restrictions.", + "flags" : 4, + "flatIdentifier" : "connection.connection-allowed-authentication-methods", + "key" : "connection-allowed-authentication-methods", + "possibleValues" : [ + { + "description" : "Basic Auth", + "value" : "com.owncloud.basicauth" + }, + { + "description" : "OAuth2", + "value" : "com.owncloud.oauth2" + }, + { + "description" : "OpenID Connect", + "value" : "com.owncloud.openid-connect" + } + ], + "status" : "recommended", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "bookmarkCertificate == serverCertificate", + "description" : "Rule that defines the criteria a certificate needs to meet for OCConnection to recognize it as valid for a bookmark.\n\nExamples of expressions:\n- `bookmarkCertificate == serverCertificate`: the whole certificate needs to be identical to the one stored in the bookmark during setup.\n- `bookmarkCertificate.publicKeyData == serverCertificate.publicKeyData`: the public key of the received certificate needs to be identical to the public key stored in the bookmark during setup.\n- `serverCertificate.passedValidationOrIsUserAccepted == true`: any certificate is accepted as long as it has passed validation by the OS or was accepted by the user.\n- `serverCertificate.commonName == \"demo.owncloud.org\"`: the common name of the certificate must be \"demo.owncloud.org\".\n- `serverCertificate.rootCertificate.commonName == \"DST Root CA X3\"`: the common name of the root certificate must be \"DST Root CA X3\".\n- `serverCertificate.parentCertificate.commonName == \"Let's Encrypt Authority X3\"`: the common name of the parent certificate must be \"Let's Encrypt Authority X3\".\n- `serverCertificate.publicKeyData.sha256Hash.asFingerPrintString == \"2A 00 98 90 BD … F7\"`: the SHA-256 fingerprint of the public key of the server certificate needs to match the provided value.\n", + "flags" : 4, + "flatIdentifier" : "connection.connection-certificate-extended-validation-rule", + "key" : "connection-certificate-extended-validation-rule", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "10.0", + "description" : "The minimum server version required.", + "flags" : 4, + "flatIdentifier" : "connection.connection-minimum-server-version", + "key" : "connection-minimum-server-version", + "status" : "debugOnly", + "type" : "string" + }, + { + "autoExpansion" : "trailing", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : [ + "com.owncloud.openid-connect", + "com.owncloud.oauth2", + "com.owncloud.basicauth" + ], + "description" : "Array of authentication methods in order of preference (most preferred first).", + "flags" : 4, + "flatIdentifier" : "connection.connection-preferred-authentication-methods", + "key" : "connection-preferred-authentication-methods", + "possibleValues" : [ + { + "description" : "Basic Auth", + "value" : "com.owncloud.basicauth" + }, + { + "description" : "OAuth2", + "value" : "com.owncloud.oauth2" + }, + { + "description" : "OpenID Connect", + "value" : "com.owncloud.openid-connect" + } + ], + "status" : "recommended", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "(bookmarkCertificate.publicKeyData == serverCertificate.publicKeyData) OR ((check.parentCertificatesHaveIdenticalPublicKeys == true) AND (serverCertificate.passedValidationOrIsUserAccepted == true))", + "description" : "Rule that defines the criteria that need to be met for OCConnection to accept a renewed certificate and update the bookmark's certificate automatically instead of prompting the user. Used when the extended validation rule fails. Set this to `never` if the user should always be prompted when a server's certificate changed.", + "flags" : 4, + "flatIdentifier" : "connection.connection-renewed-certificate-acceptance-rule", + "key" : "connection-renewed-certificate-acceptance-rule", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "ocs/v2.php/cloud/capabilities", + "description" : "Endpoint to use for retrieving server capabilities.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-capabilities", + "key" : "endpoint-capabilities", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "ocs/v2.php/apps/files_sharing/api/v1/sharees", + "description" : "Path of the sharing recipient API endpoint.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-recipients", + "key" : "endpoint-recipients", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "ocs/v2.php/apps/files_sharing/api/v1/remote_shares", + "description" : "Path of the remote shares API endpoint.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-remote-shares", + "key" : "endpoint-remote-shares", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "ocs/v2.php/apps/files_sharing/api/v1/shares", + "description" : "Path of the shares API endpoint.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-shares", + "key" : "endpoint-shares", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "status.php", + "description" : "Endpoint to retrieve basic status information and detect an ownCloud installation.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-status", + "key" : "endpoint-status", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "index.php/apps/files/api/v1/thumbnail", + "description" : "Path of the thumbnail endpoint.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-thumbnail", + "key" : "endpoint-thumbnail", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "ocs/v2.php/cloud/user", + "description" : "Endpoint to use for retrieving information on logged in user.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-user", + "key" : "endpoint-user", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "remote.php/dav/files", + "description" : "Endpoint to use for WebDAV.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-webdav", + "key" : "endpoint-webdav", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "remote.php/dav/meta", + "description" : "Endpoint to use for WebDAV metadata.", + "flags" : 4, + "flatIdentifier" : "connection.endpoint-webdav-meta", + "key" : "endpoint-webdav-meta", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : false, + "description" : "Forces the use of background URL sessions. Overrides `allow-background-url-sessions`.", + "flags" : 2, + "flatIdentifier" : "connection.force-background-url-sessions", + "key" : "force-background-url-sessions", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : "warn", + "description" : "Policy regarding the use of plain (unencryped) HTTP URLs for creating bookmarks. A value of `warn` will create an issue (typically then presented to the user as a warning), but ultimately allow the creation of the bookmark. A value of `forbidden` will block the use of `http`-URLs for the creation of new bookmarks.", + "flags" : 4, + "flatIdentifier" : "connection.plain-http-policy", + "key" : "plain-http-policy", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : false, + "description" : "Controls whether 307 redirects are handled transparently at the HTTP pipeline level (by resending the headers and body).", + "flags" : 4, + "flatIdentifier" : "connection.transparent-temporary-redirect", + "key" : "transparent-temporary-redirect", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Endpoints", + "categoryTag" : "endpoints", + "classIdentifier" : "connection", + "className" : "OCConnection", + "defaultValue" : ".well-known", + "description" : "Path of the .well-known endpoint.", + "flags" : 4, + "flatIdentifier" : "connection.well-known", + "key" : "well-known", + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "defaultValue" : { + "actions" : 10, + "all" : 0, + "download" : 3, + "download-wifi-and-cellular" : 3, + "download-wifi-only" : 2, + "transfer" : 6, + "upload" : 3, + "upload-cellular-and-wifi" : 3, + "upload-wifi-only" : 2 + }, + "description" : "Concurrency budgets available for sync actions by action category.", + "flatIdentifier" : "core.action-concurrency-budgets", + "key" : "action-concurrency-budgets", + "status" : "advanced", + "type" : "dictionary" + }, + { + "autoExpansion" : "none", + "category" : "Privacy", + "categoryTag" : "privacy", + "classIdentifier" : "core", + "className" : "OCCore", + "defaultValue" : true, + "description" : "Add an `Accept-Language` HTTP header using the preferred languages set on the device.", + "flatIdentifier" : "core.add-accept-language-header", + "key" : "add-accept-language-header", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "defaultValue" : true, + "description" : "Enable or disable per-process, in-memory cookie storage.", + "flatIdentifier" : "core.cookie-support-enabled", + "key" : "cookie-support-enabled", + "status" : "supported", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "description" : "Override the availability signal, so the host is considered to always be in maintenance mode (`true`) or never in maintenance mode (`false`).", + "flatIdentifier" : "core.override-availability-signal", + "key" : "override-availability-signal", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "description" : "Override the reachability signal, so the host is always considered reachable (`true`) or unreachable (`false`).", + "flatIdentifier" : "core.override-reachability-signal", + "key" : "override-reachability-signal", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "defaultValue" : [ + "*" + ], + "description" : "Provide hints that thumbnails are available for items whose MIME-Type starts with any of the strings provided in this array. Providing an empty array turns off thumbnail loading. Providing `[\"*\"]` turns on thumbnail loading for all items.", + "flatIdentifier" : "core.thumbnail-available-for-mime-type-prefixes", + "key" : "thumbnail-available-for-mime-type-prefixes", + "status" : "debugOnly", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Diagnostics", + "categoryTag" : "diagnostics", + "classIdentifier" : "diagnostics", + "className" : "ownCloud.DiagnosticManager", + "defaultValue" : false, + "description" : "Controls whether additional diagnostic options and information is available throughout the user interface.", + "flatIdentifier" : "diagnostics.enabled", + "key" : "enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Display Settings", + "categoryTag" : "displaysettings", + "classIdentifier" : "display", + "className" : "DisplaySettings", + "defaultValue" : false, + "description" : "Controls whether drag and drop should be prevented for items inside the app.", + "flatIdentifier" : "display.prevent-dragging-files", + "key" : "prevent-dragging-files", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Display Settings", + "categoryTag" : "displaysettings", + "classIdentifier" : "display", + "className" : "DisplaySettings", + "defaultValue" : false, + "description" : "Controls whether hidden files (i.e. files starting with `.` ) should also be shown.", + "flatIdentifier" : "display.show-hidden-files", + "key" : "show-hidden-files", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Display Settings", + "categoryTag" : "displaysettings", + "classIdentifier" : "display", + "className" : "DisplaySettings", + "defaultValue" : false, + "description" : "Controls whether folders are shown at the top.", + "flatIdentifier" : "display.sort-folders-first", + "key" : "sort-folders-first", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "host-simulator", + "className" : "OCHostSimulatorManager", + "defaultValue" : [ + + ], + "description" : "Active Host simulation extensions.", + "flatIdentifier" : "host-simulator.active-simulations", + "key" : "active-simulations", + "possibleValues" : [ + { + "description" : "Return status code 404 for every request for the first five seconds.", + "value" : "five-seconds-of-404" + }, + { + "description" : "Return status code 404 for every request.", + "value" : "only-404" + }, + { + "description" : "Redirect any request without cookies to a bogus endpoint for 30 seconds, then to a cookie-setting endpoint, where cookies are set - and then redirect back.", + "value" : "recovering-apm" + }, + { + "description" : "Reject Downloads with status 500 responses.", + "value" : "reject-downloads-500" + }, + { + "description" : "Redirect any request without cookies to a cookie-setting endpoint, where cookies are set - and then redirect back.", + "value" : "simple-apm" + } + ], + "status" : "debugOnly", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "http", + "className" : "OCHTTPPipeline", + "defaultValue" : "ownCloudApp/{{app.version}} ({{app.part}}/{{app.build}}; {{os.name}}/{{os.version}}; {{device.model}})", + "description" : "A custom `User-Agent` to send with every HTTP request.\n\nThe following placeholders can be used to make it dynamic:\n- `{{app.build}}`: the build number of the app (f.ex. `123`)\n- `{{app.version}}`: the version of the app (f.ex. `1.2`)\n- `{{app.part}}`: the part of the app (more exactly: the name of the main bundle) from which the request was sent (f.ex. `App`, `ownCloud File Provider`)\n- `{{device.model}}`: the model of the device running the app (f.ex. `iPhone`, `iPad`)\n- `{{device.model-id}}`: the model identifier of the device running the app (f.ex. `iPhone8,1`)\n- `{{os.name}}` : the name of the operating system running on the device (f.ex. `iOS`, `iPadOS`)\n- `{{os.version}}`: the version of operating system running on the device (f.ex. `13.2.2`)\n", + "flatIdentifier" : "http.user-agent", + "key" : "user-agent", + "status" : "supported", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Policies", + "categoryTag" : "policies", + "classIdentifier" : "item-policy", + "className" : "OCItemPolicyProcessor", + "defaultValue" : 604800, + "description" : "The number of seconds that a file hasn't been downloaded, modified or opened after which the local copy is removed.", + "flatIdentifier" : "item-policy.local-copy-expiration", + "key" : "local-copy-expiration", + "status" : "advanced", + "type" : "int" + }, + { + "autoExpansion" : "none", + "category" : "Policies", + "categoryTag" : "policies", + "classIdentifier" : "item-policy", + "className" : "OCItemPolicyProcessor", + "defaultValue" : true, + "description" : "Controls whether local copies should automatically be removed after they haven't been downloaded, modified or opened for a period of time.", + "flatIdentifier" : "item-policy.local-copy-expiration-enabled", + "key" : "local-copy-expiration-enabled", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Policies", + "categoryTag" : "policies", + "classIdentifier" : "item-policy", + "className" : "OCItemPolicyProcessor", + "defaultValue" : 60, + "description" : "Number of seconds since the removal of an item after which the metadata entry may be finally removed.", + "flatIdentifier" : "item-policy.vacuum-sync-anchor-ttl", + "key" : "vacuum-sync-anchor-ttl", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Licensing", + "categoryTag" : "licensing", + "classIdentifier" : "licensing", + "className" : "OCLicenseManager", + "defaultValue" : false, + "description" : "Enables/disables App Store licensing support.", + "flatIdentifier" : "licensing.disable-appstore-licensing", + "key" : "disable-appstore-licensing", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Licensing", + "categoryTag" : "licensing", + "classIdentifier" : "licensing", + "className" : "OCLicenseManager", + "defaultValue" : false, + "description" : "Enables/disables Enterprise licensing support.", + "flatIdentifier" : "licensing.disable-enterprise-licensing", + "key" : "disable-enterprise-licensing", + "status" : "debugOnly", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : false, + "description" : "Controls whether filtered out messages should still be logged, but with the message replaced with `-`.", + "flags" : 4, + "flatIdentifier" : "log.log-blank-filtered-messages", + "key" : "log-blank-filtered-messages", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : false, + "description" : "Controls whether log levels should be replaced with colored emojis.", + "flags" : 4, + "flatIdentifier" : "log.log-colored", + "key" : "log-colored", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "trailing", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : [ + "writer.stderr", + "writer.file", + "option.log-requests-and-responses" + ], + "description" : "List of enabled logging system components.", + "flags" : 4, + "flatIdentifier" : "log.log-enabled-components", + "key" : "log-enabled-components", + "possibleValues" : [ + { + "description" : "Log HTTP requests and responses", + "value" : "option.log-requests-and-responses" + }, + { + "description" : "Log file", + "value" : "writer.file" + }, + { + "description" : "Standard error output", + "value" : "writer.stderr" + } + ], + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : "text", + "description" : "Determines the format that log messages are saved in", + "flags" : 4, + "flatIdentifier" : "log.log-format", + "key" : "log-format", + "possibleValues" : [ + { + "description" : "Detailed JSON (one line per message).", + "value" : "json" + }, + { + "description" : "A simpler JSON version where details are already merged into the message.", + "value" : "json-composed" + }, + { + "description" : "Standard logging as text.", + "value" : "text" + } + ], + "status" : "advanced", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : 4, + "description" : "Log level", + "flags" : 2, + "flatIdentifier" : "log.log-level", + "key" : "log-level", + "possibleValues" : [ + { + "description" : "verbose", + "value" : -1 + }, + { + "description" : "debug", + "value" : 0 + }, + { + "description" : "info", + "value" : 1 + }, + { + "description" : "warning", + "value" : 2 + }, + { + "description" : "error", + "value" : 3 + }, + { + "description" : "off", + "value" : 4 + } + ], + "status" : "supported", + "type" : "int" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : 0, + "description" : "Maximum length of a log message before the message is truncated. A value of 0 means no limit.", + "flags" : 4, + "flatIdentifier" : "log.log-maximum-message-size", + "key" : "log-maximum-message-size", + "status" : "advanced", + "type" : "int" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "description" : "If set, omits logs messages containing any of the exact terms in this array.", + "flags" : 4, + "flatIdentifier" : "log.log-omit-matching", + "key" : "log-omit-matching", + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "description" : "If set, omits all log messages tagged with tags in this array.", + "flags" : 4, + "flatIdentifier" : "log.log-omit-tags", + "key" : "log-omit-tags", + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "description" : "If set, only logs messages containing at least one of the exact terms in this array.", + "flags" : 4, + "flatIdentifier" : "log.log-only-matching", + "key" : "log-only-matching", + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "description" : "If set, omits all log messages not tagged with tags in this array.", + "flags" : 4, + "flatIdentifier" : "log.log-only-tags", + "key" : "log-only-tags", + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : false, + "description" : "Controls whether certain objects in log statements should be masked for privacy.", + "flags" : 4, + "flatIdentifier" : "log.log-privacy-mask", + "key" : "log-privacy-mask", + "status" : "supported", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : true, + "description" : "Controls whether messages spanning more than one line should be broken into their individual lines and each be logged with the complete lead-in/lead-out sequence.", + "flags" : 4, + "flatIdentifier" : "log.log-single-lined", + "key" : "log-single-lined", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Logging", + "categoryTag" : "logging", + "classIdentifier" : "log", + "className" : "OCLogger", + "defaultValue" : false, + "description" : "Controls whether log messages should be written synchronously (which can impact performance) or asynchronously (which can loose messages in case of a crash).", + "flags" : 4, + "flatIdentifier" : "log.log-synchronous", + "key" : "log-synchronous", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Passcode", + "categoryTag" : "passcode", + "classIdentifier" : "passcode", + "className" : "ownCloudAppShared.AppLockManager", + "defaultValue" : false, + "description" : "Controls wether the user MUST establish a passcode upon app installation", + "flatIdentifier" : "passcode.enforced", + "key" : "enforced", + "status" : "advanced", + "type" : "bool" + }, + { + "autoExpansion" : "none", + "category" : "Release Notes", + "categoryTag" : "releasenotes", + "classIdentifier" : "releasenotes", + "className" : "ownCloud.ReleaseNotesDatasource", + "description" : "The last-seen app version.", + "flatIdentifier" : "releasenotes.lastSeenAppVersion", + "key" : "lastSeenAppVersion", + "status" : "debugOnly", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Release Notes", + "categoryTag" : "releasenotes", + "classIdentifier" : "releasenotes", + "className" : "ownCloud.ReleaseNotesDatasource", + "description" : "The app version for which the release notes were last shown.", + "flatIdentifier" : "releasenotes.lastSeenReleaseNotesVersion", + "key" : "lastSeenReleaseNotesVersion", + "status" : "debugOnly", + "type" : "string" + }, + { + "autoExpansion" : "none", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "user-settings", + "className" : "OCClassSettingsUserPreferences", + "description" : "List of settings (as flat identifiers) users are allowed to change. If this list is specified, only these settings can be changed by the user.", + "flatIdentifier" : "user-settings.allow", + "key" : "allow", + "status" : "advanced", + "type" : "stringArray" + }, + { + "autoExpansion" : "none", + "category" : "Security", + "categoryTag" : "security", + "classIdentifier" : "user-settings", + "className" : "OCClassSettingsUserPreferences", + "description" : "List of settings (as flat identifiers) users are not allowed to change. If this list is specified, all settings not on the list can be changed by the user.", + "flatIdentifier" : "user-settings.disallow", + "key" : "disallow", + "status" : "advanced", + "type" : "stringArray" + } +] diff --git a/docs/modules/ROOT/pages/ios_mdm.adoc b/docs/modules/ROOT/pages/ios_mdm.adoc index 233908013..a93c89d46 100644 --- a/docs/modules/ROOT/pages/ios_mdm.adoc +++ b/docs/modules/ROOT/pages/ios_mdm.adoc @@ -9,15 +9,143 @@ Starting with iOS 7, Apple added support for {mdm-protocol-ref-url}[managed application configuration]. An MDM server can push a configuration to the iOS App. -The app can access the configuration using the `NSUserDefaults` class. +The app can access this configuration (read-only) using the `NSUserDefaults` class by reading a configuration dictionary under the key _com.apple.configuration.managed_. An app can also observe a system notification (_NSUserDefaultsDidChangeNotification_) to get notified about configuration changes. In addition feedback can be queried back by MDM server. To enable that, app has to write a dictionary with feedback information into user defaults under _com.apple.feedback.managed_ key. The configuration is basically a key-value dictionary provided as a `.plist` file. +=== Configurable Settings + +ownCloud App implements a mechanism internally called Class Settings which can be derived from different sources: + +- Environment variables which e.g. can be set in Xcode for testing. In this case setting keys have to be prepended with _oc:_ prefix. +- User preferences accessed by the very same API but stored under _org.owncloud.user-settings_ key. +- Settings dictionary pushed by an MDM Server and accessible using `NSUserDefaults` API under the key _com.apple.configuration.managed_. +- Default settings defined directly in the app sourcecode. +- Branding.plist which is the part of the Xcode project under ownCloud/Resources/Theming. It allows to override class settings by specifying them in the `Configuration` section + +This is also an order in which these settings take precedence (environment variables have highest priority). So, when settings are accessed, they are merged and higher priority value for the same key overwrites lower priority ones. + +Some settings are accessed only once at runtime and the read value is cached, so that new setting to take effect may a require an app to be terminated and restarted. + +==== App Basic Configurations +There are few settings allowing to mark an app installation as BETA and e.g. to supress UIKit animation and review prompt. + +include::./ios_mdm_tables.adoc[tag=app] + +==== Extensions / Actions +ownCloud app uses internally a plug-in like mechanism called extensions. Extensions are used to implement menu actions mostly found under "+" menu allowing to add new items (Upload media, take photo etc.) or in more menu (Copy, Move, Open in etc.). Using below settings actions / extensions can be disabled. Extensions are enabled by default, however this might depend on licensing requirements of a particular extension. + +include::./ios_mdm_tables.adoc[tag=actions] + +(*) These extensions might require additional license (in-app purchase, enterprise version). + +==== Display Settings +To customize file list UI behevior, following settings are available: + +// include::./ios_mdm_tables.adoc[tag=displaysettings] + +==== Passcode Enforcement +If your organization policies require users to use a passcode as an additional security barrier for managed apps, the below setting will allow to enforce this requirement. + +include::./ios_mdm_tables.adoc[tag=passcode] + +==== Bookmark + +Below settings allow to configure the app to use a certain server URL and even bind it to this URL only by setting the default non-editable. + +include::./ios_mdm_tables.adoc[tag=bookmarks] + +==== Item Policies + +include::./ios_mdm_tables.adoc[tag=policies] + +==== Connection + +Settings concerinng HTTP user agent, cookies, background support etc. + +include::./ios_mdm_tables.adoc[tag=connection] + +===== Server Endpoints + +Individually configurable endpoints of the ownCloud server instance. + +include::./ios_mdm_tables.adoc[tag=endpoints] + +===== Connection Authentication / Security + +Settings concerning certificate validation policies. + +include::./ios_mdm_tables.adoc[tag=security] + +===== OAuth2 Based Authentication + +Settings allowing to configure OAuth2 based authentication. + +include::./ios_mdm_tables.adoc[tag=oauth2] + +==== Shortcuts + +Shortcuts are a very powerful way to build automated workflows in iOS. Apps can provide shortcut intents for certain actions. ownCloud app provides certain actions as shortcuts as well (e.g. allowing to get account information, create folder and so on). However in some cases it might make sense to disable shortcuts to minimize security risks. It can be done using following option: + +include::./ios_mdm_tables.adoc[tag=shortcuts] + +==== Logging +Logging settings control the ammount and type of app internal log messages stored as text files and accessible via settings menu. + +include::./ios_mdm_tables.adoc[tag=logging] + +== AppConfig XML Example + +Here is an example of an XML spec-file based on AppConfig standard with minimal logging settings allowing to change a log level and disable / enable private information masking: + +``` + + 1.0.0 + com.owncloud.ios-app + + + + 4 + + + + + + + + + + + Logging + + + + + 0 - Debug, 1 - Info, 2 - Warning, 3 - Error, 4 - Off + + + + + + Hide private user's data + + + + + +``` + == AppConfig XML Schema {appconfig-xml-format-url}[The XML format], developed by AppConfig community, makes it easy for developers to define and deploy an app configuration. It not only supports configuration variables having default values, but also provides a configuration UI description, which can be interpreted by the tool and which generates a plist file. Moreover, specfile XML is consistently supported by major EMM vendors. +AppConfig conformant spec file tailored to administrator needs and containing one or more of the above settings can be easily created using https://www.appconfig.org/www/appconfigspeccreator/[Config Spec Creator] tool hosted at https://www.appconfig.org[AppConfig website]. + == Example: Deployment with MobileIron 1. Open https://appconfig.jamfresearch.com[AppConfig Generator]. diff --git a/docs/modules/ROOT/pages/ios_mdm_tables.adoc b/docs/modules/ROOT/pages/ios_mdm_tables.adoc new file mode 100644 index 000000000..836c45844 --- /dev/null +++ b/docs/modules/ROOT/pages/ios_mdm_tables.adoc @@ -0,0 +1,1044 @@ + +tag::actions[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|action.com.owncloud.action.collaborate.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.copy.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.createFolder.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.delete.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.discardscene.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.duplicate.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.favorite.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.links.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.makeAvailableOffline.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.makeUnavailableOffline.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.markup.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.mediaediting.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.move.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.openin.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.openscene.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.rename.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.scan.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.show-exif.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.unfavorite.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.unshare.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.upload.camera_media.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.uploadfile.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|action.com.owncloud.action.uploadphotos.enabled +|bool +| +|Controls whether action can be accessed in the app UI. +|advanced `candidate` + +|=== +end::actions[] + + +tag::app[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|app.app-store-link +|string +|`https://itunes.apple.com/app/id1359583808?mt=8` +|URL for the app in the App Store. +|advanced `candidate` + +|app.enable-review-prompt +|bool +|`true` +|Enable/disable review prompt. +|advanced `candidate` + +|app.recommend-to-friend-enabled +|bool +|`true` +|Enables/disables the recommend to a friend entry in the settings. +|advanced `candidate` + +|app.enable-ui-animations +|bool +|`true` +|Enable/disable UI animations. +|debugOnly + +|app.is-beta-build +|bool +|`true` +|Controls if the app is built for beta or release purposes. +|debugOnly + +|app.show-beta-warning +|bool +|`true` +|Controls whether a warning should be shown on the first run of a beta version. +|debugOnly + +|=== +end::app[] + + +tag::authentication[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|authentication.browser-session-class +|string +|`operating-system` +|Alternative browser session class to use instead of `ASWebAuthenticationSession`. Please also see Compile Time Configuration if you want to use this. +[cols="1,2"] +!=== +! Value +! Description +! `UIWebView` +! Use UIWebView for browser sessions. Requires compilation with `OC_FEATURE_AVAILABLE_UIWEBVIEW_BROWSER_SESSION=1` preprocessor flag. + +! `operating-system` +! Use ASWebAuthenticationSession for browser sessions. + +!=== + +|supported `candidate` + +|authentication.browser-session-prefers-ephermal +|bool +|`false` +|Indicates whether the app should ask iOS for a private authentication (web) session for OAuth2 or OpenID Connect. Private authentication sessions do not share cookies and other browsing data with the user's normal browser. Apple only promises that [this setting](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/3237231-prefersephemeralwebbrowsersessio) will be honored if the user has set Safari as default browser. +|supported `candidate` + +|=== +end::authentication[] + + +tag::bookmarks[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|bookmark.default-url +|string +| +|The default URL for the creation of new bookmarks. +|supported `candidate` + +|bookmark.url-editable +|bool +|`true` +|Controls whetehr the server URL in the text field during the creation of new bookmarks can be changed. +|supported `candidate` + +|=== +end::bookmarks[] + + +tag::branding[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|branding.app-name +|string +| +|App name to use throughout the app. +|supported `candidate` + +|branding.organization-name +|string +| +|Organization name to use throughout the app. +|supported `candidate` + +|branding.can-add-account +|bool +|`true` +|Controls whether the user can add accounts. +|advanced `candidate` + +|branding.can-edit-account +|bool +|`true` +|Controls whether the user can edit accounts. +|advanced `candidate` + +|branding.profile-definitions +|dictionaryArray +| +|Array of dictionaries, each specifying a static profile. +|advanced `candidate` + +|branding.send-feedback-address +|string +|`ios-app@owncloud.com` +|Email address to send feedback to. Set to `null` to disable this feature. +|advanced `candidate` + +|branding.theme-definitions +|dictionaryArray +| +|Array of dictionaries, each specifying a theme. +|advanced `candidate` + +|branding.theme-generic-colors +|dictionary +| +|Dictionary defining generic colors that can be used in the definitions. +|advanced `candidate` + +|branding.url-documentation +|urlString +|`https://doc.owncloud.com/ios-app/` +|URL to documentation for the app. Opened when selecting "Documentation" in the settings. +|advanced `candidate` + +|branding.url-help +|urlString +|`https://www.owncloud.com/help` +|URL to help for the app. Opened when selecting "Help" in the settings. +|advanced `candidate` + +|branding.url-privacy +|urlString +|`https://owncloud.org/privacy-policy/` +|URL to privacy information for the app. Opened when selecting "Privacy" in the settings. +|advanced `candidate` + +|branding.url-terms-of-use +|urlString +|`https://raw.githubusercontent.com/owncloud/ios-app/master/LICENSE` +|URL to terms of use for the app. Opened when selecting "Terms Of Use" in the settings. +|advanced `candidate` + +|=== +end::branding[] + + +tag::connection[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|connection.allow-cellular +|bool +|`true` +|Allow the use of cellular connections. +|recommended `candidate` + +|core.cookie-support-enabled +|bool +|`true` +|Enable or disable per-process, in-memory cookie storage. +|supported `candidate` + +|http.user-agent +|string +|`ownCloudApp/{{app.version}} ({{app.part}}/{{app.build}}; {{os.name}}/{{os.version}}; {{device.model}})` +|A custom `User-Agent` to send with every HTTP request. + +The following placeholders can be used to make it dynamic: +- `{{app.build}}`: the build number of the app (f.ex. `123`) +- `{{app.version}}`: the version of the app (f.ex. `1.2`) +- `{{app.part}}`: the part of the app (more exactly: the name of the main bundle) from which the request was sent (f.ex. `App`, `ownCloud File Provider`) +- `{{device.model}}`: the model of the device running the app (f.ex. `iPhone`, `iPad`) +- `{{device.model-id}}`: the model identifier of the device running the app (f.ex. `iPhone8,1`) +- `{{os.name}}` : the name of the operating system running on the device (f.ex. `iOS`, `iPadOS`) +- `{{os.version}}`: the version of operating system running on the device (f.ex. `13.2.2`) + +|supported `candidate` + +|connection.always-request-private-link +|bool +|`false` +|Controls whether private links are requested with regular PROPFINDs. +|advanced `candidate` + +|connection.plain-http-policy +|string +|`warn` +|Policy regarding the use of plain (unencryped) HTTP URLs for creating bookmarks. A value of `warn` will create an issue (typically then presented to the user as a warning), but ultimately allow the creation of the bookmark. A value of `forbidden` will block the use of `http`-URLs for the creation of new bookmarks. +|advanced `candidate` + +|core.action-concurrency-budgets +|dictionary +|`map[actions:10 all:0 download:3 download-wifi-and-cellular:3 download-wifi-only:2 transfer:6 upload:3 upload-cellular-and-wifi:3 upload-wifi-only:2]` +|Concurrency budgets available for sync actions by action category. +|advanced `candidate` + +|connection.allow-background-url-sessions +|bool +|`true` +|Allow the use of background URL sessions. Note: depending on iOS version, the app may still choose not to use them. This settings is overriden by `force-background-url-sessions`. +|debugOnly + +|connection.connection-minimum-server-version +|string +|`10.0` +|The minimum server version required. +|debugOnly + +|connection.force-background-url-sessions +|bool +|`false` +|Forces the use of background URL sessions. Overrides `allow-background-url-sessions`. +|debugOnly + +|core.override-availability-signal +|bool +| +|Override the availability signal, so the host is considered to always be in maintenance mode (`true`) or never in maintenance mode (`false`). +|debugOnly + +|core.override-reachability-signal +|bool +| +|Override the reachability signal, so the host is always considered reachable (`true`) or unreachable (`false`). +|debugOnly + +|core.thumbnail-available-for-mime-type-prefixes +|stringArray +|`[*]` +|Provide hints that thumbnails are available for items whose MIME-Type starts with any of the strings provided in this array. Providing an empty array turns off thumbnail loading. Providing `["*"]` turns on thumbnail loading for all items. +|debugOnly + +|host-simulator.active-simulations +|stringArray +|`[]` +|Active Host simulation extensions. +[cols="1,2"] +!=== +! Value +! Description +! `five-seconds-of-404` +! Return status code 404 for every request for the first five seconds. + +! `only-404` +! Return status code 404 for every request. + +! `recovering-apm` +! Redirect any request without cookies to a bogus endpoint for 30 seconds, then to a cookie-setting endpoint, where cookies are set - and then redirect back. + +! `reject-downloads-500` +! Reject Downloads with status 500 responses. + +! `simple-apm` +! Redirect any request without cookies to a cookie-setting endpoint, where cookies are set - and then redirect back. + +!=== + +|debugOnly + +|=== +end::connection[] + + +tag::diagnostics[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|diagnostics.enabled +|bool +|`false` +|Controls whether additional diagnostic options and information is available throughout the user interface. +|advanced `candidate` + +|=== +end::diagnostics[] + + +tag::displaysettings[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|display.prevent-dragging-files +|bool +|`false` +|Controls whether drag and drop should be prevented for items inside the app. +|advanced `candidate` + +|display.show-hidden-files +|bool +|`false` +|Controls whether hidden files (i.e. files starting with `.` ) should also be shown. +|advanced `candidate` + +|display.sort-folders-first +|bool +|`false` +|Controls whether folders are shown at the top. +|advanced `candidate` + +|=== +end::displaysettings[] + + +tag::endpoints[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|connection.endpoint-capabilities +|string +|`ocs/v2.php/cloud/capabilities` +|Endpoint to use for retrieving server capabilities. +|advanced `candidate` + +|connection.endpoint-recipients +|string +|`ocs/v2.php/apps/files_sharing/api/v1/sharees` +|Path of the sharing recipient API endpoint. +|advanced `candidate` + +|connection.endpoint-remote-shares +|string +|`ocs/v2.php/apps/files_sharing/api/v1/remote_shares` +|Path of the remote shares API endpoint. +|advanced `candidate` + +|connection.endpoint-shares +|string +|`ocs/v2.php/apps/files_sharing/api/v1/shares` +|Path of the shares API endpoint. +|advanced `candidate` + +|connection.endpoint-status +|string +|`status.php` +|Endpoint to retrieve basic status information and detect an ownCloud installation. +|advanced `candidate` + +|connection.endpoint-thumbnail +|string +|`index.php/apps/files/api/v1/thumbnail` +|Path of the thumbnail endpoint. +|advanced `candidate` + +|connection.endpoint-user +|string +|`ocs/v2.php/cloud/user` +|Endpoint to use for retrieving information on logged in user. +|advanced `candidate` + +|connection.endpoint-webdav +|string +|`remote.php/dav/files` +|Endpoint to use for WebDAV. +|advanced `candidate` + +|connection.endpoint-webdav-meta +|string +|`remote.php/dav/meta` +|Endpoint to use for WebDAV metadata. +|advanced `candidate` + +|connection.well-known +|string +|`.well-known` +|Path of the .well-known endpoint. +|advanced `candidate` + +|=== +end::endpoints[] + + +tag::licensing[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|licensing.disable-appstore-licensing +|bool +|`false` +|Enables/disables App Store licensing support. +|debugOnly + +|licensing.disable-enterprise-licensing +|bool +|`false` +|Enables/disables Enterprise licensing support. +|debugOnly + +|=== +end::licensing[] + + +tag::logging[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|log.log-level +|int +|`4` +|Log level +[cols="1,2"] +!=== +! Value +! Description +! `-1` +! verbose + +! `0` +! debug + +! `1` +! info + +! `2` +! warning + +! `3` +! error + +! `4` +! off + +!=== + +|supported `candidate` + +|log.log-privacy-mask +|bool +|`false` +|Controls whether certain objects in log statements should be masked for privacy. +|supported `candidate` + +|log.log-blank-filtered-messages +|bool +|`false` +|Controls whether filtered out messages should still be logged, but with the message replaced with `-`. +|advanced `candidate` + +|log.log-colored +|bool +|`false` +|Controls whether log levels should be replaced with colored emojis. +|advanced `candidate` + +|log.log-enabled-components +|stringArray +|`[writer.stderr writer.file option.log-requests-and-responses]` +|List of enabled logging system components. +[cols="1,2"] +!=== +! Value +! Description +! `option.log-requests-and-responses` +! Log HTTP requests and responses + +! `writer.file` +! Log file + +! `writer.stderr` +! Standard error output + +!=== + +|advanced `candidate` + +|log.log-format +|string +|`text` +|Determines the format that log messages are saved in +[cols="1,2"] +!=== +! Value +! Description +! `json` +! Detailed JSON (one line per message). + +! `json-composed` +! A simpler JSON version where details are already merged into the message. + +! `text` +! Standard logging as text. + +!=== + +|advanced `candidate` + +|log.log-maximum-message-size +|int +|`0` +|Maximum length of a log message before the message is truncated. A value of 0 means no limit. +|advanced `candidate` + +|log.log-omit-matching +|stringArray +| +|If set, omits logs messages containing any of the exact terms in this array. +|advanced `candidate` + +|log.log-omit-tags +|stringArray +| +|If set, omits all log messages tagged with tags in this array. +|advanced `candidate` + +|log.log-only-matching +|stringArray +| +|If set, only logs messages containing at least one of the exact terms in this array. +|advanced `candidate` + +|log.log-only-tags +|stringArray +| +|If set, omits all log messages not tagged with tags in this array. +|advanced `candidate` + +|log.log-single-lined +|bool +|`true` +|Controls whether messages spanning more than one line should be broken into their individual lines and each be logged with the complete lead-in/lead-out sequence. +|advanced `candidate` + +|log.log-synchronous +|bool +|`false` +|Controls whether log messages should be written synchronously (which can impact performance) or asynchronously (which can loose messages in case of a crash). +|advanced `candidate` + +|=== +end::logging[] + + +tag::oauth2[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|authentication-oauth2.oa2-authorization-endpoint +|string +|`index.php/apps/oauth2/authorize` +|OAuth2 authorization endpoint. +|advanced `candidate` + +|authentication-oauth2.oa2-client-id +|string +|`mxd5OQDk6es5LzOzRvidJNfXLUZS2oN3oUFeXPP8LpPrhx3UroJFduGEYIBOxkY1` +|OAuth2 Client ID. +|advanced `candidate` + +|authentication-oauth2.oa2-client-secret +|string +|`KFeFWWEZO9TkisIQzR3fo7hfiMXlOpaqP8CFuTbSHzV1TUuGECglPxpiVKJfOXIx` +|OAuth2 Client Secret. +|advanced `candidate` + +|authentication-oauth2.oa2-redirect-uri +|string +|`oc://ios.owncloud.com` +|OAuth2 Redirect URI. +|advanced `candidate` + +|authentication-oauth2.oa2-token-endpoint +|string +|`index.php/apps/oauth2/api/v1/token` +|OAuth2 token endpoint. +|advanced `candidate` + +|authentication-oauth2.oa2-expiration-override-seconds +|int +| +|OAuth2 Expiration Override - lets OAuth2 tokens expire after the provided number of seconds (useful to prompt quick `refresh_token` requests for testing) +|debugOnly + +|=== +end::oauth2[] + + +tag::oidc[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|authentication-oauth2.oidc-redirect-uri +|string +|`oc://ios.owncloud.com` +|OpenID Connect Redirect URI +|supported `candidate` + +|authentication-oauth2.oidc-scope +|string +|`openid offline_access email profile` +|OpenID Connect Scope +|supported `candidate` + +|=== +end::oidc[] + + +tag::passcode[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|passcode.enforced +|bool +|`false` +|Controls wether the user MUST establish a passcode upon app installation +|advanced `candidate` + +|=== +end::passcode[] + + +tag::policies[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|item-policy.local-copy-expiration +|int +|`604800` +|The number of seconds that a file hasn't been downloaded, modified or opened after which the local copy is removed. +|advanced `candidate` + +|item-policy.local-copy-expiration-enabled +|bool +|`true` +|Controls whether local copies should automatically be removed after they haven't been downloaded, modified or opened for a period of time. +|advanced `candidate` + +|item-policy.vacuum-sync-anchor-ttl +|bool +|`60` +|Number of seconds since the removal of an item after which the metadata entry may be finally removed. +|debugOnly + +|=== +end::policies[] + + +tag::privacy[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|core.add-accept-language-header +|bool +|`true` +|Add an `Accept-Language` HTTP header using the preferred languages set on the device. +|advanced `candidate` + +|=== +end::privacy[] + + +tag::releasenotes[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|releasenotes.lastSeenAppVersion +|string +| +|The last-seen app version. +|debugOnly + +|releasenotes.lastSeenReleaseNotesVersion +|string +| +|The app version for which the release notes were last shown. +|debugOnly + +|=== +end::releasenotes[] + + +tag::security[] +[cols="1,2,3,4a,5",options=header] +|=== +|Key +|Type +|Default +|Description +|Status + + +|connection.connection-allowed-authentication-methods +|stringArray +| +|Array of allowed authentication methods. Nil/Missing for no restrictions. +[cols="1,2"] +!=== +! Value +! Description +! `com.owncloud.basicauth` +! Basic Auth + +! `com.owncloud.oauth2` +! OAuth2 + +! `com.owncloud.openid-connect` +! OpenID Connect + +!=== + +|recommended `candidate` + +|connection.connection-preferred-authentication-methods +|stringArray +|`[com.owncloud.openid-connect com.owncloud.oauth2 com.owncloud.basicauth]` +|Array of authentication methods in order of preference (most preferred first). +[cols="1,2"] +!=== +! Value +! Description +! `com.owncloud.basicauth` +! Basic Auth + +! `com.owncloud.oauth2` +! OAuth2 + +! `com.owncloud.openid-connect` +! OpenID Connect + +!=== + +|recommended `candidate` + +|connection.connection-certificate-extended-validation-rule +|string +|`bookmarkCertificate == serverCertificate` +|Rule that defines the criteria a certificate needs to meet for OCConnection to recognize it as valid for a bookmark. + +Examples of expressions: +- `bookmarkCertificate == serverCertificate`: the whole certificate needs to be identical to the one stored in the bookmark during setup. +- `bookmarkCertificate.publicKeyData == serverCertificate.publicKeyData`: the public key of the received certificate needs to be identical to the public key stored in the bookmark during setup. +- `serverCertificate.passedValidationOrIsUserAccepted == true`: any certificate is accepted as long as it has passed validation by the OS or was accepted by the user. +- `serverCertificate.commonName == "demo.owncloud.org"`: the common name of the certificate must be "demo.owncloud.org". +- `serverCertificate.rootCertificate.commonName == "DST Root CA X3"`: the common name of the root certificate must be "DST Root CA X3". +- `serverCertificate.parentCertificate.commonName == "Let's Encrypt Authority X3"`: the common name of the parent certificate must be "Let's Encrypt Authority X3". +- `serverCertificate.publicKeyData.sha256Hash.asFingerPrintString == "2A 00 98 90 BD … F7"`: the SHA-256 fingerprint of the public key of the server certificate needs to match the provided value. + +|advanced `candidate` + +|connection.connection-renewed-certificate-acceptance-rule +|string +|`(bookmarkCertificate.publicKeyData == serverCertificate.publicKeyData) OR ((check.parentCertificatesHaveIdenticalPublicKeys == true) AND (serverCertificate.passedValidationOrIsUserAccepted == true))` +|Rule that defines the criteria that need to be met for OCConnection to accept a renewed certificate and update the bookmark's certificate automatically instead of prompting the user. Used when the extended validation rule fails. Set this to `never` if the user should always be prompted when a server's certificate changed. +|advanced `candidate` + +|user-settings.allow +|stringArray +| +|List of settings (as flat identifiers) users are allowed to change. If this list is specified, only these settings can be changed by the user. +|advanced `candidate` + +|user-settings.disallow +|stringArray +| +|List of settings (as flat identifiers) users are not allowed to change. If this list is specified, all settings not on the list can be changed by the user. +|advanced `candidate` + +|connection.transparent-temporary-redirect +|bool +|`false` +|Controls whether 307 redirects are handled transparently at the HTTP pipeline level (by resending the headers and body). +|debugOnly + +|=== +end::security[] + + diff --git a/enterprise/MDM/AppConfig/log-passcode-specfile.xml b/enterprise/MDM/AppConfig/log-passcode-specfile.xml new file mode 100644 index 000000000..46afcada4 --- /dev/null +++ b/enterprise/MDM/AppConfig/log-passcode-specfile.xml @@ -0,0 +1,66 @@ + + 1 + com.owncloud.ios-app + + + + 4 + + + + + + + + + text + + + + + + + + + Logging + + + + + 0 - Debug, 1 - Info, 2 - Warning, 3 - Error, 4 - Off + + + + + + Hide private user's data + + + + + + Options: text, json, json-composed + + + + + + Passcode + + + + + User is forced to set up passcode + + + + + \ No newline at end of file diff --git a/enterprise/MDM/AppConfig/specfile.xml b/enterprise/MDM/AppConfig/specfile.xml index 247f8bf65..6f945e2dc 100644 --- a/enterprise/MDM/AppConfig/specfile.xml +++ b/enterprise/MDM/AppConfig/specfile.xml @@ -35,16 +35,6 @@ - - - true - - - - - true - - ocs/v1.php/cloud/capabilities @@ -65,6 +55,22 @@ remote.php/dav/files + + + 4 + + + + + + + + + text + + + + @@ -131,46 +137,69 @@ - Connection + Endpoints - + + + + - - Require the certificate stored in the connection's bookmark if the connection's state is active. - - + + + + - - Endpoints + Logging - + + + 0 - Debug, 1 - Info, 2 - Warning, 3 - Error, 4 - Off + - + + + Hide private user's data + - + + + Options: text, json, json-composed + - + + + + Passcode + + + + User is forced to set up passcode + diff --git a/external/PocketSVG b/external/PocketSVG deleted file mode 160000 index 039399f26..000000000 --- a/external/PocketSVG +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 039399f26c416a8bf80e9b650445eefc85280c36 diff --git a/external/libzip/libzip.xcodeproj/project.pbxproj b/external/libzip/libzip.xcodeproj/project.pbxproj index f03b4736f..c27f0c5bb 100644 --- a/external/libzip/libzip.xcodeproj/project.pbxproj +++ b/external/libzip/libzip.xcodeproj/project.pbxproj @@ -453,7 +453,7 @@ DCE93FDA21FCA42B000E14F2 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1010; + LastUpgradeCheck = 1230; ORGANIZATIONNAME = "ownCloud GmbH"; TargetAttributes = { DCE93FE221FCA42C000E14F2 = { diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 349978f37..19d3c3eaa 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -613,14 +613,14 @@ end version_key: "APP_SHORT_VERSION" ) - if values[:BETA_APP_ICON] - commit = last_git_commit - short_hash = commit[:abbreviated_commit_hash] # short sha of commit - sh "brew install librsvg" - sh "sed -e \"s/\#version#/" + version + "/\" -e \"s/\#githash#/" + short_hash + "/\" badge.svg > badge_tmp.svg" - sh "rsvg-convert badge_tmp.svg > badge.png" - add_badge(custom: "fastlane/badge.png") - end + #if values[:BETA_APP_ICON] + # commit = last_git_commit + # short_hash = commit[:abbreviated_commit_hash] # short sha of commit + # sh "brew install librsvg" + # sh "sed -e \"s/\#version#/" + version + "/\" -e \"s/\#githash#/" + short_hash + "/\" badge.svg > badge_tmp.svg" + # sh "rsvg-convert badge_tmp.svg > badge.png" + # add_badge(custom: "fastlane/badge.png") + #end #Create the build gym( diff --git a/fastlane/Snapfile b/fastlane/Snapfile index 8aa706bdd..adaaab9af 100644 --- a/fastlane/Snapfile +++ b/fastlane/Snapfile @@ -4,11 +4,11 @@ devices([ "iPhone 11 Pro Max", "iPad Pro (12.9-inch) (4th generation)", - "iPhone 7", + "iPhone 8", "iPhone 8 Plus", "iPhone SE (2nd generation)", "iPhone 11", - "iPad Pro (12.9-inch)", + "iPad Pro (12.9-inch) (2nd generation)", "iPad Pro (9.7-inch)" ]) diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index f23e1fdb6..488bf3dcf 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,6 +1,30 @@ -• Fix: Crash in Detail View -Fixed a crash when selecting an item, which is still uploading +• Full Screen PDF View +A PDF file can be opened in fullscreen view and hides unnecessary UI elements. -• Fix: Upload Improvements -Fixed some problems when uploading items in the background or from the share sheet +• Video Upload Improvements +Added an option to allow uploading original videos like slow motion, unedited version without re-encoding + +• Right-to-Left Language UI Improvements +We improved our App UI for Right-to-Left languages + +• UI Improvements +The app is using the ownCloud colors and we also polished some UI elements + +• Certificate Changes +Show certificate changes in a comparison view + +• Login Improvements +User login to a bookmark is only possible with the same user ID + +• Improved Drag & Drop +We improved Drag & Drop and now it is also possible for non local files + +• Fix: Bookmark name editing +Editing the bookmark name was not possible + +• Fix: Sync +Fixed some problems with items in stuck + +• Fix: Media Playback +Media Player stopped playing, if there was a non media file item in the folder. diff --git a/fastlane/screenshots/de_CH/keyword.strings b/fastlane/screenshots/de_CH/keyword.strings new file mode 100644 index 000000000..fe237c7fe Binary files /dev/null and b/fastlane/screenshots/de_CH/keyword.strings differ diff --git a/fastlane/screenshots/de_CH/title.strings b/fastlane/screenshots/de_CH/title.strings new file mode 100644 index 000000000..0a9465ab8 Binary files /dev/null and b/fastlane/screenshots/de_CH/title.strings differ diff --git a/fastlane/screenshots/en-US/1_ipadPro129_1.iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_ipadPro129_1.iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 45a16cc58..000000000 Binary files a/fastlane/screenshots/en-US/1_ipadPro129_1.iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_ipadPro_1.iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_ipadPro_1.iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 10ae37aa9..000000000 Binary files a/fastlane/screenshots/en-US/1_ipadPro_1.iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_ipad_1.iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_ipad_1.iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 4b5594f4d..000000000 Binary files a/fastlane/screenshots/en-US/1_ipad_1.iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_iphone4_1.iPhone SE-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_iphone4_1.iPhone SE-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index e30d8c033..000000000 Binary files a/fastlane/screenshots/en-US/1_iphone4_1.iPhone SE-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_iphone58_1.iPhone X-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_iphone58_1.iPhone X-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index d7edad838..000000000 Binary files a/fastlane/screenshots/en-US/1_iphone58_1.iPhone X-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_iphone65_1.iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_iphone65_1.iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 36d69fd9b..000000000 Binary files a/fastlane/screenshots/en-US/1_iphone65_1.iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_iphone6Plus_1.iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_iphone6Plus_1.iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 5de004aea..000000000 Binary files a/fastlane/screenshots/en-US/1_iphone6Plus_1.iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/1_iphone6_1.iPhone 7-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/1_iphone6_1.iPhone 7-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index a290e0db1..000000000 Binary files a/fastlane/screenshots/en-US/1_iphone6_1.iPhone 7-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_ipadPro129_2.iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_ipadPro129_2.iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 65a508688..000000000 Binary files a/fastlane/screenshots/en-US/2_ipadPro129_2.iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_ipadPro_2.iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_ipadPro_2.iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 81b6b004b..000000000 Binary files a/fastlane/screenshots/en-US/2_ipadPro_2.iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_ipad_2.iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_ipad_2.iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 4b022f215..000000000 Binary files a/fastlane/screenshots/en-US/2_ipad_2.iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_iphone4_2.iPhone SE-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_iphone4_2.iPhone SE-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 688c45e81..000000000 Binary files a/fastlane/screenshots/en-US/2_iphone4_2.iPhone SE-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_iphone58_2.iPhone X-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_iphone58_2.iPhone X-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 85d65e59e..000000000 Binary files a/fastlane/screenshots/en-US/2_iphone58_2.iPhone X-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_iphone65_2.iPhone Xs Max-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_iphone65_2.iPhone Xs Max-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 800d6e4b2..000000000 Binary files a/fastlane/screenshots/en-US/2_iphone65_2.iPhone Xs Max-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_iphone6Plus_2.iPhone 8 Plus-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_iphone6Plus_2.iPhone 8 Plus-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index eb1354371..000000000 Binary files a/fastlane/screenshots/en-US/2_iphone6Plus_2.iPhone 8 Plus-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/2_iphone6_2.iPhone 7-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/2_iphone6_2.iPhone 7-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 058e56525..000000000 Binary files a/fastlane/screenshots/en-US/2_iphone6_2.iPhone 7-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_ipadPro129_3.iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_ipadPro129_3.iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png deleted file mode 100644 index 499817591..000000000 Binary files a/fastlane/screenshots/en-US/3_ipadPro129_3.iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_ipadPro_3.iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_ipadPro_3.iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png deleted file mode 100644 index 61881eb4a..000000000 Binary files a/fastlane/screenshots/en-US/3_ipadPro_3.iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_ipad_3.iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_ipad_3.iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png deleted file mode 100644 index d25c33873..000000000 Binary files a/fastlane/screenshots/en-US/3_ipad_3.iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_iphone4_3.iPhone SE-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_iphone4_3.iPhone SE-20_ios_files_list_demo_framed.png deleted file mode 100644 index 2771b9d4b..000000000 Binary files a/fastlane/screenshots/en-US/3_iphone4_3.iPhone SE-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_iphone58_3.iPhone X-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_iphone58_3.iPhone X-20_ios_files_list_demo_framed.png deleted file mode 100644 index ea941394d..000000000 Binary files a/fastlane/screenshots/en-US/3_iphone58_3.iPhone X-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_iphone65_3.iPhone Xs Max-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_iphone65_3.iPhone Xs Max-20_ios_files_list_demo_framed.png deleted file mode 100644 index c7c963e53..000000000 Binary files a/fastlane/screenshots/en-US/3_iphone65_3.iPhone Xs Max-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_iphone6Plus_3.iPhone 8 Plus-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_iphone6Plus_3.iPhone 8 Plus-20_ios_files_list_demo_framed.png deleted file mode 100644 index 343636bc1..000000000 Binary files a/fastlane/screenshots/en-US/3_iphone6Plus_3.iPhone 8 Plus-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/3_iphone6_3.iPhone 7-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/3_iphone6_3.iPhone 7-20_ios_files_list_demo_framed.png deleted file mode 100644 index 7241a98d3..000000000 Binary files a/fastlane/screenshots/en-US/3_iphone6_3.iPhone 7-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_ipadPro129_4.iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_ipadPro129_4.iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 03f8052cb..000000000 Binary files a/fastlane/screenshots/en-US/4_ipadPro129_4.iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_ipadPro_4.iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_ipadPro_4.iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png deleted file mode 100644 index b1ad4fab6..000000000 Binary files a/fastlane/screenshots/en-US/4_ipadPro_4.iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_ipad_4.iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_ipad_4.iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png deleted file mode 100644 index f705bc377..000000000 Binary files a/fastlane/screenshots/en-US/4_ipad_4.iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_iphone4_4.iPhone SE-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_iphone4_4.iPhone SE-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 117c21640..000000000 Binary files a/fastlane/screenshots/en-US/4_iphone4_4.iPhone SE-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_iphone58_4.iPhone X-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_iphone58_4.iPhone X-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 9d3829b91..000000000 Binary files a/fastlane/screenshots/en-US/4_iphone58_4.iPhone X-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_iphone65_4.iPhone Xs Max-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_iphone65_4.iPhone Xs Max-21_ios_files_actions_demo_framed.png deleted file mode 100644 index e72dfc9d9..000000000 Binary files a/fastlane/screenshots/en-US/4_iphone65_4.iPhone Xs Max-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_iphone6Plus_4.iPhone 8 Plus-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_iphone6Plus_4.iPhone 8 Plus-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 59b9d675a..000000000 Binary files a/fastlane/screenshots/en-US/4_iphone6Plus_4.iPhone 8 Plus-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/4_iphone6_4.iPhone 7-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/4_iphone6_4.iPhone 7-21_ios_files_actions_demo_framed.png deleted file mode 100644 index caaafc8b7..000000000 Binary files a/fastlane/screenshots/en-US/4_iphone6_4.iPhone 7-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_ipadPro129_5.iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_ipadPro129_5.iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 0a1248601..000000000 Binary files a/fastlane/screenshots/en-US/5_ipadPro129_5.iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_ipadPro_5.iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_ipadPro_5.iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 0ef6e8657..000000000 Binary files a/fastlane/screenshots/en-US/5_ipadPro_5.iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_ipad_5.iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_ipad_5.iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 5c32eb46a..000000000 Binary files a/fastlane/screenshots/en-US/5_ipad_5.iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_iphone4_5.iPhone SE-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_iphone4_5.iPhone SE-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 2361d919f..000000000 Binary files a/fastlane/screenshots/en-US/5_iphone4_5.iPhone SE-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_iphone58_5.iPhone X-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_iphone58_5.iPhone X-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 329d9e1ea..000000000 Binary files a/fastlane/screenshots/en-US/5_iphone58_5.iPhone X-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_iphone65_5.iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_iphone65_5.iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 4bf3aa3da..000000000 Binary files a/fastlane/screenshots/en-US/5_iphone65_5.iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_iphone6Plus_5.iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_iphone6Plus_5.iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 9cd733dd1..000000000 Binary files a/fastlane/screenshots/en-US/5_iphone6Plus_5.iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/5_iphone6_5.iPhone 7-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/5_iphone6_5.iPhone 7-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index b43b82804..000000000 Binary files a/fastlane/screenshots/en-US/5_iphone6_5.iPhone 7-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_ipadPro129_6.iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/6_ipadPro129_6.iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index 7731a2f1c..000000000 Binary files a/fastlane/screenshots/en-US/6_ipadPro129_6.iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_ipadPro_6.iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/6_ipadPro_6.iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index 003b193f4..000000000 Binary files a/fastlane/screenshots/en-US/6_ipadPro_6.iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_ipad_6.iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/6_ipad_6.iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index 527668fac..000000000 Binary files a/fastlane/screenshots/en-US/6_ipad_6.iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_iphone4_6.iPhone SE-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/6_iphone4_6.iPhone SE-40_ios_quick_access_demo_framed.png deleted file mode 100644 index cf51a45b1..000000000 Binary files a/fastlane/screenshots/en-US/6_iphone4_6.iPhone SE-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_iphone58_6.iPhone X-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/6_iphone58_6.iPhone X-40_ios_quick_access_demo_framed.png deleted file mode 100644 index c5d5232ad..000000000 Binary files a/fastlane/screenshots/en-US/6_iphone58_6.iPhone X-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_iphone65_6.iPhone Xs Max-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/6_iphone65_6.iPhone Xs Max-40_ios_quick_access_demo_framed.png deleted file mode 100644 index d68c455b7..000000000 Binary files a/fastlane/screenshots/en-US/6_iphone65_6.iPhone Xs Max-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_iphone6Plus_6.iPhone 8 Plus-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/6_iphone6Plus_6.iPhone 8 Plus-40_ios_quick_access_demo_framed.png deleted file mode 100644 index f3f59ce03..000000000 Binary files a/fastlane/screenshots/en-US/6_iphone6Plus_6.iPhone 8 Plus-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/6_iphone6_6.iPhone 7-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/6_iphone6_6.iPhone 7-40_ios_quick_access_demo_framed.png deleted file mode 100644 index b02a8efca..000000000 Binary files a/fastlane/screenshots/en-US/6_iphone6_6.iPhone 7-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_ipadPro129_7.iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/7_ipadPro129_7.iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 0c20e050f..000000000 Binary files a/fastlane/screenshots/en-US/7_ipadPro129_7.iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_ipadPro_7.iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/7_ipadPro_7.iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png deleted file mode 100644 index b7d229970..000000000 Binary files a/fastlane/screenshots/en-US/7_ipadPro_7.iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_ipad_7.iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/7_ipad_7.iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 7d0aa87ed..000000000 Binary files a/fastlane/screenshots/en-US/7_ipad_7.iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_iphone4_7.iPhone SE-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/7_iphone4_7.iPhone SE-60_ios_settings_demo_framed.png deleted file mode 100644 index d9c0ed2ad..000000000 Binary files a/fastlane/screenshots/en-US/7_iphone4_7.iPhone SE-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_iphone58_7.iPhone X-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/7_iphone58_7.iPhone X-60_ios_settings_demo_framed.png deleted file mode 100644 index f2b4d64e8..000000000 Binary files a/fastlane/screenshots/en-US/7_iphone58_7.iPhone X-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_iphone65_7.iPhone Xs Max-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/7_iphone65_7.iPhone Xs Max-60_ios_settings_demo_framed.png deleted file mode 100644 index e82d103cd..000000000 Binary files a/fastlane/screenshots/en-US/7_iphone65_7.iPhone Xs Max-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_iphone6Plus_7.iPhone 8 Plus-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/7_iphone6Plus_7.iPhone 8 Plus-60_ios_settings_demo_framed.png deleted file mode 100644 index 1b7400b10..000000000 Binary files a/fastlane/screenshots/en-US/7_iphone6Plus_7.iPhone 8 Plus-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/7_iphone6_7.iPhone 7-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/7_iphone6_7.iPhone 7-60_ios_settings_demo_framed.png deleted file mode 100644 index 904bba69a..000000000 Binary files a/fastlane/screenshots/en-US/7_iphone6_7.iPhone 7-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/8_ipadPro129_8.iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/8_ipadPro129_8.iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png deleted file mode 100644 index 2790b4545..000000000 Binary files a/fastlane/screenshots/en-US/8_ipadPro129_8.iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/8_ipadPro_8.iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/8_ipadPro_8.iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png deleted file mode 100644 index 58ecf9db1..000000000 Binary files a/fastlane/screenshots/en-US/8_ipadPro_8.iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/8_ipad_8.iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/8_ipad_8.iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png deleted file mode 100644 index c657cd26e..000000000 Binary files a/fastlane/screenshots/en-US/8_ipad_8.iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..31229f63d Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..cc3686137 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..b4e1186e6 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..47cc2c25f Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo.png new file mode 100644 index 000000000..c4c1e3863 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..844f28503 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo.png new file mode 100644 index 000000000..dab70cd8f Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..810915ac3 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..227d29bef Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..1f3cb4049 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape.png new file mode 100644 index 000000000..79b6e37dc Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape_framed.png new file mode 100644 index 000000000..610a3c068 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-23_ios_files_list_multiple_window_landscape_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo.png new file mode 100644 index 000000000..c5189333d Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo_framed.png new file mode 100644 index 000000000..836576544 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo.png new file mode 100644 index 000000000..ee94c0b5e Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..523e210bb Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (2nd generation)-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo.png deleted file mode 100644 index 18d77b898..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index cfc591c9f..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo.png deleted file mode 100644 index eea14addb..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index f03b2e4e7..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo.png deleted file mode 100644 index e680b7d5d..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png deleted file mode 100644 index 32a90dce0..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo.png deleted file mode 100644 index 3afb1d086..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png deleted file mode 100644 index df3064b17..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index 1bc8b6182..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index f1fb54945..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window.png deleted file mode 100644 index 61ed2dc2d..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index 19d76a609..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo.png deleted file mode 100644 index c4f436838..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 617565e89..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo.png deleted file mode 100644 index 3c38ca421..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png deleted file mode 100644 index b53b8c203..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3rd generation)-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..b208bdfa7 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..81786fa2c Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..25de507c4 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..05327df4d Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo.png new file mode 100644 index 000000000..9ae24e419 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..0c692ef7f Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo.png new file mode 100644 index 000000000..833854c63 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..737725408 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..131ea739f Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..325f74f6e Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape.png new file mode 100644 index 000000000..1dd066dc3 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape_framed.png new file mode 100644 index 000000000..ca2a4a497 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-23_ios_files_list_multiple_window_landscape_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo.png new file mode 100644 index 000000000..0580cbba8 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo_framed.png new file mode 100644 index 000000000..ebfa789ec Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo.png new file mode 100644 index 000000000..9bca2a370 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..e951e334e Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (12.9-inch) (3th generation)-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo.png deleted file mode 100644 index 3dd2be093..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 2a5c4e9e1..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo.png deleted file mode 100644 index 368c08fb0..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 86bfde214..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo.png deleted file mode 100644 index 16ca461b6..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png deleted file mode 100644 index e3c3dc2f4..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo.png deleted file mode 100644 index 1962be6f8..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 4ff169226..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index 817da3dd0..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 9e7b6a34c..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window.png deleted file mode 100644 index e9cc2d6b8..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index af3c33e0a..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo.png deleted file mode 100644 index a51715f68..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png deleted file mode 100644 index ef7f34860..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo.png deleted file mode 100644 index c4c26a09d..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png deleted file mode 100644 index 861566363..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (12.9-inch)-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo.png index 19f20a8f1..b9367969e 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png index ccb44c3d1..d4c645138 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo.png index 8485ca87b..ac43cd7a3 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png index 24948700e..40cab7e9a 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo.png index e19e2f417..61e74f64c 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png index 79bcfc5db..004d9c02e 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo.png index d02cd80da..d6e3d773a 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png index beab8ebc1..f7fc18b1d 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo.png index a81a6168f..56b76914f 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png index 61cef6ac6..4f9887106 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window.png deleted file mode 100644 index 3398b3ebc..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png deleted file mode 100644 index 7e51c55bf..000000000 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape.png new file mode 100644 index 000000000..b7a089604 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape_framed.png new file mode 100644 index 000000000..65288a746 Binary files /dev/null and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-23_ios_files_list_multiple_window_landscape_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo.png index 7090fa0fd..062747b7a 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png index 73c44ae72..23876677c 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo.png index 6de56e0d8..ce2239c06 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png index 6ee3bfbd8..909c935d2 100644 Binary files a/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png and b/fastlane/screenshots/en-US/iPad Pro (9.7-inch)-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..cff6307ed Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..0a13ba292 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..c3fc8bbf0 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..42474c514 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo.png new file mode 100644 index 000000000..5b4bef98c Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..7916b0986 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo.png new file mode 100644 index 000000000..295fc39af Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..0d760a13b Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..0b39e2e94 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..623a29cfc Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo.png new file mode 100644 index 000000000..32fe679b5 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo_framed.png new file mode 100644 index 000000000..d25f79455 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo.png new file mode 100644 index 000000000..0836a762f Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..c857c5d29 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11 Pro Max-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..b77438b08 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..606e26c28 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..232b9e94f Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..cf8b32935 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo.png new file mode 100644 index 000000000..9b5759566 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..c52fbb752 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo.png new file mode 100644 index 000000000..920d19172 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..952e243b1 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..c0a36f3df Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..3df89c7f2 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo.png new file mode 100644 index 000000000..4cb54ee6b Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..99d971b90 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 11-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo.png deleted file mode 100644 index bc17c2e9b..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index f18ba435d..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo.png deleted file mode 100644 index c95f09d23..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 849fdee4c..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo.png deleted file mode 100644 index f2dfa77f2..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo_framed.png deleted file mode 100644 index 262389b2c..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo.png deleted file mode 100644 index 05267009f..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 4abc98bdf..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index 047114209..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index efa3e8133..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo.png deleted file mode 100644 index 7679a8f49..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo_framed.png deleted file mode 100644 index ac12e9021..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo.png deleted file mode 100644 index ea0292a86..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo_framed.png deleted file mode 100644 index 920a89531..000000000 Binary files a/fastlane/screenshots/en-US/iPhone 7-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo.png index be30b6fd0..5164af33a 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png index d9797bf8e..c4c05af12 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo.png index aeb945b01..300cc1b61 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo_framed.png index 4a6a091c2..f0d3e4998 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo.png index b1644acd7..9005c7d4c 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo_framed.png index 4a02e0e45..58d25d162 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo.png index 14e06c519..8cfee5961 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo_framed.png index cb3f0c84f..db8b975fb 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo.png index fb3cf5e5c..1856291f9 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png index 35eb02828..71e8efd6e 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo.png index fe05ca409..2cfca7942 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo_framed.png index 305734dc7..5e52c427a 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo.png index 3879f2f35..9b04b1ef7 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo_framed.png index 3dd3bf4b4..05873e9e8 100644 Binary files a/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo_framed.png and b/fastlane/screenshots/en-US/iPhone 8 Plus-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..bd808ce2b Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..2de34e7d1 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..b289c8ab0 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..6f437a7ff Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo.png new file mode 100644 index 000000000..2f5901b7a Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..dddb89f41 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo.png new file mode 100644 index 000000000..dcfcd678e Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..9f550e3f5 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..315a85a71 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..71383bc48 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo.png new file mode 100644 index 000000000..9a1634c31 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo_framed.png new file mode 100644 index 000000000..d67faeb16 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo.png new file mode 100644 index 000000000..bb4ecaee1 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..8b20ecafd Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone 8-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo.png new file mode 100644 index 000000000..5a37089e0 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo_framed.png new file mode 100644 index 000000000..f568ba75b Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-10_ios_accounts_welcome_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo.png new file mode 100644 index 000000000..8493038d9 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo_framed.png new file mode 100644 index 000000000..954c0f951 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-11_ios_accounts_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo.png new file mode 100644 index 000000000..5f5af119c Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo_framed.png new file mode 100644 index 000000000..b82e4c6b5 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-20_ios_files_list_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo.png new file mode 100644 index 000000000..26e3accd2 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo_framed.png new file mode 100644 index 000000000..00fa7408a Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-21_ios_files_actions_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo.png new file mode 100644 index 000000000..c8fc99886 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo_framed.png new file mode 100644 index 000000000..fcdba1724 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-22_ios_files_preview_pdf_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo.png new file mode 100644 index 000000000..b2f5af5b4 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo_framed.png new file mode 100644 index 000000000..f340f1bca Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-40_ios_quick_access_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo.png new file mode 100644 index 000000000..0ebc4ef52 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo_framed.png new file mode 100644 index 000000000..34ae43409 Binary files /dev/null and b/fastlane/screenshots/en-US/iPhone SE (2nd generation)-60_ios_settings_demo_framed.png differ diff --git a/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo.png deleted file mode 100644 index eac0d6b0e..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 302785d43..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo.png deleted file mode 100644 index 61d7a6666..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 9dcf84616..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo.png deleted file mode 100644 index 058599de3..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo_framed.png deleted file mode 100644 index 4ee86f275..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo.png deleted file mode 100644 index 5bed40e6d..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo_framed.png deleted file mode 100644 index 5606c8d9e..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index 43b4add5b..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 19355728e..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo.png deleted file mode 100644 index a82320bf5..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 2b6bacbc0..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo.png deleted file mode 100644 index 7d9f40bdc..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo_framed.png deleted file mode 100644 index bc1dd7eb2..000000000 Binary files a/fastlane/screenshots/en-US/iPhone SE-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo.png deleted file mode 100644 index 2a80f9b4e..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index fe75ea3b0..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo.png deleted file mode 100644 index 81fb481ae..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 173c28f13..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo.png deleted file mode 100644 index 2b207834b..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo_framed.png deleted file mode 100644 index 6e80260fe..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo.png deleted file mode 100644 index f2d1a52e8..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo_framed.png deleted file mode 100644 index d84fa7bdb..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index 9249dfd04..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index af49a4702..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo.png deleted file mode 100644 index 4e14fa056..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 4a3b7ae1b..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo.png deleted file mode 100644 index 618a32753..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo_framed.png deleted file mode 100644 index 324326100..000000000 Binary files a/fastlane/screenshots/en-US/iPhone X-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo.png deleted file mode 100644 index 0d3099c53..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png deleted file mode 100644 index 030f61ad4..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-10_ios_accounts_welcome_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo.png deleted file mode 100644 index ce71090e8..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo_framed.png deleted file mode 100644 index 9f8ffa359..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-11_ios_accounts_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo.png deleted file mode 100644 index e2c100255..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo_framed.png deleted file mode 100644 index ad4d35d52..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-20_ios_files_list_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo.png deleted file mode 100644 index 2657119d6..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo_framed.png deleted file mode 100644 index d3e411e4e..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-21_ios_files_actions_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo.png deleted file mode 100644 index bfe1427ff..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png deleted file mode 100644 index 9667e1ede..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-22_ios_files_preview_pdf_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo.png deleted file mode 100644 index 3ae48c85c..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo_framed.png deleted file mode 100644 index 225bdb112..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-40_ios_quick_access_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo.png b/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo.png deleted file mode 100644 index c03af7ae8..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo.png and /dev/null differ diff --git a/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo_framed.png b/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo_framed.png deleted file mode 100644 index 138058e29..000000000 Binary files a/fastlane/screenshots/en-US/iPhone Xs Max-60_ios_settings_demo_framed.png and /dev/null differ diff --git a/fastlane/screenshots/km/keyword.strings b/fastlane/screenshots/km/keyword.strings new file mode 100644 index 000000000..9e578cb74 Binary files /dev/null and b/fastlane/screenshots/km/keyword.strings differ diff --git a/fastlane/screenshots/zh_TW/keyword.strings b/fastlane/screenshots/zh_TW/keyword.strings new file mode 100644 index 000000000..c6185c38f Binary files /dev/null and b/fastlane/screenshots/zh_TW/keyword.strings differ diff --git a/fastlane/screenshots/zh_TW/title.strings b/fastlane/screenshots/zh_TW/title.strings new file mode 100644 index 000000000..9676e63d1 Binary files /dev/null and b/fastlane/screenshots/zh_TW/title.strings differ diff --git a/ownCloud/Resources/icon-available-offline.tvg b/img/filetypes-tvg/icon-available-offline.tvg similarity index 100% rename from ownCloud/Resources/icon-available-offline.tvg rename to img/filetypes-tvg/icon-available-offline.tvg diff --git a/ownCloud/Resources/icon-search.tvg b/img/filetypes-tvg/icon-search.tvg similarity index 100% rename from ownCloud/Resources/icon-search.tvg rename to img/filetypes-tvg/icon-search.tvg diff --git a/ios-sdk b/ios-sdk index 95bbb2e48..e774c7523 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit 95bbb2e4824e71c460da6cd7a23d48c11fe40ab3 +Subproject commit e774c7523d48b16ce5321fa167688311d04b2537 diff --git a/ownCloud File Provider/FileProviderExtension.m b/ownCloud File Provider/FileProviderExtension.m index dd845091b..6043049dc 100644 --- a/ownCloud File Provider/FileProviderExtension.m +++ b/ownCloud File Provider/FileProviderExtension.m @@ -1165,6 +1165,18 @@ + (OCClassSettingsIdentifier)classSettingsIdentifier }); } ++ (OCClassSettingsMetadataCollection)classSettingsMetadata +{ + return (@{ + OCClassSettingsKeyFileProviderSkipLocalErrorChecks : @{ + OCClassSettingsMetadataKeyType : OCClassSettingsMetadataTypeBoolean, + OCClassSettingsMetadataKeyDescription : @"Skip some local error checks in the FileProvider to easily provoke errors.", + OCClassSettingsMetadataKeyCategory : @"File Provider", + OCClassSettingsMetadataKeyStatus : OCClassSettingsKeyStatusDebugOnly + } + }); +} + - (BOOL)skipLocalErrorChecks { return (((NSNumber *)[self classSettingForOCClassSettingsKey:OCClassSettingsKeyFileProviderSkipLocalErrorChecks]).boolValue); diff --git a/ownCloud Intents/IntentSettings.swift b/ownCloud Intents/IntentSettings.swift index 8f1ba1a7d..99457bdee 100644 --- a/ownCloud Intents/IntentSettings.swift +++ b/ownCloud Intents/IntentSettings.swift @@ -87,4 +87,15 @@ extension IntentSettings: OCClassSettingsSupport { .shortcutsEnabled : true ] } + + public static func classSettingsMetadata() -> [OCClassSettingsKey : [OCClassSettingsMetadataKey : Any]]? { + return [ + .shortcutsEnabled : [ + .type : OCClassSettingsMetadataType.boolean, + .description : "Controls whether Shortcuts support is enabled.", + .category : "Shortcuts", + .status : OCClassSettingsKeyStatus.advanced + ] + ] + } } diff --git a/ownCloud Intents/OCBookmarkManager+Extension.swift b/ownCloud Intents/OCBookmarkManager+Extension.swift index 6ee506ddc..ca35e8795 100644 --- a/ownCloud Intents/OCBookmarkManager+Extension.swift +++ b/ownCloud Intents/OCBookmarkManager+Extension.swift @@ -36,7 +36,7 @@ extension OCBookmarkManager { return accountList } - public func bookmark(for uuidString: String) -> OCBookmark? { + func bookmark(for uuidString: String) -> OCBookmark? { return OCBookmarkManager.shared.bookmarks.filter({ $0.uuid.uuidString == uuidString}).first } diff --git a/ownCloud Share Extension/ShareViewController.swift b/ownCloud Share Extension/ShareViewController.swift index 5c9409763..d77b16573 100644 --- a/ownCloud Share Extension/ShareViewController.swift +++ b/ownCloud Share Extension/ShareViewController.swift @@ -304,30 +304,41 @@ class ShareViewController: MoreStaticTableViewController { if error == nil { var data : Data? var tempFilePath : String? + var tempFileURL : URL? if let text = item as? String { // Save plain text content let ext = self.utiToFileExtension(type) tempFilePath = NSTemporaryDirectory() + (attachment.suggestedName ?? "Text".localized) + "." + (ext ?? type) data = Data(text.utf8) } else if let url = item as? URL { // Download URL content - do { - tempFilePath = NSTemporaryDirectory() + url.lastPathComponent - data = try Data(contentsOf: url) - } catch { - jobDone() + if url.isFileURL { + tempFileURL = URL(fileURLWithPath: NSTemporaryDirectory() + url.lastPathComponent) + if let tempFileURL = tempFileURL { + try? FileManager.default.copyItem(at: url, to: tempFileURL) + } + } else { + do { + tempFilePath = NSTemporaryDirectory() + url.lastPathComponent + data = try Data(contentsOf: url) + } catch { + jobDone() + } } } - if let data = data, let tempFilePath = tempFilePath { + if tempFileURL == nil, let data = data, let tempFilePath = tempFilePath { FileManager.default.createFile(atPath: tempFilePath, contents:data, attributes:nil) + tempFileURL = URL(fileURLWithPath: tempFilePath) + } - serviceSession.importThroughFileProvider(url: URL(fileURLWithPath: tempFilePath), to: targetDirectory, completion: { (error) in - try? FileManager.default.removeItem(atPath: tempFilePath) + if let tempFileURL = tempFileURL { + serviceSession.importThroughFileProvider(url: tempFileURL, to: targetDirectory, completion: { (error) in + try? FileManager.default.removeItem(at: tempFileURL) if let error = error { - Log.error("Error importing item at \(tempFilePath) through file provider: \(String(describing: error))") + Log.error("Error importing item at \(tempFileURL) through file provider: \(String(describing: error))") - self.showAlert(title: NSString(format: "Error importing %@".localized as NSString, (tempFilePath as NSString).lastPathComponent) as String, error: error, decisionHandler: { (doContinue) in + self.showAlert(title: NSString(format: "Error importing %@".localized as NSString, tempFileURL.lastPathComponent) as String, error: error, decisionHandler: { (doContinue) in if !doContinue { importError = error progressViewController?.cancel() diff --git a/ownCloud.xcodeproj/project.pbxproj b/ownCloud.xcodeproj/project.pbxproj index 32cfbc54f..1cfe6b93f 100644 --- a/ownCloud.xcodeproj/project.pbxproj +++ b/ownCloud.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 02072E6023E46022006548A7 /* UIWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02072E5F23E46022006548A7 /* UIWindow+Extension.swift */; }; 0233F45E246E9D960095A799 /* UploadCameraMediaAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0233F45D246E9D960095A799 /* UploadCameraMediaAction.swift */; }; + 0234EF0E2515138B00AE921A /* PasscodeSetupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0234EF072515138A00AE921A /* PasscodeSetupCoordinator.swift */; }; 024F3A2124A3AB410083E11E /* CrashReporter in Frameworks */ = {isa = PBXBuildFile; productRef = 024F3A2024A3AB410083E11E /* CrashReporter */; }; 025F063324AA163C009D8FC5 /* DisplayExifMetadataAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025F063224AA163C009D8FC5 /* DisplayExifMetadataAction.swift */; }; 025F063A24AA18C7009D8FC5 /* ImageMetadataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025F063924AA18C7009D8FC5 /* ImageMetadataViewController.swift */; }; @@ -22,6 +23,7 @@ 0269F589244DED02002E9D99 /* UIAlertController+UniversalLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0269F588244DED02002E9D99 /* UIAlertController+UniversalLinks.swift */; }; 0287DD7D249131E000C912CA /* AppStatistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0287DD7C249131E000C912CA /* AppStatistics.swift */; }; 02AE32E424D2FA8B00A19476 /* CrashReporter in Frameworks */ = {isa = PBXBuildFile; productRef = 02AE32E324D2FA8B00A19476 /* CrashReporter */; }; + 02D4C82A255208E60000E299 /* PDFSearchResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D4C829255208E60000E299 /* PDFSearchResultsView.swift */; }; 02DC7C9024CB354800DCB2C6 /* ProPhotoUploadSettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DC7C8F24CB354800DCB2C6 /* ProPhotoUploadSettingsSection.swift */; }; 02F2891424BFAF0100E3D35C /* MigrationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F2891024BFAF0100E3D35C /* MigrationViewController.swift */; }; 02F2891524BFAF0100E3D35C /* Migration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F2891124BFAF0100E3D35C /* Migration.swift */; }; @@ -32,7 +34,6 @@ 233BDEB5204FEFE500C06732 /* OwnCloudTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233BDEB4204FEFE500C06732 /* OwnCloudTests.swift */; }; 233E0FD82099F11D00C3D8D5 /* SecuritySettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233E0FD72099F11D00C3D8D5 /* SecuritySettingsSection.swift */; }; 23957A6D209AFFE8003C8537 /* MoreSettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23957A6C209AFFE8003C8537 /* MoreSettingsSection.swift */; }; - 23BEF1182076667F00DD2E6F /* IssuesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23BEF1172076667F00DD2E6F /* IssuesViewController.swift */; }; 23D5241521491C670002C566 /* DisplayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D5241421491C670002C566 /* DisplayViewController.swift */; }; 23EC77582137F3DD0032D4E6 /* PDFViewerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EC77542137F3DC0032D4E6 /* PDFViewerViewController.swift */; }; 23EC77592137F3DD0032D4E6 /* DisplayExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EC77552137F3DC0032D4E6 /* DisplayExtension.swift */; }; @@ -181,12 +182,16 @@ 6E91F37E21ECA6FD009436D2 /* CopyAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E91F37D21ECA6FD009436D2 /* CopyAction.swift */; }; 6EA78B8F2179B55400A5216A /* ImageScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EA78B8E2179B55400A5216A /* ImageScrollView.swift */; }; 75AC0B4AD332C8CC785FE349 /* Pods_ownCloudTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A56EA84D8AD331FFA604138B /* Pods_ownCloudTests.framework */; }; - A45A8D98137C902524B84E6D /* EarlGrey.framework in EarlGrey Copy Files */ = {isa = PBXBuildFile; fileRef = D0D9C062DD1E85A838608B0F /* EarlGrey.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + A45A8D98137C902524B84E6D /* EarlGrey.framework in EarlGrey Copy Files */ = {isa = PBXBuildFile; fileRef = D0D9C062DD1E85A838608B0F /* EarlGrey.framework */; }; DC0030C12350B1CE00BB8570 /* NSData+Encoding.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0030BF2350B1CE00BB8570 /* NSData+Encoding.m */; }; DC0030C22350B1CE00BB8570 /* NSData+Encoding.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0030C02350B1CE00BB8570 /* NSData+Encoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC0030CB2350B75000BB8570 /* ScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1AC7CF2319ADAE002B7892 /* ScanViewController.swift */; }; DC0196AB20F7690C00C41B78 /* OCBookmark+FileProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = DC27A1A420CBEF85008ACB6C /* OCBookmark+FileProvider.m */; }; DC01CDCC212EDDF600FC8E38 /* TextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC01CDCB212EDDF600FC8E38 /* TextViewController.swift */; }; + DC049156258C00C400DEDC27 /* OCFileProviderServiceStandby.h in Headers */ = {isa = PBXBuildFile; fileRef = DC049154258C00C400DEDC27 /* OCFileProviderServiceStandby.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC049157258C00C400DEDC27 /* OCFileProviderServiceStandby.m in Sources */ = {isa = PBXBuildFile; fileRef = DC049155258C00C400DEDC27 /* OCFileProviderServiceStandby.m */; }; + DC04920B258CB06A00DEDC27 /* PocketSVG in Frameworks */ = {isa = PBXBuildFile; productRef = DC04920A258CB06A00DEDC27 /* PocketSVG */; }; + DC0492B1258CC4EE00DEDC27 /* PocketSVG.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = DC0492B0258CC4EE00DEDC27 /* PocketSVG.LICENSE */; }; DC080CE5238AE3F40044C5D2 /* OCLicenseAppStoreProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = DC080CE3238AE3ED0044C5D2 /* OCLicenseAppStoreProvider.m */; }; DC080CE6238AE3F40044C5D2 /* OCLicenseAppStoreProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = DC080CE2238AE3ED0044C5D2 /* OCLicenseAppStoreProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC080CF1238C8D850044C5D2 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC080CF0238C8D850044C5D2 /* StoreKit.framework */; }; @@ -231,7 +236,6 @@ DC0A357E24C0E43C00FB58FC /* ThemeStyle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8549372183B4CD00782BA8 /* ThemeStyle+Extensions.swift */; }; DC0A357F24C0E43C00FB58FC /* ThemeStyle+DefaultStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB44D842186FEF700DAA4CC /* ThemeStyle+DefaultStyles.swift */; }; DC0A358024C0E43C00FB58FC /* NSObject+ThemeApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC42244F207CB2500006A2A6 /* NSObject+ThemeApplication.swift */; }; - DC0A358124C0E43C00FB58FC /* ThemeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39C31F9622F1C52C0023923D /* ThemeProvider.swift */; }; DC0A358224C0E44200FB58FC /* TVGImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7DBA53207FA80C00E7337D /* TVGImage.swift */; }; DC0A358324C0E44200FB58FC /* VectorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7DBA28207F71D600E7337D /* VectorImage.swift */; }; DC0A358424C0E44200FB58FC /* VectorImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7DBA2A207F71E400E7337D /* VectorImageView.swift */; }; @@ -257,19 +261,21 @@ DC0A359E24C0EBE500FB58FC /* ownCloudApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCC0855C2293F1FD008CC05C /* ownCloudApp.framework */; }; DC0A359F24C0EBE500FB58FC /* ownCloudSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 239369782076110900BCE21A /* ownCloudSDK.framework */; }; DC0A35A124C1091400FB58FC /* UserInterfaceContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0A35A024C1091400FB58FC /* UserInterfaceContext.swift */; }; + DC0A5C432550C70800E6674B /* class-settings-sdk in Resources */ = {isa = PBXBuildFile; fileRef = DC0A5C422550C70800E6674B /* class-settings-sdk */; }; DC0B379420514E4700189B9A /* ServerListBookmarkCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0B379320514E4700189B9A /* ServerListBookmarkCell.swift */; }; DC18898E218A773700CFB3F9 /* ownCloudMocking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC0196A620F754CA00C41B78 /* ownCloudMocking.framework */; }; - DC1B2707209CF0D3004715E1 /* IssuesDismissalAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1B26FE209CF0D2004715E1 /* IssuesDismissalAnimator.swift */; }; - DC1B2708209CF0D3004715E1 /* IssuesPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1B26FF209CF0D2004715E1 /* IssuesPresentationAnimator.swift */; }; - DC1B2709209CF0D3004715E1 /* CertificateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1B2705209CF0D3004715E1 /* CertificateViewController.swift */; }; - DC1B270A209CF0D3004715E1 /* ConnectionIssueViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1B2706209CF0D3004715E1 /* ConnectionIssueViewController.swift */; }; DC1B270C209CF34B004715E1 /* BookmarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1B270B209CF34B004715E1 /* BookmarkViewController.swift */; }; DC20DE5C21C01A3D0096000B /* ownCloudMocking.framework in EarlGrey Copy Files */ = {isa = PBXBuildFile; fileRef = DC0196A620F754CA00C41B78 /* ownCloudMocking.framework */; }; DC20DE6A21C01B210096000B /* ownCloudSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 239369782076110900BCE21A /* ownCloudSDK.framework */; }; DC20DE6B21C01B210096000B /* ownCloudUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2393697C2076110900BCE21A /* ownCloudUI.framework */; }; DC23D1D9238F390A00423F62 /* OCLicenseAppStoreReceipt.m in Sources */ = {isa = PBXBuildFile; fileRef = DC23D1D7238F390200423F62 /* OCLicenseAppStoreReceipt.m */; }; DC23D1DA238F391200423F62 /* OCLicenseAppStoreReceipt.h in Headers */ = {isa = PBXBuildFile; fileRef = DC23D1D6238F390200423F62 /* OCLicenseAppStoreReceipt.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC24B28725BA2A2E005783E2 /* Branding.h in Headers */ = {isa = PBXBuildFile; fileRef = DC24B27125B9DF31005783E2 /* Branding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC24B29825BA2A34005783E2 /* Branding.m in Sources */ = {isa = PBXBuildFile; fileRef = DC24B27225B9DF31005783E2 /* Branding.m */; }; + DC24B31D25BB6FC4005783E2 /* IssuesCardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC24B31C25BB6FC4005783E2 /* IssuesCardViewController.swift */; }; + DC24B2AB25BA316D005783E2 /* Branding+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC24B2AA25BA316D005783E2 /* Branding+App.swift */; }; DC2565EE225F5A1900828AA5 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC2565E8225F5A1900828AA5 /* UserNotifications.framework */; }; + DC26ADDE2550C0B20059680D /* MetadataDocumentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC26ADDD2550C0B20059680D /* MetadataDocumentationTests.swift */; }; DC27A18E20CA9F66008ACB6C /* OCItem+FileProviderItem.m in Sources */ = {isa = PBXBuildFile; fileRef = DC27A18D20CA9F66008ACB6C /* OCItem+FileProviderItem.m */; }; DC27A18F20CAA0BA008ACB6C /* ownCloudSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 239369782076110900BCE21A /* ownCloudSDK.framework */; }; DC27A19D20CAB602008ACB6C /* FileProviderInterfaceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC27A19C20CAB602008ACB6C /* FileProviderInterfaceManager.swift */; }; @@ -311,8 +317,6 @@ DC63208321FCAC1E007EC0A8 /* ClientActivityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC63208221FCAC1E007EC0A8 /* ClientActivityViewController.swift */; }; DC63208521FCEBE9007EC0A8 /* ClientActivityCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC63208421FCEBE9007EC0A8 /* ClientActivityCell.swift */; }; DC6428D02081406800493A01 /* CollapsibleProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6428CF2081406800493A01 /* CollapsibleProgressBar.swift */; }; - DC65D0CA259D26BD0042571D /* OCFileProviderServiceStandby.m in Sources */ = {isa = PBXBuildFile; fileRef = DC65D0C3259D26BD0042571D /* OCFileProviderServiceStandby.m */; }; - DC65D0CB259D26BD0042571D /* OCFileProviderServiceStandby.h in Headers */ = {isa = PBXBuildFile; fileRef = DC65D0C9259D26BD0042571D /* OCFileProviderServiceStandby.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC66F39C239659C000CF4812 /* OCASN1.h in Headers */ = {isa = PBXBuildFile; fileRef = DC66F39A239659C000CF4812 /* OCASN1.h */; }; DC66F39D239659C000CF4812 /* OCASN1.m in Sources */ = {isa = PBXBuildFile; fileRef = DC66F39B239659C000CF4812 /* OCASN1.m */; }; DC66F3A523965A1400CF4812 /* NSDate+RFC3339.h in Headers */ = {isa = PBXBuildFile; fileRef = DC66F3A323965A1400CF4812 /* NSDate+RFC3339.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -322,6 +326,7 @@ DC66F3AD2396630100CF4812 /* AppleIncRootCertificate.cer in Resources */ = {isa = PBXBuildFile; fileRef = DC66F3A823965BF400CF4812 /* AppleIncRootCertificate.cer */; }; DC680576212DF548006C3B1F /* CertificateManagementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC680575212DF548006C3B1F /* CertificateManagementViewController.swift */; }; DC68057A212EAB5E006C3B1F /* ThemeCertificateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC680579212EAB5E006C3B1F /* ThemeCertificateViewController.swift */; }; + DC6C68362574FD0400E46BD4 /* PLCrashReporter.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = DC6C68352574FD0400E46BD4 /* PLCrashReporter.LICENSE */; }; DC6CF7FB219446050013B9F9 /* LogSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6CF7FA219446050013B9F9 /* LogSettingsViewController.swift */; }; DC774E5F22F44E57000B11A1 /* ZIPArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = DC774E5D22F44E4A000B11A1 /* ZIPArchive.m */; }; DC774E6022F44E57000B11A1 /* ZIPArchive.h in Headers */ = {isa = PBXBuildFile; fileRef = DC774E5C22F44E4A000B11A1 /* ZIPArchive.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -330,8 +335,6 @@ DC774E6822F44F6A000B11A1 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCE93FF321FCA434000E14F2 /* libzip.framework */; }; DC7C101124B5FA7700227085 /* OCBookmark+AppExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = DC7C100E24B5F81E00227085 /* OCBookmark+AppExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC7C101224B5FD6500227085 /* OCBookmark+AppExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = DC7C100F24B5F81E00227085 /* OCBookmark+AppExtensions.m */; }; - DC7DBA1F207F59F800E7337D /* PocketSVG.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC7DBA18207F59D200E7337D /* PocketSVG.framework */; }; - DC7DBA20207F5A0400E7337D /* PocketSVG.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = DC7DBA18207F59D200E7337D /* PocketSVG.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DC7DBA37207F84BF00E7337D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7DBA36207F84BF00E7337D /* main.swift */; }; DC82D6FA23171339001551C5 /* ScanAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC82D6F923171339001551C5 /* ScanAction.swift */; }; DC854936218331CF00782BA8 /* UserInterfaceSettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC854935218331CF00782BA8 /* UserInterfaceSettingsSection.swift */; }; @@ -406,14 +409,13 @@ DCE20272249AB50E0015A22A /* OCMessage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCE20271249AB50E0015A22A /* OCMessage+Extension.swift */; }; DCE28F602433683700879DEC /* ClientSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCE28F5F2433683700879DEC /* ClientSessionManager.swift */; }; DCE442CE2387452000940A6D /* LicensingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC0856B2293F1FD008CC05C /* LicensingTests.m */; }; - DCE4E42C24C10E0D0051722F /* PocketSVG.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC7DBA18207F59D200E7337D /* PocketSVG.framework */; }; DCE4E43124C197450051722F /* OpenItemUserActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 394E200B233E477F009D2897 /* OpenItemUserActivity.swift */; }; DCE4E43524C1999A0051722F /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E37F48A2188B27D00CF16CA /* Action.swift */; }; DCE4E43724C19A910051722F /* LicenseRequirements.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDC209B2399A4CF003CFF5B /* LicenseRequirements.swift */; }; DCE4E43924C19AB20051722F /* MoreStaticTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232B01F52126B10900366FA0 /* MoreStaticTableViewController.swift */; }; DCE4E43A24C19ADC0051722F /* MoreViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232B01F32126B0CE00366FA0 /* MoreViewHeader.swift */; }; DCE4E43B24C19B4F0051722F /* NSLayoutConstraint+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC248C66213E7DB00067FE94 /* NSLayoutConstraint+Extension.swift */; }; - DCE4E43C24C19B660051722F /* MoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236735A521217C3500E5834A /* MoreViewController.swift */; }; + DCE4E43C24C19B660051722F /* FrameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236735A521217C3500E5834A /* FrameViewController.swift */; }; DCE4E43E24C19C3E0051722F /* Action+UserInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCE4E43D24C19C3E0051722F /* Action+UserInterface.swift */; }; DCE4E43F24C19D370051722F /* UIAlertController+OCIssue.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC434D1220D7A8F100740056 /* UIAlertController+OCIssue.swift */; }; DCE4E44124C1A07E0051722F /* UITableViewController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39607CBB2225D480007B386D /* UITableViewController+Extension.swift */; }; @@ -663,34 +665,6 @@ remoteGlobalIDString = DCE93FE221FCA42C000E14F2; remoteInfo = libzip; }; - DC7DBA17207F59D200E7337D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C79800BB1A21CB5300380860; - remoteInfo = "PocketSVG (iOS)"; - }; - DC7DBA19207F59D200E7337D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C79800F51A21CDFD00380860; - remoteInfo = "PocketSVG (Mac)"; - }; - DC7DBA1B207F59D200E7337D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = B0B5922B20752E980009ECA2; - remoteInfo = PocketSVGTests; - }; - DC7DBA1D207F59F200E7337D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = C79800BA1A21CB5300380860; - remoteInfo = "PocketSVG (iOS)"; - }; DC8EB26D23927FE7009148F9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DCD344AF205BD0FA00189B9A /* openssl.xcodeproj */; @@ -761,13 +735,6 @@ remoteGlobalIDString = DCC0855B2293F1FD008CC05C; remoteInfo = ownCloudApp; }; - DCE4E42524C10E050051722F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = C79800BA1A21CB5300380860; - remoteInfo = "PocketSVG (iOS)"; - }; DCE4E47024C1F5610051722F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 233BDE94204FEFE500C06732 /* Project object */; @@ -852,7 +819,6 @@ 394A0B0122EEFC2C00603813 /* ownCloudAppShared.framework in Copy Frameworks */, DCC085722293F1FD008CC05C /* ownCloudApp.framework in Copy Frameworks */, DCFBAD0C21BE67A100943F76 /* ownCloudUI.framework in Copy Frameworks */, - DC7DBA20207F5A0400E7337D /* PocketSVG.framework in Copy Frameworks */, DC3BE0D92077BC6B002A0AC0 /* openssl.framework in Copy Frameworks */, DC3BE0DA2077BC6B002A0AC0 /* ownCloudSDK.framework in Copy Frameworks */, ); @@ -877,6 +843,7 @@ /* Begin PBXFileReference section */ 02072E5F23E46022006548A7 /* UIWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIWindow+Extension.swift"; sourceTree = ""; }; 0233F45D246E9D960095A799 /* UploadCameraMediaAction.swift */ = {isa = PBXFileReference; indentWidth = 5; lastKnownFileType = sourcecode.swift; path = UploadCameraMediaAction.swift; sourceTree = ""; }; + 0234EF072515138A00AE921A /* PasscodeSetupCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasscodeSetupCoordinator.swift; sourceTree = ""; }; 025F063224AA163C009D8FC5 /* DisplayExifMetadataAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayExifMetadataAction.swift; sourceTree = ""; }; 025F063924AA18C7009D8FC5 /* ImageMetadataViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageMetadataViewController.swift; sourceTree = ""; }; 025FC71F247810AB009307A7 /* MediaUploadSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadSettingsViewController.swift; sourceTree = ""; }; @@ -888,6 +855,7 @@ 02633EFE2483D2EB00B5F58F /* UNUserNotificationCenter+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNUserNotificationCenter+Extensions.swift"; sourceTree = ""; }; 0269F588244DED02002E9D99 /* UIAlertController+UniversalLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+UniversalLinks.swift"; sourceTree = ""; }; 0287DD7C249131E000C912CA /* AppStatistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStatistics.swift; sourceTree = ""; }; + 02D4C829255208E60000E299 /* PDFSearchResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFSearchResultsView.swift; sourceTree = ""; }; 02DC7C8F24CB354800DCB2C6 /* ProPhotoUploadSettingsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProPhotoUploadSettingsSection.swift; sourceTree = ""; }; 02F2890F24BFAF0100E3D35C /* LegacyCredentials.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyCredentials.swift; sourceTree = ""; }; 02F2891024BFAF0100E3D35C /* MigrationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationViewController.swift; sourceTree = ""; }; @@ -907,11 +875,10 @@ 233BDEB6204FEFE500C06732 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 233BDEBF204FEFF300C06732 /* ownCloudSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ownCloudSDK.xcodeproj; path = "ios-sdk/ownCloudSDK.xcodeproj"; sourceTree = ""; }; 233E0FD72099F11D00C3D8D5 /* SecuritySettingsSection.swift */ = {isa = PBXFileReference; indentWidth = 8; lastKnownFileType = sourcecode.swift; path = SecuritySettingsSection.swift; sourceTree = ""; tabWidth = 8; usesTabs = 1; }; - 236735A521217C3500E5834A /* MoreViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoreViewController.swift; sourceTree = ""; }; + 236735A521217C3500E5834A /* FrameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrameViewController.swift; sourceTree = ""; }; 23957A6C209AFFE8003C8537 /* MoreSettingsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreSettingsSection.swift; sourceTree = ""; }; 239F1318205A693A0029F186 /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; - 239F437D20D0EE6300B1276D /* icon-search.tvg */ = {isa = PBXFileReference; lastKnownFileType = text; name = "icon-search.tvg"; path = "../../ownCloud/Resources/icon-search.tvg"; sourceTree = ""; }; - 23BEF1172076667F00DD2E6F /* IssuesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IssuesViewController.swift; sourceTree = ""; }; + 239F437D20D0EE6300B1276D /* icon-search.tvg */ = {isa = PBXFileReference; lastKnownFileType = text; name = "icon-search.tvg"; path = "../img/filetypes-tvg/icon-search.tvg"; sourceTree = ""; }; 23C5652F212167BD00BD4B47 /* CardPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardPresentationController.swift; sourceTree = ""; }; 23C56536212167BE00BD4B47 /* CardTransitionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardTransitionDelegate.swift; sourceTree = ""; }; 23D5241421491C670002C566 /* DisplayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayViewController.swift; sourceTree = ""; }; @@ -1008,7 +975,6 @@ 39B39446238532DC00892E8D /* ThemeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeTableViewCell.swift; sourceTree = ""; }; 39B394482385334D00892E8D /* ThemeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeView.swift; sourceTree = ""; }; 39BE385C23435AFE0062A2FE /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; - 39C31F9622F1C52C0023923D /* ThemeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeProvider.swift; sourceTree = ""; }; 39CC8AE5228C12100020253B /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; 39CC8B36228D5B890020253B /* ShareClientItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareClientItemCell.swift; sourceTree = ""; }; 39CD755123D787E400193950 /* DocumentEditingAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocumentEditingAction.swift; sourceTree = ""; }; @@ -1171,27 +1137,32 @@ DC0030C02350B1CE00BB8570 /* NSData+Encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Encoding.h"; sourceTree = ""; }; DC018F8B20A1060A00135198 /* ProgressHUDViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressHUDViewController.swift; sourceTree = ""; }; DC01CDCB212EDDF600FC8E38 /* TextViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewController.swift; sourceTree = ""; }; + DC049154258C00C400DEDC27 /* OCFileProviderServiceStandby.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCFileProviderServiceStandby.h; sourceTree = ""; }; + DC049155258C00C400DEDC27 /* OCFileProviderServiceStandby.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCFileProviderServiceStandby.m; sourceTree = ""; }; + DC0492B0258CC4EE00DEDC27 /* PocketSVG.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PocketSVG.LICENSE; sourceTree = ""; }; DC080CE2238AE3ED0044C5D2 /* OCLicenseAppStoreProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCLicenseAppStoreProvider.h; sourceTree = ""; }; DC080CE3238AE3ED0044C5D2 /* OCLicenseAppStoreProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCLicenseAppStoreProvider.m; sourceTree = ""; }; DC080CE7238BD71F0044C5D2 /* OCLicenseAppStoreItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCLicenseAppStoreItem.h; sourceTree = ""; }; DC080CE8238BD71F0044C5D2 /* OCLicenseAppStoreItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCLicenseAppStoreItem.m; sourceTree = ""; }; DC080CF0238C8D850044C5D2 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; DC0A35A024C1091400FB58FC /* UserInterfaceContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceContext.swift; sourceTree = ""; }; + DC0A5C422550C70800E6674B /* class-settings-sdk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "class-settings-sdk"; path = "ios-sdk/doc/class-settings-sdk"; sourceTree = SOURCE_ROOT; }; DC0B379320514E4700189B9A /* ServerListBookmarkCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerListBookmarkCell.swift; sourceTree = ""; }; DC0B37952051541C00189B9A /* ownCloud.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ownCloud.entitlements; sourceTree = ""; }; DC0B37962051681600189B9A /* ThemeButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeButton.swift; sourceTree = ""; }; DC136581208223F000FC0F60 /* OCBookmark+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OCBookmark+Extension.swift"; sourceTree = ""; }; DC1AC7CF2319ADAE002B7892 /* ScanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanViewController.swift; sourceTree = ""; }; - DC1B26FE209CF0D2004715E1 /* IssuesDismissalAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssuesDismissalAnimator.swift; sourceTree = ""; }; - DC1B26FF209CF0D2004715E1 /* IssuesPresentationAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssuesPresentationAnimator.swift; sourceTree = ""; }; - DC1B2705209CF0D3004715E1 /* CertificateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CertificateViewController.swift; sourceTree = ""; }; - DC1B2706209CF0D3004715E1 /* ConnectionIssueViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionIssueViewController.swift; sourceTree = ""; }; DC1B270B209CF34B004715E1 /* BookmarkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkViewController.swift; sourceTree = ""; }; DC23D1D6238F390200423F62 /* OCLicenseAppStoreReceipt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCLicenseAppStoreReceipt.h; sourceTree = ""; }; DC23D1D7238F390200423F62 /* OCLicenseAppStoreReceipt.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCLicenseAppStoreReceipt.m; sourceTree = ""; }; DC243BF92317B446004FBB5C /* ThemeWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeWindow.swift; sourceTree = ""; }; DC248C66213E7DB00067FE94 /* NSLayoutConstraint+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+Extension.swift"; sourceTree = ""; }; + DC24B27125B9DF31005783E2 /* Branding.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Branding.h; sourceTree = ""; }; + DC24B27225B9DF31005783E2 /* Branding.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Branding.m; sourceTree = ""; }; + DC24B2AA25BA316D005783E2 /* Branding+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Branding+App.swift"; sourceTree = ""; }; + DC24B31C25BB6FC4005783E2 /* IssuesCardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IssuesCardViewController.swift; sourceTree = ""; }; DC2565E8225F5A1900828AA5 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; + DC26ADDD2550C0B20059680D /* MetadataDocumentationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataDocumentationTests.swift; sourceTree = ""; }; DC27A18C20CA9F66008ACB6C /* OCItem+FileProviderItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OCItem+FileProviderItem.h"; sourceTree = ""; }; DC27A18D20CA9F66008ACB6C /* OCItem+FileProviderItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "OCItem+FileProviderItem.m"; sourceTree = ""; }; DC27A19020CAA0BA008ACB6C /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; @@ -1213,7 +1184,7 @@ DC33939F22E0A1C000DD3DA4 /* ItemPolicyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemPolicyTableViewController.swift; sourceTree = ""; }; DC3393A122E0A71100DD3DA4 /* ItemPolicyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemPolicyCell.swift; sourceTree = ""; }; DC3393A322E0A75C00DD3DA4 /* ClientItemResolvingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientItemResolvingCell.swift; sourceTree = ""; }; - DC3393A722E0C4ED00DD3DA4 /* icon-available-offline.tvg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "icon-available-offline.tvg"; path = "../../ownCloud/Resources/icon-available-offline.tvg"; sourceTree = ""; }; + DC3393A722E0C4ED00DD3DA4 /* icon-available-offline.tvg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "icon-available-offline.tvg"; path = "../img/filetypes-tvg/icon-available-offline.tvg"; sourceTree = ""; }; DC36885624DC98BF00333600 /* OCFileProviderServiceSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCFileProviderServiceSession.h; sourceTree = ""; }; DC36885724DC98BF00333600 /* OCFileProviderServiceSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCFileProviderServiceSession.m; sourceTree = ""; }; DC36886024DDA3C300333600 /* ProgressIndicatorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressIndicatorViewController.swift; sourceTree = ""; }; @@ -1249,8 +1220,6 @@ DC63208421FCEBE9007EC0A8 /* ClientActivityCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientActivityCell.swift; sourceTree = ""; }; DC63208621FCEE5D007EC0A8 /* ProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressView.swift; sourceTree = ""; }; DC6428CF2081406800493A01 /* CollapsibleProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleProgressBar.swift; sourceTree = ""; }; - DC65D0C3259D26BD0042571D /* OCFileProviderServiceStandby.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OCFileProviderServiceStandby.m; sourceTree = ""; }; - DC65D0C9259D26BD0042571D /* OCFileProviderServiceStandby.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCFileProviderServiceStandby.h; sourceTree = ""; }; DC66F39A239659C000CF4812 /* OCASN1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCASN1.h; sourceTree = ""; }; DC66F39B239659C000CF4812 /* OCASN1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCASN1.m; sourceTree = ""; }; DC66F3A323965A1400CF4812 /* NSDate+RFC3339.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDate+RFC3339.h"; sourceTree = ""; }; @@ -1260,6 +1229,7 @@ DC66F3AA23965C9C00CF4812 /* OCLicenseAppStoreReceiptInAppPurchase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCLicenseAppStoreReceiptInAppPurchase.m; sourceTree = ""; }; DC680575212DF548006C3B1F /* CertificateManagementViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificateManagementViewController.swift; sourceTree = ""; }; DC680579212EAB5E006C3B1F /* ThemeCertificateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeCertificateViewController.swift; sourceTree = ""; }; + DC6C68352574FD0400E46BD4 /* PLCrashReporter.LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = PLCrashReporter.LICENSE; sourceTree = ""; }; DC6CF7FA219446050013B9F9 /* LogSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogSettingsViewController.swift; sourceTree = ""; }; DC774E5C22F44E4A000B11A1 /* ZIPArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZIPArchive.h; sourceTree = ""; }; DC774E5D22F44E4A000B11A1 /* ZIPArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZIPArchive.m; sourceTree = ""; }; @@ -1267,7 +1237,6 @@ DC774E6222F44E6D000B11A1 /* OCCore+BundleImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "OCCore+BundleImport.m"; sourceTree = ""; }; DC7C100E24B5F81E00227085 /* OCBookmark+AppExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OCBookmark+AppExtensions.h"; sourceTree = ""; }; DC7C100F24B5F81E00227085 /* OCBookmark+AppExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "OCBookmark+AppExtensions.m"; sourceTree = ""; }; - DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PocketSVG.xcodeproj; path = external/PocketSVG/PocketSVG.xcodeproj; sourceTree = SOURCE_ROOT; }; DC7DBA24207F684700E7337D /* ThemeResource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeResource.swift; sourceTree = ""; }; DC7DBA28207F71D600E7337D /* VectorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VectorImage.swift; sourceTree = ""; }; DC7DBA2A207F71E400E7337D /* VectorImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VectorImageView.swift; sourceTree = ""; }; @@ -1301,6 +1270,8 @@ DCAEB06021F9FC510067E147 /* EarlGrey+Tools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EarlGrey+Tools.swift"; sourceTree = ""; }; DCB2C05D250C1F9E001083CA /* BrandingClassSettingsSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BrandingClassSettingsSource.h; sourceTree = ""; }; DCB2C05E250C1F9E001083CA /* BrandingClassSettingsSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BrandingClassSettingsSource.m; sourceTree = ""; }; + DCB3256A2559989200058EEB /* generate_docs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = generate_docs.sh; sourceTree = ""; }; + DCB3257425599ABC00058EEB /* ios_mdm_tables.adoc.tmpl */ = {isa = PBXFileReference; lastKnownFileType = text; path = ios_mdm_tables.adoc.tmpl; sourceTree = ""; }; DCB44D7C2186F0F600DAA4CC /* ThemeStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeStyle.swift; sourceTree = ""; }; DCB44D842186FEF700DAA4CC /* ThemeStyle+DefaultStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ThemeStyle+DefaultStyles.swift"; sourceTree = ""; }; DCB44D86218718BA00DAA4CC /* VendorServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VendorServices.swift; sourceTree = ""; }; @@ -1444,13 +1415,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DC7DBA1F207F59F800E7337D /* PocketSVG.framework in Frameworks */, 024F3A2124A3AB410083E11E /* CrashReporter in Frameworks */, DC3BE0D72077BC5D002A0AC0 /* openssl.framework in Frameworks */, + 394A0B0022EEFC2C00603813 /* ownCloudAppShared.framework in Frameworks */, DC3BE0D82077BC5D002A0AC0 /* ownCloudSDK.framework in Frameworks */, DC080CF1238C8D850044C5D2 /* StoreKit.framework in Frameworks */, DCC085712293F1FD008CC05C /* ownCloudApp.framework in Frameworks */, - 394A0B0022EEFC2C00603813 /* ownCloudAppShared.framework in Frameworks */, DCE0275E21F1DF7E00F2544E /* ownCloudUI.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1471,7 +1441,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DCE4E42C24C10E0D0051722F /* PocketSVG.framework in Frameworks */, + DC04920B258CB06A00DEDC27 /* PocketSVG in Frameworks */, DCDC0ACF23CD186400DFE36D /* ownCloudApp.framework in Frameworks */, 394A0B0A22EEFCF500603813 /* ownCloudSDK.framework in Frameworks */, ); @@ -1571,16 +1541,6 @@ path = Migration; sourceTree = ""; }; - 23031768205AA1DB006C4DAF /* Issues */ = { - isa = PBXGroup; - children = ( - 23BEF1172076667F00DD2E6F /* IssuesViewController.swift */, - DC1B26FD209CF0D2004715E1 /* Issues Animators */, - DC1B2704209CF0D3004715E1 /* Issues Subclasses */, - ); - path = Issues; - sourceTree = ""; - }; 233BDE93204FEFE500C06732 = { isa = PBXGroup; children = ( @@ -1628,6 +1588,7 @@ 3968C878239C54AC00AC28AC /* Release Notes */, 233BDE9F204FEFE500C06732 /* AppDelegate.swift */, 3961281522F8730A0087BD3A /* SceneDelegate.swift */, + DCD502B325BC3432007F9087 /* Issues */, DCF4F1612051925A00189B9A /* Bookmarks */, DC8EB26F239308C3009148F9 /* Licensing */, 4C51727422DE04BD001BC97F /* Tasks */, @@ -1655,6 +1616,7 @@ 233BDEB3204FEFE500C06732 /* ownCloudTests */ = { isa = PBXGroup; children = ( + DC26ADBD2550C02F0059680D /* Metadata */, EA9337DC2226DAE00054971F /* Settings */, 59B09E5B21AD61DD007827B8 /* Resources */, D7F3B3E74D4B04F9CAF95C09 /* EarlGrey.swift */, @@ -1786,6 +1748,7 @@ 394A0AFA22EEFC2C00603813 /* ownCloudAppShared */ = { isa = PBXGroup; children = ( + DC24B2A925BA3154005783E2 /* Branding */, DCCE54092080175B00067D1D /* TVGs */, DCE4E43824C19A950051722F /* Licensing */, DC0A354F24C0E18800FB58FC /* AppLock */, @@ -1798,6 +1761,7 @@ 395E16FB22F0691F00DE89A1 /* Intent */, DCE4E4C024C255A70051722F /* App Extensions */, 394A0AFB22EEFC2C00603813 /* ownCloudAppShared.h */, + DC0492B0258CC4EE00DEDC27 /* PocketSVG.LICENSE */, 394A0AFC22EEFC2C00603813 /* Info.plist */, ); path = ownCloudAppShared; @@ -1897,7 +1861,8 @@ 3931206A2326451900E8DFBA /* Branding.plist */, ); name = Theming; - sourceTree = ""; + path = ownCloud/Resources/Theming; + sourceTree = SOURCE_ROOT; }; 39E42D152315286300B82AC3 /* Key Commands */ = { isa = PBXGroup; @@ -2122,6 +2087,7 @@ DC0A354F24C0E18800FB58FC /* AppLock */ = { isa = PBXGroup; children = ( + 0234EF072515138A00AE921A /* PasscodeSetupCoordinator.swift */, 593BAB96209F8A0500023634 /* AppLockManager.swift */, 597A404820AD59EF00B028B2 /* AppLockWindow.swift */, 593BAB44209AE1BC00023634 /* PasscodeViewController.swift */, @@ -2139,7 +2105,6 @@ DC8549372183B4CD00782BA8 /* ThemeStyle+Extensions.swift */, DCB44D842186FEF700DAA4CC /* ThemeStyle+DefaultStyles.swift */, DC42244F207CB2500006A2A6 /* NSObject+ThemeApplication.swift */, - 39C31F9622F1C52C0023923D /* ThemeProvider.swift */, DC7DBA27207F6DFD00E7337D /* UI */, DC7DBA26207F6DEE00E7337D /* Resources */, DC7DBA21207F672700E7337D /* TVG */, @@ -2164,24 +2129,6 @@ path = "Cursor Support"; sourceTree = ""; }; - DC1B26FD209CF0D2004715E1 /* Issues Animators */ = { - isa = PBXGroup; - children = ( - DC1B26FE209CF0D2004715E1 /* IssuesDismissalAnimator.swift */, - DC1B26FF209CF0D2004715E1 /* IssuesPresentationAnimator.swift */, - ); - path = "Issues Animators"; - sourceTree = ""; - }; - DC1B2704209CF0D3004715E1 /* Issues Subclasses */ = { - isa = PBXGroup; - children = ( - DC1B2705209CF0D3004715E1 /* CertificateViewController.swift */, - DC1B2706209CF0D3004715E1 /* ConnectionIssueViewController.swift */, - ); - path = "Issues Subclasses"; - sourceTree = ""; - }; DC23D1D0238F38DF00423F62 /* Receipt */ = { isa = PBXGroup; children = ( @@ -2193,6 +2140,14 @@ path = Receipt; sourceTree = ""; }; + DC24B2A925BA3154005783E2 /* Branding */ = { + isa = PBXGroup; + children = ( + DC24B2AA25BA316D005783E2 /* Branding+App.swift */, + ); + path = Branding; + sourceTree = ""; + }; DC255E432319AD13007279B1 /* Scanner */ = { isa = PBXGroup; children = ( @@ -2203,6 +2158,15 @@ path = Scanner; sourceTree = ""; }; + DC26ADBD2550C02F0059680D /* Metadata */ = { + isa = PBXGroup; + children = ( + DC0A5C422550C70800E6674B /* class-settings-sdk */, + DC26ADDD2550C0B20059680D /* MetadataDocumentationTests.swift */, + ); + path = Metadata; + sourceTree = ""; + }; DC27A19B20CAB5D7008ACB6C /* FileProvider Integration */ = { isa = PBXGroup; children = ( @@ -2365,22 +2329,11 @@ isa = PBXGroup; children = ( DCE93FEE21FCA434000E14F2 /* libzip.xcodeproj */, - DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */, ); name = External; path = ownCloud; sourceTree = ""; }; - DC7DBA12207F59D200E7337D /* Products */ = { - isa = PBXGroup; - children = ( - DC7DBA18207F59D200E7337D /* PocketSVG.framework */, - DC7DBA1A207F59D200E7337D /* PocketSVG.framework */, - DC7DBA1C207F59D200E7337D /* PocketSVGTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; DC7DBA21207F672700E7337D /* TVG */ = { isa = PBXGroup; children = ( @@ -2427,6 +2380,7 @@ DC7DBA3B207F86E900E7337D /* Tools */ = { isa = PBXGroup; children = ( + DCB3256B255998A400058EEB /* GenerateDocs */, DC7DBA35207F84BF00E7337D /* MakeTVG */, ); name = Tools; @@ -2453,6 +2407,7 @@ 233BDEAB204FEFE500C06732 /* Info.plist */, 59D4895420C83F2E00369C2E /* InfoPlist.strings */, 593A821320C7D4C5000E2A90 /* Localizable.strings */, + DC6C68352574FD0400E46BD4 /* PLCrashReporter.LICENSE */, ); path = Resources; sourceTree = ""; @@ -2510,16 +2465,36 @@ DCB2C05C250C1ECD001083CA /* Branding */ = { isa = PBXGroup; children = ( + DC24B27225B9DF31005783E2 /* Branding.m */, + DC24B27125B9DF31005783E2 /* Branding.h */, DCB2C05E250C1F9E001083CA /* BrandingClassSettingsSource.m */, DCB2C05D250C1F9E001083CA /* BrandingClassSettingsSource.h */, ); path = Branding; sourceTree = ""; }; + DCB3256B255998A400058EEB /* GenerateDocs */ = { + isa = PBXGroup; + children = ( + DCB3257525599BAC00058EEB /* templates */, + DCB3256A2559989200058EEB /* generate_docs.sh */, + ); + path = GenerateDocs; + sourceTree = ""; + }; + DCB3257525599BAC00058EEB /* templates */ = { + isa = PBXGroup; + children = ( + DCB3257425599ABC00058EEB /* ios_mdm_tables.adoc.tmpl */, + ); + path = templates; + sourceTree = ""; + }; DCBF0A5E2280393A00465530 /* PDF */ = { isa = PBXGroup; children = ( 23EC77542137F3DC0032D4E6 /* PDFViewerViewController.swift */, + 02D4C829255208E60000E299 /* PDFSearchResultsView.swift */, 4C464BEB2187AF1500D30602 /* PDFOutlineViewController.swift */, 4C464BEC2187AF1500D30602 /* PDFSearchTableViewCell.swift */, 4C464BEA2187AF1400D30602 /* PDFSearchViewController.swift */, @@ -2683,7 +2658,6 @@ 239F437D20D0EE6300B1276D /* icon-search.tvg */, ); name = TVGs; - path = Resources; sourceTree = ""; }; DCD1301923A25D0500255779 /* Transactions */ = { @@ -2702,6 +2676,14 @@ path = Tools; sourceTree = ""; }; + DCD502B325BC3432007F9087 /* Issues */ = { + isa = PBXGroup; + children = ( + DC24B31C25BB6FC4005783E2 /* IssuesCardViewController.swift */, + ); + path = Issues; + sourceTree = ""; + }; DCDC208923991296003CFF5B /* Transactions */ = { isa = PBXGroup; children = ( @@ -2774,7 +2756,7 @@ DCE4E43624C19A3B0051722F /* More */ = { isa = PBXGroup; children = ( - 236735A521217C3500E5834A /* MoreViewController.swift */, + 236735A521217C3500E5834A /* FrameViewController.swift */, 232B01F32126B0CE00366FA0 /* MoreViewHeader.swift */, 232B01F52126B10900366FA0 /* MoreStaticTableViewController.swift */, ); @@ -2857,11 +2839,11 @@ DCF2DA7F24C836240026D790 /* OCBookmark+FPServices.h */, DCF2DA7C24C835BF0026D790 /* OCVault+FPServices.m */, DCF2DA7B24C835BF0026D790 /* OCVault+FPServices.h */, - DC65D0C3259D26BD0042571D /* OCFileProviderServiceStandby.m */, - DC65D0C9259D26BD0042571D /* OCFileProviderServiceStandby.h */, - DCF2DA7524C82C9F0026D790 /* OCFileProviderService.h */, DC36885724DC98BF00333600 /* OCFileProviderServiceSession.m */, DC36885624DC98BF00333600 /* OCFileProviderServiceSession.h */, + DCF2DA7524C82C9F0026D790 /* OCFileProviderService.h */, + DC049155258C00C400DEDC27 /* OCFileProviderServiceStandby.m */, + DC049154258C00C400DEDC27 /* OCFileProviderServiceStandby.h */, ); path = "File Provider Services"; sourceTree = ""; @@ -2869,7 +2851,6 @@ DCF4F1612051925A00189B9A /* Bookmarks */ = { isa = PBXGroup; children = ( - 23031768205AA1DB006C4DAF /* Issues */, DC1B270B209CF34B004715E1 /* BookmarkViewController.swift */, 4CC46D202284C677009E938F /* BookmarkInfoViewController.swift */, ); @@ -3051,6 +3032,7 @@ DCF2DA8324C83BFB0026D790 /* OCFileProviderService.h in Headers */, DCF2DA8624C87A330026D790 /* OCCore+FPServices.h in Headers */, DC774E6022F44E57000B11A1 /* ZIPArchive.h in Headers */, + DC24B28725BA2A2E005783E2 /* Branding.h in Headers */, DCFEFE9C2368D7FA009A142F /* OCLicenseObserver.h in Headers */, DCFEFE2E236876D4009A142F /* OCLicenseProvider.h in Headers */, DCC832F3242CC28900153F8C /* NotificationManager.h in Headers */, @@ -3074,7 +3056,7 @@ DC0030C22350B1CE00BB8570 /* NSData+Encoding.h in Headers */, DCC5E4472326564F002E5B84 /* NSObject+AnnotatedProperties.h in Headers */, DC66F3AB23965C9C00CF4812 /* OCLicenseAppStoreReceiptInAppPurchase.h in Headers */, - DC65D0CB259D26BD0042571D /* OCFileProviderServiceStandby.h in Headers */, + DC049156258C00C400DEDC27 /* OCFileProviderServiceStandby.h in Headers */, DCFEFE972368D099009A142F /* OCLicenseEnvironment.h in Headers */, DC36885824DC98BF00333600 /* OCFileProviderServiceSession.h in Headers */, ); @@ -3092,7 +3074,6 @@ 233BDE99204FEFE500C06732 /* Frameworks */, 233BDE9A204FEFE500C06732 /* Resources */, DC85573420513CCC00189B9A /* Copy Frameworks */, - DC01CDCA212ECEB000FC8E38 /* Copy PocketSVG license */, DC63207821FCA6A4007EC0A8 /* Copy libzip license */, 23DFDCF120AEEC77003BD16B /* Update LastGitCommit key in Info.plist */, DCC6567020C9B7E400110A97 /* Embed App Extensions */, @@ -3101,7 +3082,6 @@ ); dependencies = ( DC63207D21FCA71B007EC0A8 /* PBXTargetDependency */, - DC7DBA1E207F59F200E7337D /* PBXTargetDependency */, DC3BE0CD2077BC52002A0AC0 /* PBXTargetDependency */, DC3BE0CF2077BC52002A0AC0 /* PBXTargetDependency */, DC3BE0D12077BC52002A0AC0 /* PBXTargetDependency */, @@ -3110,6 +3090,7 @@ 39A7138622E79C6700089423 /* PBXTargetDependency */, 394A0AFF22EEFC2C00603813 /* PBXTargetDependency */, DCE4E47124C1F5610051722F /* PBXTargetDependency */, + DC0491AA258CAF9800DEDC27 /* PBXTargetDependency */, ); name = ownCloud; packageProductDependencies = ( @@ -3125,10 +3106,10 @@ buildPhases = ( CCD5F274B7E08D493D596856 /* [CP] Check Pods Manifest.lock */, 233BDEAC204FEFE500C06732 /* Sources */, + FF929A2C3849C01CA20C4475 /* [CP] Embed Pods Frameworks */, + D9876310DCEA650662AA6AF7 /* EarlGrey Copy Files */, 233BDEAD204FEFE500C06732 /* Frameworks */, 233BDEAE204FEFE500C06732 /* Resources */, - D9876310DCEA650662AA6AF7 /* EarlGrey Copy Files */, - FF929A2C3849C01CA20C4475 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -3151,15 +3132,19 @@ 394A0AF522EEFC2C00603813 /* Sources */, 394A0AF622EEFC2C00603813 /* Frameworks */, 394A0AF722EEFC2C00603813 /* Resources */, + DC049259258CB33600DEDC27 /* Copy PocketSVG license (inactive) */, ); buildRules = ( ); dependencies = ( - DCE4E42624C10E050051722F /* PBXTargetDependency */, + DC0491D8258CB00000DEDC27 /* PBXTargetDependency */, DCDC0ACE23CD185F00DFE36D /* PBXTargetDependency */, 394A0B0C22EEFD2800603813 /* PBXTargetDependency */, ); name = ownCloudAppShared; + packageProductDependencies = ( + DC04920A258CB06A00DEDC27 /* PocketSVG */, + ); productName = ownCloudAppShared; productReference = 394A0AF922EEFC2C00603813 /* ownCloudAppShared.framework */; productType = "com.apple.product-type.framework"; @@ -3311,7 +3296,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1150; - LastUpgradeCheck = 1160; + LastUpgradeCheck = 1230; ORGANIZATIONNAME = "ownCloud GmbH"; TargetAttributes = { 233BDE9B204FEFE500C06732 = { @@ -3408,6 +3393,7 @@ mainGroup = 233BDE93204FEFE500C06732; packageReferences = ( 024F3A1F24A3AB410083E11E /* XCRemoteSwiftPackageReference "plcrashreporter" */, + DC049197258CAF8200DEDC27 /* XCRemoteSwiftPackageReference "PocketSVG" */, ); productRefGroup = 233BDE9D204FEFE500C06732 /* Products */; projectDirPath = ""; @@ -3424,10 +3410,6 @@ ProductGroup = 239369712076110900BCE21A /* Products */; ProjectRef = 233BDEBF204FEFF300C06732 /* ownCloudSDK.xcodeproj */; }, - { - ProductGroup = DC7DBA12207F59D200E7337D /* Products */; - ProjectRef = DC7DBA11207F59D200E7337D /* PocketSVG.xcodeproj */; - }, ); projectRoot = ""; targets = ( @@ -3495,27 +3477,6 @@ remoteRef = DC0196A720F754CA00C41B78 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - DC7DBA18207F59D200E7337D /* PocketSVG.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = PocketSVG.framework; - remoteRef = DC7DBA17207F59D200E7337D /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - DC7DBA1A207F59D200E7337D /* PocketSVG.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = PocketSVG.framework; - remoteRef = DC7DBA19207F59D200E7337D /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - DC7DBA1C207F59D200E7337D /* PocketSVGTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = PocketSVGTests.xctest; - remoteRef = DC7DBA1B207F59D200E7337D /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; DCE93FF321FCA434000E14F2 /* libzip.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -3542,6 +3503,7 @@ DCE684F6241BD4E800799C30 /* Branding.plist in Resources */, DC9BFBB320A19AF4007064B5 /* doc in Resources */, 233BDEA7204FEFE500C06732 /* Assets.xcassets in Resources */, + DC6C68362574FD0400E46BD4 /* PLCrashReporter.LICENSE in Resources */, 39F48A6A24D89D7E0000E3F9 /* branding-bookmark-icon.png in Resources */, 595E2CA821EE501400F0E95D /* PropfindResponseNewFolder.xml in Resources */, 59B09E6521AD61DD007827B8 /* test_certificate.cer in Resources */, @@ -3554,6 +3516,7 @@ buildActionMask = 2147483647; files = ( 595E2C9F21EE4BF300F0E95D /* PropfindResponseNewFolder.xml in Resources */, + DC0A5C432550C70800E6674B /* class-settings-sdk in Resources */, 59B09E6621AD61DD007827B8 /* test_certificate.cer in Resources */, 59B09E6421AD61DD007827B8 /* PropfindResponse.xml in Resources */, ); @@ -3589,6 +3552,7 @@ DCE4E49924C1FB750051722F /* package-x-generic.tvg in Resources */, DCE4E49324C1FB750051722F /* folder-create.tvg in Resources */, DCE4E49824C1FB750051722F /* owncloud-logo.tvg in Resources */, + DC0492B1258CC4EE00DEDC27 /* PocketSVG.LICENSE in Resources */, DCE4E48A24C1FB750051722F /* application.tvg in Resources */, DCE4E49024C1FB750051722F /* folder-shared.tvg in Resources */, DCE4E4A224C1FB750051722F /* x-office-spreadsheet.tvg in Resources */, @@ -3696,12 +3660,13 @@ buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ownCloudScreenshotsTests/Pods-ownCloudScreenshotsTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ownCloudScreenshotsTests/Pods-ownCloudScreenshotsTests-frameworks.sh", + "${PODS_ROOT}/EarlGrey/EarlGrey/EarlGrey.framework", ); name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ownCloudScreenshotsTests/Pods-ownCloudScreenshotsTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EarlGrey.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -3726,19 +3691,23 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - DC01CDCA212ECEB000FC8E38 /* Copy PocketSVG license */ = { + DC049259258CB33600DEDC27 /* Copy PocketSVG license (inactive) */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); - name = "Copy PocketSVG license"; + name = "Copy PocketSVG license (inactive)"; + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"${PROJECT_DIR}/external/PocketSVG/LICENSE\" \"${TARGET_BUILD_DIR}/${WRAPPER_NAME}/PocketSVG.LICENSE\"\ncp \"${PROJECT_DIR}/external/PocketSVG/LICENSE\" \"${TARGET_BUILD_DIR}/${WRAPPER_NAME}/PocketSVG.LICENSE\"\n"; + shellScript = "# echo \"${TARGET_BUILD_DIR}/../../../SourcePackages/checkouts/PocketSVG/LICENSE\" \"${TARGET_BUILD_DIR}/${WRAPPER_NAME}/PocketSVG.LICENSE\"\n# cp \"${TARGET_BUILD_DIR}/../../../SourcePackages/checkouts/PocketSVG/LICENSE\" \"${TARGET_BUILD_DIR}/${WRAPPER_NAME}/PocketSVG.LICENSE\"\n"; }; DC63207821FCA6A4007EC0A8 /* Copy libzip license */ = { isa = PBXShellScriptBuildPhase; @@ -3746,6 +3715,7 @@ files = ( ); inputFileListPaths = ( + "${PROJECT_DIR}/external/libzip/LICENSE", ); inputPaths = ( ); @@ -3753,6 +3723,7 @@ outputFileListPaths = ( ); outputPaths = ( + "${TARGET_BUILD_DIR}/${WRAPPER_NAME}/libzip.LICENSE", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -3763,12 +3734,13 @@ buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ownCloudTests/Pods-ownCloudTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ownCloudTests/Pods-ownCloudTests-frameworks.sh", + "${PODS_ROOT}/EarlGrey/EarlGrey/EarlGrey.framework", ); name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ownCloudTests/Pods-ownCloudTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/EarlGrey.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -3819,7 +3791,6 @@ 4C464BF52187AF1500D30602 /* PDFThumbnailsCollectionViewController.swift in Sources */, 4C464BF02187AF1500D30602 /* PDFTocTableViewController.swift in Sources */, 3961281622F8730A0087BD3A /* SceneDelegate.swift in Sources */, - DC1B2708209CF0D3004715E1 /* IssuesPresentationAnimator.swift in Sources */, DCA35D8124D1707100DBE2B0 /* OCSyncRecordActivity+DiagnosticGenerator.swift in Sources */, DC3BE0DF2077CC14002A0AC0 /* ClientRootViewController.swift in Sources */, 4CB8ADE022DF5EC500F1FEBC /* UIAlertViewController+SystemPermissions.swift in Sources */, @@ -3834,7 +3805,6 @@ DCD1300A23A191C000255779 /* LicenseOfferButton.swift in Sources */, 0269F589244DED02002E9D99 /* UIAlertController+UniversalLinks.swift in Sources */, 4C9BFA2323158C3F0059CA3E /* PreviewViewController.swift in Sources */, - DC1B2709209CF0D3004715E1 /* CertificateViewController.swift in Sources */, 4C3E17DB234DBF9A000D7BA8 /* PendingMediaUploadTaskExtension.swift in Sources */, DCC832DE242C0C3700153F8C /* DisplaySleepPreventer.swift in Sources */, 6E586CFC2199A72600F680C4 /* OpenInAction.swift in Sources */, @@ -3924,7 +3894,6 @@ DCEE1C9C23A0EADD00FE8D98 /* LicenseOfferView.swift in Sources */, DCB6C4DE24559B1600C1EAE1 /* ClientAuthenticationUpdaterViewController.swift in Sources */, 6E3A104D219D6F0100F90C96 /* DuplicateAction.swift in Sources */, - DC1B270A209CF0D3004715E1 /* ConnectionIssueViewController.swift in Sources */, DCFB74C121AD5C88005796AF /* StaticLoginStepViewController.swift in Sources */, 02F2891424BFAF0100E3D35C /* MigrationViewController.swift in Sources */, DC4D5A0A247C1398008ADDB6 /* MessageGroup.swift in Sources */, @@ -3940,8 +3909,7 @@ 02DC7C9024CB354800DCB2C6 /* ProPhotoUploadSettingsSection.swift in Sources */, DCC832F6242CC5F700153F8C /* CardIssueMessagePresenter.swift in Sources */, DCD1301123A23F4E00255779 /* OCLicenseManager+AppStore.swift in Sources */, - DC1B2707209CF0D3004715E1 /* IssuesDismissalAnimator.swift in Sources */, - 23BEF1182076667F00DD2E6F /* IssuesViewController.swift in Sources */, + DC24B31D25BB6FC4005783E2 /* IssuesCardViewController.swift in Sources */, DC62514C225D254500736874 /* UploadBaseAction.swift in Sources */, 4C6B78102226B83300C5F3DB /* PhotoAlbumTableViewController.swift in Sources */, DC3393A222E0A71100DD3DA4 /* ItemPolicyCell.swift in Sources */, @@ -3949,6 +3917,7 @@ DCDF58B323CE82E100080BEB /* LicenseInAppPurchaseFeatureView.swift in Sources */, 39AFC3D8225E79CD00A6D3AE /* GroupSharingEditTableViewController.swift in Sources */, DC33939622E0747400DD3DA4 /* MakeAvailableOfflineAction.swift in Sources */, + 02D4C82A255208E60000E299 /* PDFSearchResultsView.swift in Sources */, 39057AA3233BA7A60008E6C0 /* Intents.intentdefinition in Sources */, 6E586CFE2199A75900F680C4 /* MoveAction.swift in Sources */, DC625148225CEB2C00736874 /* UploadFileAction.swift in Sources */, @@ -3981,6 +3950,7 @@ 5958C9BE20C000A700E0E567 /* PasscodeTests.swift in Sources */, 5917244E20D3DC2100809B38 /* BiometricalTests.swift in Sources */, 59538A0B21E4C301005E543B /* MockOCQuery.swift in Sources */, + DC26ADDE2550C0B20059680D /* MetadataDocumentationTests.swift in Sources */, 5971CF3A22046F530052FE9A /* MockClientRootViewController.swift in Sources */, 59B09E7021AD61F4007827B8 /* UtilsTests.swift in Sources */, 59538A1C21E77FB7005E543B /* MockOCCore.swift in Sources */, @@ -4002,7 +3972,6 @@ DC0A359224C0E55800FB58FC /* UIColor+Extension.swift in Sources */, DCE4E45024C1E0400051722F /* UIButton+Extension.swift in Sources */, DC0A357024C0E42700FB58FC /* StaticTableViewSection.swift in Sources */, - DC0A358124C0E43C00FB58FC /* ThemeProvider.swift in Sources */, DC0A357624C0E43200FB58FC /* ProgressHUDViewController.swift in Sources */, DCE4E45824C1F0F40051722F /* ClientDirectoryPickerViewController.swift in Sources */, DCDC0AD123CD18D200DFE36D /* OCLicenseManager+Setup.swift in Sources */, @@ -4012,6 +3981,8 @@ DCE4E44124C1A07E0051722F /* UITableViewController+Extension.swift in Sources */, DC0A358E24C0E44B00FB58FC /* ThemeableColoredView.swift in Sources */, DC0A356D24C0E42200FB58FC /* PasscodeViewController.swift in Sources */, + DC24B2AB25BA316D005783E2 /* Branding+App.swift in Sources */, + 0234EF0E2515138B00AE921A /* PasscodeSetupCoordinator.swift in Sources */, DCA35DA724D309B600DBE2B0 /* OCFileProviderServiceSession+UploadByFileProvider.swift in Sources */, 39BE385D23435AFE0062A2FE /* String+Extension.swift in Sources */, DC0A357A24C0E43700FB58FC /* CardViewController.swift in Sources */, @@ -4044,7 +4015,7 @@ DC0A357124C0E42700FB58FC /* StaticTableViewRow.swift in Sources */, DCE4E43124C197450051722F /* OpenItemUserActivity.swift in Sources */, DC0A358D24C0E44B00FB58FC /* ThemedAlertController.swift in Sources */, - DCE4E43C24C19B660051722F /* MoreViewController.swift in Sources */, + DCE4E43C24C19B660051722F /* FrameViewController.swift in Sources */, DC0A35A124C1091400FB58FC /* UserInterfaceContext.swift in Sources */, DC0A357424C0E42D00FB58FC /* PushTransition.swift in Sources */, DC0A357824C0E43700FB58FC /* CardPresentationController.swift in Sources */, @@ -4129,6 +4100,7 @@ DCF2DA8724C87A330026D790 /* OCCore+FPServices.m in Sources */, DC7C101224B5FD6500227085 /* OCBookmark+AppExtensions.m in Sources */, DC4332012472E1B4002DC0E5 /* OCLicenseEMMProvider.m in Sources */, + DC24B29825BA2A34005783E2 /* Branding.m in Sources */, DCFEFE3E236877B7009A142F /* OCLicenseProduct.m in Sources */, DC774E6422F44E6D000B11A1 /* OCCore+BundleImport.m in Sources */, DCF2DA7E24C835BF0026D790 /* OCVault+FPServices.m in Sources */, @@ -4154,7 +4126,7 @@ DCD8109B23984AF6003B0053 /* OCLicenseDuration.m in Sources */, DC080CF3238C92480044C5D2 /* OCLicenseAppStoreItem.m in Sources */, DCFEFE982368D099009A142F /* OCLicenseEnvironment.m in Sources */, - DC65D0CA259D26BD0042571D /* OCFileProviderServiceStandby.m in Sources */, + DC049157258C00C400DEDC27 /* OCFileProviderServiceStandby.m in Sources */, DC36885924DC98BF00333600 /* OCFileProviderServiceSession.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -4227,6 +4199,14 @@ target = 233BDE9B204FEFE500C06732 /* ownCloud */; targetProxy = 59056CAF22414F3C00A18A22 /* PBXContainerItemProxy */; }; + DC0491AA258CAF9800DEDC27 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = DC0491A9258CAF9800DEDC27 /* PocketSVG */; + }; + DC0491D8258CB00000DEDC27 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = DC0491D7258CB00000DEDC27 /* PocketSVG */; + }; DC0A359B24C0EBD800FB58FC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ownCloudSDK; @@ -4278,11 +4258,6 @@ name = libzip; targetProxy = DC774E6622F44F65000B11A1 /* PBXContainerItemProxy */; }; - DC7DBA1E207F59F200E7337D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "PocketSVG (iOS)"; - targetProxy = DC7DBA1D207F59F200E7337D /* PBXContainerItemProxy */; - }; DC8EB26E23927FE7009148F9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = openssl; @@ -4333,11 +4308,6 @@ target = DCC0855B2293F1FD008CC05C /* ownCloudApp */; targetProxy = DCDC0ACD23CD185F00DFE36D /* PBXContainerItemProxy */; }; - DCE4E42624C10E050051722F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "PocketSVG (iOS)"; - targetProxy = DCE4E42524C10E050051722F /* PBXContainerItemProxy */; - }; DCE4E47124C1F5610051722F /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DCE4E46724C1F5610051722F /* ownCloud Share Extension */; @@ -4492,8 +4462,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - APP_SHORT_VERSION = 11.4.5; - APP_VERSION = 182; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -4548,6 +4518,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VALIDATE_WORKSPACE = YES; }; name = Debug; }; @@ -4555,8 +4526,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - APP_SHORT_VERSION = 11.4.5; - APP_VERSION = 182; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -4604,6 +4575,7 @@ SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; + VALIDATE_WORKSPACE = YES; }; name = Release; }; @@ -4611,8 +4583,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - APP_SHORT_VERSION = 11.4.5; - APP_VERSION = 182; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ownCloud/ownCloud.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -4644,8 +4616,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - APP_SHORT_VERSION = 11.4.5; - APP_VERSION = 182; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ownCloud/ownCloud.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -4943,6 +4915,8 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = NO; @@ -4985,6 +4959,8 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + APP_SHORT_VERSION = 11.5; + APP_VERSION = 185; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = NO; @@ -5289,6 +5265,14 @@ minimumVersion = 1.7.0; }; }; + DC049197258CAF8200DEDC27 /* XCRemoteSwiftPackageReference "PocketSVG" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pocketsvg/PocketSVG.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.7.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -5302,6 +5286,21 @@ package = 024F3A1F24A3AB410083E11E /* XCRemoteSwiftPackageReference "plcrashreporter" */; productName = CrashReporter; }; + DC0491A9258CAF9800DEDC27 /* PocketSVG */ = { + isa = XCSwiftPackageProductDependency; + package = DC049197258CAF8200DEDC27 /* XCRemoteSwiftPackageReference "PocketSVG" */; + productName = PocketSVG; + }; + DC0491D7258CB00000DEDC27 /* PocketSVG */ = { + isa = XCSwiftPackageProductDependency; + package = DC049197258CAF8200DEDC27 /* XCRemoteSwiftPackageReference "PocketSVG" */; + productName = PocketSVG; + }; + DC04920A258CB06A00DEDC27 /* PocketSVG */ = { + isa = XCSwiftPackageProductDependency; + package = DC049197258CAF8200DEDC27 /* XCRemoteSwiftPackageReference "PocketSVG" */; + productName = PocketSVG; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 233BDE94204FEFE500C06732 /* Project object */; diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/MakeTVG.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/MakeTVG.xcscheme index 31bf2c32e..29e114fe2 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/MakeTVG.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/MakeTVG.xcscheme @@ -1,6 +1,6 @@ + RemotePath = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/Applications/Files.app"> + isEnabled = "YES"> + isEnabled = "YES"> + isEnabled = "YES"> diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud File ProviderUI.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud File ProviderUI.xcscheme index 2a5c1d941..8c013868b 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud File ProviderUI.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud File ProviderUI.xcscheme @@ -1,6 +1,6 @@ + runnableDebuggingMode = "0" + BundleIdentifier = "com.apple.DocumentsApp" + RemotePath = "/var/containers/Bundle/Application/992AF78C-7B9A-4EBF-AB5B-BA3202AD7B9D/Files.app"> + + + + + + @@ -246,18 +261,18 @@ isEnabled = "NO"> + + + + diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloudApp.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloudApp.xcscheme index fb1ca8044..5b73a86b5 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloudApp.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloudApp.xcscheme @@ -1,6 +1,6 @@ = OCIssueLevel.warning.rawValue { + if let issue = issue { + let displayIssues = issue.prepareForDisplay() + + if displayIssues.isAtLeast(level: .warning) { // Present issues if the level is >= warning - let issuesViewController = ConnectionIssueViewController(displayIssues: displayIssues, completion: { [weak self] (response) in + IssuesCardViewController.present(on: self, issue: issue, displayIssues: displayIssues, completion: { [weak self, weak issue] (response) in switch response { case .cancel: issue?.reject() @@ -440,11 +441,9 @@ class BookmarkViewController: StaticTableViewController { self?.bookmark?.url = nil } }) - - self.present(issuesViewController, animated: true, completion: nil) } else { // Do not present issues - issue?.approve() + issue.approve() continueToNextStep() } } @@ -472,6 +471,7 @@ class BookmarkViewController: StaticTableViewController { } options[.presentingViewControllerKey] = self + options[.requiredUsernameKey] = connectionBookmark.userName guard let bookmarkAuthenticationMethodIdentifier = bookmark?.authenticationMethodIdentifier else { return } @@ -503,8 +503,8 @@ class BookmarkViewController: StaticTableViewController { self.updateInputFocus(fallbackRow: self.passwordRow) } else if nsError?.isOCError(withCode: .authorizationCancelled) == true { // User cancelled authorization, no reaction needed - } else { - let issuesViewController = ConnectionIssueViewController(displayIssues: issue?.prepareForDisplay(), completion: { [weak self] (response) in + } else if let issue = issue { + IssuesCardViewController.present(on: self, issue: issue, completion: { [weak self, weak issue] (response) in switch response { case .cancel: issue?.reject() @@ -516,8 +516,6 @@ class BookmarkViewController: StaticTableViewController { case .dismiss: break } }) - - self.present(issuesViewController, animated: true, completion: nil) } }) } @@ -576,8 +574,8 @@ class BookmarkViewController: StaticTableViewController { case .edit: // Update original bookmark self?.originalBookmark?.setValuesFrom(bookmark) - if !OCBookmarkManager.shared.updateBookmark(bookmark) { - Log.error("Changes to \(bookmark) not saved as it's not tracked by OCBookmarkManager!") + if let originalBookmark = self?.originalBookmark, !OCBookmarkManager.shared.updateBookmark(originalBookmark) { + Log.error("Changes to \(originalBookmark) not saved as it's not tracked by OCBookmarkManager!") } } @@ -598,10 +596,10 @@ class BookmarkViewController: StaticTableViewController { } else { OnMainThread { hudCompletion({ - if issue != nil { + if let issue = issue { self?.bookmark?.authenticationData = nil - let issuesViewController = ConnectionIssueViewController(displayIssues: issue?.prepareForDisplay(), completion: { [weak self] (response) in + IssuesCardViewController.present(on: strongSelf, issue: issue, completion: { [weak self, weak issue] (response) in switch response { case .cancel: issue?.reject() @@ -613,8 +611,6 @@ class BookmarkViewController: StaticTableViewController { case .dismiss: break } }) - - strongSelf.present(issuesViewController, animated: true, completion: nil) } else { strongSelf.presentingViewController?.dismiss(animated: true, completion: nil) } @@ -931,17 +927,31 @@ extension BookmarkViewController : OCClassSettingsSupport { static func defaultSettings(forIdentifier identifier: OCClassSettingsIdentifier) -> [OCClassSettingsKey : Any]? { if identifier == .bookmark { - /* return [ - .bookmarkDefaultURL : "http://demo.owncloud.org/", - .bookmarkURLEditable : false + .bookmarkURLEditable : true ] - */ - return [ : ] } return nil } + + static func classSettingsMetadata() -> [OCClassSettingsKey : [OCClassSettingsMetadataKey : Any]]? { + return [ + .bookmarkDefaultURL : [ + .type : OCClassSettingsMetadataType.string, + .description : "The default URL for the creation of new bookmarks.", + .category : "Bookmarks", + .status : OCClassSettingsKeyStatus.supported + ], + + .bookmarkURLEditable : [ + .type : OCClassSettingsMetadataType.boolean, + .description : "Controls whetehr the server URL in the text field during the creation of new bookmarks can be changed.", + .category : "Bookmarks", + .status : OCClassSettingsKeyStatus.supported + ] + ] + } } // MARK: - Keyboard / return key tracking diff --git a/ownCloud/Bookmarks/Issues/Issues Animators/IssuesDismissalAnimator.swift b/ownCloud/Bookmarks/Issues/Issues Animators/IssuesDismissalAnimator.swift deleted file mode 100644 index b552bba4f..000000000 --- a/ownCloud/Bookmarks/Issues/Issues Animators/IssuesDismissalAnimator.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// IssuesDismissalAnimator.swift -// ownCloud -// -// Created by Pablo Carrascal on 15/03/2018. -// Copyright © 2018 ownCloud GmbH. All rights reserved. -// - -import UIKit - -@objc public class IssuesDismissalAnimator: NSObject, UIViewControllerAnimatedTransitioning { - - public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return 0.4 - } - - public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - let fromVC = transitionContext.viewController(forKey: .from) - - transitionContext.containerView.addSubview(fromVC!.view) - - let initialFrame = transitionContext.initialFrame(for: fromVC!) - - let views = Array(fromVC!.view.subviews.reversed()) - var index = 0 - - let step: Double = 0.0 - - for view in views.reversed() { - let delay = step * Double(index) - UIView.animate(withDuration: self.transitionDuration(using: transitionContext) - delay, - delay: delay, - usingSpringWithDamping: 0.7, - initialSpringVelocity: 0.5, - options: [], - animations: { - view.transform = CGAffineTransform(translationX: 0, y: initialFrame.height) - }, completion: nil) - index += 1 - } - - let backgroundColor = fromVC?.view.backgroundColor! - - UIView.animate(withDuration: self.transitionDuration(using: transitionContext), - animations: { - fromVC?.view.backgroundColor = backgroundColor?.withAlphaComponent(0) - }, completion: { _ in - transitionContext.completeTransition(true) - }) - } -} diff --git a/ownCloud/Bookmarks/Issues/Issues Animators/IssuesPresentationAnimator.swift b/ownCloud/Bookmarks/Issues/Issues Animators/IssuesPresentationAnimator.swift deleted file mode 100644 index 66114b053..000000000 --- a/ownCloud/Bookmarks/Issues/Issues Animators/IssuesPresentationAnimator.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// IssuesPresentationAnimator.swift -// ownCloud -// -// Created by Pablo Carrascal on 15/03/2018. -// Copyright © 2018 ownCloud GmbH. All rights reserved. -// - -import UIKit - -@objc public class IssuesPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning { - - public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return 0.1 - } - - public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - let fromVC = transitionContext.viewController(forKey: .from) - let toVC = transitionContext.viewController(forKey: .to) - - let finalFrame = transitionContext.initialFrame(for: fromVC!) - - toVC?.view.frame = finalFrame - - transitionContext.containerView.addSubview(toVC!.view) - - let views = toVC!.view.subviews - var index = 0 - - for view in views { - view.transform = CGAffineTransform(translationX: 0, y: finalFrame.height) - - let delay = 0.0 - UIView.animate(withDuration: self.transitionDuration(using: transitionContext) - delay, - delay: delay, - usingSpringWithDamping: 0.7, - initialSpringVelocity: 0.3, - options: [], - animations: { - view.transform = CGAffineTransform.identity - }, completion: nil) - - index += 1 - } - - let backgroundColor = toVC?.view.backgroundColor! - toVC?.view.backgroundColor = backgroundColor?.withAlphaComponent(0) - - UIView.animate(withDuration: self.transitionDuration(using: transitionContext), - animations: { - toVC?.view.backgroundColor = backgroundColor - }, completion: { _ in - transitionContext.completeTransition(true) - }) - } -} diff --git a/ownCloud/Bookmarks/Issues/Issues Subclasses/CertificateViewController.swift b/ownCloud/Bookmarks/Issues/Issues Subclasses/CertificateViewController.swift deleted file mode 100644 index 37d94ec0e..000000000 --- a/ownCloud/Bookmarks/Issues/Issues Subclasses/CertificateViewController.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// CertificatesViewController.swift -// ownCloud -// -// Created by Pablo Carrascal on 05/04/2018. -// Copyright © 2018 ownCloud GmbH. All rights reserved. -// - -/* -* Copyright (C) 2019, ownCloud GmbH. -* -* This code is covered by the GNU Public License Version 3. -* -* For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/ -* You should have received a copy of this license along with this program. If not, see . -* -*/ - -import UIKit - -class CertificateViewController: IssuesViewController { - - var localizedDescription: NSAttributedString? { - didSet { - if self.tableView?.window != nil { - self.tableView?.reloadData() - } - } - } - - init(buttons: [IssueButton]? = nil) { - if buttons != nil { - super.init(buttons: buttons, title: "Certificate Details".localized) - } else { - super.init(buttons: nil, title: "Certificate Details".localized) - self.buttons = [IssueButton(title: "OK".localized, type: .plain, action: { - self.dismiss(animated: true)}, accessibilityIdentifier: "ok-button-certificate-details")] - } - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - - override func viewDidLoad() { - super.viewDidLoad() - self.tableView?.dataSource = self - } -} - -extension CertificateViewController: UITableViewDataSource { - - func numberOfSections(in tableView: UITableView) -> Int { - return 1 - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = UITableViewCell(style: .default, reuseIdentifier: nil) - cell.textLabel?.attributedText = localizedDescription - cell.textLabel?.numberOfLines = 0 - cell.selectionStyle = .none - return cell - } -} diff --git a/ownCloud/Bookmarks/Issues/Issues Subclasses/ConnectionIssueViewController.swift b/ownCloud/Bookmarks/Issues/Issues Subclasses/ConnectionIssueViewController.swift deleted file mode 100644 index 03dee6e83..000000000 --- a/ownCloud/Bookmarks/Issues/Issues Subclasses/ConnectionIssueViewController.swift +++ /dev/null @@ -1,184 +0,0 @@ -// -// IssueViewController.swift -// ownCloud -// -// Created by Pablo Carrascal on 04/04/2018. -// Copyright © 2018 ownCloud GmbH. All rights reserved. -// - -/* -* Copyright (C) 2018, ownCloud GmbH. -* -* This code is covered by the GNU Public License Version 3. -* -* For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/ -* You should have received a copy of this license along with this program. If not, see . -* -*/ - -import UIKit -import ownCloudSDK -import ownCloudUI -import ownCloudAppShared - -enum ConnectionResponse { - case cancel - case approve - case dismiss -} - -class ConnectionIssueViewController: IssuesViewController { - - private var displayIssues : DisplayIssues? - private var dismissedHandler : (() -> Void)? - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - - init(displayIssues issues: DisplayIssues?, buttons: [IssueButton]? = nil, title: String? = nil) { - super.init(buttons: buttons, title: title) - - displayIssues = issues - } - - convenience init(displayIssues issues: DisplayIssues?, title: String? = nil, completion:@escaping (ConnectionResponse) -> Void, dismissedHandler dismissedHandlerBlock: (() -> Void)? = nil) { - var useButtons : [IssueButton]? - var useTitle = title - - self.init(displayIssues: issues, buttons: nil, title: useTitle) - - self.dismissedHandler = dismissedHandlerBlock - - if let displayLevel = issues?.displayLevel { - switch displayLevel { - case .informal: - if title == nil { - useTitle = "Review Connection".localized - } - - useButtons = [ - IssueButton(title: "OK".localized, type: .approve, action: { [weak self] in - completion(.approve) - self?.dismiss(animated: true)}, accessibilityIdentifier: "ok-button") - ] - - case .warning: - if title == nil { - useTitle = "Review Connection".localized - } - - useButtons = [ - IssueButton(title: "Cancel".localized, type: .cancel, action: { [weak self] in - completion(.cancel) - self?.dismiss(animated: true)}, accessibilityIdentifier: "cancel-button"), - - IssueButton(title: "Approve".localized, type: .approve, action: { [weak self] in - completion(.approve) - self?.dismiss(animated: true)}, accessibilityIdentifier: "approve-button") - ] - - case .error: - if title == nil { - useTitle = "Error".localized - } - - useButtons = [ - IssueButton(title: "OK".localized, type: .approve, action: { [weak self] in - completion(.dismiss) - self?.dismiss(animated: true)}, accessibilityIdentifier: "ok-button") - ] - } - - self.headerTitle = useTitle - self.issueLevel = displayLevel - self.buttons = useButtons - } - } - - override func viewDidLoad() { - super.viewDidLoad() - self.tableView?.dataSource = self - } - - override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { - super.dismiss(animated: flag) { - completion?() - self.dismissedHandler?() - } - } -} - -extension ConnectionIssueViewController { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if let issue = displayIssues?.displayIssues[indexPath.row], issue.type == OCIssueType.certificate { - let certificateViewController = CertificateViewController() - certificateViewController.modalPresentationStyle = .overCurrentContext - - if let certificateNodes = OCCertificateDetailsViewNode.certificateDetailsViewNodes(for: issue.certificate, withValidationCompletionHandler: { (certificateNodes) in - let certDetails: NSAttributedString = OCCertificateDetailsViewNode.attributedString(withCertificateDetails: certificateNodes) - - OnMainThread { - certificateViewController.localizedDescription = certDetails - } - }) { - certificateViewController.localizedDescription = OCCertificateDetailsViewNode.attributedString(withCertificateDetails: certificateNodes) - self.present(certificateViewController, animated: true, completion: nil) - } - } - } -} - -extension ConnectionIssueViewController: UITableViewDataSource { - - func numberOfSections(in tableView: UITableView) -> Int { - return 1 - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return displayIssues?.displayIssues.count ?? 0 - } - - override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return super.tableView(tableView, heightForHeaderInSection: section) - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: IssuesViewControllerCellIdentifier, for: indexPath) - let issue = (displayIssues?.displayIssues[indexPath.row])! - cell.detailTextLabel?.text = issue.localizedDescription - cell.textLabel?.numberOfLines = 0 - - var color: UIColor = .black - cell.selectionStyle = .none - - if issue.type == OCIssueType.certificate { - cell.accessoryType = .disclosureIndicator - cell.accessoryView?.backgroundColor = .blue - } else { - cell.accessoryType = .none - } - - switch issue.level { - case .warning: - color = Theme.shared.activeCollection.warningColor - case .informal: - color = Theme.shared.activeCollection.informativeColor - case .error: - color = Theme.shared.activeCollection.errorColor - } - - cell.textLabel?.font = UIFont.systemFont(ofSize: 18, weight: .semibold) - cell.textLabel?.textColor = color - if issue.localizedTitle != headerTitle { - cell.textLabel?.text = issue.localizedTitle ?? "" - } - - cell.detailTextLabel?.font = UIFont.systemFont(ofSize: 15, weight: .regular) - cell.detailTextLabel?.text = issue.localizedDescription ?? "" - - cell.detailTextLabel?.numberOfLines = 0 - cell.accessibilityIdentifier = "issue-row.\(indexPath.row)" - return cell - } -} diff --git a/ownCloud/Bookmarks/Issues/IssuesViewController.swift b/ownCloud/Bookmarks/Issues/IssuesViewController.swift deleted file mode 100644 index 6d8316760..000000000 --- a/ownCloud/Bookmarks/Issues/IssuesViewController.swift +++ /dev/null @@ -1,236 +0,0 @@ -// -// IssueViewController.swift -// ownCloud -// -// Created by Pablo Carrascal on 05/04/2018. -// Copyright © 2018 ownCloud GmbH. All rights reserved. -// - -/* - * Copyright (C) 2018, ownCloud GmbH. - * - * This code is covered by the GNU Public License Version 3. - * - * For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/ - * You should have received a copy of this license along with this program. If not, see . - * - */ - -import UIKit -import ownCloudAppShared -import ownCloudSDK - -enum IssueButtonStyle { - case plain - case approve - case cancel - case custom(backgroundColor: UIColor) -} - -struct IssueButton { - let title: String - let type: IssueButtonStyle - let action: () -> Void - let accessibilityIdentifier: String -} - -class IssuesTableViewCell : UITableViewCell, Themeable { - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) - - Theme.shared.register(client: self, applyImmediately: true) - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - deinit { - Theme.shared.unregister(client: self) - } - - func applyThemeCollection(theme: Theme, collection: ThemeCollection, event: ThemeEvent) { - self.backgroundColor = collection.tableBackgroundColor - self.detailTextLabel?.textColor = collection.tableRowColors.labelColor - } -} - -let IssuesViewControllerCellIdentifier = "issue-cell" - -class IssuesViewController: UIViewController { - - var tableView: UITableView? - private var bottomContainer: UIStackView? - var headerTitle: String? - var issueLevel: OCIssueLevel? - var buttons:[IssueButton]? - private var tableHeighConstraint: NSLayoutConstraint? - private var modalPresentationVC: UIViewControllerTransitioningDelegate? - - init(buttons: [IssueButton]? = nil, title: String?) { - super.init(nibName: nil, bundle: nil) - self.headerTitle = title - self.buttons = buttons - setupTransitions() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - self.view.backgroundColor = UIColor.black.withAlphaComponent(0.5) - setupTableView() - setupBottomContainer() - tableView?.delegate = self - self.addButtons() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - setupConstraints() - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - self.tableHeighConstraint?.constant = self.tableView!.contentSize.height - } - - private func setupTableView() { - tableView = UITableView() - tableView?.layer.cornerRadius = 10 - tableView?.separatorInset = .zero - tableView?.bounces = false - tableView?.rowHeight = UITableView.automaticDimension - tableView?.register(IssuesTableViewCell.self, forCellReuseIdentifier: IssuesViewControllerCellIdentifier) - } - - private func setupBottomContainer() { - bottomContainer = UIStackView() - bottomContainer?.alignment = .fill - bottomContainer?.axis = .horizontal - bottomContainer?.distribution = .fillEqually - bottomContainer?.spacing = 20 - } - - func addButtons() { - if let buttonsToAdd = buttons { - var tag = 0 - buttonsToAdd.forEach({ - let button = UIButton(type: .system) - var color: UIColor = .blue - var backgroundColor: UIColor = .white - - switch $0.type { - case .approve: - backgroundColor = Theme.shared.activeCollection.approvalColors.normal.background - color = Theme.shared.activeCollection.approvalColors.normal.foreground - case .custom(let backColor): - backgroundColor = backColor - default: - backgroundColor = Theme.shared.activeCollection.tableRowColors.filledColorPairCollection.normal.background - color = Theme.shared.activeCollection.tableRowColors.filledColorPairCollection.normal.foreground - } - - button.backgroundColor = backgroundColor - button.setAttributedTitle(NSAttributedString(string: $0.title, attributes: [ - .foregroundColor : color, - .font : UIFont.systemFont(ofSize: 20, weight: .semibold) - ]), for: .normal) - button.setTitle($0.title, for: UIControl.State.normal) - button.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside) - button.accessibilityIdentifier = $0.accessibilityIdentifier - button.layer.cornerRadius = 10 - button.tag = tag - tag += 1 - bottomContainer?.addArrangedSubview(button) - }) - } - } - - @objc func buttonPressed(_ button :UIButton) { - if let buttonPressed: IssueButton = buttons?[button.tag] { - buttonPressed.action() - } - } - - private func setupConstraints() { - bottomContainer?.translatesAutoresizingMaskIntoConstraints = false - self.view.addSubview(bottomContainer!) - - bottomContainer?.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -20).isActive = true - bottomContainer?.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor, constant: 20).isActive = true - bottomContainer?.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor, constant: -20).isActive = true - bottomContainer?.heightAnchor.constraint(equalToConstant: 50).isActive = true - bottomContainer?.contentHuggingPriority(for: .vertical) - - tableView?.translatesAutoresizingMaskIntoConstraints = false - self.view.addSubview(tableView!) - - tableView?.bottomAnchor.constraint(equalTo: bottomContainer!.topAnchor, constant: -20).isActive = true - tableView?.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor, constant: 20).isActive = true - tableView?.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor, constant: -20).isActive = true - tableView?.topAnchor.constraint(greaterThanOrEqualTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true - tableHeighConstraint = tableView?.heightAnchor.constraint(equalToConstant: 0) - tableHeighConstraint?.priority = UILayoutPriority.defaultLow - tableHeighConstraint?.isActive = true - } - - private func setupTransitions() { - self.modalPresentationStyle = .overCurrentContext - let transitioningDLG = IssuesTransitioningDelegate() - self.modalPresentationVC = transitioningDLG - self.transitioningDelegate = transitioningDLG - } -} - -extension IssuesViewController: UITableViewDelegate { - - func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let cell = UITableViewCell(style: .default, reuseIdentifier: nil) - cell.textLabel?.text = headerTitle ?? "" - cell.textLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold) - var textColor = Theme.shared.activeCollection.tableRowColors.labelColor - if issueLevel != nil { - switch issueLevel { - case .warning: - textColor = Theme.shared.activeCollection.warningColor - case .informal: - textColor = Theme.shared.activeCollection.informativeColor - case .error: - textColor = Theme.shared.activeCollection.errorColor - case .none, .some(_): break - } - } - cell.textLabel?.textColor = textColor - cell.backgroundColor = Theme.shared.activeCollection.tableBackgroundColor - - let separatorView: UIView = UIView() - separatorView.translatesAutoresizingMaskIntoConstraints = false - separatorView.backgroundColor = Theme.shared.activeCollection.tableSeparatorColor - cell.addSubview(separatorView) - separatorView.heightAnchor.constraint(equalToConstant: 1).isActive = true - separatorView.leftAnchor.constraint(equalTo: cell.leftAnchor, constant: 0).isActive = true - separatorView.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: 0).isActive = true - separatorView.bottomAnchor.constraint(equalTo: cell.bottomAnchor, constant: 0).isActive = true - return cell - } - - func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 40 - } - -} - -internal class IssuesTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { - - func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return IssuesPresentationAnimator() - } - - func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return IssuesDismissalAnimator() - } -} diff --git a/ownCloud/Client/Actions/Action+UserInterface.swift b/ownCloud/Client/Actions/Action+UserInterface.swift index 03986b644..9e3f3be29 100644 --- a/ownCloud/Client/Actions/Action+UserInterface.swift +++ b/ownCloud/Client/Actions/Action+UserInterface.swift @@ -29,7 +29,7 @@ extension Action { let tableViewController = MoreStaticTableViewController(style: .grouped) let header = MoreViewHeader(for: item, with: core) - let moreViewController = MoreViewController(item: item, core: core, header: header, viewController: tableViewController) + let moreViewController = FrameViewController(header: header, viewController: tableViewController) if core.connectionStatus == .online { if core.connection.capabilities?.sharingAPIEnabled == 1 { @@ -103,7 +103,7 @@ extension Action { } else { let offersViewController = LicenseOffersViewController(withFeature: requirements.feature, in: core.licenseEnvironment) - viewController.present(asCard: MoreViewController(header: offersViewController.cardHeaderView!, viewController: offersViewController), animated: true) + viewController.present(asCard: FrameViewController(header: offersViewController.cardHeaderView!, viewController: offersViewController), animated: true) } } }) @@ -177,7 +177,7 @@ private extension Action { self.dismiss(presentingController: presentingController, andPresent: sharingViewController, on: context.viewController) } - }, title: userTitle, style: .plain, image: UIImage(named: "group"), imageWidth: Action.staticRowImageWidth, alignment: .left, accessoryType: .disclosureIndicator) + }, title: userTitle, style: .plain, image: nil, imageWidth: nil, alignment: .left, accessoryType: .disclosureIndicator) shareRows.append(addGroupRow) } else if item.isShareable { shareRows.append(self.shareAsGroupRow(item: item, presentingController: presentingController, context: context)) @@ -191,7 +191,7 @@ private extension Action { self.dismiss(presentingController: presentingController, andPresent: sharingViewController, on: context.viewController) } - }, title: linkTitle, style: .plain, image: UIImage(named: "link"), imageWidth: Action.staticRowImageWidth, alignment: .left, accessoryType: .disclosureIndicator) + }, title: linkTitle, style: .plain, image: nil, imageWidth: nil, alignment: .left, accessoryType: .disclosureIndicator) shareRows.append(addGroupRow) } else if let publicLinkRow = self.shareAsPublicLinkRow(item: item, presentingController: presentingController, context: context) { shareRows.append(publicLinkRow) @@ -200,7 +200,7 @@ private extension Action { return shareRows } - private class func updateSharingSection(sectionIdentifier: String, rows: [StaticTableViewRow], tableViewController: MoreStaticTableViewController, contentViewController: MoreViewController) { + private class func updateSharingSection(sectionIdentifier: String, rows: [StaticTableViewRow], tableViewController: MoreStaticTableViewController, contentViewController: FrameViewController) { if let section = tableViewController.sectionForIdentifier(sectionIdentifier) { tableViewController.removeSection(section) } @@ -218,7 +218,7 @@ private extension Action { andPresent: GroupSharingTableViewController(core: core, item: item), on: context.viewController) } - }, title: title, style: .plain, image: UIImage(named: "group"), imageWidth: Action.staticRowImageWidth, alignment: .left, identifier: "share-add-group") + }, title: title, style: .plain, image: nil, imageWidth:nil, imageTintColorKey: nil, alignment: .left, identifier: "share-add-group", accessoryView: UIImageView(image: UIImage(named: "group"))) return addGroupRow } @@ -230,7 +230,7 @@ private extension Action { andPresent: PublicLinkTableViewController(core: core, item: item), on: context.viewController) } - }, title: "Links".localized, style: .plain, image: UIImage(named: "link"), imageWidth: Action.staticRowImageWidth, alignment: .left, identifier: "share-add-group") + }, title: "Links".localized, style: .plain, image: nil, imageWidth: nil, alignment: .left, identifier: "share-add-group", accessoryView: UIImageView(image: UIImage(named: "link"))) return addGroupRow } diff --git a/ownCloud/Client/Actions/Actions+Extensions/UploadMediaAction.swift b/ownCloud/Client/Actions/Actions+Extensions/UploadMediaAction.swift index 8afefc687..33d4b6f93 100644 --- a/ownCloud/Client/Actions/Actions+Extensions/UploadMediaAction.swift +++ b/ownCloud/Client/Actions/Actions+Extensions/UploadMediaAction.swift @@ -20,8 +20,116 @@ import UIKit import ownCloudSDK import ownCloudAppShared import Photos +import PhotosUI + +@available(iOS 14, *) +class PhotoPickerPresenter: NSObject, PHPickerViewControllerDelegate, PHPhotoLibraryChangeObserver { + + typealias AssetSelectionHandler = ([PHAsset]) -> Void + + var completionHandler: AssetSelectionHandler? + var parentViewController: UIViewController? + + private var assetIdentifiers = [String]() + + override init() { + super.init() + PHPhotoLibrary.shared().register(self) + } + + var pickerViewController: UIViewController { + var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared()) + configuration.preferredAssetRepresentationMode = .automatic + configuration.selectionLimit = 0 + let pickerViewController = PHPickerViewController(configuration: configuration) + pickerViewController.delegate = self + + return pickerViewController + } + + // MARK: - PHPickerViewControllerDelegate + + func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { + + picker.dismiss(animated: true) + + OnBackgroundQueue { + + // Get asset identifiers + for result in results { + if let identifier = result.assetIdentifier { + self.assetIdentifiers.append(identifier) + } + } + + // Fetch corresponding assets + let assets = self.attemptAssetsFetch() + + OnMainThread { + if results.count == assets.count { + self.completionHandler?(assets) + } else { + self.presentLimitedLibraryPicker() + } + } + } + } + + private func presentLimitedLibraryPicker() { + guard let viewController = self.parentViewController else { return } + let library = PHPhotoLibrary.shared() + + let alert = ThemedAlertController(title: "Limited Photo Access".localized, message: "Access for the media selected for upload is limited".localized, preferredStyle: .alert) + + alert.addAction(UIAlertAction(title: "Change".localized, style: .default, handler: {_ in + library.presentLimitedLibraryPicker(from: viewController) + })) + alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (_) in + self.assetIdentifiers.removeAll() + })) + + self.parentViewController?.present(alert, animated: true) + + } + + private func attemptAssetsFetch() -> [PHAsset] { + // Fetch corresponding assets + var assets = [PHAsset]() + + let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: assetIdentifiers, options: nil) + fetchResult.enumerateObjects({ (asset, _, _) in + assets.append(asset) + }) + + return assets + } + + func present(in viewController:UIViewController, with completion:@escaping AssetSelectionHandler) { + self.parentViewController = viewController + self.completionHandler = completion + viewController.present(self.pickerViewController, animated: true) + } + + // MARK: - PHPhotoLibraryChangeObserver + + func photoLibraryDidChange(_ changeInstance: PHChange) { + OnMainThread { + let assets = self.attemptAssetsFetch() + if assets.count > 0 { + self.completionHandler?(assets) + } else { + let alert = ThemedAlertController(title: "Limited Photo Access".localized, message: "No Access to the media selected for upload".localized, preferredStyle: .alert) + + alert.addAction(UIAlertAction(title: "OK".localized, style: .default, handler: nil)) + + self.parentViewController?.present(alert, animated: true) + } + } + } +} class UploadMediaAction: UploadBaseAction { + override class var identifier : OCExtensionIdentifier? { return OCExtensionIdentifier("com.owncloud.action.uploadphotos") } override class var category : ActionCategory? { return .normal } override class var name : String { return "Upload from your photo library".localized } @@ -29,6 +137,9 @@ class UploadMediaAction: UploadBaseAction { override class var keyCommand : String? { return "M" } override class var keyModifierFlags: UIKeyModifierFlags? { return [.command] } + // We need this to keep PhotoPickerPresenter alive in iOS14. Type is 'Any' since it is iOS14 only and you can't add @available() to stored properties + private var picker: Any? + private struct AssociatedKeys { static var actionKey = "action" } @@ -52,20 +163,33 @@ class UploadMediaAction: UploadBaseAction { } private func presentImageGalleryPicker() { - if let viewController = self.context.viewController { - let photoAlbumViewController = PhotoAlbumTableViewController() - photoAlbumViewController.selectionCallback = {(assets) in - self.completed() - guard let path = self.context.items.first?.path else { return } + func addAssetsToQueue(assets:[PHAsset]) { + guard let path = self.context.items.first?.path else { return } + guard let bookmark = self.core?.bookmark else { return } - guard let bookmark = self.core?.bookmark else { return } + MediaUploadQueue.shared.addUploads(assets, for: bookmark, at: path) + } - MediaUploadQueue.shared.addUploads(assets, for: bookmark, at: path) - } - let navigationController = ThemeNavigationController(rootViewController: photoAlbumViewController) + if let viewController = self.context.viewController { - viewController.present(navigationController, animated: true) + if #available(iOS 14, *) { + picker = PhotoPickerPresenter() + (picker as? PhotoPickerPresenter)?.present(in: viewController, with: { [weak self] (assets) in + self?.completed() + addAssetsToQueue(assets: assets) + self?.picker = nil + }) + } else { + let photoAlbumViewController = PhotoAlbumTableViewController() + photoAlbumViewController.selectionCallback = {(assets) in + self.completed() + addAssetsToQueue(assets: assets) + } + let navigationController = ThemeNavigationController(rootViewController: photoAlbumViewController) + + viewController.present(navigationController, animated: true) + } } else { self.completed(with: NSError(ocError: .internal)) } diff --git a/ownCloud/Client/ClientAuthenticationUpdater.swift b/ownCloud/Client/ClientAuthenticationUpdater.swift index 0e96fc3bb..34478fbdd 100644 --- a/ownCloud/Client/ClientAuthenticationUpdater.swift +++ b/ownCloud/Client/ClientAuthenticationUpdater.swift @@ -59,12 +59,15 @@ class ClientAuthenticationUpdater: NSObject { let tempConnection = OCConnection(bookmark: tempBookmark) var options : [OCAuthenticationMethodKey : Any] = [:] + tempBookmark.setLastUserName(bookmark.userName) + if let cookieSupportEnabled = OCCore.classSetting(forOCClassSettingsKey: .coreCookieSupportEnabled) as? Bool, cookieSupportEnabled == true { tempConnection.cookieStorage = OCHTTPCookieStorage() Log.debug("Created cookie storage \(String(describing: tempConnection.cookieStorage)) for client auth updater") } options[.presentingViewControllerKey] = viewController + options[.requiredUsernameKey] = bookmark.userName tempBookmark.authenticationMethodIdentifier = authenticationMethodID diff --git a/ownCloud/Client/ClientRootViewController.swift b/ownCloud/Client/ClientRootViewController.swift index c95f84a03..6cbdb288c 100644 --- a/ownCloud/Client/ClientRootViewController.swift +++ b/ownCloud/Client/ClientRootViewController.swift @@ -238,7 +238,7 @@ class ClientRootViewController: UITabBarController, BookmarkContainer, ToolAndTa libraryViewController = LibraryTableViewController(style: .grouped) libraryNavigationController = ThemeNavigationController(rootViewController: libraryViewController!) libraryNavigationController?.tabBarItem.title = "Quick Access".localized - libraryNavigationController?.tabBarItem.image = UIImage(named: "branding-bookmark-icon")?.scaledImageFitting(in: CGSize(width: 25.0, height: 25.0)) + libraryNavigationController?.tabBarItem.image = Branding.shared.brandedImageNamed(.bookmarkIcon)?.scaledImageFitting(in: CGSize(width: 25.0, height: 25.0)) progressBar = CollapsibleProgressBar(frame: CGRect.zero) progressBar?.translatesAutoresizingMaskIntoConstraints = false @@ -467,6 +467,7 @@ extension ClientRootViewController : OCCoreDelegate { issueNSError.isOCError(withCode: .authorizationMethodNotAllowed) || issueNSError.isOCError(withCode: .authorizationMethodUnknown) || issueNSError.isOCError(withCode: .authorizationNoMethodData) || + issueNSError.isOCError(withCode: .authorizationNotMatchingRequiredUserID) || issueNSError.isOCError(withCode: .authorizationMissingData) { nsError = issueNSError issue = nil @@ -536,46 +537,8 @@ extension ClientRootViewController : OCCoreDelegate { var queueCompletionHandlerScheduled : Bool = false if isAuthFailure { - let alertController = ThemedAlertController(title: authFailureTitle, - message: authFailureMessage, - preferredStyle: .alert) + self?.presentAuthAlert(for: editBookmark, error: nsError, title: authFailureTitle, message: authFailureMessage, ignoreLabel: authFailureIgnoreLabel, ignoreStyle: authFailureIgnoreStyle, hasEditOption: authFailureHasEditOption, preferredAuthenticationMethods: preferredAuthenticationMethods, completionHandler: queueCompletionHandler) - alertController.addAction(UIAlertAction(title: authFailureIgnoreLabel, style: authFailureIgnoreStyle, handler: { (_) in - queueCompletionHandler() - })) - - if authFailureHasEditOption { - alertController.addAction(UIAlertAction(title: "Sign in".localized, style: .default, handler: { (_) in - queueCompletionHandler() - - var notifyAuthDelegate = true - - if let bookmark = self?.bookmark { - let updater = ClientAuthenticationUpdater(with: bookmark, preferredAuthenticationMethods: preferredAuthenticationMethods) - - if updater.canUpdateInline, let self = self { - notifyAuthDelegate = false - - updater.updateAuthenticationData(on: self, completion: { (error) in - if error == nil { - OCSynchronized(self) { - self.skipAuthorizationFailure = false // Auth failure fixed -> allow new failures to prompt for sign in again - } - } - }) - } - } - - if notifyAuthDelegate { - if let authDelegate = self?.authDelegate, let self = self, let nsError = nsError { - authDelegate.handleAuthError(for: self, error: nsError, editBookmark: editBookmark, preferredAuthenticationMethods: preferredAuthenticationMethods) - } - } - - })) - } - - self?.present(alertController, animated: true, completion: nil) queueCompletionHandlerScheduled = true return @@ -587,11 +550,23 @@ extension ClientRootViewController : OCCoreDelegate { if presentIssue != nil { var presentViewController : UIViewController? + var onViewController : UIViewController? - if presentIssue?.type == .multipleChoice { - presentViewController = ThemedAlertController(with: presentIssue!, completion: queueCompletionHandler) - } else { - presentViewController = ConnectionIssueViewController(displayIssues: presentIssue?.prepareForDisplay(), completion: { (response) in + if let startViewController = self { + var hostViewController : UIViewController = startViewController + + while hostViewController.presentedViewController != nil, + hostViewController.presentedViewController?.isBeingDismissed == false { + hostViewController = hostViewController.presentedViewController! + } + + onViewController = hostViewController + } + + if let presentIssue = presentIssue, presentIssue.type == .multipleChoice { + presentViewController = ThemedAlertController(with: presentIssue, completion: queueCompletionHandler) + } else if let onViewController = onViewController, let presentIssue = presentIssue { + IssuesCardViewController.present(on: onViewController, issue: presentIssue, bookmark: self?.bookmark, completion: { [weak presentIssue] (response) in switch response { case .cancel: presentIssue?.reject() @@ -603,19 +578,13 @@ extension ClientRootViewController : OCCoreDelegate { } queueCompletionHandler() }) - } - - if presentViewController != nil, let startViewController = self { - var hostViewController : UIViewController = startViewController - - while hostViewController.presentedViewController != nil, - hostViewController.presentedViewController?.isBeingDismissed == false { - hostViewController = hostViewController.presentedViewController! - } queueCompletionHandlerScheduled = true + } - hostViewController.present(presentViewController!, animated: true, completion: nil) + if let presentViewController = presentViewController, let onViewController = onViewController { + queueCompletionHandlerScheduled = true + onViewController.present(presentViewController, animated: true, completion: nil) } } @@ -666,6 +635,51 @@ extension ClientRootViewController : OCCoreDelegate { } } + func presentAuthAlert(for editBookmark: OCBookmark, error nsError: NSError?, title authFailureTitle: String, message authFailureMessage: String?, ignoreLabel authFailureIgnoreLabel: String, ignoreStyle authFailureIgnoreStyle: UIAlertAction.Style, hasEditOption authFailureHasEditOption: Bool, preferredAuthenticationMethods: [OCAuthenticationMethodIdentifier]?, completionHandler: @escaping () -> Void) { + let alertController = ThemedAlertController(title: authFailureTitle, + message: authFailureMessage, + preferredStyle: .alert) + + alertController.addAction(UIAlertAction(title: authFailureIgnoreLabel, style: authFailureIgnoreStyle, handler: { (_) in + completionHandler() + })) + + if authFailureHasEditOption { + alertController.addAction(UIAlertAction(title: "Sign in".localized, style: .default, handler: { [weak self] (_) in + completionHandler() + + var notifyAuthDelegate = true + + if let bookmark = self?.bookmark { + let updater = ClientAuthenticationUpdater(with: bookmark, preferredAuthenticationMethods: preferredAuthenticationMethods) + + if updater.canUpdateInline, let self = self { + notifyAuthDelegate = false + + updater.updateAuthenticationData(on: self, completion: { (error) in + if error == nil { + OCSynchronized(self) { + self.skipAuthorizationFailure = false // Auth failure fixed -> allow new failures to prompt for sign in again + } + } else if let nsError = error as NSError?, !nsError.isOCError(withCode: .authorizationCancelled) { + // Error updating authentication -> inform the user and provide option to retry + self.alertQueue.async { [weak self] (queueCompletionHandler) in + self?.presentAuthAlert(for: editBookmark, error: error as NSError?, title: "Error".localized, message: error?.localizedDescription, ignoreLabel: authFailureIgnoreLabel, ignoreStyle: authFailureIgnoreStyle, hasEditOption: authFailureHasEditOption, preferredAuthenticationMethods: preferredAuthenticationMethods, completionHandler: queueCompletionHandler) + } + } + }) + } + } + + if notifyAuthDelegate, let authDelegate = self?.authDelegate, let self = self, let nsError = nsError { + authDelegate.handleAuthError(for: self, error: nsError, editBookmark: editBookmark, preferredAuthenticationMethods: preferredAuthenticationMethods) + } + })) + } + + self.present(alertController, animated: true, completion: nil) + } + func presentAlertAsCard(viewController: UIViewController, withHandle: Bool = false, dismissable: Bool = true) { alertQueue.async { [weak self] (queueCompletionHandler) in if let startViewController = self { diff --git a/ownCloud/Client/Viewer/DisplayHostViewController.swift b/ownCloud/Client/Viewer/DisplayHostViewController.swift index 50054db21..7a708a590 100644 --- a/ownCloud/Client/Viewer/DisplayHostViewController.swift +++ b/ownCloud/Client/Viewer/DisplayHostViewController.swift @@ -35,7 +35,13 @@ class DisplayHostViewController: UIPageViewController { private var initialItem: OCItem private var displayedIndex: Int? - public var items: [OCItem]? + public var items: [OCItem]? { + didSet { + playableItems = items?.filter({ $0.isPlayable }) + } + } + + private var playableItems: [OCItem]? private var query: OCQuery private var queryStarted : Bool = false @@ -215,12 +221,13 @@ class DisplayHostViewController: UIPageViewController { return nil } - private func viewControllerAtIndex(index: Int) -> UIViewController? { - guard let items = items else { return nil } + private func viewControllerAtIndex(index: Int, includeOnlyMediaItems: Bool = false) -> UIViewController? { - guard index >= 0, index < items.count else { return nil } + guard let processedItems = includeOnlyMediaItems ? playableItems : items else { return nil } - let item = items[index] + guard index >= 0, index < processedItems.count else { return nil } + + let item = processedItems[index] let viewController = self.viewController(for: item) (viewController as? DisplayViewController)?.itemIndex = index @@ -262,24 +269,26 @@ class DisplayHostViewController: UIPageViewController { extension DisplayHostViewController: UIPageViewControllerDataSource { - private func vendNewViewController(from viewController:UIViewController, _ position:PagePosition) -> UIViewController? { + private func vendNewViewController(from viewController:UIViewController, _ position:PagePosition, includeOnlyMediaItems: Bool = false) -> UIViewController? { guard let displayViewController = viewControllers?.first as? DisplayViewController else { return nil } - guard let item = displayViewController.item, let items = self.items else { return nil } + guard let item = displayViewController.item else { return nil } + + guard let processedItems = includeOnlyMediaItems ? playableItems : items else { return nil } // Is the item assigned to the currently visible view controller still available? - let index = items.firstIndex(where: {$0.localID == item.localID}) + let index = processedItems.firstIndex(where: {$0.localID == item.localID}) if index != nil { // If so, then vend view controller with the item next to the current item - if let nextIndex = computeNewIndex(for: index!, itemCount:items.count, position: position) { - return viewControllerAtIndex(index: nextIndex) + if let nextIndex = computeNewIndex(for: index!, itemCount:processedItems.count, position: position) { + return viewControllerAtIndex(index: nextIndex, includeOnlyMediaItems: includeOnlyMediaItems) } } else { // Currently visible item was deleted or moved, use it's old index to find a new one if let index = displayViewController.itemIndex { - if let nextIndex = computeNewIndex(for: index, itemCount:items.count, position: position, indexFound: false) { - return viewControllerAtIndex(index: nextIndex) + if let nextIndex = computeNewIndex(for: index, itemCount:processedItems.count, position: position, indexFound: false) { + return viewControllerAtIndex(index: nextIndex, includeOnlyMediaItems: includeOnlyMediaItems) } } } @@ -322,7 +331,7 @@ extension DisplayHostViewController: UIPageViewControllerDelegate { extension DisplayHostViewController: Themeable { func applyThemeCollection(theme: Theme, collection: ThemeCollection, event: ThemeEvent) { - self.view.backgroundColor = .black + self.view.backgroundColor = collection.tableBackgroundColor } } @@ -330,7 +339,7 @@ extension DisplayHostViewController { @objc private func handleMediaPlaybackFinished(notification:Notification) { if let mediaController = self.viewControllers?.first as? MediaDisplayViewController { - if let vc = vendNewViewController(from: mediaController, .after) { + if let vc = vendNewViewController(from: mediaController, .after, includeOnlyMediaItems: true) { self.setViewControllers([vc], direction: .forward, animated: false, completion: nil) } } @@ -338,7 +347,7 @@ extension DisplayHostViewController { @objc private func handlePlayNextMedia(notification:Notification) { if let mediaController = self.viewControllers?.first as? MediaDisplayViewController { - if let vc = vendNewViewController(from: mediaController, .after) { + if let vc = vendNewViewController(from: mediaController, .after, includeOnlyMediaItems: true) { self.setViewControllers([vc], direction: .forward, animated: false, completion: nil) } } @@ -346,7 +355,7 @@ extension DisplayHostViewController { @objc private func handlePlayPreviousMedia(notification:Notification) { if let mediaController = self.viewControllers?.first as? MediaDisplayViewController { - if let vc = vendNewViewController(from: mediaController, .before) { + if let vc = vendNewViewController(from: mediaController, .before, includeOnlyMediaItems: true) { self.setViewControllers([vc], direction: .forward, animated: false, completion: nil) } } diff --git a/ownCloud/Client/Viewer/DisplayViewController.swift b/ownCloud/Client/Viewer/DisplayViewController.swift index a6961fda2..e23c995d9 100644 --- a/ownCloud/Client/Viewer/DisplayViewController.swift +++ b/ownCloud/Client/Viewer/DisplayViewController.swift @@ -647,6 +647,5 @@ extension DisplayViewController : Themeable { metadataInfoLabel.applyThemeCollection(collection) showPreviewButton.applyThemeCollection(collection) infoLabel.applyThemeCollection(collection) - self.view.backgroundColor = collection.tableBackgroundColor } } diff --git a/ownCloud/Client/Viewer/PDF/PDFSearchResultsView.swift b/ownCloud/Client/Viewer/PDF/PDFSearchResultsView.swift new file mode 100644 index 000000000..98ae8cc72 --- /dev/null +++ b/ownCloud/Client/Viewer/PDF/PDFSearchResultsView.swift @@ -0,0 +1,141 @@ +// +// PDFSearchResultsView.swift +// ownCloud +// +// Created by Michael Neuwert on 03.11.20. +// Copyright © 2020 ownCloud GmbH. All rights reserved. +// + +/* +* Copyright (C) 2018, ownCloud GmbH. +* +* This code is covered by the GNU Public License Version 3. +* +* For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/ +* You should have received a copy of this license along with this program. If not, see . +* +*/ + +import UIKit +import PDFKit + +typealias PDFSearchResultsViewCloseHandler = () -> Void +typealias PDFSearchResultsViewUpdateHandler = (PDFSelection) -> Void + +class PDFSearchResultsView : UIView { + + let roundedCornerRadius: CGFloat = 8.0 + let stackViewSpacing: CGFloat = 8.0 + let overlayAlpha: CGFloat = 0.8 + + private let closeButtton = UIButton() + private let backButton = UIButton() + private let forwardButton = UIButton() + private let searchTermButton = UIButton() + + private let stackView = UIStackView() + + private var currentIndex = -1 + + var currentMatch: PDFSelection? { + didSet { + if let match = currentMatch, let matches = self.matches { + if let index = matches.index(of: match), let matchString = match.string { + currentIndex = index + let searchResultsText = "\(matchString) (" + String(format: "%@ of %@".localized, "\(index + 1)", "\(matches.count)") + ")" + searchTermButton.setTitle(searchResultsText, for: .normal) + backButton.isEnabled = currentIndex == 0 ? false : true + forwardButton.isEnabled = currentIndex == matches.count - 1 ? false : true + + updateHandler?(match) + } + } + } + } + + var matches: [PDFSelection]? + var closeHandler: PDFSearchResultsViewCloseHandler? + var updateHandler: PDFSearchResultsViewUpdateHandler? + + override init(frame: CGRect) { + super.init(frame: .zero) + + self.backgroundColor = UIColor.init(white: 0, alpha: overlayAlpha) + self.layer.cornerRadius = roundedCornerRadius + + stackView.axis = .horizontal + stackView.spacing = stackViewSpacing + stackView.distribution = .fillProportionally + stackView.translatesAutoresizingMaskIntoConstraints = false + + self.addSubview(stackView) + + let viewDictionary = ["stackView": stackView] + var constraints: [NSLayoutConstraint] = [] + + let vertical = NSLayoutConstraint.constraints(withVisualFormat: "V:|-[stackView]-|", metrics: nil, views: viewDictionary) + let horizontal = NSLayoutConstraint.constraints(withVisualFormat: "H:|-[stackView]-|", metrics: nil, views: viewDictionary) + constraints += vertical + constraints += horizontal + NSLayoutConstraint.activate(constraints) + + stackView.addArrangedSubview(backButton) + stackView.addArrangedSubview(searchTermButton) + stackView.addArrangedSubview(forwardButton) + stackView.addArrangedSubview(closeButtton) + + closeButtton.addTarget(self, action: #selector(close), for: .touchUpInside) + backButton.addTarget(self, action: #selector(back), for: .touchUpInside) + forwardButton.addTarget(self, action: #selector(forward), for: .touchUpInside) + + if #available(iOS 13, *) { + closeButtton.setImage(UIImage(systemName: "xmark")?.tinted(with: .white), for: .normal) + backButton.setImage(UIImage(systemName: "chevron.left")?.tinted(with: .white), for: .normal) + forwardButton.setImage(UIImage(systemName: "chevron.right")?.tinted(with: .white), for: .normal) + } else { + closeButtton.setImage(UIImage(named: "xmark")?.tinted(with: .white), for: .normal) + backButton.setImage(UIImage(named: "chevron.left")?.tinted(with: .white), for: .normal) + forwardButton.setImage(UIImage(named: "chevron.right")?.tinted(with: .white), for: .normal) + } + + searchTermButton.titleLabel?.textColor = .white + searchTermButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .footnote) + searchTermButton.titleLabel?.adjustsFontForContentSizeCategory = true + searchTermButton.addTarget(self, action: #selector(resultsTextTapped), for: .touchUpInside) + searchTermButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + + self.translatesAutoresizingMaskIntoConstraints = false + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Button actions + + @objc private func close() { + closeHandler?() + } + + @objc private func back() { + guard currentIndex >= 0 else { return } + if currentIndex > 0, let matches = self.matches { + self.currentMatch = matches[currentIndex - 1] + updateHandler?(self.currentMatch!) + } + } + + @objc private func forward() { + guard currentIndex >= 0 else { return } + if let matches = self.matches, currentIndex < (matches.count - 1) { + self.currentMatch = matches[currentIndex + 1] + updateHandler?(self.currentMatch!) + } + } + + @objc private func resultsTextTapped() { + if let match = self.currentMatch { + updateHandler?(match) + } + } +} diff --git a/ownCloud/Client/Viewer/PDF/PDFSearchViewController.swift b/ownCloud/Client/Viewer/PDF/PDFSearchViewController.swift index c659913e4..61796369c 100644 --- a/ownCloud/Client/Viewer/PDF/PDFSearchViewController.swift +++ b/ownCloud/Client/Viewer/PDF/PDFSearchViewController.swift @@ -22,7 +22,7 @@ import ownCloudAppShared class PDFSearchViewController: UITableViewController, PDFDocumentDelegate, Themeable, UISearchBarDelegate { - typealias PDFSearchMatchSelectedCallback = (PDFSelection) -> Void + typealias PDFSearchMatchSelectedCallback = (String?, [PDFSelection], PDFSelection) -> Void fileprivate var searchController: UISearchController? @@ -87,7 +87,7 @@ class PDFSearchViewController: UITableViewController, PDFDocumentDelegate, Theme typeDelayTimer?.invalidate() self.dismiss(animated: true) { if self.userSelectedMatchCallback != nil && self.selection != nil { - self.userSelectedMatchCallback!(self.selection!) + self.userSelectedMatchCallback!(self.searchController?.searchBar.text, self.matches, self.selection!) } } } diff --git a/ownCloud/Client/Viewer/PDF/PDFViewerViewController.swift b/ownCloud/Client/Viewer/PDF/PDFViewerViewController.swift index edd3dc116..f7d4a7fb5 100644 --- a/ownCloud/Client/Viewer/PDF/PDFViewerViewController.swift +++ b/ownCloud/Client/Viewer/PDF/PDFViewerViewController.swift @@ -45,24 +45,25 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { static let PDFGoToPageNotification = Notification(name: Notification.Name(rawValue: "PDFGoToPageNotification")) - fileprivate var gotoPageNotificationObserver : Any? - - fileprivate let searchAnnotationDelay = 3.0 - fileprivate let thumbnailViewWidthMultiplier: CGFloat = 0.15 - fileprivate let thumbnailViewHeightMultiplier: CGFloat = 0.1 - fileprivate let thumbnailMargin: CGFloat = 32.0 - fileprivate let filenameContainerTopMargin: CGFloat = 10.0 public let pdfView = PDFView() - fileprivate let thumbnailView = PDFThumbnailView() - fileprivate let containerView = UIStackView() - fileprivate let pageCountLabel = UILabel() + private var gotoPageNotificationObserver : Any? + + private let searchAnnotationDelay = 3.0 + private let thumbnailViewWidthMultiplier: CGFloat = 0.15 + private let thumbnailViewHeightMultiplier: CGFloat = 0.1 + private let filenameContainerTopMargin: CGFloat = 10.0 + private let thumbnailView = PDFThumbnailView() - fileprivate var searchButtonItem: UIBarButtonItem? - fileprivate var gotoButtonItem: UIBarButtonItem? - fileprivate var outlineItem: UIBarButtonItem? + private let containerView = UIStackView() + private let pageCountLabel = UILabel() + private let pageCountContainerView = UIView() - fileprivate var thumbnailViewPosition : ThumbnailViewPosition = .bottom { + private var searchButtonItem: UIBarButtonItem? + private var gotoButtonItem: UIBarButtonItem? + private var outlineItem: UIBarButtonItem? + + private var thumbnailViewPosition : ThumbnailViewPosition = .bottom { didSet { switch thumbnailViewPosition { case .left, .right: @@ -79,7 +80,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { } } - fileprivate var activeViewConstraints: [NSLayoutConstraint] = [] { + private var activeViewConstraints: [NSLayoutConstraint] = [] { willSet { NSLayoutConstraint.deactivate(activeViewConstraints) } @@ -88,6 +89,15 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { } } + private var fullScreen: Bool = false { + didSet { + self.navigationController?.setNavigationBarHidden(fullScreen, animated: true) + pageCountLabel.isHidden = fullScreen + pageCountContainerView.isHidden = fullScreen + setupConstraints() + } + } + // MARK: - DisplayExtension static var customMatcher: OCExtensionCustomContextMatcher? @@ -104,6 +114,8 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { private var didSetupView : Bool = false + private let searchResultsView = PDFSearchResultsView() + override func renderSpecificView(completion: @escaping (Bool) -> Void) { if let source = source, let document = PDFDocument(url: source) { if !didSetupView { @@ -111,12 +123,10 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { setupToolbar() - self.view.backgroundColor = UIColor.gray self.thumbnailViewPosition = .none // Configure thumbnail view thumbnailView.translatesAutoresizingMaskIntoConstraints = false - thumbnailView.backgroundColor = UIColor.gray thumbnailView.pdfView = pdfView thumbnailView.isExclusiveTouch = true @@ -125,7 +135,6 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { containerView.spacing = UIStackView.spacingUseSystem containerView.isLayoutMarginsRelativeArrangement = true containerView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: filenameContainerTopMargin, leading: 0, bottom: 0, trailing: 0) - containerView.backgroundColor = UIColor.lightGray containerView.translatesAutoresizingMaskIntoConstraints = false containerView.axis = .vertical containerView.distribution = .fill @@ -136,21 +145,29 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { pdfView.usePageViewController(true, withViewOptions: nil) containerView.addArrangedSubview(pdfView) - let pageCountContainerView = UIView() - pageCountContainerView.backgroundColor = UIColor.gray pageCountContainerView.translatesAutoresizingMaskIntoConstraints = false pageCountContainerView.addSubview(pageCountLabel) pageCountLabel._setupPdfInfoLabel() + pageCountLabel.centerXAnchor.constraint(equalTo: pageCountContainerView.centerXAnchor).isActive = true pageCountLabel.centerYAnchor.constraint(equalTo: pageCountContainerView.centerYAnchor).isActive = true pageCountLabel.widthAnchor.constraint(equalTo: pageCountContainerView.widthAnchor, multiplier: 0.25).isActive = true pageCountLabel.heightAnchor.constraint(equalTo: pageCountContainerView.heightAnchor, multiplier: 0.9).isActive = true - containerView.addArrangedSubview(pageCountContainerView) self.view.addSubview(containerView) + if #available(iOS 13, *) { + self.view.backgroundColor = self.pdfView.backgroundColor + thumbnailView.backgroundColor = self.pdfView.backgroundColor + pageCountContainerView.backgroundColor = self.pdfView.backgroundColor + } else { + self.view.backgroundColor = .gray + thumbnailView.backgroundColor = .gray + pageCountContainerView.backgroundColor = .gray + } + setupConstraints() self.view.layoutIfNeeded() @@ -158,11 +175,12 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { pdfView.document = document + setupSearchResultsView() + pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit pdfView.autoScales = true updatePageLabel() - - adjustThumbnailsSize() + setThumbnailPosition() completion(true) @@ -183,14 +201,49 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { self?.pdfView.go(to: page) } } + + if #available(iOS 13, *) { + let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.toggleFullscreen(_:))) + tapRecognizer.numberOfTapsRequired = 1 + pdfView.addGestureRecognizer(tapRecognizer) + } + //pdfView.isUserInteractionEnabled = true + } + + @objc func toggleFullscreen(_ sender: UITapGestureRecognizer) { + self.fullScreen.toggle() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - self.thumbnailViewPosition = .bottom - pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit pdfView.autoScales = true + if #available(iOS 13, *) { + self.calculateThumbnailSize() + } + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + // Crashes on pre-iOS 13 + if #available(iOS 13, *) { + coordinator.animate(alongsideTransition: nil) { (_) in + self.calculateThumbnailSize() + } + } + } + + override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { + if #available(iOS 13, *) { + coordinator.animate(alongsideTransition: nil) { (_) in + self.setThumbnailPosition() + self.calculateThumbnailSize() + } + } } func save(item: OCItem) { @@ -235,15 +288,16 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { let pdfSearchController = PDFSearchViewController() let searchNavigationController = ThemeNavigationController(rootViewController: pdfSearchController) pdfSearchController.pdfDocument = pdfDocument - pdfSearchController.userSelectedMatchCallback = { (selection) in - DispatchQueue.main.async { - selection.color = UIColor.yellow - self.pdfView.setCurrentSelection(selection, animate: true) - self.pdfView.scrollSelectionToVisible(nil) - - DispatchQueue.main.asyncAfter(deadline: .now() + self.searchAnnotationDelay, execute: { - self.pdfView.clearSelection() - }) + // Interpret the search text and all the matches returned by search view controller + pdfSearchController.userSelectedMatchCallback = { (_, matches, selection) in + DispatchQueue.main.async { [weak self] in + if matches.count > 1 { + self?.searchResultsView.matches = matches + self?.searchResultsView.currentMatch = selection + self?.showSearchResultsView() + } else { + self?.jumpTo(selection) + } } } @@ -272,13 +326,20 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { // MARK: - Private helpers - fileprivate func adjustThumbnailsSize() { - let maxHeight = floor(self.view.bounds.height * thumbnailViewHeightMultiplier - thumbnailMargin) - let maxWidth = floor(self.view.bounds.width * thumbnailViewWidthMultiplier - thumbnailMargin) - thumbnailView.thumbnailSize = CGSize(width: maxWidth, height: maxHeight) + private func setThumbnailPosition() { + if UIScreen.main.traitCollection.verticalSizeClass == .regular { + self.thumbnailViewPosition = .bottom + } else { + self.thumbnailViewPosition = .right + } + } + + private func calculateThumbnailSize() { + let maxHeight = floor( min(self.thumbnailView.bounds.size.height, self.thumbnailView.bounds.size.width) * 0.6) + self.thumbnailView.thumbnailSize = CGSize(width: maxHeight, height: maxHeight) } - fileprivate func setupConstraints() { + private func setupConstraints() { if thumbnailView.superview == nil || pdfView.superview == nil { return @@ -291,8 +352,13 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { thumbnailView.isHidden = false - switch thumbnailViewPosition { - case .left: + switch (thumbnailViewPosition, fullScreen) { + case (_, true): + constraints.append(containerView.leadingAnchor.constraint(equalTo: guide.leadingAnchor)) + constraints.append(containerView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) + constraints.append(containerView.bottomAnchor.constraint(equalTo: guide.bottomAnchor)) + thumbnailView.isHidden = true + case (.left, false): constraints.append(thumbnailView.topAnchor.constraint(equalTo: guide.topAnchor)) constraints.append(thumbnailView.leadingAnchor.constraint(equalTo: guide.leadingAnchor)) constraints.append(thumbnailView.bottomAnchor.constraint(equalTo: guide.bottomAnchor)) @@ -302,7 +368,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { constraints.append(containerView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) constraints.append(containerView.bottomAnchor.constraint(equalTo: guide.bottomAnchor)) - case .right: + case (.right, false): constraints.append(thumbnailView.topAnchor.constraint(equalTo: guide.topAnchor)) constraints.append(thumbnailView.leadingAnchor.constraint(equalTo: containerView.trailingAnchor)) constraints.append(thumbnailView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) @@ -313,7 +379,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { constraints.append(containerView.trailingAnchor.constraint(equalTo: thumbnailView.leadingAnchor)) constraints.append(containerView.bottomAnchor.constraint(equalTo: guide.bottomAnchor)) - case .bottom: + case (.bottom, false): constraints.append(thumbnailView.topAnchor.constraint(equalTo: containerView.bottomAnchor)) constraints.append(thumbnailView.leadingAnchor.constraint(equalTo: guide.leadingAnchor)) constraints.append(thumbnailView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) @@ -324,7 +390,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { constraints.append(containerView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) constraints.append(containerView.bottomAnchor.constraint(equalTo: thumbnailView.topAnchor)) - case .none: + case (.none, _): constraints.append(containerView.leadingAnchor.constraint(equalTo: guide.leadingAnchor)) constraints.append(containerView.trailingAnchor.constraint(equalTo: guide.trailingAnchor)) constraints.append(containerView.bottomAnchor.constraint(equalTo: guide.bottomAnchor)) @@ -335,7 +401,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { } - fileprivate func setupToolbar() { + private func setupToolbar() { searchButtonItem = UIBarButtonItem(barButtonSystemItem: .search, target: self, action: #selector(search)) gotoButtonItem = UIBarButtonItem(image: UIImage(named: "ic_pdf_go_to_page"), style: .plain, target: self, action: #selector(goToPage)) outlineItem = UIBarButtonItem(image: UIImage(named: "ic_pdf_outline"), style: .plain, target: self, action: #selector(showOutline)) @@ -350,7 +416,60 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { outlineItem!] } - fileprivate func selectPage(with label:String) { + // MARK: - Search results navigation + + private func setupSearchResultsView() { + self.searchResultsView.isHidden = true + + self.pdfView.addSubview(searchResultsView) + + let viewDictionary = ["searchResulsView": searchResultsView] + var constraints: [NSLayoutConstraint] = [] + + let vertical = NSLayoutConstraint.constraints(withVisualFormat: "V:|-20-[searchResulsView(48)]-(>=1)-|", metrics: nil, views: viewDictionary) + let horizontal = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[searchResulsView]-20-|", metrics: nil, views: viewDictionary) + constraints += vertical + constraints += horizontal + NSLayoutConstraint.activate(constraints) + + self.searchResultsView.updateHandler = { selection in + self.jumpTo(selection) + } + + self.searchResultsView.closeHandler = { [weak self] in + self?.hideSearchResultsView() + } + } + + private func showSearchResultsView() { + self.searchResultsView.isHidden = false + self.searchResultsView.alpha = 0.0 + UIView.animate(withDuration: 0.25, animations: { + self.searchResultsView.alpha = 1.0 + }) + } + + private func hideSearchResultsView() { + UIView.animate(withDuration: 0.25, animations: { + self.searchResultsView.alpha = 0.0 + }, completion: { (complete) in + self.searchResultsView.isHidden = complete + }) + } + + private func jumpTo(_ selection: PDFSelection) { + selection.color = UIColor.yellow + self.pdfView.go(to: selection) + self.pdfView.setCurrentSelection(selection, animate: true) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + self.pdfView.setCurrentSelection(nil, animate: true) + } + } + + // MARK: - Current page selection + + private func selectPage(with label:String) { guard let pdf = pdfView.document else { return } if let pageNr = Int(label) { @@ -368,7 +487,7 @@ class PDFViewerViewController: DisplayViewController, DisplayExtension { } } - fileprivate func updatePageLabel() { + private func updatePageLabel() { guard let pdf = pdfView.document else { return } guard let page = pdfView.currentPage else { return } diff --git a/ownCloud/Diagnostic/DiagnosticManager.swift b/ownCloud/Diagnostic/DiagnosticManager.swift index 0707bab53..9163c2178 100644 --- a/ownCloud/Diagnostic/DiagnosticManager.swift +++ b/ownCloud/Diagnostic/DiagnosticManager.swift @@ -43,6 +43,17 @@ class DiagnosticManager: NSObject, OCClassSettingsSupport, OCClassSettingsUserPr return true } + public static func classSettingsMetadata() -> [OCClassSettingsKey : [OCClassSettingsMetadataKey : Any]]? { + return [ + .diagnosticsEnabled : [ + .type : OCClassSettingsMetadataType.boolean, + .description : "Controls whether additional diagnostic options and information is available throughout the user interface.", + .category : "Diagnostics", + .status : OCClassSettingsKeyStatus.advanced + ] + ] + } + // MARK: - Shared instance static var shared = DiagnosticManager() diff --git a/ownCloud/Import/ImportFilesController.swift b/ownCloud/Import/ImportFilesController.swift index 87eed745f..4e9b63265 100644 --- a/ownCloud/Import/ImportFilesController.swift +++ b/ownCloud/Import/ImportFilesController.swift @@ -254,12 +254,12 @@ extension ImportFilesController { }) } - func cardViewController(for url: URL) -> MoreViewController? { + func cardViewController(for url: URL) -> FrameViewController? { let tableViewController = MoreStaticTableViewController(style: .grouped) header = MoreViewHeader(url: url) guard let header = header else { return nil } - let moreViewController = MoreViewController(header: header, viewController: tableViewController) + let moreViewController = FrameViewController(header: header, viewController: tableViewController) let title = NSAttributedString(string: "Save File".localized, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20, weight: .heavy)]) diff --git a/ownCloud/Issues/IssuesCardViewController.swift b/ownCloud/Issues/IssuesCardViewController.swift new file mode 100644 index 000000000..1ac410f29 --- /dev/null +++ b/ownCloud/Issues/IssuesCardViewController.swift @@ -0,0 +1,267 @@ +// +// IssuesCardViewController.swift +// ownCloud +// +// Created by Felix Schwarz on 22.01.21. +// Copyright © 2021 ownCloud GmbH. All rights reserved. +// +/* + * Copyright (C) 2021, ownCloud GmbH. + * + * This code is covered by the GNU Public License Version 3. + * + * For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/ + * You should have received a copy of this license along with this program. If not, see . + * + */ + +import UIKit +import ownCloudSDK +import ownCloudAppShared + +class CardCellBackgroundView : UIView { + init(backgroundColor: UIColor, insets: NSDirectionalEdgeInsets, cornerRadius: CGFloat) { + super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) + + let backgroundView = UIView(frame: CGRect(x: insets.leading, y: insets.top, width: frame.size.width - insets.leading - insets.trailing, height: frame.size.height - insets.top - insets.bottom)) + + backgroundView.layer.backgroundColor = backgroundColor.cgColor + backgroundView.layer.cornerRadius = cornerRadius + backgroundView.autoresizingMask = [.flexibleHeight, .flexibleWidth] + + addSubview(backgroundView) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +class CardHeaderView : UIView, Themeable { + var label : UILabel + + init(title: String) { + label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + label.text = title + label.setContentHuggingPriority(.required, for: .vertical) + label.setContentHuggingPriority(.defaultLow, for: .horizontal) + label.setContentCompressionResistancePriority(.required, for: .vertical) + label.setContentCompressionResistancePriority(.required, for: .horizontal) + + super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) + + translatesAutoresizingMaskIntoConstraints = false + addSubview(label) + + NSLayoutConstraint.activate([ + label.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 15), + label.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -15), + label.topAnchor.constraint(equalTo: self.topAnchor, constant: 10), + label.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10) + ]) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + Theme.shared.unregister(client: self) + } + + override func didMoveToSuperview() { + super.didMoveToSuperview() + + if self.superview != nil { + Theme.shared.register(client: self) + } + } + + func applyThemeCollection(theme: Theme, collection: ThemeCollection, event: ThemeEvent) { + label.font = UIFont.systemFont(ofSize: UIFont.systemFontSize * 1.4, weight: .bold) + label.textColor = collection.tableRowColors.labelColor + + self.backgroundColor = collection.tableBackgroundColor + } +} + +enum IssueUserResponse { + case cancel + case approve + case dismiss +} + +class IssuesCardViewController: StaticTableViewController { + typealias CompletionHandler = (IssueUserResponse) -> Void + typealias DismissHandler = () -> Void + + var issues : DisplayIssues + var headerTitle : String? + var options : [AlertOption] + weak var alertView : AlertView? + + private var completionHandler : CompletionHandler? + private var dismissHandler : DismissHandler? + + required init(with issue: OCIssue, displayIssues: DisplayIssues? = nil, bookmark: OCBookmark? = nil, completion:@escaping CompletionHandler, dismissed: DismissHandler? = nil) { + issues = (displayIssues != nil) ? displayIssues! : issue.prepareForDisplay() + options = [] + completionHandler = completion + dismissHandler = dismissed + + super.init(style: .plain) + + headerTitle = "Review Connection".localized + + switch issues.displayLevel { + case .informal: + options = [ + AlertOption(label: "OK".localized, type: .default, accessibilityIdentifier: "ok-button", handler: { [weak self] (_, _) in + self?.complete(with: .approve) + }) + ] + + case .warning: + options = [ + AlertOption(label: "Cancel".localized, type: .cancel, accessibilityIdentifier: "cancel-button", handler: { [weak self] (_, _) in + self?.complete(with: .cancel) + }), + + AlertOption(label: "Approve".localized, type: .regular, accessibilityIdentifier: "approve-button", handler: { [weak self] (_, _) in + self?.complete(with: .approve) + }) + ] + + case .error: + headerTitle = "Issues".localized + + options = [ + AlertOption(label: "OK".localized, type: .cancel, accessibilityIdentifier: "ok-button", handler: { [weak self] (_, _) in + self?.complete(with: .dismiss) + }) + ] + } + + let section = StaticTableViewSection() + + let horizontalMargin : CGFloat = 25 + let verticalMargin : CGFloat = 10 + let backgroundHorizontalMargin : CGFloat = 15 + let backgroundVerticalMargin : CGFloat = 2 + let backgroundCornerRadius : CGFloat = 5 + + let cellStyler : ThemeTableViewCell.CellStyler = { (cell, style) in + cell.primaryTextLabel?.textColor = style.textColor + cell.primaryTextLabel?.font = UIFont.systemFont(ofSize: UIFont.systemFontSize * 1.1, weight: .semibold) + + cell.primaryDetailTextLabel?.textColor = style.textColor + cell.primaryDetailTextLabel?.font = UIFont.systemFont(ofSize: UIFont.systemFontSize, weight: .regular) + + if let backgroundColor = style.backgroundColor { + let edgeInsets = NSDirectionalEdgeInsets(top: backgroundVerticalMargin, leading: backgroundHorizontalMargin, bottom: backgroundVerticalMargin, trailing: backgroundHorizontalMargin) + + cell.backgroundView = CardCellBackgroundView(backgroundColor: backgroundColor, insets: edgeInsets, cornerRadius: backgroundCornerRadius) + cell.selectedBackgroundView = CardCellBackgroundView(backgroundColor: backgroundColor.darker(0.07), insets: edgeInsets, cornerRadius: backgroundCornerRadius) + } + + cell.tintColor = style.textColor + + return true + } + + for issue in issues.displayIssues { + if let issueTitle = issue.localizedTitle { + var messageStyle : StaticTableViewRowMessageStyle? + + switch issue.level { + + case .informal: + messageStyle = .plain + + case .warning: + messageStyle = .warning + + case .error: + messageStyle = .alert + } + + let row = StaticTableViewRow(rowWithAction: { [weak self] (_, _) in + if issue.type == .certificate, let certificate = issue.certificate { + let certificateViewController = ThemeCertificateViewController(certificate: certificate, compare: bookmark?.certificate) + + if bookmark?.certificate != nil { + certificateViewController.showDifferences = true + } + + self?.present(ThemeNavigationController(rootViewController: certificateViewController), animated: true, completion: nil) + } + }, title: issueTitle, subtitle: issue.localizedDescription, messageStyle: messageStyle, recreatedLabelLayout: { (cell, textLabel, detailLabel) in + NSLayoutConstraint.activate([ + textLabel.topAnchor.constraint(equalTo: cell.contentView.topAnchor, constant: verticalMargin), + + textLabel.leadingAnchor.constraint(equalTo: cell.contentView.leadingAnchor, constant: horizontalMargin), + textLabel.trailingAnchor.constraint(equalTo: cell.contentView.trailingAnchor, constant: -horizontalMargin), + + detailLabel.leadingAnchor.constraint(equalTo: cell.contentView.leadingAnchor, constant: horizontalMargin), + detailLabel.trailingAnchor.constraint(equalTo: cell.contentView.trailingAnchor, constant: -horizontalMargin), + + detailLabel.topAnchor.constraint(equalToSystemSpacingBelow: textLabel.bottomAnchor, multiplier: 1), + detailLabel.bottomAnchor.constraint(equalTo: cell.contentView.bottomAnchor, constant: -verticalMargin) + ]) + }, accessoryType: (issue.type == .certificate) ? .disclosureIndicator : .none) + + if #available(iOS 13.0, *), row.cell?.accessoryType == .disclosureIndicator { + // On iOS 13+, chevrons created via .accessoryType are not using the .tintColor anymore + let chevronImageView = UIImageView(image: UIImage(systemName: "chevron.right")) + (row.cell as? ThemeTableViewCell)?.accessoryView = chevronImageView + } + + (row.cell as? ThemeTableViewCell)?.cellStyler = cellStyler + + section.add(row: row) + } + } + + self.addSection(section) + + self.tableView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 2, leading: 25, bottom: 2, trailing: 25) + self.tableView.preservesSuperviewLayoutMargins = true + self.tableView.separatorStyle = .none + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + static func present(on hostViewController: UIViewController, issue: OCIssue, displayIssues: DisplayIssues? = nil, bookmark: OCBookmark? = nil, completion:@escaping CompletionHandler, dismissed: DismissHandler? = nil) { + let issuesViewController = self.init(with: issue, displayIssues: displayIssues, bookmark: bookmark, completion: completion, dismissed: dismissed) + + let headerView = CardHeaderView(title: issuesViewController.headerTitle ?? "") + let alertView = AlertView(localizedTitle: "", localizedDescription: "", contentPadding: 15, options: issuesViewController.options) + + let frameViewController = FrameViewController(header: headerView, footer: alertView, viewController: issuesViewController) + + alertView.backgroundColor = Theme.shared.activeCollection.tableBackgroundColor + issuesViewController.alertView = alertView + + hostViewController.present(asCard: frameViewController, animated: true, withHandle: false, dismissable: false) { + _ = frameViewController.view + } + } + + func complete(with result: IssueUserResponse) { + completionHandler?(result) + completionHandler = nil + + self.presentingViewController?.dismiss(animated: true) + } + + override func applyThemeCollection(theme: Theme, collection: ThemeCollection, event: ThemeEvent) { + super.applyThemeCollection(theme: theme, collection: collection, event: event) + + tableView.backgroundColor = collection.tableBackgroundColor + alertView?.backgroundColor = collection.tableBackgroundColor + } +} diff --git a/ownCloud/Key Commands/KeyCommands.swift b/ownCloud/Key Commands/KeyCommands.swift index 274a341f9..f01dcaf12 100644 --- a/ownCloud/Key Commands/KeyCommands.swift +++ b/ownCloud/Key Commands/KeyCommands.swift @@ -123,34 +123,6 @@ extension BookmarkViewController { } } -extension IssuesViewController { - override var keyCommands: [UIKeyCommand]? { - var shortcuts = [UIKeyCommand]() - - if let buttons = buttons { - var counter = 1 - for button in buttons { - let command = UIKeyCommand(input: String(counter), modifierFlags: [.command], action: #selector(issueButtonPressed), discoverabilityTitle: button.title) - shortcuts.append(command) - counter += 1 - } - } - - return shortcuts - } - - @objc func issueButtonPressed(_ command : UIKeyCommand) { - guard let button = buttons?.first(where: {$0.title == command.discoverabilityTitle}) else { return } - - let buttonPressed: IssueButton = button - buttonPressed.action() - } - - override var canBecomeFirstResponder: Bool { - return true - } -} - extension UIAlertController { typealias AlertHandler = @convention(block) (UIAlertAction) -> Void @@ -1130,11 +1102,25 @@ extension AlertViewController { } } -extension MoreViewController { +extension FrameViewController { open override var keyCommands: [UIKeyCommand]? { var shortcuts = [UIKeyCommand]() - let cancelCommand = UIKeyCommand(input: UIKeyCommand.inputEscape, modifierFlags: [], action: #selector(dismissCard), discoverabilityTitle: "Close".localized) - shortcuts.append(cancelCommand) + + if let issuesCard = self.viewController as? IssuesCardViewController { + if let buttons = issuesCard.alertView?.optionViews { + var counter = 1 + for button in buttons { + if let buttonTitle = button.currentTitle { + let command = UIKeyCommand(input: String(counter), modifierFlags: [.command], action: #selector(issueButtonPressed), discoverabilityTitle: buttonTitle) + shortcuts.append(command) + } + counter += 1 + } + } + } else { + let cancelCommand = UIKeyCommand(input: UIKeyCommand.inputEscape, modifierFlags: [], action: #selector(dismissCard), discoverabilityTitle: "Close".localized) + shortcuts.append(cancelCommand) + } return shortcuts } @@ -1146,4 +1132,12 @@ extension MoreViewController { @objc func dismissCard(_ sender: Any?) { self.dismiss(animated: false, completion: nil) } + + @objc func issueButtonPressed(_ command : UIKeyCommand) { + if let issuesCard = self.viewController as? IssuesCardViewController, let alertView = issuesCard.alertView { + guard let button = alertView.optionViews.first(where: {$0.currentTitle == command.discoverabilityTitle}) else { return } + + alertView.optionSelected(sender: button) + } + } } diff --git a/ownCloud/Licensing/Offers/LicenseOffersViewController.swift b/ownCloud/Licensing/Offers/LicenseOffersViewController.swift index 86f6be7e2..df5449bde 100644 --- a/ownCloud/Licensing/Offers/LicenseOffersViewController.swift +++ b/ownCloud/Licensing/Offers/LicenseOffersViewController.swift @@ -77,8 +77,8 @@ class LicenseOffersViewController: StaticTableViewController { } func composeSections() { - let iapSection = StaticTableViewSection(headerTitle: "Purchase") - let subSection = StaticTableViewSection(headerTitle: "Subscribe") + let iapSection = StaticTableViewSection(headerTitle: "Purchase".localized) + let subSection = StaticTableViewSection(headerTitle: "Subscribe".localized) if let feature = OCLicenseManager.shared.feature(withIdentifier: featureIdentifier) { if let offers = OCLicenseManager.shared.offers(for: feature) { diff --git a/ownCloud/Licensing/Product List/LicenseInAppProductListViewController.swift b/ownCloud/Licensing/Product List/LicenseInAppProductListViewController.swift index 40fd8c962..a2845702e 100644 --- a/ownCloud/Licensing/Product List/LicenseInAppProductListViewController.swift +++ b/ownCloud/Licensing/Product List/LicenseInAppProductListViewController.swift @@ -31,12 +31,18 @@ class LicenseInAppProductListViewController: StaticTableViewController { UIBarButtonItem(title: "Restore purchases".localized, style: .plain, target: self, action: #selector(restorePurchases)), UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) ] + + NotificationCenter.default.addObserver(self, selector: #selector(bookmarkManagerListUpdated(_:)), name: .OCBookmarkManagerListChanged, object: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + deinit { + NotificationCenter.default.removeObserver(self, name: .OCBookmarkManagerListChanged, object: nil) + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -52,6 +58,12 @@ class LicenseInAppProductListViewController: StaticTableViewController { self.navigationController?.isToolbarHidden = true } + @objc func bookmarkManagerListUpdated(_ notification: Notification?) { + OnMainThread { [weak self] in + self?.generateContent() + } + } + func provideContent() { OCLicenseManager.appStoreProvider?.refreshProductsIfNeeded(completionHandler: { [weak self] (error) in OnMainThread { @@ -68,9 +80,27 @@ class LicenseInAppProductListViewController: StaticTableViewController { }) } + private weak var proFeaturesSection : StaticTableViewSection? + private weak var noBookmarksSection : StaticTableViewSection? + func generateContent() { - if self.sections.count == 0 { - let section = StaticTableViewSection(headerTitle: "Pro Features".localized) + if OCBookmarkManager.shared.bookmarks.count == 0 { + if noBookmarksSection == nil { + let section = StaticTableViewSection(headerTitle: "", identifier: "no-bookmarks") + + section.add(row: StaticTableViewRow(message: "In order to accurately determine your current licensing status, please add one or more accounts first.".localized, title: "No accounts found".localized, style: .warning)) + + noBookmarksSection = section + self.addSection(section) + } + } else { + if let noBookmarksSection = noBookmarksSection { + self.removeSection(noBookmarksSection) + } + } + + if proFeaturesSection == nil { + let section = StaticTableViewSection(headerTitle: "Pro Features".localized, identifier: "pro-features") let environment = OCLicenseEnvironment() if let iapMessages = OCLicenseManager.shared.inAppPurchaseMessage(forFeature: nil) { @@ -85,7 +115,10 @@ class LicenseInAppProductListViewController: StaticTableViewController { } } - self.addSection(section) + if section.rows.count > 0 { + proFeaturesSection = section + self.addSection(section) + } } } diff --git a/ownCloud/Licensing/Product List/LicenseInAppPurchaseFeatureView.swift b/ownCloud/Licensing/Product List/LicenseInAppPurchaseFeatureView.swift index 64acc8953..37f7afd61 100644 --- a/ownCloud/Licensing/Product List/LicenseInAppPurchaseFeatureView.swift +++ b/ownCloud/Licensing/Product List/LicenseInAppPurchaseFeatureView.swift @@ -131,6 +131,6 @@ class LicenseInAppPurchaseFeatureView: UIView, Themeable { @objc func takeOffer() { let offersViewController = LicenseOffersViewController(withFeature: feature.identifier, in: environment) - baseViewController?.present(asCard: MoreViewController(header: offersViewController.cardHeaderView!, viewController: offersViewController), animated: true) + baseViewController?.present(asCard: FrameViewController(header: offersViewController.cardHeaderView!, viewController: offersViewController), animated: true) } } diff --git a/ownCloud/Media Uploads/MediaUploadOperation.swift b/ownCloud/Media Uploads/MediaUploadOperation.swift index d2264fbe8..7dbd1ea54 100644 --- a/ownCloud/Media Uploads/MediaUploadOperation.swift +++ b/ownCloud/Media Uploads/MediaUploadOperation.swift @@ -174,6 +174,10 @@ class MediaUploadOperation : Operation { if userDefaults.preferRawPhotos { preferredResourceTypes.append(.alternatePhoto) } + + if userDefaults.preferOriginalVideos { + preferredResourceTypes.append(.video) + } } if let result = asset.upload(with: core, diff --git a/ownCloud/Media Uploads/PhotoKit Extensions/PHAsset+Upload.swift b/ownCloud/Media Uploads/PhotoKit Extensions/PHAsset+Upload.swift index 4474e45f9..433f12e67 100644 --- a/ownCloud/Media Uploads/PhotoKit Extensions/PHAsset+Upload.swift +++ b/ownCloud/Media Uploads/PhotoKit Extensions/PHAsset+Upload.swift @@ -335,61 +335,13 @@ extension PHAsset { } } - /** - Method for exporting video assets - - parameter resources: array of PHAssetResource objects belonging to PHAsset - - parameter fileName: name for the exported asset including file extension - - parameter utisToConvert: list of file UTIs for media formats which shall be converted to MP4 format - - parameter completionHandler: called when the file is written to disk or if an error occurs - */ - func exportVideo(resources:[PHAssetResource], fileName:String, utisToConvert:[String] = [], completionHandler: @escaping (_ url:URL?, _ error:Error?) -> Void) { - - var resourceToExport:PHAssetResource? - - // For edited video pick the edited version - resourceToExport = resources.filter({$0.type == .fullSizeVideo}).first - - // If edited video is not avaialable, pick the original - if resourceToExport == nil { - resourceToExport = resources.filter({$0.type == .video}).first - } - - // No resource found? - guard let resource = resourceToExport else { - completionHandler(nil, NSError(ocError: .internal)) - return - } - - // Allow to request resource underlying data from network (iCloud in this case) - let requestOptions = PHAssetResourceRequestOptions() - requestOptions.isNetworkAccessAllowed = true - - // Prepare export URL and remove path extension which will depend on output format - - // Check if conversion is required? - if utisToConvert.contains(resource.uniformTypeIdentifier) { - exportVideo(fileName: fileName, utisToConvert: utisToConvert) { (url, error) in - completionHandler(url, error) - } - } else { - var exportURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(fileName).deletingPathExtension() - // Append correct file extension to export URL - exportURL = exportURL.appendingPathExtension(resource.fileExtension) - - // Write the file to disc - PHAssetResourceManager.default().writeData(for: resource, toFile: exportURL, options: requestOptions) { (error) in - completionHandler(exportURL, error) - } - } - } - /** Method for exporting video assets - parameter fileName: name for the exported asset including file extension - parameter utisToConvert: list of file UTIs for media formats which shall be converted to MP4 format - parameter completionHandler: called when the file is written to disk or if an error occurs */ - func exportVideo(fileName:String, utisToConvert:[String] = [], completionHandler: @escaping (_ url:URL?, _ error:Error?) -> Void) { + func exportVideo(fileName:String, utisToConvert:[String] = [], preferOriginal:Bool = false, completionHandler: @escaping (_ url:URL?, _ error:Error?) -> Void) { var outError: Error? var exportURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(fileName) @@ -397,7 +349,7 @@ extension PHAsset { let videoRequestOptions = PHVideoRequestOptions() videoRequestOptions.isNetworkAccessAllowed = true // Take care that in case of edited video, the edited content is used - videoRequestOptions.version = .current + videoRequestOptions.version = preferOriginal ? .original : .current videoRequestOptions.deliveryMode = .highQualityFormat // Request AVAssetExport session (can be also done with requestAVAsset() in conjunction with AVAssetWriter for more fine-grained control) @@ -439,9 +391,10 @@ extension PHAsset { */ func export(fileName:String, utisToConvert:[String] = [], preferredResourceTypes:[PHAssetResourceType] = [], completion:@escaping (_ url:URL?, _ error:Error?) -> Void) { let assetResources = PHAssetResource.assetResources(for: self) - if assetResources.count > 0 { - // We have actual data on the device and we can export it directly - if self.mediaType == .image { + + // We have actual data on the device and we can export it directly + if self.mediaType == .image { + if assetResources.count > 0 { exportPhoto(resources: assetResources, fileName: fileName, utisToConvert: utisToConvert, @@ -449,29 +402,23 @@ extension PHAsset { completionHandler: { (url, error) in completion(url, error) }) - } else if self.mediaType == .video { - exportVideo(resources: assetResources, fileName: fileName, utisToConvert: utisToConvert) { (url, error) in - completion(url, error) - } } else { - completion(nil, NSError(ocError: .internal)) - } - } else { - // It could be that we don't have any asset resources locally e.g. since we have to deal with an asset from a cloud album - if self.mediaType == .image { exportPhoto(fileName: fileName, utisToConvert: utisToConvert, completionHandler: { (url, error) in completion(url, error) }) - } else if self.mediaType == .video { - exportVideo(fileName: fileName, - utisToConvert: utisToConvert) { (url, error) in - completion(url, error) - } - } else { - completion(nil, NSError(ocError: .internal)) } + + } else if self.mediaType == .video { + let preferOriginal = preferredResourceTypes.contains(.video) + exportVideo(fileName: fileName, + utisToConvert: utisToConvert, + preferOriginal: preferOriginal) { (url, error) in + completion(url, error) + } + } else { + completion(nil, NSError(ocError: .internal)) } } diff --git a/ownCloud/Messages/AlertView.swift b/ownCloud/Messages/AlertView.swift index ef6bc73c4..232039ccd 100644 --- a/ownCloud/Messages/AlertView.swift +++ b/ownCloud/Messages/AlertView.swift @@ -26,11 +26,13 @@ class AlertOption : NSObject { var label : String var handler : ChoiceHandler var type : OCIssueChoiceType + var accessibilityIdentifier : String? - init(label: String, type: OCIssueChoiceType, handler: @escaping ChoiceHandler) { + init(label: String, type: OCIssueChoiceType, accessibilityIdentifier : String? = nil, handler: @escaping ChoiceHandler) { self.label = label self.type = type self.handler = handler + self.accessibilityIdentifier = accessibilityIdentifier super.init() } @@ -53,11 +55,12 @@ class AlertView: UIView, Themeable { var optionViews : [ThemeButton] = [] - init(localizedHeader: String? = nil, localizedTitle: String, localizedDescription: String, options: [AlertOption]) { + init(localizedHeader: String? = nil, localizedTitle: String, localizedDescription: String, contentPadding: CGFloat = 20, options: [AlertOption]) { self.localizedHeader = localizedHeader self.localizedTitle = localizedTitle self.localizedDescription = localizedDescription self.options = options + self.contentPadding = contentPadding super.init(frame: .zero) @@ -83,10 +86,9 @@ class AlertView: UIView, Themeable { optionButton.setTitle(option.label, for: .normal) optionButton.tag = optionIdx optionButton.translatesAutoresizingMaskIntoConstraints = false + optionButton.accessibilityIdentifier = option.accessibilityIdentifier -// optionButton.setContentHuggingPriority(.defaultLow, for: .horizontal) optionButton.setContentHuggingPriority(.required, for: .vertical) -// optionButton.setContentCompressionResistancePriority(.required, for: .horizontal) optionButton.setContentCompressionResistancePriority(.required, for: .vertical) optionButton.addTarget(self, action: #selector(optionSelected(sender:)), for: .primaryActionTriggered) @@ -110,7 +112,7 @@ class AlertView: UIView, Themeable { private let headerTextHorizontalInset : CGFloat = 20 private let headerTextVerticalInset : CGFloat = 7 private let titleAndDescriptionSpacing : CGFloat = 5 - private let contentPadding : CGFloat = 20 + private var contentPadding : CGFloat = 20 private let optionInnerSpacing : CGFloat = 10 private let headerLabelFontSize : CGFloat = 14 @@ -176,32 +178,45 @@ class AlertView: UIView, Themeable { self.addSubview(headerContainer) NSLayoutConstraint.activate([ - headerLabel.leftAnchor.constraint(equalTo: headerContainer.leftAnchor, constant: headerTextHorizontalInset), - headerLabel.rightAnchor.constraint(equalTo: headerContainer.rightAnchor, constant: -headerTextHorizontalInset), + headerLabel.leadingAnchor.constraint(equalTo: headerContainer.leadingAnchor, constant: headerTextHorizontalInset), + headerLabel.trailingAnchor.constraint(equalTo: headerContainer.trailingAnchor, constant: -headerTextHorizontalInset), headerLabel.topAnchor.constraint(equalTo: headerContainer.topAnchor, constant: headerTextVerticalInset), headerLabel.bottomAnchor.constraint(equalTo: headerContainer.bottomAnchor, constant: -headerTextVerticalInset), headerContainer.topAnchor.constraint(equalTo: enclosure.topAnchor), - headerContainer.leftAnchor.constraint(equalTo: enclosure.leftAnchor), - headerContainer.rightAnchor.constraint(equalTo: enclosure.rightAnchor) + headerContainer.leadingAnchor.constraint(equalTo: enclosure.leadingAnchor), + headerContainer.trailingAnchor.constraint(equalTo: enclosure.trailingAnchor) ]) } - NSLayoutConstraint.activate([ - titleLabel.topAnchor.constraint(equalTo: ((localizedHeader != nil) ? headerContainer.bottomAnchor : enclosure.topAnchor), constant: contentPadding), - titleLabel.bottomAnchor.constraint(equalTo: descriptionLabel.topAnchor, constant: -titleAndDescriptionSpacing), - descriptionLabel.bottomAnchor.constraint(equalTo: optionStackView.topAnchor, constant: -contentPadding), - optionStackView.bottomAnchor.constraint(equalTo: enclosure.bottomAnchor, constant: -contentPadding), + if localizedHeader == nil, localizedTitle == "", localizedDescription == "" { + titleLabel.removeFromSuperview() + descriptionLabel.removeFromSuperview() - titleLabel.leftAnchor.constraint(equalTo: enclosure.leftAnchor, constant: contentPadding), - titleLabel.rightAnchor.constraint(equalTo: enclosure.rightAnchor, constant: -contentPadding), + NSLayoutConstraint.activate([ + optionStackView.topAnchor.constraint(equalTo: enclosure.topAnchor, constant: contentPadding), + optionStackView.bottomAnchor.constraint(equalTo: enclosure.bottomAnchor, constant: -contentPadding), + + optionStackView.leadingAnchor.constraint(equalTo: enclosure.leadingAnchor, constant: contentPadding), + optionStackView.trailingAnchor.constraint(equalTo: enclosure.trailingAnchor, constant: -contentPadding) + ]) + } else { + NSLayoutConstraint.activate([ + titleLabel.topAnchor.constraint(equalTo: ((localizedHeader != nil) ? headerContainer.bottomAnchor : enclosure.topAnchor), constant: contentPadding), + titleLabel.bottomAnchor.constraint(equalTo: descriptionLabel.topAnchor, constant: -titleAndDescriptionSpacing), + descriptionLabel.bottomAnchor.constraint(equalTo: optionStackView.topAnchor, constant: -contentPadding), + optionStackView.bottomAnchor.constraint(equalTo: enclosure.bottomAnchor, constant: -contentPadding), - descriptionLabel.leftAnchor.constraint(equalTo: enclosure.leftAnchor, constant: contentPadding), - descriptionLabel.rightAnchor.constraint(equalTo: enclosure.rightAnchor, constant: -contentPadding), + titleLabel.leadingAnchor.constraint(equalTo: enclosure.leadingAnchor, constant: contentPadding), + titleLabel.trailingAnchor.constraint(equalTo: enclosure.trailingAnchor, constant: -contentPadding), - optionStackView.leftAnchor.constraint(equalTo: enclosure.leftAnchor, constant: contentPadding), - optionStackView.rightAnchor.constraint(equalTo: enclosure.rightAnchor, constant: -contentPadding) - ]) + descriptionLabel.leadingAnchor.constraint(equalTo: enclosure.leadingAnchor, constant: contentPadding), + descriptionLabel.trailingAnchor.constraint(equalTo: enclosure.trailingAnchor, constant: -contentPadding), + + optionStackView.leadingAnchor.constraint(equalTo: enclosure.leadingAnchor, constant: contentPadding), + optionStackView.trailingAnchor.constraint(equalTo: enclosure.trailingAnchor, constant: -contentPadding) + ]) + } } func applyThemeCollection(theme: Theme, collection: ThemeCollection, event: ThemeEvent) { diff --git a/ownCloud/Migration/Migration.swift b/ownCloud/Migration/Migration.swift index 5e70277e4..4a6c3ed3a 100644 --- a/ownCloud/Migration/Migration.swift +++ b/ownCloud/Migration/Migration.swift @@ -261,7 +261,7 @@ class Migration { let displayIssues = issue.prepareForDisplay() - guard displayIssues.displayLevel.rawValue >= OCIssueLevel.warning.rawValue else { + guard displayIssues.isAtLeast(level: .warning) else { connectGroup.leave() return } @@ -269,7 +269,7 @@ class Migration { if let parentViewController = parentViewController { // Present issues if the level is >= warning DispatchQueue.main.async { - let issuesViewController = ConnectionIssueViewController(displayIssues: displayIssues, completion: { (response) in + IssuesCardViewController.present(on: parentViewController, issue: issue, displayIssues: displayIssues, completion: { (response) in Log.debug(tagged: ["MIGRATION"], "User responded to the issue with \(response)") switch response { @@ -285,7 +285,6 @@ class Migration { connectGroup.leave() }) - parentViewController.present(issuesViewController, animated: true, completion: nil) Log.debug(tagged: ["MIGRATION"], "Presenting the issue to the user") } } else { diff --git a/ownCloud/Migration/MigrationViewController.swift b/ownCloud/Migration/MigrationViewController.swift index 97bddb76e..37e78e911 100644 --- a/ownCloud/Migration/MigrationViewController.swift +++ b/ownCloud/Migration/MigrationViewController.swift @@ -17,6 +17,7 @@ */ import UIKit +import ownCloudApp import ownCloudAppShared class MigrationViewController: UITableViewController, Themeable { @@ -116,12 +117,12 @@ class MigrationViewController: UITableViewController, Themeable { headerLabel.bottomAnchor.constraint(equalTo: rootView.bottomAnchor, constant: -15) ]) - if let organizationLogoImage = UIImage(named: "branding-splashscreen") { + if let organizationLogoImage = Branding.shared.brandedImageNamed(.splashscreenLogo) { headerLogoView.image = organizationLogoImage headerLogoView.contentMode = .scaleAspectFit } - if let organizationBackgroundImage = UIImage(named: "branding-splashscreen-background") { + if let organizationBackgroundImage = Branding.shared.brandedImageNamed(.splashscreenBackground) { backgroundImageView.image = organizationBackgroundImage } diff --git a/ownCloud/Release Notes/ReleaseNotes.plist b/ownCloud/Release Notes/ReleaseNotes.plist index be79bda16..34195277f 100644 --- a/ownCloud/Release Notes/ReleaseNotes.plist +++ b/ownCloud/Release Notes/ReleaseNotes.plist @@ -62,6 +62,14 @@ iVBORw0KGgoAAAANSUhEUgAAADYAAAA3CAYAAABHGbl4AAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAB3HHAAAaZAADsgEAAA0dAAOgAQADAAAAAQABAACgAgAEAAAAAQAAADagAwAEAAAAAQAAADcAAAAA1+0GLwAAAAlwSFlzAAALGwAACxgBDz3HvgAAAyRJREFUaAXtWcurTlEUP673+5Gu3BJh4BFFSSklGRDJ9UqZmDDxBxgwMTI2ZoJMPJIZJSXKY4JIbu4tkeSRVx5xr8fvx121725/59vfOWvv853sVb+7H2evx2+ddb59zr5ZliRlIGUgZSBlIH4GRsHlLeBUfNdhPW6F+d+DmB/W1T/rHTGcwAeJiZh9matlyzL8AMgdu11LFo6gNxikSO4XMMuxTnUqRinapTcMDLpVWVRgbDh8vgakDKW9VkEsqi7XOEiR3E+gEwgmoUvRLkMhQr9bZFC3ls/Sc0DKz24v142QxLsyhxRJ/gCmymLtNmQpNipD4TASnc0yqFP7BMHa5WePL9aJEGNd6kGKJL8BEwB1CVWKzcpQiIxBZ6MMNNsRDmPjMLceYMusUqSEGvXtdbv+avn92YtlA4NL+UtKUHz777D2EsBXtVw5gqtCpC6tVyKXgZjrNahdST5CvDNyb5VxcSb6V4B2JSNxHUeM4424vbqs8QMAN1Ix1C7te8S0AyglK6DdC7QLqRuIZXYpRobyRPRPAlWS4y/nYYCfQuqyGxY/AbEJPoPP1epsLINzMea5RSxy5+Ar2MuyxS3jxs79jh+MoQh+gW1u3pXIWnh9AWiTuwebCythZDidjv51QIvcCdgabdgv1O0opDVU6S2GX4dOlRq9gvb3UhaUlPlg9wNad6xPKa7SZvYokpLkLC8blUYpbi8bhEN/m2Mu6tQkeOPzIJnWanuisnA445uIFhnbzhKHP++psqXYShneR1Q8Z/SVysqRhzA8jLEz7RofxTruTdOAC546D7GuEtkJry4S5twbrNnkiG4/5nySssChG3zqDDyYJOz+VVzvyomCzxA/6209c3wwRz/IpbGw+rlBUNysDwE+zy9Pwo41sEOCd4Go0g1vZmal/xTzqwpEwrI2/50r9tjOK2CvsMppaJrO2T8LTClsMcvmQPcmYNvluUsU4a/bR0AC4AvwPiXP8p3Hw0+xf0fJdlMz6wynD9Bf1FSj9QX08RIQcp2tm2hdYzFUuNFyb+LZeyghmfPAY2ByKCfJbspAykDKwP+RgT/k5YRXgmClowAAAABJRU5ErkJggg== rectangle.and.arrow.up.right.and.arrow.down.left iVBORw0KGgoAAAANSUhEUgAAAC8AAAA7CAYAAADrYNMhAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAABGlFAAAPowAD8kEAAA3rAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAC+gAwAEAAAAAQAAADsAAAAAKsqlggAAAAlwSFlzAAALGwAACyoB4k2TzwAAAvlJREFUaAXtmTmIFEEUhsdrPRAVRNREdF3NDLzAQDQQxFA01MTAC9lEzA02NhAzMwUTUQMPjBQTETQRDEUYURdFxQOPFby+H22mGaqrXs9WbTdsPfi2e+u9fv33m6rqmppOJ1uuQK5ArkCuQKACMwJ+l3sHjbtgJQy5Amq2TRDfhVvwBMxWR/wCsl6FEbgOL+EnTNbmkmAY9sEVGIU/ENXOke0SzI6atZdsEacP4GivKc6ZuscHWBonXWWW7XgeV3oHdGxIkdShRZ/qDzB9ujMdCVxNS2hU5VObxtA3WGy5kVW84qIPogqBv2k36TIFVdwkVfN+En+0JDf1LUuiiDH3rLmaEn8agccCIp/j3+aLaUr8WUTphSTTWFI/L9DMdhE2QhTbSZa7UTL5k2zCPQ6HQFOm15qqvEvUVhpvwmF46Arob2vLbKO+fRuOg9ZNJl1tqLyEa0Up4ddAZhJvCvqXL8nfsvDLpTuYdJmCSkljnlYJ1z1MS/WmxGtWKbpKueK1itNUn5+FyoOgQeoyTZNaoHmtKfGPvKo6ndf4VwRibKM6lCSyX2NhDgRfUk31ed/zaizo+0PQ2ig+KLoImBbi3/G094snzsfqCrzHtaza3fOEus18Qsd64c6zec7WFjSuRcNXj471+F7BFk9MXZe58qHEPvGF8FOhJDX9ycWnEq7njCr+c1/lUgqPLr68U7aO7OrjsbtKuT5RK//2f+Zhji/gZPlOCc6jitcKbzV0YRRSW1Txn1D7DEKbRLEeyiw+tJ7XRpA2/SdgN+wBvdgK9HVNm0Zn4A5MqYXEd1FzAPTTi8+e+pzTyWfuNqG1TVG0zZycL/5py9EqfiGCR6ZQtMZR0Kziv5Mp1O+DNzMGaJWqCSKaLSeT5vvUph0DffExmbXyb8imt+teU9bBg45wqXaKo5t+I9VS4QSoQrFM74o1MAbjsAqSmGadG/AF9LOj+uZk+UUOTY8XoJZwPfUgpuv05h0a5OK+azQZqBjZcgVyBXIFWlqBvzlogkNrEJLXAAAAAElFTkSuQmCC + arrow.up.left.and.arrow.down.right + iVBORw0KGgoAAAANSUhEUgAAADMAAAAxCAYAAAB3aZEhAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAARrdAAAD6gAkGscAAH+LAAOgAQADAAAAAQABAACgAgAEAAAAAQAAADOgAwAEAAAAAQAAADEAAAAAAMt5IQAAAAlwSFlzAAALHQAACyUBs4xsHQAAAktJREFUaAXtmb1OFFEYhgfBxVBBZaOXYUFhPFSUxIbSa/ACNBJ+TSytDVcCDKG2MbHDZP1DCxNaAonwvGQPmYznzMLMyHxDzpc8zO75gfc5Z3Z2mc2yVGkF0grcZAUmIoOnaJ+H+5H+cc2fGPBn3KC2+xU6VC9pfAc7cAwPAkzSFivN3Y51/q/2mMwcf/AjPIYXcATmKyaj4B9gFvZgAcwLVckMENgCVQ4S+glmq0pmepS6KORoMytUJaOd8VUU0g798B2WjteVUeay0HdLIspSJeNPs2LmopCjw5RQlUyszwvtIyOhb2CiYoHHhfNCOQMdmBCqK0P+y9fQBMccdFH4Cp1WExkF3wQv5HjcqVBTGfJnG3APcnDQmVAbMuTP1kA7tA8OhnDr1ZaMgq9CcYeGarzNisl8JkSd/2VWmKcdysHBEHpfOu302pnpvclIYJGjTrtUaQXSCjRbgUGz6XZmPyXKF9CNkjtR61g0EXrO/IeWVkJCh/CoRqgD5iyF5sU+AYTGttn2il92Djk8g1ZuknQlQ/7stX5QOThoLNSlDPmvhHSj0cER1K6uZRTc75AX+lXXxoKMF9KnbQktQC0hKzIS8heF2kKWZCSkU+4vVAmpP1jWZBTyDZxDTOhUg0JlUUY5VyC2Q2caECqrMsq6CiGh3u2MX/j1gFBvZSS1WRLq5WkmEV9veeBPuaFvLB+7es0sE+RJOczoua5kWv2TEnoj/Q26UfIe/qmuZAYkqbpzM0m/vq4vl74B1yV7t9yRnqcVSCtw8xW4AGLQa0Iaa7hCAAAAAElFTkSuQmCC + text.alignright + iVBORw0KGgoAAAANSUhEUgAAADUAAAAoCAYAAABerrI1AAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAABK8DAAAQXQAAA8AAAAANAAOgAQADAAAAAQABAACgAgAEAAAAAQAAADWgAwAEAAAAAQAAACgAAAAALQUdrwAAAAlwSFlzAAALRQAAC1sB4u2y/wAAANlJREFUaAXtlrENwkAMRYOUFsQIEQMwAxKjsAEtLQNkBCagQ/RMQIeYAHpKJODT25HOycEV76RrbP9v+1WuKh4EiiOw0kQv/XfBf+1RG3kJxScduRJSDw3xhc6DAAQgAAEIQODfBLouishsW4nmEWFAs5Nmb+lqK9gjdpT20kOfIj2nFFMLAQhAAAIQgEBGAt6ZNFPPZca+Q1ifZHK1jLwzqVFx6UvdvKWsRYlBAAIQgAAEIJCRgHcmRVuOJZxGxYm6u+qflmbopQ5qsrAaZYht5Nlm8MXyZwQ+jr83O3m7psgAAAAASUVORK5CYII= + paintbrush + iVBORw0KGgoAAAANSUhEUgAAADYAAABFCAYAAAAB8xWyAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAACvq9AAAm/AACsHcAAAl3AAOgAQADAAAAAQABAACgAgAEAAAAAQAAADagAwAEAAAAAQAAAEUAAAAApThRpgAAAAlwSFlzAAALFwAACzABJaKpbwAABI5JREFUaAXtmGvIDVsYx93vIQdRJLkkucvdB8r9dpBbJxFvHOmcI+UcPiAkhS8unxD5IiJKLif3VymXcjmUks7rdXeOw3FLuRS/f/Zi2s3MXrP3zLx7NE/99qy9Zq1nPf9n1qw1M5UqpZZmIM1AmoE0A2kG0gykGYgrA1XjGigzThuOa2AM3IV/IRKrEolXd6cNqS6FFvAWzoEEJt5+Q8EFqJxRMoLjSxib+Z/YwxEi/zUr+uH8T7w43U8ds4Tpb6LFdUDAIxdRpiqx4hagYKtR4XEcRn3ipuUZgh7pIchZbcSNc1YWa7k5gen+qmEZYGLELUXQRktRptlQCpqWRXvlqhPcA+gEQc2I+zFoxzjaz2OQPwsYaAh9deWKSlxtAroPA6EQk7gXUDTi1hDMwUIUOfrupPweKlxcZ4JQlvU0H4bdwsknkLjxYTjMx0ctOt2ARfl0dunTizqJMlSYuG0EcQzMUzzFguwAvY0oc4xdnF5NyqBJQVK+dR5E0Ygxx+vUzYTYVst+DPY/uD3BUx3Y9GJaDkaQjrugLsjMVtD7y9/wfifgqhTOgTJ4HH6HsMw5BV/jdLaLY82Qiy71eVetoOcj+BlK4G9QRkdDGLYKJ+ZKnaTc2sOp9sqP0MjjfKBqDVoOrRy9fqB8FU5Aod9RdBUkSsmaCn5Wn5NaSMz09Gvre06D3gO3DErcX7ADChE3hf668lUhl62mwb5cjXKdb0ADfV3q49OwMefCEOczxNdTcyiVQ7OvNXkWetDvlUXfOMTpvr4PbS3iydlEN+p/oBfBXKZpeQ0KnZZu48yi8gG0dzuZb90kOj6FrhYOohA3g3G1GuvjUOimuV0R4qYz7mMI6wHANTFxi/uJKJ5APm/irgL8KoOK0z6Xzz03jX7/gM3094s30LmoxWlP0xeu7oGiCqnxXPzonuti4U+PPrZXzixUPS38RtJEryiXYI+ldxtxE/GlrSX0J3ebGCVoLTyHzaCAbU1tr4DbPadX/2fQF2I1CVoHr2Ev5Lv7G3H78aE9T6bVT6IG6E9c1oCB9NApQYegB7hZSyqPgM0qZsS9o732KC3psYnSk/o80AKhbxm55v1u2pRCkE38Nu3XQy2IxdoxynnQSjbYYsSetNGeUw/Mamlz5WbT/izEYv0ZRVlfAjbvRgrqNPyhQsZsxf1C+1OmU5THpjhX5icHGGQobZWIull9conT4qNNeGJWv0j+bsDr9oCeNWUXe/TxEteG9nqvWunRL/Tqh3js5fBag7JWK62MbjaKSmU9+2o52xpxwzKV8q/3qhWZ/5EftDLpY0odx0ia/6orBy0MTqvMn8uw0FnpUdZjkhLwAt7AfIjNFKj2leaZEbVw6BOXhIlu4DR9SboDNZ2VPmW16wTZCfLpEt4pfcsrcbhbRllZ3gUSbkxXVaJ0JRJho4hSAXvdU0bEJgqHzZ+kHLcR6Blo6BGw7ind/GbKejQrvupqhLQFFLw+lHaAFqCreRTKoCMk1rQ866H2JXyAm7AcKuTmZ9xIzLlwRDJA6jTNQJqBNANpBtIMpBn4jjPwGXuy45Ouy5hGAAAAAElFTkSuQmCC + lock.shield + iVBORw0KGgoAAAANSUhEUgAAADAAAAA2CAYAAACBWxqaAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAABHfJAAAP3QAADzAAAAA1AAOgAQADAAAAAQABAACgAgAEAAAAAQAAADCgAwAEAAAAAQAAADYAAAAArZm05AAAAAlwSFlzAAALFwAAC0gBwkRakQAAA4ZJREFUaAXtmFuITVEYx8ctt9wakowZxSSTaESYF8eQ3HNJlBgeiJS8KIYQIw8eEF6mpEZTQ5oIL2MKD0qJxLhfIjHjXphy5/cfnTo5Z699W3vOTO2vfufs9voua31r7W/vtXJyYokzEGcgzkA2M9ApwuAd8T0S+sH7CONYd12Ex33QCHfgCTyHCiiENim96dUauApNoAEo+0kZy8Uh0ExcgdXQB7IqHYg+BY7DJzgL86EzOElXGpZCHXyBaigF+Wo1ySfSdngKj2ALDAK/UoDBTngGWmZbYTBEIv9nroooky1F0sM+HU5AM5wDzaS1ArMYZ1rX12EdRLl2c/G/ERpAMzwVQkkx1p9hVigvwYz1rCi2llpg2YVlpU9rPZCLoBZURm9DDQRJwmns1oOjmCqGjAaCHlSvomflJIyBg7AftJYnwlG4ACvhN3iRxyipD47iNgAF/+lond6wl1sKOBpUWpNyiQsN4CKUQwV4EcVWHxxFFcCW9MfRWlgOqZ1P+n/LxSrYBN2TN8P+2xxAgs7cBNOSu0Z7I5SAFbE5AFWLhx569QCdfA96nlRsDqAbEb96iCod6VoRmwOw0iG/Ttr9ANzKqJeEDENJNX8SaGnMBZNog5OAabABXkJgsTGAA0SfndKDHinXTpcqowtBn9RlTkpe7ttYQnppBZUwti0xbQxAnw9BJXQ1sjGAoJ23YhcPwEoaQziJZyBE8rya/jEpus3Ad4xDVwpTB1zaFPuHScdtADqICnJkYorpp02xP5gM3AZwD+NxJge0GafYxdZtazke+/suPozN2h5+g6EGrRu0aRBBqDf4nUBbM/Q06HhqqkHrmEFzBW3au/odgBIzz+C3jrZKQ3tLk5czyQI0b4H2s7UtVuk/Q7g1ArqkN2W8o87fhaaMrf8Ot3bQVgTagoYWfSJro14a2pO7Ax0KqPrNcVf1p7EEdQ1imT8zX9rlaGt2IouRwPkbOAw23w+5+DsDH2EGRCp5eL8MDVBsIdJMfLwCHblod9cqotOyzaAd1W4Isifoi52qmyrYHvBaAFC1J6NwpcypopT4cLsAXWVdB796WWVVNBs6LtRs6NnoBU6iF+Mp0NnQNshK1ombUbR+6+EFpG7yk8p64enbSjqFyZtt8b+MTr2DasiD4XAeXkNk5RHfVmUA3qrgF+hz+AjooW13ojWvGh9LnIE4A3EGMmfgL1hCpIHRaszPAAAAAElFTkSuQmCC Versions @@ -884,6 +892,113 @@ Users can choose to prefer the original photo instead of an edited version and a + + Version + 11.5 + ReleaseNotes + + + Title + Full Screen PDF View + Subtitle + A PDF file can be opened in fullscreen view and hides unnecessary UI elements. + Type + New + ImageName + arrow.up.left.and.arrow.down.right + + + Title + Video Upload Improvements + Subtitle + Added an option to allow uploading original videos like slow motion, unedited version without re-encoding + Type + New + ImageName + camera + + + Title + Right-to-Left Language UI Improvements + Subtitle + We improved our App UI for Right-to-Left languages + Type + New + ImageName + text.alignright + + + Title + UI Improvements + Subtitle + The app is using the ownCloud colors and we also polished some UI elements + Type + New + ImageName + paintbrush + + + Title + Certificate Changes + Subtitle + Show certificate changes in a comparison view + Type + New + ImageName + lock.shield + + + Title + Login Improvements + Subtitle + User login to a bookmark is only possible with the same user ID + Type + New + ImageName + wrench + + + Title + Improved Drag & Drop + Subtitle + We improved Drag & Drop and now it is also possible for non local files + Type + New + ImageName + hand.draw + + + Title + Fix: Bookmark name editing + Subtitle + Editing the bookmark name was not possible + Type + Fix + ImageName + bandage + + + Title + Fix: Sync + Subtitle + Fixed some problems with items in stuck + Type + Fix + ImageName + bandage + + + Title + Fix: Media Playback + Subtitle + Media Player stopped playing, if there was a non media file item in the folder. + Type + Fix + ImageName + bandage + + + diff --git a/ownCloud/Release Notes/ReleaseNotesHostViewController.swift b/ownCloud/Release Notes/ReleaseNotesHostViewController.swift index 0a6c4e223..ef74a896d 100644 --- a/ownCloud/Release Notes/ReleaseNotesHostViewController.swift +++ b/ownCloud/Release Notes/ReleaseNotesHostViewController.swift @@ -103,6 +103,7 @@ class ReleaseNotesHostViewController: UIViewController { footerText = String(format:"Thank you for using %@.\nIf you like our App, please leave an AppStore review.\n❤️".localized, appName) } footerButton.setTitle(footerText, for: .normal) + footerButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.footnote) footerButton.titleLabel?.adjustsFontForContentSizeCategory = true footerButton.titleLabel?.numberOfLines = 0 @@ -239,6 +240,10 @@ class ReleaseNotesDatasource : NSObject, OCClassSettingsUserPreferencesSupport { } } +public extension OCClassSettingsIdentifier { + static let releasenotes = OCClassSettingsIdentifier("releasenotes") +} + extension OCClassSettingsKey { // Available since version 1.3.0 static let lastSeenReleaseNotesVersion = OCClassSettingsKey("lastSeenReleaseNotesVersion") @@ -246,13 +251,27 @@ extension OCClassSettingsKey { } extension ReleaseNotesDatasource : OCClassSettingsSupport { - static let classSettingsIdentifier : OCClassSettingsIdentifier = .app + static let classSettingsIdentifier : OCClassSettingsIdentifier = .releasenotes static func defaultSettings(forIdentifier identifier: OCClassSettingsIdentifier) -> [OCClassSettingsKey : Any]? { - if identifier == .app { - return nil - } - return nil } + + static func classSettingsMetadata() -> [OCClassSettingsKey : [OCClassSettingsMetadataKey : Any]]? { + return [ + .lastSeenReleaseNotesVersion : [ + .type : OCClassSettingsMetadataType.string, + .description : "The app version for which the release notes were last shown.", + .category : "Release Notes", + .status : OCClassSettingsKeyStatus.debugOnly + ], + + .lastSeenAppVersion : [ + .type : OCClassSettingsMetadataType.string, + .description : "The last-seen app version.", + .category : "Release Notes", + .status : OCClassSettingsKeyStatus.debugOnly + ] + ] + } } diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-1024.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-1024.png index 4a363927d..e11ed3b8e 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-1024.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-1024.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20.png index 880bcbb69..00f48a8db 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@2x.png index fa8e9a985..415be8917 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@3x.png index 04c0132e8..e06a34160 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-20@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29.png index 83c4ab81f..10d288c08 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@2x.png index 4f34cfd5a..c7009e370 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@3x.png index 2edd2ce18..d1d090968 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-29@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40.png index fa8e9a985..415be8917 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@2x.png index 0fe5ebfcb..46621e254 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@3x.png index 951c30d00..90f20f466 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-40@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@2x.png index 951c30d00..90f20f466 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@3x.png index 8250aea9a..060f21f82 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-60@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76.png index e83d14de8..e50667f14 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76@2x.png index 548db82e2..104d696f2 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-76@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-83.5@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-83.5@2x.png index 0a409b484..fed0a2898 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-83.5@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon-emm.appiconset/icon-83.5@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png index 87d58ef19..66294a740 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20.png index 8a8e1ec73..7b8c551c4 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png index e43f89300..5265cd644 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png index 07013ae31..397221439 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29.png index 81eb85115..1449e2ce7 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png index fd02a4ac6..1675c21cf 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png index 3e50c9ca4..a14729826 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40.png index e43f89300..5265cd644 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png index 107181d32..c68484026 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png index 0b2623465..7c0aef50c 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png index 7d21ffe07..7c0aef50c 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png index b005715d9..61d545717 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76.png index 3e5e8e479..006d2505c 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png index c68133e4c..bfbe42d61 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png index 5d4aa1175..08dc61093 100644 Binary files a/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png and b/ownCloud/Resources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/Contents.json b/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/Contents.json new file mode 100644 index 000000000..c2da7f841 --- /dev/null +++ b/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "chevron_left.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/chevron_left.pdf b/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/chevron_left.pdf new file mode 100644 index 000000000..cb1032e6b Binary files /dev/null and b/ownCloud/Resources/Assets.xcassets/chevron.left.imageset/chevron_left.pdf differ diff --git a/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/Contents.json b/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/Contents.json new file mode 100644 index 000000000..e53d92766 --- /dev/null +++ b/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "chevron_right.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/chevron_right.pdf b/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/chevron_right.pdf new file mode 100644 index 000000000..ce780a39d Binary files /dev/null and b/ownCloud/Resources/Assets.xcassets/chevron.right.imageset/chevron_right.pdf differ diff --git a/ownCloud/Resources/Assets.xcassets/gear.imageset/Contents.json b/ownCloud/Resources/Assets.xcassets/gear.imageset/Contents.json index 5c76825bc..35d5d770b 100644 --- a/ownCloud/Resources/Assets.xcassets/gear.imageset/Contents.json +++ b/ownCloud/Resources/Assets.xcassets/gear.imageset/Contents.json @@ -1,8 +1,8 @@ { "images" : [ { - "idiom" : "universal", "filename" : "gear.png", + "idiom" : "universal", "scale" : "1x" }, { @@ -15,7 +15,7 @@ } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/ownCloud/Resources/Assets.xcassets/gear.imageset/gear.png b/ownCloud/Resources/Assets.xcassets/gear.imageset/gear.png deleted file mode 100644 index f13515bb5..000000000 Binary files a/ownCloud/Resources/Assets.xcassets/gear.imageset/gear.png and /dev/null differ diff --git a/ownCloud/Resources/Assets.xcassets/xmark.imageset/Contents.json b/ownCloud/Resources/Assets.xcassets/xmark.imageset/Contents.json new file mode 100644 index 000000000..df9d264a2 --- /dev/null +++ b/ownCloud/Resources/Assets.xcassets/xmark.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "xmark.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/ownCloud/Resources/Assets.xcassets/gear.imageset/gear.pdf b/ownCloud/Resources/Assets.xcassets/xmark.imageset/xmark.pdf similarity index 50% rename from ownCloud/Resources/Assets.xcassets/gear.imageset/gear.pdf rename to ownCloud/Resources/Assets.xcassets/xmark.imageset/xmark.pdf index 1edadc079..35ee8a035 100644 Binary files a/ownCloud/Resources/Assets.xcassets/gear.imageset/gear.pdf and b/ownCloud/Resources/Assets.xcassets/xmark.imageset/xmark.pdf differ diff --git a/ownCloud/Resources/Info.plist b/ownCloud/Resources/Info.plist index b913def72..ae0143ed5 100644 --- a/ownCloud/Resources/Info.plist +++ b/ownCloud/Resources/Info.plist @@ -153,5 +153,7 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + PHPhotoLibraryPreventAutomaticLimitedAccessAlert + diff --git a/ownCloud/Resources/PLCrashReporter.LICENSE b/ownCloud/Resources/PLCrashReporter.LICENSE new file mode 100644 index 000000000..1321f221f --- /dev/null +++ b/ownCloud/Resources/PLCrashReporter.LICENSE @@ -0,0 +1,54 @@ +Except as noted below, PLCrashReporter is provided under the +following license: + + Copyright (c) Microsoft Corporation. + Copyright (c) 2008 - 2014 Plausible Labs Cooperative, Inc. + All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +Additional contributions have been made under the same license terms +as above, with copyright held by their respective authors: + + Damian Morris + Copyright (c) 2010 MOSO Corporation, Pty Ltd. + All rights reserved. + + HockeyApp/Bitstadium + Copyright (c) 2012 HockeyApp, Bit Stadium GmbH. + All rights reserved. + +The protobuf-c library, as well as the PLCrashLogWriterEncoding.c +file are licensed as follows: + + Copyright 2008, Dave Benson. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with + the License. You may obtain a copy of the License + at http://www.apache.org/licenses/LICENSE-2.0 Unless + required by applicable law or agreed to in writing, + software distributed under the License is distributed on + an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. diff --git a/ownCloud/Resources/Theming/Branding-default.plist b/ownCloud/Resources/Theming/Branding-default.plist new file mode 100644 index 000000000..0c67376eb --- /dev/null +++ b/ownCloud/Resources/Theming/Branding-default.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/ownCloud/Resources/Theming/Branding-owncloud-online-legacy.plist b/ownCloud/Resources/Theming/Branding-owncloud-online-legacy.plist new file mode 100644 index 000000000..f72968f46 --- /dev/null +++ b/ownCloud/Resources/Theming/Branding-owncloud-online-legacy.plist @@ -0,0 +1,616 @@ + + + + + canAddAccount + + canEditAccount + + organizationName + ownCloud.online + feedbackMail + + Configuration + + Profiles + + + identifier + ownCloud.online + name + ownCloud.online + welcome + Welcome to ownCloud.online + promptForPasswordAuth + Enter your username and password + promptForTokenAuth + Please log in to authorize the app. + promptForURL + Please enter your ownCloud.online URL + promptForHelpURL + If you do not have an ownCloud.online account yet, you can request a free test account. + helpURLButtonString + TRY IT FOR FREE + bookmarkName + ownCloud.online + url + + canConfigureURL + + helpURL + https://owncloud.online/try/ + allowedHosts + + owncloud.online + owncloud.com + owncloud.team + + allowedAuthenticationMethods + + com.owncloud.basicauth + com.owncloud.oauth2 + + + + URLs + + Help + https://owncloud.online/faq/ + Privacy + https://owncloud.online/privacy-policy/ + + Generic + + Corporate + + Color + #52DDA9 + + Action + + Primary + #1279C5 + Inverse + #FFFFFF + Secondary + #777777 + + Text + + Primary + #333333 + Inverse + #000000 + Secondary + #666666 + Inverse-Light + #000000 + Disabled + #BFC9D9 + + Login + + Primary + #333333 + Inverse + #FFFFFF + Secondary + #666666 + Inverse-Light + #F2F4F7 + Disabled + #BFC9D9 + + Background + + Standard + #FFFFFF + Light + #EEEEEE + Input-Form + #FFFFFF + Selected + #E5EFFF + Tooltip + #1F2939 + + System + + success + #4CD964 + success-background + #DBF7E0 + warning + #FF8800 + warning-background + #FFE7CC + danger + #E00000 + danger-background + #F9CCCC + + Status + + Progress-Indicator + #7357C7 + Progress-Background + #D5D3DC + + Icon + + System + #667FA3 + System-Light + #CCD4E0 + Filetype-Normal + #00af90 + Disabled + #C4C4C4 + + Tab + + Active + #000000 + Inactive + #777777 + + + Themes + + + Name + ownCloud.online + Identifier + com.owncloud.branding + ThemeStyle + contrast + darkBrandColor + Corporate.Color + lightBrandColor + #628a99 + Colors + + tintColor + #000000 + Label + + informativeColor + + successColor + System.Success + warningColor + System.Warning + errorColor + System.Danger + + Fill + + approvalColors + + normal + + background + #52DDA9 + foreground + + + highlighted + + background + #52DDA9 + foreground + + + disabled + + background + #37C390 + foreground + + + + neutralColors + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + destructiveColors + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + Favorite + + enabledColor + + disabledColor + + + Table + + tableBackgroundColor + Background.Standard + tableGroupBackgroundColor + + tableSeparatorColor + + tableRowBorderColor + + tableRowColors + + backgroundColor + Background.Standard + labelColor + Text.Primary + secondaryLabelColor + Text.Secondary + symbolColor + Action.Primary + tintColor + + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + tableRowHighlightColors + + backgroundColor + #DCEBF6 + labelColor + + secondaryLabelColor + + symbolColor + + tintColor + + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + + Icon + + folderFillColor + Icon.Filetype-Normal + fileFillColor + Icon.Filetype-Normal + logoFillColor + Icon.Filetype-Normal + iconFillColor + Icon.Filetype-Normal + symbolFillColor + Icon.Filetype-Normal + + Progress + + foreground + Progress.Indicator + background + Progress.Background + + Toolbar + + backgroundColor + Corporate.Color + labelColor + Text.Inverse + secondaryLabelColor + + symbolColor + + tintColor + Tab.Active + filledColorPairCollection + + normal + + background + + foreground + Tab.Inactive + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + Searchbar + + backgroundColor + Background.Input-Form + labelColor + Text.Inverse + secondaryLabelColor + Text.Secondary + symbolColor + + tintColor + Text.Inverse + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + Login + + backgroundColor + Background.Standard + labelColor + Login.Primary + secondaryLabelColor + Login.Secondary + symbolColor + + tintColor + Login.Inverse + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + NavigationBar + + backgroundColor + #FFFFFF + labelColor + Text.Inverse + secondaryLabelColor + + symbolColor + + tintColor + Text.Inverse-Light + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + darkBrandColors + + backgroundColor + + labelColor + + secondaryLabelColor + + symbolColor + + tintColor + + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + lightBrandColors + + backgroundColor + + labelColor + + secondaryLabelColor + + symbolColor + + tintColor + + filledColorPairCollection + + normal + + background + + foreground + + + highlighted + + background + + foreground + + + disabled + + background + + foreground + + + + + + Styles + + statusBarStyle + darkContent + barStyle + black + activityIndicatorViewStyle + gray + searchBarActivityIndicatorViewStyle + white + interfaceStyle + light + keyboardAppearance + light + backgroundBlurEffectStyle + light + + + + + diff --git a/ownCloud/Resources/Theming/Branding-owncloud-online.plist b/ownCloud/Resources/Theming/Branding-owncloud-online.plist index f72968f46..8931774b4 100644 --- a/ownCloud/Resources/Theming/Branding-owncloud-online.plist +++ b/ownCloud/Resources/Theming/Branding-owncloud-online.plist @@ -2,17 +2,15 @@ - canAddAccount + branding.can-add-account - canEditAccount + branding.can-edit-account - organizationName + branding.organization-name ownCloud.online - feedbackMail + branding.send-feedback-address - Configuration - - Profiles + branding.profile-definitions identifier @@ -52,14 +50,11 @@ - URLs - - Help - https://owncloud.online/faq/ - Privacy - https://owncloud.online/privacy-policy/ - - Generic + branding.url-help + https://owncloud.online/faq/ + branding.url-privacy + https://owncloud.online/privacy-policy/ + branding.theme-generic-colors Corporate @@ -155,7 +150,7 @@ #777777 - Themes + branding.theme-definitions Name diff --git a/ownCloud/Resources/Theming/branding-splashscreen-background.png b/ownCloud/Resources/Theming/branding-splashscreen-background.png index 17ec30196..ca2b68fcf 100644 Binary files a/ownCloud/Resources/Theming/branding-splashscreen-background.png and b/ownCloud/Resources/Theming/branding-splashscreen-background.png differ diff --git a/ownCloud/Resources/ar.lproj/Localizable.strings b/ownCloud/Resources/ar.lproj/Localizable.strings index cbd78d8ce..bda6ef265 100644 Binary files a/ownCloud/Resources/ar.lproj/Localizable.strings and b/ownCloud/Resources/ar.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/de-DE.lproj/Localizable.strings b/ownCloud/Resources/de-DE.lproj/Localizable.strings index fc6393c1b..88b4896e5 100644 Binary files a/ownCloud/Resources/de-DE.lproj/Localizable.strings and b/ownCloud/Resources/de-DE.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/de.lproj/InfoPlist.strings b/ownCloud/Resources/de.lproj/InfoPlist.strings index 1bd58128e..31069d00f 100644 Binary files a/ownCloud/Resources/de.lproj/InfoPlist.strings and b/ownCloud/Resources/de.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/de.lproj/Localizable.strings b/ownCloud/Resources/de.lproj/Localizable.strings index b2d28f6b2..0ae2fd8c9 100644 Binary files a/ownCloud/Resources/de.lproj/Localizable.strings and b/ownCloud/Resources/de.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/de_CH.lproj/InfoPlist.strings b/ownCloud/Resources/de_CH.lproj/InfoPlist.strings new file mode 100644 index 000000000..31069d00f Binary files /dev/null and b/ownCloud/Resources/de_CH.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/de_CH.lproj/Localizable.strings b/ownCloud/Resources/de_CH.lproj/Localizable.strings new file mode 100644 index 000000000..b97d838a3 Binary files /dev/null and b/ownCloud/Resources/de_CH.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/el.lproj/Localizable.strings b/ownCloud/Resources/el.lproj/Localizable.strings index d0af3d7c3..bf00d4605 100644 Binary files a/ownCloud/Resources/el.lproj/Localizable.strings and b/ownCloud/Resources/el.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/en.lproj/Localizable.strings b/ownCloud/Resources/en.lproj/Localizable.strings index 19ebaaacf..82076d6fd 100644 --- a/ownCloud/Resources/en.lproj/Localizable.strings +++ b/ownCloud/Resources/en.lproj/Localizable.strings @@ -34,6 +34,7 @@ "Cancel" = "Cancel"; "Approve" = "Approve"; "Error" = "Error"; +"Issues" = "Issues"; "Review Connection" = "Review Connection"; "Authenticated via" = "Authenticated via"; "Authenticated as %@ via %@" = "Authenticated as %@ via %@"; @@ -200,6 +201,7 @@ "Privacy Policy" = "Privacy Policy"; "Terms Of Use" = "Terms Of Use"; "Acknowledgements" = "Acknowledgements"; +"Portions of this app may utilize the following copyrighted material, the use of which is hereby acknowledged." = "Portions of this app may utilize the following copyrighted material, the use of which is hereby acknowledged."; "Video upload path" = "Video upload path"; "Photo upload path" = "Photo upload path"; "Immediately" = "Immediately"; @@ -303,6 +305,7 @@ "Please try again in %@" = "Please try again in %@"; "Unlock %@" = "Unlock %@"; "Biometric authentication failed" = "Biometric authentication failed"; +"You are required to set the passcode" = "You are required to set the passcode"; /* Certificate management */ @@ -591,6 +594,9 @@ "Overview" = "Overview"; "All Files" = "All Files"; +/* Single Account */ +"You are connected as\n%@" = "You are connected as\n%@"; + /* Release Notes */ "Proceed" = "Proceed"; "New in %@" = "New in %@"; @@ -691,6 +697,9 @@ "Purchase" = "Purchase"; "Subscribe" = "Subscribe"; +"No accounts found" = "No accounts found"; +"In order to accurately determine your current licensing status, please add one or more accounts first." = "In order to accurately determine your current licensing status, please add one or more accounts first."; + /* Share Sheet */ "Save File" = "Save File"; "Choose an account and folder to import into." = "Choose an account and folder to import into."; @@ -831,4 +840,9 @@ "Extended upload settings" = "Extended upload settings"; "Prefer unedited photos" = "Prefer unedited photos"; "Prefer RAW photos" = "Prefer RAW photos"; +"Prefer original videos" = "Prefer original videos"; +/* Limited photo library access */ +"Limited Photo Access" = "Limited Photo Access"; +"Access for the media selected for upload is limited" = "Access for the media selected for upload is limited"; +"No Access to the media selected for upload" = "No Access to the media selected for upload"; diff --git a/ownCloud/Resources/es.lproj/Localizable.strings b/ownCloud/Resources/es.lproj/Localizable.strings index ad747792e..3a13588b9 100644 Binary files a/ownCloud/Resources/es.lproj/Localizable.strings and b/ownCloud/Resources/es.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/gl.lproj/Localizable.strings b/ownCloud/Resources/gl.lproj/Localizable.strings index eeca7e208..eaa1fac67 100644 Binary files a/ownCloud/Resources/gl.lproj/Localizable.strings and b/ownCloud/Resources/gl.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/he.lproj/Localizable.strings b/ownCloud/Resources/he.lproj/Localizable.strings index abec94045..86a14ae0c 100644 Binary files a/ownCloud/Resources/he.lproj/Localizable.strings and b/ownCloud/Resources/he.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/nl.lproj/Localizable.strings b/ownCloud/Resources/nl.lproj/Localizable.strings new file mode 100644 index 000000000..67258a521 Binary files /dev/null and b/ownCloud/Resources/nl.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/pt-BR.lproj/InfoPlist.strings b/ownCloud/Resources/pt-BR.lproj/InfoPlist.strings index 1bf3229f9..9d54dfa13 100644 Binary files a/ownCloud/Resources/pt-BR.lproj/InfoPlist.strings and b/ownCloud/Resources/pt-BR.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/pt-BR.lproj/Localizable.strings b/ownCloud/Resources/pt-BR.lproj/Localizable.strings index f67a2ac2e..a797be010 100644 Binary files a/ownCloud/Resources/pt-BR.lproj/Localizable.strings and b/ownCloud/Resources/pt-BR.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/ru.lproj/InfoPlist.strings b/ownCloud/Resources/ru.lproj/InfoPlist.strings index ca226db0d..a021513a8 100644 Binary files a/ownCloud/Resources/ru.lproj/InfoPlist.strings and b/ownCloud/Resources/ru.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/ru.lproj/Localizable.strings b/ownCloud/Resources/ru.lproj/Localizable.strings index beb1856ef..88b929208 100644 Binary files a/ownCloud/Resources/ru.lproj/Localizable.strings and b/ownCloud/Resources/ru.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/sq.lproj/Localizable.strings b/ownCloud/Resources/sq.lproj/Localizable.strings index b50efa7af..81f3e0481 100644 Binary files a/ownCloud/Resources/sq.lproj/Localizable.strings and b/ownCloud/Resources/sq.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/th-TH.lproj/InfoPlist.strings b/ownCloud/Resources/th-TH.lproj/InfoPlist.strings index e841088f6..9f50e3a4a 100644 Binary files a/ownCloud/Resources/th-TH.lproj/InfoPlist.strings and b/ownCloud/Resources/th-TH.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/th-TH.lproj/Localizable.strings b/ownCloud/Resources/th-TH.lproj/Localizable.strings index 0a39df6b2..d6bc1e9e3 100644 Binary files a/ownCloud/Resources/th-TH.lproj/Localizable.strings and b/ownCloud/Resources/th-TH.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/tr.lproj/Localizable.strings b/ownCloud/Resources/tr.lproj/Localizable.strings index 5a8a5a92d..2ce2cbd36 100644 Binary files a/ownCloud/Resources/tr.lproj/Localizable.strings and b/ownCloud/Resources/tr.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/zh-Hans.lproj/Localizable.strings b/ownCloud/Resources/zh-Hans.lproj/Localizable.strings index 8e625d72f..a8b6c60da 100644 Binary files a/ownCloud/Resources/zh-Hans.lproj/Localizable.strings and b/ownCloud/Resources/zh-Hans.lproj/Localizable.strings differ diff --git a/ownCloud/Resources/zh_TW.lproj/InfoPlist.strings b/ownCloud/Resources/zh_TW.lproj/InfoPlist.strings new file mode 100644 index 000000000..c919b9641 Binary files /dev/null and b/ownCloud/Resources/zh_TW.lproj/InfoPlist.strings differ diff --git a/ownCloud/Resources/zh_TW.lproj/Localizable.strings b/ownCloud/Resources/zh_TW.lproj/Localizable.strings new file mode 100644 index 000000000..eabd58be1 Binary files /dev/null and b/ownCloud/Resources/zh_TW.lproj/Localizable.strings differ diff --git a/ownCloud/SDK Extensions/OCIssue+Extension.swift b/ownCloud/SDK Extensions/OCIssue+Extension.swift index 7efb21681..e9cbc3d7e 100644 --- a/ownCloud/SDK Extensions/OCIssue+Extension.swift +++ b/ownCloud/SDK Extensions/OCIssue+Extension.swift @@ -24,6 +24,10 @@ struct DisplayIssues { var displayLevel : OCIssueLevel //!< The issue level to be used for display var displayIssues: [OCIssue] //!< The selection of issues to be used for display var primaryCertificate : OCCertificate? //!< The first certificate found among the issues + + func isAtLeast(level minLevel: OCIssueLevel) -> Bool { + return displayLevel.rawValue >= minLevel.rawValue + } } extension OCIssue { diff --git a/ownCloud/Server List/ServerListBookmarkCell.swift b/ownCloud/Server List/ServerListBookmarkCell.swift index c834489b7..4403f9f10 100644 --- a/ownCloud/Server List/ServerListBookmarkCell.swift +++ b/ownCloud/Server List/ServerListBookmarkCell.swift @@ -18,6 +18,7 @@ import UIKit import ownCloudSDK +import ownCloudApp import ownCloudAppShared class ServerListBookmarkCell : ThemeTableViewCell { @@ -48,7 +49,7 @@ class ServerListBookmarkCell : ThemeTableViewCell { infoView.translatesAutoresizingMaskIntoConstraints = false iconView.contentMode = .scaleAspectFit - iconView.image = UIImage(named: "branding-bookmark-icon") + iconView.image = Branding.shared.brandedImageNamed(.bookmarkIcon) titleLabel.font = UIFont.preferredFont(forTextStyle: .headline) titleLabel.adjustsFontForContentSizeCategory = true @@ -67,20 +68,20 @@ class ServerListBookmarkCell : ThemeTableViewCell { iconView.widthAnchor.constraint(equalToConstant: 40), iconView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), - iconView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 20), - iconView.rightAnchor.constraint(equalTo: titleLabel.leftAnchor, constant: -25), - iconView.rightAnchor.constraint(equalTo: detailLabel.leftAnchor, constant: -25), + iconView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20), + iconView.trailingAnchor.constraint(equalTo: titleLabel.leadingAnchor, constant: -25), + iconView.trailingAnchor.constraint(equalTo: detailLabel.leadingAnchor, constant: -25), - titleLabel.rightAnchor.constraint(equalTo: infoView.leftAnchor), + titleLabel.trailingAnchor.constraint(equalTo: infoView.leadingAnchor), titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 20), titleLabel.bottomAnchor.constraint(equalTo: detailLabel.topAnchor, constant: -5), - detailLabel.rightAnchor.constraint(equalTo: infoView.leftAnchor), + detailLabel.trailingAnchor.constraint(equalTo: infoView.leadingAnchor), detailLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -20), infoView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 20), infoView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -20), - infoView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -20) + infoView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20) ]) infoView.setContentHuggingPriority(.required, for: .horizontal) diff --git a/ownCloud/Server List/ServerListTableViewController.swift b/ownCloud/Server List/ServerListTableViewController.swift index 7e4e90f13..225e8472b 100644 --- a/ownCloud/Server List/ServerListTableViewController.swift +++ b/ownCloud/Server List/ServerListTableViewController.swift @@ -210,6 +210,10 @@ class ServerListTableViewController: UITableViewController, Themeable { settingsBarButtonItem ] + if AppLockManager.shared.passcode == nil && AppLockManager.shared.isPasscodeEnforced { + PasscodeSetupCoordinator(parentViewController: self, action: .setup).start() + } + if showBetaWarning, shownFirstTime { showBetaWarning = !considerAutoLogin() } diff --git a/ownCloud/Settings/Certificate Management/CertificateManagementViewController.swift b/ownCloud/Settings/Certificate Management/CertificateManagementViewController.swift index b3d2bb8d1..0a4d99326 100644 --- a/ownCloud/Settings/Certificate Management/CertificateManagementViewController.swift +++ b/ownCloud/Settings/Certificate Management/CertificateManagementViewController.swift @@ -49,9 +49,8 @@ class CertificateManagementViewController: StaticTableViewController { let approvalDate = shortReason + " " + ((certificate.userAcceptedDate==nil) ? " \("undated".localized)" : DateFormatter.localizedString(from: certificate.userAcceptedDate!, dateStyle: .medium, timeStyle: .short)) let certificateRow = CertificateManagementRow(subtitleRowWithAction: { (row, _) in - if let certificateDetailsViewController = ThemeCertificateViewController(certificate: certificate) { - row.viewController?.navigationController?.pushViewController(certificateDetailsViewController, animated: true) - } + let certificateDetailsViewController = ThemeCertificateViewController(certificate: certificate, compare: nil) + row.viewController?.navigationController?.pushViewController(certificateDetailsViewController, animated: true) }, title: certificate.hostName ?? "", subtitle: approvalDate, accessoryType: .disclosureIndicator) certificateRow.certificate = certificate diff --git a/ownCloud/Settings/LogFilesViewController.swift b/ownCloud/Settings/LogFilesViewController.swift index 88b2bcb0f..418234da4 100644 --- a/ownCloud/Settings/LogFilesViewController.swift +++ b/ownCloud/Settings/LogFilesViewController.swift @@ -17,7 +17,10 @@ */ import UIKit +import CoreServices + import ownCloudSDK +import ownCloudApp import ownCloudAppShared class LogFileTableViewCell : ThemeTableViewCell { @@ -57,7 +60,7 @@ extension OCLogFileRecord { } } -class LogFilesViewController : UITableViewController, Themeable { +class LogFilesViewController : UITableViewController, UITableViewDragDelegate, Themeable { var logRecords = [OCLogFileRecord]() @@ -87,6 +90,8 @@ class LogFilesViewController : UITableViewController, Themeable { super.viewDidLoad() Theme.shared.register(client: self, applyImmediately: true) self.tableView.register(LogFileTableViewCell.self, forCellReuseIdentifier: LogFileTableViewCell.identifier) + self.tableView.dragDelegate = self + self.tableView.dragInteractionEnabled = true self.title = "Log Files".localized } @@ -165,6 +170,39 @@ class LogFilesViewController : UITableViewController, Themeable { ] } + // MARK: - Table view drag & drop support + func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { + if DisplaySettings.shared.preventDraggingFiles { + return [UIDragItem]() + } + + var logURL : URL? + var logName : String? + + provideLogURL(at: indexPath, makeNamedCopy: false) { (url, name, completionHandler) in + logURL = url + logName = name + + // Since we use false for makeNamedCopy, this should be safe + completionHandler?() + } + + if let logURL = logURL { + let itemProvider = NSItemProvider() + itemProvider.registerFileRepresentation(forTypeIdentifier: kUTTypeUTF8PlainText as String, fileOptions: [], visibility: .all, loadHandler: { (completionHandler) -> Progress? in + completionHandler(logURL, true, nil) + return nil + }) + itemProvider.suggestedName = logName + + let dragItem = UIDragItem(itemProvider: itemProvider) + + return [dragItem] + } + + return [UIDragItem]() + } + // MARK: - Private Helpers private func populateLogFileList() { @@ -180,7 +218,7 @@ class LogFilesViewController : UITableViewController, Themeable { } } - private func shareLogRecord(at indexPath:IndexPath, sender: UITableViewCell) { + private func provideLogURL(at indexPath: IndexPath, makeNamedCopy: Bool, completionHandler: (_ fileURL: URL?, _ name: String?, _ doneBlock: (() -> Void)?) -> Void) { let logRecord = self.logRecords[indexPath.row] // Create a file name for sharing with format ownCloud__