From 27c436293f446d9746745eb9796bf37a9e25a994 Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Tue, 13 Jul 2021 00:41:34 +0200 Subject: [PATCH 01/13] - ProgressIndicatorViewController : extend with Progress object and cancellation support / monitoring - BookmarkViewController: add infinite PROPFIND prepopulation step after account creation - update SDK to provide infinite PROPFIND support --- ios-sdk | 2 +- .../ShareViewController.swift | 2 +- .../xcshareddata/xcschemes/ownCloud.xcscheme | 2 +- .../Bookmarks/BookmarkViewController.swift | 52 +++++++++++----- .../ProgressIndicatorViewController.swift | 61 ++++++++++++++++++- 5 files changed, 99 insertions(+), 20 deletions(-) diff --git a/ios-sdk b/ios-sdk index 9ec25a848..7dce388ac 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit 9ec25a848c2e7a2d74ca8267bdbf984adb9ce8af +Subproject commit 7dce388ac06d3b713cb03c11322a56dc6dc97886 diff --git a/ownCloud Share Extension/ShareViewController.swift b/ownCloud Share Extension/ShareViewController.swift index d77b16573..a4133b06e 100644 --- a/ownCloud Share Extension/ShareViewController.swift +++ b/ownCloud Share Extension/ShareViewController.swift @@ -187,7 +187,7 @@ class ShareViewController: MoreStaticTableViewController { OnMainThread { self.navigationController?.popToViewController(self, animated: false) - let progressViewController = ProgressIndicatorViewController(initialProgressLabel: "Preparing…".localized, cancelHandler: {}) + let progressViewController = ProgressIndicatorViewController(initialProgressLabel: "Preparing…".localized, progress: nil, cancelHandler: {}) self.present(progressViewController, animated: false) diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme index 90beba4d7..854095cfc 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme @@ -203,7 +203,7 @@ + isEnabled = "NO"> Void)? open var progressView : UIProgressView + open var activityIndicator : UIActivityIndicatorView open var label : UILabel open var cancelButton : UIButton? - public init(initialProgressLabel: String?, cancelLabel: String? = nil, cancelHandler: (() -> Void)? = nil) { + var progressMessageObservation : NSKeyValueObservation? + var progressValueObservation : NSKeyValueObservation? + open var progress : Progress? { + willSet { + progressMessageObservation?.invalidate() + progressMessageObservation = nil + + progressValueObservation?.invalidate() + progressValueObservation = nil + } + + didSet { + if progress != nil { + progressMessageObservation = progress?.observe(\Progress.localizedDescription, options: NSKeyValueObservingOptions.initial, changeHandler: { [weak self] progress, _ in + OnMainThread { + self?.label.text = progress.localizedDescription + } + }) + + progressValueObservation = progress?.observe(\Progress.fractionCompleted, options: NSKeyValueObservingOptions.initial, changeHandler: { [weak self] progress, _ in + OnMainThread { + if progress.isIndeterminate { + self?.activityIndicator.isHidden = false + self?.progressView.isHidden = true + self?.activityIndicator.startAnimating() + } else { + self?.activityIndicator.stopAnimating() + self?.activityIndicator.isHidden = true + self?.progressView.isHidden = false + } + } + }) + } + } + } + + public init(initialProgressLabel: String?, progress : Progress?, cancelLabel: String? = nil, cancelHandler: (() -> Void)? = nil) { progressView = UIProgressView(progressViewStyle: .bar) progressView.translatesAutoresizingMaskIntoConstraints = false + if #available(iOS 13, *) { + activityIndicator = UIActivityIndicatorView(style: .large) + } else { + activityIndicator = UIActivityIndicatorView(style: .whiteLarge) + } + activityIndicator.translatesAutoresizingMaskIntoConstraints = false + activityIndicator.isHidden = true + label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false super.init(nibName: nil, bundle: nil) + self.progress = progress + if let initialProgressLabel = initialProgressLabel { label.text = initialProgressLabel } + self.cancelHandler = cancelHandler + if cancelHandler != nil { cancelButton = ThemeButton(type: .system) cancelButton?.translatesAutoresizingMaskIntoConstraints = false @@ -68,6 +117,7 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { } rootView.addSubview(centerView) + rootView.addSubview(activityIndicator) let outerSpacing : CGFloat = 10 let labelProgressBarSpacing : CGFloat = 15 @@ -92,7 +142,12 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { centerView.centerXAnchor.constraint(equalTo: rootView.centerXAnchor), centerView.centerYAnchor.constraint(equalTo: rootView.centerYAnchor), - centerView.widthAnchor.constraint(equalToConstant: progressBarWidth) + centerView.widthAnchor.constraint(equalToConstant: progressBarWidth), + + activityIndicator.centerXAnchor.constraint(equalTo: centerView.centerXAnchor), + activityIndicator.bottomAnchor.constraint(equalTo: centerView.topAnchor, constant:-labelProgressBarSpacing), + activityIndicator.widthAnchor.constraint(equalToConstant: 20), + activityIndicator.heightAnchor.constraint(equalToConstant: 20) ] if let cancelButton = cancelButton { From 7ed8e3dbb943d05e098e28b3f7c20dd3f62ed020 Mon Sep 17 00:00:00 2001 From: felix-schwarz Date: Mon, 12 Jul 2021 22:49:15 +0000 Subject: [PATCH 02/13] Configuration documentation updated --- doc/CONFIGURATION.json | 13 +++++++++++++ docs/modules/ROOT/pages/ios_mdm_tables.adoc | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/doc/CONFIGURATION.json b/doc/CONFIGURATION.json index 29e91e70c..5d3c9a918 100644 --- a/doc/CONFIGURATION.json +++ b/doc/CONFIGURATION.json @@ -1154,6 +1154,19 @@ "status" : "debugOnly", "type" : "bool" }, + { + "autoExpansion" : "none", + "category" : "Connection", + "categoryTag" : "connection", + "classIdentifier" : "core", + "className" : "OCCore", + "description" : "Minimum number of milliseconds until the next scan for changes, measured from the completion of the previous scan. If no value is provided, uses the pollinterval provided in the server's capabilities. If none is provided either, defaults to 10 seconds.", + "flatIdentifier" : "core.scan-for-changes-interval", + "key" : "scan-for-changes-interval", + "label" : "core.scan-for-changes-interval", + "status" : "advanced", + "type" : "int" + }, { "autoExpansion" : "none", "category" : "Connection", diff --git a/docs/modules/ROOT/pages/ios_mdm_tables.adoc b/docs/modules/ROOT/pages/ios_mdm_tables.adoc index 209bd48a8..5239cabdb 100644 --- a/docs/modules/ROOT/pages/ios_mdm_tables.adoc +++ b/docs/modules/ROOT/pages/ios_mdm_tables.adoc @@ -635,6 +635,12 @@ The following placeholders can be used to make it dynamic: |Concurrency budgets available for sync actions by action category. |advanced `candidate` +|core.scan-for-changes-interval +|int +| +|Minimum number of milliseconds until the next scan for changes, measured from the completion of the previous scan. If no value is provided, uses the pollinterval provided in the server's capabilities. If none is provided either, defaults to 10 seconds. +|advanced `candidate` + |connection.allow-background-url-sessions |bool |`true` From 69042fe57e6eb9e912a4ec8c16615fb48a20952a Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Sun, 1 Aug 2021 01:50:32 +0200 Subject: [PATCH 03/13] - update SDK to gain access to streaming infinite PROPFIND - switch from receive+parse to stream+parse for infinite PROPFIND --- ios-sdk | 2 +- ownCloud/Bookmarks/BookmarkViewController.swift | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ios-sdk b/ios-sdk index 7dce388ac..8371eaee1 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit 7dce388ac06d3b713cb03c11322a56dc6dc97886 +Subproject commit 8371eaee18896cd0fc5109d9289a902e39c69f53 diff --git a/ownCloud/Bookmarks/BookmarkViewController.swift b/ownCloud/Bookmarks/BookmarkViewController.swift index 3adfa95a9..e26986b08 100644 --- a/ownCloud/Bookmarks/BookmarkViewController.swift +++ b/ownCloud/Bookmarks/BookmarkViewController.swift @@ -587,7 +587,8 @@ class BookmarkViewController: StaticTableViewController { OnMainThread { var progressViewController : ProgressIndicatorViewController? - let prepopulateProgress = bookmark.prepopulate(completionHandler: { error in + // let prepopulateProgress = bookmark.prepopulate(completionHandler: { _ in + let prepopulateProgress = bookmark.prepopulate(streamCompletionHandler: { _ in OCBookmarkManager.shared.addBookmark(bookmark) OnMainThread { From 53176c365d8e5a39153120cea8ec6e4470dc609c Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Thu, 5 Aug 2021 00:15:45 +0200 Subject: [PATCH 04/13] - update SDK to gain access to new supportsInfinitePropfind capability - BookmarkViewController: make prepopulation configurable, using new capability and new class setting - ProgressIndicatorViewController: add support for new title label view --- ios-sdk | 2 +- .../xcshareddata/xcschemes/ownCloud.xcscheme | 5 + .../Bookmarks/BookmarkViewController.swift | 102 +++++++++++++++--- .../Resources/en.lproj/Localizable.strings | 4 + .../ProgressIndicatorViewController.swift | 36 ++++++- 5 files changed, 131 insertions(+), 18 deletions(-) diff --git a/ios-sdk b/ios-sdk index 8371eaee1..6e591eaf4 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit 8371eaee18896cd0fc5109d9289a902e39c69f53 +Subproject commit 6e591eaf4aacb382840f069e59c9d3a1d54fd227 diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme index 854095cfc..676b3203f 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme @@ -335,6 +335,11 @@ value = "[com.owncloud.action.copy,com.owncloud.action.move]" isEnabled = "NO"> + + Void)? = nil) { + public init(initialTitleLabel: String? = nil, initialProgressLabel: String?, progress : Progress?, cancelLabel: String? = nil, cancelHandler: (() -> Void)? = nil) { progressView = UIProgressView(progressViewStyle: .bar) progressView.translatesAutoresizingMaskIntoConstraints = false @@ -82,6 +83,15 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { self.progress = progress + if let initialTitleLabel = initialTitleLabel { + titleLabel = UILabel() + titleLabel?.translatesAutoresizingMaskIntoConstraints = false + titleLabel?.text = initialTitleLabel + titleLabel?.font = .preferredFont(forTextStyle: .title2) + + label.font = .preferredFont(forTextStyle: .subheadline) + } + if let initialProgressLabel = initialProgressLabel { label.text = initialProgressLabel } @@ -112,6 +122,10 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { centerView.addSubview(progressView) centerView.addSubview(label) + if let titleLabel = titleLabel { + centerView.addSubview(titleLabel) + } + if let cancelButton = cancelButton { centerView.addSubview(cancelButton) } @@ -120,7 +134,8 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { rootView.addSubview(activityIndicator) let outerSpacing : CGFloat = 10 - let labelProgressBarSpacing : CGFloat = 15 + let titleLabelSpacing : CGFloat = 5 + let labelProgressBarSpacing : CGFloat = 20 let cancelProgressBarSpacing : CGFloat = 40 let progressBarWidth : CGFloat = 280 @@ -133,7 +148,6 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { label.centerXAnchor.constraint(equalTo: centerView.centerXAnchor), - label.topAnchor.constraint(equalTo: centerView.topAnchor, constant: outerSpacing), progressView.topAnchor.constraint(equalTo: label.bottomAnchor, constant: labelProgressBarSpacing), centerView.leftAnchor.constraint(greaterThanOrEqualTo: rootView.leftAnchor, constant: outerSpacing), @@ -150,6 +164,20 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { activityIndicator.heightAnchor.constraint(equalToConstant: 20) ] + if let titleLabel = titleLabel { + constraints.append(contentsOf: [ + titleLabel.topAnchor.constraint(equalTo: centerView.topAnchor, constant: outerSpacing), + titleLabel.centerXAnchor.constraint(greaterThanOrEqualTo: centerView.centerXAnchor), + titleLabel.leftAnchor.constraint(greaterThanOrEqualTo: centerView.leftAnchor), + titleLabel.rightAnchor.constraint(lessThanOrEqualTo: centerView.rightAnchor), + label.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: titleLabelSpacing) + ]) + } else { + constraints.append(contentsOf: [ + label.topAnchor.constraint(equalTo: centerView.topAnchor, constant: outerSpacing), + ]) + } + if let cancelButton = cancelButton { constraints.append(contentsOf: [ cancelButton.topAnchor.constraint(equalTo: progressView.bottomAnchor, constant: cancelProgressBarSpacing), @@ -187,8 +215,10 @@ open class ProgressIndicatorViewController: UIViewController, Themeable { self.view.backgroundColor = collection.tableBackgroundColor self.progressView.applyThemeCollection(collection) + self.titleLabel?.applyThemeCollection(collection, itemStyle: .title, itemState: .normal) self.label.applyThemeCollection(collection) self.cancelButton?.applyThemeCollection(collection) + self.activityIndicator.style = collection.activityIndicatorViewStyle } open func update(progress: Float? = nil, text: String? = nil) { From e425698af80b59f13ac91985fd1d5c0713332933 Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Fri, 6 Aug 2021 10:30:22 +0200 Subject: [PATCH 05/13] - BookmarkViewController: fix property name typo - scheme: add new options to test streaming and split bookmark prepopulation --- .../xcshareddata/xcschemes/ownCloud.xcscheme | 7 ++++++- ownCloud/Bookmarks/BookmarkViewController.swift | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme index 676b3203f..7f3f7ec35 100644 --- a/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme +++ b/ownCloud.xcodeproj/xcshareddata/xcschemes/ownCloud.xcscheme @@ -338,7 +338,12 @@ + isEnabled = "NO"> + + diff --git a/ownCloud/Bookmarks/BookmarkViewController.swift b/ownCloud/Bookmarks/BookmarkViewController.swift index c971f25e3..fea8a349a 100644 --- a/ownCloud/Bookmarks/BookmarkViewController.swift +++ b/ownCloud/Bookmarks/BookmarkViewController.swift @@ -565,7 +565,7 @@ class BookmarkViewController: StaticTableViewController { if let strongSelf = self { if error == nil { - let serverSupportsInfinitePropfind = connection.capabilities?.prepopulateWithInfinitePropfind + let serverSupportsInfinitePropfind = connection.capabilities?.supportsInfinitePropfind bookmark.displayName = connection.loggedInUser?.displayName connection.disconnect(completionHandler: { From 40baeb210bac2a9b74dbd5dacd135d824b2326fc Mon Sep 17 00:00:00 2001 From: felix-schwarz Date: Fri, 6 Aug 2021 08:37:41 +0000 Subject: [PATCH 06/13] Configuration documentation updated --- doc/CONFIGURATION.json | 27 +++++++++++++++++++++ docs/modules/ROOT/pages/ios_mdm_tables.adoc | 21 ++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/doc/CONFIGURATION.json b/doc/CONFIGURATION.json index 5d3c9a918..3317b125a 100644 --- a/doc/CONFIGURATION.json +++ b/doc/CONFIGURATION.json @@ -493,6 +493,33 @@ "status" : "supported", "type" : "string" }, + { + "autoExpansion" : "none", + "category" : "Bookmarks", + "categoryTag" : "bookmarks", + "classIdentifier" : "bookmark", + "className" : "ownCloud.BookmarkViewController", + "description" : "Controls prepopulation of the local database with the full item set during account setup.", + "flatIdentifier" : "bookmark.prepopulation", + "key" : "prepopulation", + "label" : "bookmark.prepopulation", + "possibleValues" : [ + { + "description" : "No prepopulation. Request the contents of every folder individually.", + "value" : "doNot" + }, + { + "description" : "Parse the prepopulation metadata after receiving it as a whole.", + "value" : "split" + }, + { + "description" : "Parse the prepopulation metadata while receiving it.", + "value" : "streaming" + } + ], + "status" : "supported", + "type" : "string" + }, { "autoExpansion" : "none", "category" : "Bookmarks", diff --git a/docs/modules/ROOT/pages/ios_mdm_tables.adoc b/docs/modules/ROOT/pages/ios_mdm_tables.adoc index 5239cabdb..daf103d0a 100644 --- a/docs/modules/ROOT/pages/ios_mdm_tables.adoc +++ b/docs/modules/ROOT/pages/ios_mdm_tables.adoc @@ -279,6 +279,27 @@ tag::bookmarks[] |The default URL for the creation of new bookmarks. |supported `candidate` +|bookmark.prepopulation +|string +| +|Controls prepopulation of the local database with the full item set during account setup. +[cols="1,2"] +!=== +! Value +! Description +! `doNot` +! No prepopulation. Request the contents of every folder individually. + +! `split` +! Parse the prepopulation metadata after receiving it as a whole. + +! `streaming` +! Parse the prepopulation metadata while receiving it. + +!=== + +|supported `candidate` + |bookmark.url-editable |bool |`true` From 1f99ad3755c212cf1737eb22a1be233895bdcfdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=BChne?= Date: Wed, 6 Oct 2021 11:09:16 +0200 Subject: [PATCH 07/13] added additional build information to the Branding.plist file: - ios-app and ios-sdk commit hash - copy the Branding.plist with additional app and build information as file name --- fastlane/Fastfile | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 765479ef0..501fd51d1 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -468,7 +468,8 @@ end appName = "ownCloud" appBuildFlags = "" - themePath = "ownCloud/Resources/Theming/Branding.plist" + themeFolder = "ownCloud/Resources/Theming/" + themePath = themeFolder + "Branding.plist" if !values[:APP_NAME].nil? appName = values[:APP_NAME] elsif File.exist?("../" + themePath) @@ -483,17 +484,27 @@ end if tmpAppBuildFlags && !tmpAppBuildFlags.empty? appBuildFlags = tmpAppBuildFlags end + + # Set the Git commit hash for the ios-app and ios-sdk repository into the Branding.plist + commit = sh "git rev-parse --short HEAD" + sdkcommit = sh "git -C ../ios-sdk/ rev-parse --short HEAD" + + puts "Git Hash: " + commit + puts "SDK Git Hash: " + sdkcommit + set_info_plist_value(path: themePath, key: "LastGitCommit", value: commit) + set_info_plist_value(path: themePath, key: "SDKLastGitCommit", value: sdkcommit) end + puts "App Name: " + appName puts "App Build Flags: " + appBuildFlags - + # Special handling for app build flag DISABLE_BACKGROUND_LOCATION needed: # calls to set_info_plist_value before building with xcodebuild # strip preprocessor instructions from Info.plist, so that the # Location keys they aim to remove stay in place. Working around this # by removing anything between "#ifndef DISABLE_BACKGROUND_LOCATION" - # and "#endif" via sed + # and "#endif" via sed if appBuildFlags.include? "DISABLE_BACKGROUND_LOCATION" sh "sed '/#ifndef DISABLE_BACKGROUND_LOCATION/,/#endif/d' ../ownCloud/Resources/Info.plist >../ownCloud/Resources/Info.plist.mod" sh "mv ../ownCloud/Resources/Info.plist.mod ../ownCloud/Resources/Info.plist" @@ -708,6 +719,11 @@ end version += "." + BUILD_NUMBER end ipaName = appName + "-" + version + "-" + ipaSuffix + ".ipa" + + if File.exist?("../" + themePath) + # Copy the Branding.plist file with additional app and build informtion in the file name + sh "cp " + "../" + themePath + " ../" + themeFolder + appName + "-" + version + "-" + ipaSuffix + ".plist" + end end generate_appicon() From bda5598f50b6a47924168db68ececece69cb10d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=BChne?= Date: Mon, 11 Oct 2021 12:22:33 +0200 Subject: [PATCH 08/13] [feature/biometrical-mdm-setting ]Suggest Biometrical Unlock (#1046) * Suggest biometrical unlock, after setting up passcode * - do not show Cancel button, if password is enforced - update biometrical UI switch value in settings view - fixed bug, dismissing the view, if biometrical is not available * moved extension into ownCloudAppShared folder --- ownCloud.xcodeproj/project.pbxproj | 8 ++-- .../Resources/en.lproj/Localizable.strings | 1 + .../Settings/SecuritySettingsSection.swift | 1 + .../AppLock/PasscodeSetupCoordinator.swift | 42 +++++++++++++++---- .../LAContext+Extension.swift | 2 +- 5 files changed, 42 insertions(+), 12 deletions(-) rename {ownCloud/UIKit Extensions => ownCloudAppShared/UIKit Extension}/LAContext+Extension.swift (92%) diff --git a/ownCloud.xcodeproj/project.pbxproj b/ownCloud.xcodeproj/project.pbxproj index f7e653263..e332b72a6 100644 --- a/ownCloud.xcodeproj/project.pbxproj +++ b/ownCloud.xcodeproj/project.pbxproj @@ -50,6 +50,7 @@ 392378FF24EBD1A1006E86DE /* branding-splashscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 39F48A6624D848550000E3F9 /* branding-splashscreen.png */; }; 3923790524EBD1A5006E86DE /* branding-splashscreen-background.png in Resources */ = {isa = PBXBuildFile; fileRef = 39F48A6724D848550000E3F9 /* branding-splashscreen-background.png */; }; 39265BB223D9987500B0C4CA /* MediaEditingAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39265BB123D9987500B0C4CA /* MediaEditingAction.swift */; }; + 392CFEB72705831700631D2B /* LAContext+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392CFEB62705831700631D2B /* LAContext+Extension.swift */; }; 392DDAE624C8923B009E5406 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 233BDEA6204FEFE500C06732 /* Assets.xcassets */; }; 392DDB1424CF024D009E5406 /* ImportFilesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392DDB1324CF024C009E5406 /* ImportFilesController.swift */; }; 393D2B3F23FEB6DC00ED4F8C /* DispatchQueueTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4FEAE9209E48E800D4476B /* DispatchQueueTools.swift */; }; @@ -193,7 +194,6 @@ 6E586CFE2199A75900F680C4 /* MoveAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E586CFD2199A75900F680C4 /* MoveAction.swift */; }; 6E586D002199A78E00F680C4 /* DeleteAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E586CFF2199A78E00F680C4 /* DeleteAction.swift */; }; 6E5FC172221590B000F60846 /* DisplayHostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5FC171221590B000F60846 /* DisplayHostViewController.swift */; }; - 6E83C78420A33C180066EC23 /* LAContext+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E83C78320A33C180066EC23 /* LAContext+Extension.swift */; }; 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 */; }; @@ -953,6 +953,7 @@ 3913213722946E5E00EF88F4 /* FileListTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileListTableViewController.swift; sourceTree = ""; }; 3913214A22956D5700EF88F4 /* LibraryTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryTableViewController.swift; sourceTree = ""; }; 39265BB123D9987500B0C4CA /* MediaEditingAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaEditingAction.swift; sourceTree = ""; }; + 392CFEB62705831700631D2B /* LAContext+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LAContext+Extension.swift"; sourceTree = ""; }; 392DDB1324CF024C009E5406 /* ImportFilesController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportFilesController.swift; sourceTree = ""; }; 3931206A2326451900E8DFBA /* Branding.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Branding.plist; path = ownCloud/Resources/Theming/Branding.plist; sourceTree = SOURCE_ROOT; }; 3940C4EF2326985B008227AE /* GetAccountIntentHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetAccountIntentHandler.swift; sourceTree = ""; }; @@ -1195,7 +1196,6 @@ 6E586CFD2199A75900F680C4 /* MoveAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveAction.swift; sourceTree = ""; }; 6E586CFF2199A78E00F680C4 /* DeleteAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteAction.swift; sourceTree = ""; }; 6E5FC171221590B000F60846 /* DisplayHostViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayHostViewController.swift; sourceTree = ""; }; - 6E83C78320A33C180066EC23 /* LAContext+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LAContext+Extension.swift"; sourceTree = ""; }; 6E91F37D21ECA6FD009436D2 /* CopyAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyAction.swift; sourceTree = ""; }; 6EA78B8E2179B55400A5216A /* ImageScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageScrollView.swift; sourceTree = ""; }; 6EB8EDBE2114358300C2BF44 /* folder-create.tvg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "folder-create.tvg"; path = "img/filetypes-tvg/folder-create.tvg"; sourceTree = SOURCE_ROOT; }; @@ -1774,7 +1774,6 @@ 239F1314205A69240029F186 /* UIKit Extensions */ = { isa = PBXGroup; children = ( - 6E83C78320A33C180066EC23 /* LAContext+Extension.swift */, 4CB8ADDF22DF5EC500F1FEBC /* UIAlertViewController+SystemPermissions.swift */, 39878B7321FB1DE800DBF693 /* UINavigationController+Extension.swift */, 39CC8AE5228C12100020253B /* Array+Extension.swift */, @@ -1888,6 +1887,7 @@ 399725DF233DF37300FC3B94 /* UIKit Extension */ = { isa = PBXGroup; children = ( + 392CFEB62705831700631D2B /* LAContext+Extension.swift */, 399EA73925E656A900B6FF11 /* UITableView+Extension.swift */, DC248C66213E7DB00067FE94 /* NSLayoutConstraint+Extension.swift */, DC434D1220D7A8F100740056 /* UIAlertController+OCIssue.swift */, @@ -4003,7 +4003,6 @@ DC4C575D233958B70098BAE9 /* FixedHeightImageView.swift in Sources */, 4C1561E8222321E0009C4EF3 /* PhotoSelectionViewController.swift in Sources */, 39CC8AE6228C12100020253B /* Array+Extension.swift in Sources */, - 6E83C78420A33C180066EC23 /* LAContext+Extension.swift in Sources */, DCE28F602433683700879DEC /* ClientSessionManager.swift in Sources */, 3968C881239C54AC00AC28AC /* ReleaseNotesHostViewController.swift in Sources */, DC6428D02081406800493A01 /* CollapsibleProgressBar.swift in Sources */, @@ -4194,6 +4193,7 @@ DCE4E45924C1F0F70051722F /* ClientQueryViewController.swift in Sources */, DCE4E45124C1E4430051722F /* UIBarButtonItem+Extension.swift in Sources */, DC0A357724C0E43200FB58FC /* ProgressSummarizer.swift in Sources */, + 392CFEB72705831700631D2B /* LAContext+Extension.swift in Sources */, DCE4E48724C1F9F50051722F /* CreateFolderAction.swift in Sources */, DC0A359724C0E64500FB58FC /* UIImageView+Thumbnails.swift in Sources */, 39E6DE86233CDF1E008DAE04 /* OCItemTracker.swift in Sources */, diff --git a/ownCloud/Resources/en.lproj/Localizable.strings b/ownCloud/Resources/en.lproj/Localizable.strings index aac537d76..cb1071e8f 100644 --- a/ownCloud/Resources/en.lproj/Localizable.strings +++ b/ownCloud/Resources/en.lproj/Localizable.strings @@ -205,6 +205,7 @@ "Passcode Lock" = "Passcode Lock"; "Face ID" = "Face ID"; "Touch ID" = "Touch ID"; +"Unlock using %@?" = "Unlock using %@?"; "Videos" = "Videos"; "Photos" = "Photos"; "Wifi only" = "Wifi only"; diff --git a/ownCloud/Settings/SecuritySettingsSection.swift b/ownCloud/Settings/SecuritySettingsSection.swift index 420dfde59..0a2f616ad 100644 --- a/ownCloud/Settings/SecuritySettingsSection.swift +++ b/ownCloud/Settings/SecuritySettingsSection.swift @@ -203,6 +203,7 @@ class SecuritySettingsSection: SettingsSection { } if biometricalRow != nil, !rows.contains(biometricalRow!) { + biometricalRow?.value = isBiometricalSecurityEnabled rowsToAdd.append(biometricalRow!) } } else { diff --git a/ownCloudAppShared/AppLock/PasscodeSetupCoordinator.swift b/ownCloudAppShared/AppLock/PasscodeSetupCoordinator.swift index 623e57834..d98c139dd 100644 --- a/ownCloudAppShared/AppLock/PasscodeSetupCoordinator.swift +++ b/ownCloudAppShared/AppLock/PasscodeSetupCoordinator.swift @@ -18,6 +18,7 @@ import UIKit import ownCloudApp +import LocalAuthentication public enum PasscodeAction { case setup @@ -104,7 +105,7 @@ public class PasscodeSetupCoordinator { passcodeViewController.dismiss(animated: true) { self.completionHandler?(true) } - }, completionHandler: { (passcodeViewController, passcode) in + }, completionHandler: { (_, passcode) in if self.action == .delete { if passcode == AppLockManager.shared.passcode { // Success -> Remove stored passcode and unlock the app @@ -126,9 +127,7 @@ public class PasscodeSetupCoordinator { if self.passcodeFromFirstStep == passcode { // Confirmed passcode matches the original ones -> save and lock the app self.lock(with: passcode) - self.passcodeViewController?.dismiss(animated: true, completion: { - self.completionHandler?(false) - }) + self.showSuggestBiometricalUnlockUI() } else { //Passcode is not the same self.updateUI(with: self.action.localizedDescription, errorMessage: "The entered codes are different".localized) @@ -153,6 +152,33 @@ public class PasscodeSetupCoordinator { } } + public func showSuggestBiometricalUnlockUI() { + if let biometricalSecurityName = LAContext().supportedBiometricsAuthenticationName() { + let alertController = UIAlertController(title: biometricalSecurityName, message: String(format:"Unlock using %@?".localized, biometricalSecurityName), preferredStyle: .alert) + + alertController.addAction(UIAlertAction(title: "Enable".localized, style: .default, handler: { _ in + PasscodeSetupCoordinator.isBiometricalSecurityEnabled = true + self.passcodeViewController?.dismiss(animated: true, completion: { + self.completionHandler?(false) + }) + })) + + alertController.addAction(UIAlertAction(title: "Disable".localized, style: .cancel, handler: { _ in + PasscodeSetupCoordinator.isBiometricalSecurityEnabled = false + self.passcodeViewController?.dismiss(animated: true, completion: { + self.completionHandler?(false) + }) + })) + + self.passcodeViewController?.present(alertController, animated: true, completion: { + }) + } else { + self.passcodeViewController?.dismiss(animated: true, completion: { + self.completionHandler?(false) + }) + } + } + public func showDigitsCountSelectionUI() { let alertController = ThemedAlertController(title: "Passcode option".localized, message: "Please choose how many digits you want to use for the passcode lock?".localized, preferredStyle: .actionSheet) @@ -162,9 +188,11 @@ public class PasscodeSetupCoordinator { popoverController.permittedArrowDirections = [] } - alertController.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel, handler: { _ in - self.completionHandler?(true) - })) + if !AppLockSettings.shared.isPasscodeEnforced { + alertController.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel, handler: { _ in + self.completionHandler?(true) + })) + } var digit = self.maxPasscodeDigits while digit >= self.minPasscodeDigits { diff --git a/ownCloud/UIKit Extensions/LAContext+Extension.swift b/ownCloudAppShared/UIKit Extension/LAContext+Extension.swift similarity index 92% rename from ownCloud/UIKit Extensions/LAContext+Extension.swift rename to ownCloudAppShared/UIKit Extension/LAContext+Extension.swift index f47bb83f4..8c620920e 100644 --- a/ownCloud/UIKit Extensions/LAContext+Extension.swift +++ b/ownCloudAppShared/UIKit Extension/LAContext+Extension.swift @@ -20,7 +20,7 @@ import LocalAuthentication extension LAContext { - func supportedBiometricsAuthenticationName() -> String? { + public func supportedBiometricsAuthenticationName() -> String? { if canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) { switch self.biometryType { From 88609b5af9a5587b3cdfcbc89d408493275e1740 Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Mon, 11 Oct 2021 12:22:50 +0200 Subject: [PATCH 09/13] Branding: (#1045) - add new `branding.user-defaults-default-values` class settings key to allow registration of alternative defaults for user defaults --- ownCloudAppFramework/Branding/Branding.h | 3 ++ ownCloudAppFramework/Branding/Branding.m | 30 +++++++++++++++++-- .../Branding/BrandingClassSettingsSource.m | 1 + 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/ownCloudAppFramework/Branding/Branding.h b/ownCloudAppFramework/Branding/Branding.h index 74ed76bdd..85a7e7f6f 100644 --- a/ownCloudAppFramework/Branding/Branding.h +++ b/ownCloudAppFramework/Branding/Branding.h @@ -61,6 +61,8 @@ typedef NSString* BrandingImageName NS_TYPED_EXTENSIBLE_ENUM; - (nullable id)computedValueForClassSettingsKey:(OCClassSettingsKey)classSettingsKey; - (nullable NSURL *)urlForClassSettingsKey:(OCClassSettingsKey)settingsKey; +- (void)registerUserDefaultsDefaults; + @end extern OCClassSettingsIdentifier OCClassSettingsIdentifierBranding; @@ -68,6 +70,7 @@ extern OCClassSettingsIdentifier OCClassSettingsIdentifierBranding; extern BrandingKey BrandingKeyAppName; extern BrandingKey BrandingKeyOrganizationName; extern BrandingKey BrandingKeyDisabledImportMethods; +extern BrandingKey BrandingKeyUserDefaultsDefaultValues; extern BrandingFileImportMethod BrandingFileImportMethodOpenWith; extern BrandingFileImportMethod BrandingFileImportMethodShareExtension; diff --git a/ownCloudAppFramework/Branding/Branding.m b/ownCloudAppFramework/Branding/Branding.m index 0c53195ec..b62acbf8d 100644 --- a/ownCloudAppFramework/Branding/Branding.m +++ b/ownCloudAppFramework/Branding/Branding.m @@ -207,6 +207,16 @@ - (instancetype)init return (self); } +- (void)registerUserDefaultsDefaults +{ + // Register user defaults + NSDictionary *userDefaultsDefaults; + if ((userDefaultsDefaults = self.userDefaultsDefaultValues) != nil) + { + [OCAppIdentity.sharedAppIdentity.userDefaults registerDefaults:userDefaultsDefaults]; + } +} + - (void)registerLegacyKeyPath:(BrandingLegacyKeyPath)keyPath forClassSettingsKey:(OCClassSettingsKey)classSettingsKey; { NSMutableDictionary *mutableLegacyKeyPathsByClassSettingsKeys = nil; @@ -231,6 +241,11 @@ - (NSString *)organizationName return ([self computedValueForClassSettingsKey:BrandingKeyOrganizationName]); } +- (NSDictionary *)userDefaultsDefaultValues +{ + return ([self computedValueForClassSettingsKey:BrandingKeyUserDefaultsDefaultValues]); +} + - (NSArray *)disabledImportMethods { return ([self computedValueForClassSettingsKey:BrandingKeyDisabledImportMethods]); @@ -349,6 +364,14 @@ + (OCClassSettingsMetadataCollection)classSettingsMetadata BrandingFileImportMethodShareExtension : @"Disallow import through the Share Extension", BrandingFileImportMethodFileProvider : @"Disallow import through the File Provider (Files.app)" } + }, + + // User Defaults + BrandingKeyUserDefaultsDefaultValues : @{ + OCClassSettingsMetadataKeyType : OCClassSettingsMetadataTypeDictionary, + OCClassSettingsMetadataKeyDescription : @"Default values for user defaults. Allows overriding default settings.", + OCClassSettingsMetadataKeyStatus : OCClassSettingsKeyStatusAdvanced, + OCClassSettingsMetadataKeyCategory : @"Branding" } }); } @@ -357,9 +380,10 @@ + (OCClassSettingsMetadataCollection)classSettingsMetadata OCClassSettingsIdentifier OCClassSettingsIdentifierBranding = @"branding"; -OCClassSettingsKey BrandingKeyAppName = @"app-name"; -OCClassSettingsKey BrandingKeyOrganizationName = @"organization-name"; // Legacy Branding Key: organizationName -OCClassSettingsKey BrandingKeyDisabledImportMethods = @"disabled-import-methods"; +BrandingKey BrandingKeyAppName = @"app-name"; +BrandingKey BrandingKeyOrganizationName = @"organization-name"; // Legacy Branding Key: organizationName +BrandingKey BrandingKeyDisabledImportMethods = @"disabled-import-methods"; +BrandingKey BrandingKeyUserDefaultsDefaultValues = @"user-defaults-default-values"; BrandingFileImportMethod BrandingFileImportMethodOpenWith = @"open-with"; BrandingFileImportMethod BrandingFileImportMethodShareExtension = @"share-extension"; diff --git a/ownCloudAppFramework/Branding/BrandingClassSettingsSource.m b/ownCloudAppFramework/Branding/BrandingClassSettingsSource.m index 0c51ccac2..eae88b71c 100644 --- a/ownCloudAppFramework/Branding/BrandingClassSettingsSource.m +++ b/ownCloudAppFramework/Branding/BrandingClassSettingsSource.m @@ -24,6 +24,7 @@ @implementation BrandingClassSettingsSource + (void)load { [OCClassSettings.sharedSettings insertSource:[BrandingClassSettingsSource new] before:OCClassSettingsSourceIdentifierManaged after:nil]; + [Branding.sharedBranding registerUserDefaultsDefaults]; } - (OCClassSettingsSourceIdentifier)settingsSourceIdentifier From f7574f6bd54f5fd2dbf42e2d043c37ec2223c3cb Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Mon, 11 Oct 2021 12:23:14 +0200 Subject: [PATCH 10/13] - fix bug where a quick access entry showed no items when selected a second time. (#1044) --- .../Library/LibraryTableViewController.swift | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/ownCloud/Client/Library/LibraryTableViewController.swift b/ownCloud/Client/Library/LibraryTableViewController.swift index bbf209fa1..d1ab8e4ea 100644 --- a/ownCloud/Client/Library/LibraryTableViewController.swift +++ b/ownCloud/Client/Library/LibraryTableViewController.swift @@ -380,26 +380,30 @@ class LibraryTableViewController: StaticTableViewController { let section = StaticTableViewSection(headerTitle: "Collection".localized, footerTitle: nil, identifier: "collection-section") self.addSection(section) - let lastWeekDate = Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date())! - var recentsQuery = OCQuery(condition: .require([ - .where(.lastUsed, isGreaterThan: lastWeekDate), - .where(.name, isNotEqualTo: "/") - ]), inputFilter:nil) - - if let condition = OCQueryCondition.fromSearchTerm(":1w :file") { - recentsQuery = OCQuery(condition:condition, inputFilter: nil) - } + addCollectionRow(to: section, title: "Recents".localized, image: UIImage(named: "recents")!, queryCreator: { + let lastWeekDate = Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date())! + + var recentsQuery = OCQuery(condition: .require([ + .where(.lastUsed, isGreaterThan: lastWeekDate), + .where(.name, isNotEqualTo: "/") + ]), inputFilter:nil) + + if let condition = OCQueryCondition.fromSearchTerm(":1w :file") { + recentsQuery = OCQuery(condition:condition, inputFilter: nil) + } - addCollectionRow(to: section, title: "Recents".localized, image: UIImage(named: "recents")!, query: recentsQuery, actionHandler: nil) + return recentsQuery + }, actionHandler: nil) - let favoriteQuery = OCQuery(condition: .where(.isFavorite, isEqualTo: true), inputFilter:nil) - addCollectionRow(to: section, title: "Favorites".localized, image: UIImage(named: "star")!, query: favoriteQuery, actionHandler: { [weak self] (completion) in + addCollectionRow(to: section, title: "Favorites".localized, image: UIImage(named: "star")!, queryCreator: { + return OCQuery(condition: .where(.isFavorite, isEqualTo: true), inputFilter:nil) + }, actionHandler: { [weak self] (completion) in self?.core?.refreshFavorites(completionHandler: { (_, _) in completion() }) }) - addCollectionRow(to: section, title: "Available Offline".localized, image: UIImage(named: "cloud-available-offline")!, query: nil, actionHandler: { [weak self] (completion) in + addCollectionRow(to: section, title: "Available Offline".localized, image: UIImage(named: "cloud-available-offline")!, queryCreator: nil, actionHandler: { [weak self] (completion) in if let core = self?.core { let availableOfflineListController = ItemPolicyTableViewController(core: core, policyKind: .availableOffline) @@ -418,22 +422,23 @@ class LibraryTableViewController: StaticTableViewController { ] for query in queries { - let conditions = query.mimeType.map { (mimeType) -> OCQueryCondition in - return .where(.mimeType, contains: mimeType) - } + addCollectionRow(to: section, title: query.name, image: Theme.shared.image(for: query.imageName, size: CGSize(width: 25, height: 25))!, queryCreator: { + let conditions = query.mimeType.map { (mimeType) -> OCQueryCondition in + return .where(.mimeType, contains: mimeType) + } - let customQuery = OCQuery(condition: .any(of: conditions), inputFilter:nil) - addCollectionRow(to: section, title: query.name, image: Theme.shared.image(for: query.imageName, size: CGSize(width: 25, height: 25))!, query: customQuery, actionHandler: nil) + return OCQuery(condition: .any(of: conditions), inputFilter:nil) + }, actionHandler: nil) } } } - func addCollectionRow(to section: StaticTableViewSection, title: String, image: UIImage? = nil, themeImageName: String? = nil, query: OCQuery?, actionHandler: ((_ completion: @escaping () -> Void) -> Void)?) { + func addCollectionRow(to section: StaticTableViewSection, title: String, image: UIImage? = nil, themeImageName: String? = nil, queryCreator: (() -> OCQuery?)?, actionHandler: ((_ completion: @escaping () -> Void) -> Void)?) { let identifier = String(format:"%@-collection-row", title) if section.row(withIdentifier: identifier) == nil, let core = core { let row = StaticTableViewRow(rowWithAction: { [weak self] (_, _) in - if let query = query { + if let query = queryCreator?() { let customFileListController = QueryFileListTableViewController(core: core, query: query) customFileListController.title = title customFileListController.pullToRefreshAction = actionHandler From a7cc6a8abd2d31c0ec5a6b5c28d2af8b477a6167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=BChne?= Date: Fri, 15 Oct 2021 10:07:14 +0200 Subject: [PATCH 11/13] used better wording for "Cellular transfers" --- .../Resources/ar.lproj/Localizable.strings | Bin 79138 -> 79142 bytes .../Resources/cs.lproj/Localizable.strings | 4 ++-- .../Resources/de.lproj/Localizable.strings | Bin 88566 -> 88570 bytes .../Resources/en.lproj/Localizable.strings | 4 ++-- .../Resources/es.lproj/Localizable.strings | Bin 87248 -> 87252 bytes .../Resources/fr.lproj/Localizable.strings | Bin 90520 -> 90524 bytes .../Resources/ko.lproj/Localizable.strings | Bin 60340 -> 60348 bytes .../Resources/mk.lproj/Localizable.strings | Bin 63192 -> 63200 bytes .../Resources/nb-NO.lproj/Localizable.strings | 4 ++-- .../Resources/nn-NO.lproj/Localizable.strings | 4 ++-- .../Resources/pt-BR.lproj/Localizable.strings | Bin 87004 -> 87008 bytes .../Resources/pt-PT.lproj/Localizable.strings | 4 ++-- .../Resources/ru.lproj/Localizable.strings | Bin 87918 -> 87922 bytes .../Resources/sq.lproj/Localizable.strings | Bin 86628 -> 86632 bytes .../Resources/th-TH.lproj/Localizable.strings | Bin 79172 -> 79176 bytes .../zh-Hans.lproj/Localizable.strings | Bin 51002 -> 51010 bytes .../CellularSettingsViewController.swift | 4 ++-- ownCloud/Settings/DataSettingsSection.swift | 2 +- 18 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ownCloud/Resources/ar.lproj/Localizable.strings b/ownCloud/Resources/ar.lproj/Localizable.strings index c673792f55471aedfcef080d05d66feb30d00980..f3ce56f233ed97509d9851bdb6ca6c4dbb85a273 100644 GIT binary patch delta 63 zcmZ4Vie=d=mJLoN!Y&Mn3?)FUz!1t%45ZT;Qa1;eJY>QqG5PE(@y#*i$MymMSydC3 delta 57 zcmZ4Xie=F&mJLoNf+Y+^42cYR48;s-45>hN@#fHyhfMrv!jsRxlH8n7erzuQCHxb) diff --git a/ownCloud/Resources/cs.lproj/Localizable.strings b/ownCloud/Resources/cs.lproj/Localizable.strings index 32483e56b..7ac6f0dd0 100644 --- a/ownCloud/Resources/cs.lproj/Localizable.strings +++ b/ownCloud/Resources/cs.lproj/Localizable.strings @@ -257,9 +257,9 @@ "Decrease Slider Value" = "Decrease Slider Value"; "Increase Slider Value" = "Increase Slider Value"; -"Cellular transfers" = "Cellular transfers"; +"Cellular Data Usage" = "Cellular Data Usage"; "Some cellular data may still be used. To completely avoid the usage of cellular data, please turn off access to cellular for the entire app in the Settings app." = "Some cellular data may still be used. To completely avoid the usage of cellular data, please turn off access to cellular for the entire app in the Settings app."; -"Cellular transfers have been disabled via MDM configuration. Please contact your administrator for more information." = "Cellular transfers have been disabled via MDM configuration. Please contact your administrator for more information."; +"Cellular Data Usage have been disabled via MDM configuration. Please contact your administrator for more information." = "Cellular Data Usage have been disabled via MDM configuration. Please contact your administrator for more information."; "General" = "Hlavní"; "By feature" = "By feature"; diff --git a/ownCloud/Resources/de.lproj/Localizable.strings b/ownCloud/Resources/de.lproj/Localizable.strings index d1151dcd74d7f4953d60b9ede9926831962578a2..cf22d611a46e3bff497a4ffe17b90022a19d68e8 100644 GIT binary patch delta 64 zcmeyinf2FZ)(ufj!Y&Mn3?)FUz!1t%45ZT;Qa5Kec{5{^nEsxfQGD~gR*5SBZq^dU delta 66 zcmeyhnf2Rd)(ufjf+Y+^42cYR48;s-45>hN@#OwC)^25i|e* delta 55 tcmcbzlJ&w$)(yMr1WOo-7!n!s7>XIv7*c`k;>~C444JVA3pO3T1ONtw5y$`l diff --git a/ownCloud/Resources/fr.lproj/Localizable.strings b/ownCloud/Resources/fr.lproj/Localizable.strings index c16d411dd2593a46fa357be912d9031c43e87ee3..95489d2b08e712f2c12b916351aed58d98a10d7f 100644 GIT binary patch delta 59 tcmbPnn03x!)(tGJ!Y&Mn3?)FUz!1t%45ZT;Qa6jX#xi4-Xzmcb2>{$B51Rl0 delta 55 scmbPpn03Zs)(tGJf+Y+^42cYR48;s-45>hN@n-SXSY|B3?H!^w0n0`ZF8}}l diff --git a/ownCloud/Resources/ko.lproj/Localizable.strings b/ownCloud/Resources/ko.lproj/Localizable.strings index 713dd77292cfed1a24184217deab9e9c143ecd2f..a7d704345cb7d188feb7181581a6eec6c0579228 100644 GIT binary patch delta 115 zcmdmToq5l7<_#+ngbg08cX?ng9R* delta 119 zcmdmUoq5Z3<_#+n1xpx;7!n!s7>XIv7*c`k;>r1`vY4WqUnj0*;zv_Fnen9LT(k={%3?)FUz!1t%45ZT;QW=zhJX;2Z$%z@F!dT=tZ_QZCB#T7? gs4W9%L>WWsTf+Y+^42cYR48;s-45>hN@nqW^SxnK*J2TcY@uMl8eD|{ChN@#gvU(#%+d&o&8P1OWWt5qAIp diff --git a/ownCloud/Resources/pt-PT.lproj/Localizable.strings b/ownCloud/Resources/pt-PT.lproj/Localizable.strings index f0a019754..93c95140a 100644 --- a/ownCloud/Resources/pt-PT.lproj/Localizable.strings +++ b/ownCloud/Resources/pt-PT.lproj/Localizable.strings @@ -257,9 +257,9 @@ "Decrease Slider Value" = "Decrease Slider Value"; "Increase Slider Value" = "Increase Slider Value"; -"Cellular transfers" = "Cellular transfers"; +"Cellular Data Usage" = "Cellular Data Usage"; "Some cellular data may still be used. To completely avoid the usage of cellular data, please turn off access to cellular for the entire app in the Settings app." = "Some cellular data may still be used. To completely avoid the usage of cellular data, please turn off access to cellular for the entire app in the Settings app."; -"Cellular transfers have been disabled via MDM configuration. Please contact your administrator for more information." = "Cellular transfers have been disabled via MDM configuration. Please contact your administrator for more information."; +"Cellular Data Usage have been disabled via MDM configuration. Please contact your administrator for more information." = "Cellular Data Usage have been disabled via MDM configuration. Please contact your administrator for more information."; "General" = "Geral"; "By feature" = "By feature"; diff --git a/ownCloud/Resources/ru.lproj/Localizable.strings b/ownCloud/Resources/ru.lproj/Localizable.strings index e53d6e109f1954274c877acc9b23d4c1f251d3ed..b3bd49df39e1e08d3e18619469eee48b6300a5a2 100644 GIT binary patch delta 62 zcmaF2j`hhN@#Mx9;mvaz_?Y?8q^38rFiK9IV=A!u INps(20OAQ1`Tzg` diff --git a/ownCloud/Resources/sq.lproj/Localizable.strings b/ownCloud/Resources/sq.lproj/Localizable.strings index f1c4f887f89d8e43fed696679748a31818ab8c29..5ac018c8a590300c60fd852aeb5d42275c0b51ad 100644 GIT binary patch delta 59 tcmaE|g!RP|)(sQtgXIvCLinhN@n-*0S0;Wm;mL1bN^ag)-nAD1B%%|R diff --git a/ownCloud/Resources/zh-Hans.lproj/Localizable.strings b/ownCloud/Resources/zh-Hans.lproj/Localizable.strings index 0348f76403e1cf0a6cb1177915fe748830407dd7..60ccdebb8a3441c237fe648d2321b09420ad21c0 100644 GIT binary patch delta 139 zcmdnh$9$-ddBY=LXBUP2GZ#asSHX$o-Gh7F*pNxIY3wn#EA?=Krt-p hH!J$BWfI0BG5KQP@yQ>!I3}+P6v8II`C?#ZDFC>lA#nfz delta 111 zcmX@q$GoeLdBY=L!4ifdhD3%uhGK>^hEyQCc=F0XSxnK*s(x#k_|X(kHe4z>`9t7_ U$sf2lCT|H8!Y04@Lts!T08VfsIRF3v diff --git a/ownCloud/Settings/CellularSettingsViewController.swift b/ownCloud/Settings/CellularSettingsViewController.swift index a0cebc86b..9247d5b48 100644 --- a/ownCloud/Settings/CellularSettingsViewController.swift +++ b/ownCloud/Settings/CellularSettingsViewController.swift @@ -62,7 +62,7 @@ class CellularSettingsViewController: StaticTableViewController { override func viewDidLoad() { super.viewDidLoad() - navigationItem.title = "Cellular transfers".localized + navigationItem.title = "Cellular Data Usage".localized if OCConnection.allowCellular { let mainSection = StaticTableViewSection(headerTitle: "General".localized, footerTitle: "".localized, identifier: "main-section", rows: [ @@ -84,7 +84,7 @@ class CellularSettingsViewController: StaticTableViewController { updateSwitchesVisibility(animated: false) } else { let cellularDisabledSection = StaticTableViewSection(headerTitle: "General".localized, identifier: "cellular-disabled-section", rows: [ - StaticTableViewRow(label: "Cellular transfers have been disabled via MDM configuration. Please contact your administrator for more information.".localized) + StaticTableViewRow(label: "Cellular Data Usage have been disabled via MDM configuration. Please contact your administrator for more information.".localized) ]) addSection(cellularDisabledSection) diff --git a/ownCloud/Settings/DataSettingsSection.swift b/ownCloud/Settings/DataSettingsSection.swift index bfff7c156..063c0c9c4 100644 --- a/ownCloud/Settings/DataSettingsSection.swift +++ b/ownCloud/Settings/DataSettingsSection.swift @@ -28,7 +28,7 @@ class DataSettingsSection: SettingsSection { cellularRow = StaticTableViewRow(valueRowWithAction: { [weak self] (_, _) in self?.pushCellularSettings() - }, title: "Cellular transfers".localized, value: self.cellularSummary, accessoryType: .disclosureIndicator, identifier: "storage-use-cellular") + }, title: "Cellular Data Usage".localized, value: self.cellularSummary, accessoryType: .disclosureIndicator, identifier: "storage-use-cellular") self.add(row: cellularRow!) From cddb2c831996a48ad28c7a8f5b9dd48b7d8180e3 Mon Sep 17 00:00:00 2001 From: Felix Schwarz Date: Mon, 18 Oct 2021 11:17:00 +0200 Subject: [PATCH 12/13] - adjust to final capabilities naming for infinite PROPFIND support --- ios-sdk | 2 +- ownCloud/Bookmarks/BookmarkViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ios-sdk b/ios-sdk index a70eff7e1..4f279b1a0 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit a70eff7e1377b28ffb1135178e98969259ba7a10 +Subproject commit 4f279b1a0c3c3bea62221dea7d8f0c3eeae7e360 diff --git a/ownCloud/Bookmarks/BookmarkViewController.swift b/ownCloud/Bookmarks/BookmarkViewController.swift index fea8a349a..25eabcde3 100644 --- a/ownCloud/Bookmarks/BookmarkViewController.swift +++ b/ownCloud/Bookmarks/BookmarkViewController.swift @@ -565,7 +565,7 @@ class BookmarkViewController: StaticTableViewController { if let strongSelf = self { if error == nil { - let serverSupportsInfinitePropfind = connection.capabilities?.supportsInfinitePropfind + let serverSupportsInfinitePropfind = connection.capabilities?.davPropfindSupportsDepthInfinity bookmark.displayName = connection.loggedInUser?.displayName connection.disconnect(completionHandler: { From 6d9c1c0b376728bf0ee2ff179ee575df90caabe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Hu=CC=88hne?= Date: Tue, 14 Dec 2021 14:36:29 +0100 Subject: [PATCH 13/13] upgraded app version numbers --- ownCloud.xcodeproj/project.pbxproj | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ownCloud.xcodeproj/project.pbxproj b/ownCloud.xcodeproj/project.pbxproj index 54af8ddc4..7af570514 100644 --- a/ownCloud.xcodeproj/project.pbxproj +++ b/ownCloud.xcodeproj/project.pbxproj @@ -4730,8 +4730,8 @@ APP_BUILD_FLAGS = "$(inherited)"; APP_BUILD_FLAGS_SWIFT = "$(APP_BUILD_FLAGS)"; APP_PRODUCT_NAME = ownCloud; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -4799,8 +4799,8 @@ APP_BUILD_FLAGS = "$(inherited)"; APP_BUILD_FLAGS_SWIFT = "$(APP_BUILD_FLAGS)"; APP_PRODUCT_NAME = ownCloud; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -4863,8 +4863,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ownCloud/ownCloud.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -4897,8 +4897,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ownCloud/ownCloud.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -5255,8 +5255,8 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = NO; @@ -5299,8 +5299,8 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; - APP_SHORT_VERSION = 11.8.0; - APP_VERSION = 202; + APP_SHORT_VERSION = 11.8.1; + APP_VERSION = 203; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = NO;