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__