diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100755 index 000000000..2fce9c8de --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,64 @@ +# rule identifiers to exclude from running +disabled_rules: + - trailing_whitespace + - todo + - conditional_binding_cascade + - mark + - vertical_whitespace + - syntactic_sugar + - unused_closure_parameter + - closure_parameter_position + - redundant_string_enum_value + - large_tuple + - shorthand_operator + - vertical_parameter_alignment + - identifier_name + +# some rules are only opt-in +opt_in_rules: + - force_unwrapping + - private_action + - explicit_init + +# paths to include during linting. `--path` is ignored if present. +included: + - Riot + +# paths to ignore during linting. Takes precedence over `included`. +excluded: + - Carthage + - Pods + - Riot/Generated/ + +line_length: + warning: 250 + error: 1000 + +file_length: + warning: 700 + error: 1000 + +type_body_length: + warning: 700 + error: 1000 + +function_parameter_count: + warning: 7 + error: 10 + +cyclomatic_complexity: + ignores_case_statements: true + warning: 20 + error: 25 + +function_body_length: + warning: 100 + error: 150 + +# naming rules can set warnings/errors for min_length and max_length +# additionally they can set excluded names +type_name: + min_length: 3 # only warning + max_length: # warning and error + warning: 150 + error: 1000 diff --git a/CHANGES.rst b/CHANGES.rst index da8af16db..f17ec7adc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,7 @@ Improvements: * Update deprecated contact availability checks (#2222). * RoomVC: Remove the beta warning modal when enabling e2e in a room (#2239). * Fastlane: Update to Xcode 10.1 (#2202). + * Use SwiftLint to enforce Swift style and conventions (PR #2300). Bug fix: * Reskin: status bar text is no more readable on iPad (#2276). diff --git a/Podfile b/Podfile index 796298a32..2377b2a22 100644 --- a/Podfile +++ b/Podfile @@ -80,6 +80,7 @@ abstract_target 'RiotPods' do # Tools pod 'SwiftGen', '~> 6.1' + pod 'SwiftLint', '~> 0.30.1' target "Riot" do import_MatrixKit diff --git a/Podfile.lock b/Podfile.lock index 38c19fed1..7b874f889 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -71,7 +71,7 @@ PODS: - GZIP (~> 1.2.2) - libbase58 (~> 0.1.4) - OLMKit (~> 3.0.0) - - Realm (~> 3.13.1) + - Realm (~> 3.11.1) - MatrixSDK/JingleCallStack (0.12.2): - MatrixSDK/Core - WebRTC (= 63.11.20455) @@ -85,15 +85,16 @@ PODS: - PiwikTracker (4.4.2): - PiwikTracker/Core (= 4.4.2) - PiwikTracker/Core (4.4.2) - - Realm (3.13.1): - - Realm/Headers (= 3.13.1) - - Realm/Headers (3.13.1) + - Realm (3.11.2): + - Realm/Headers (= 3.11.2) + - Realm/Headers (3.11.2) - Reusable (4.0.5): - Reusable/Storyboard (= 4.0.5) - Reusable/View (= 4.0.5) - Reusable/Storyboard (4.0.5) - Reusable/View (4.0.5) - SwiftGen (6.1.0) + - SwiftLint (0.30.1) - WebRTC (63.11.20455) - zxcvbn-ios (1.0.4) @@ -108,7 +109,8 @@ DEPENDENCIES: - OLMKit - PiwikTracker (from `https://github.com/manuroe/matomo-sdk-ios.git`, branch `feature/CustomVariables`) - Reusable (~> 4.0) - - SwiftGen (~> 6.0) + - SwiftGen (~> 6.1) + - SwiftLint (~> 0.30.1) - zxcvbn-ios SPEC REPOS: @@ -128,6 +130,7 @@ SPEC REPOS: - Realm - Reusable - SwiftGen + - SwiftLint - WebRTC - zxcvbn-ios @@ -155,12 +158,13 @@ SPEC CHECKSUMS: MatrixSDK: 60a9472eacdf51e5110b8bc7beba844debf992ef OLMKit: 88eda69110489f817d59bcb4353b7c247570aa4f PiwikTracker: 42862c7b13028065c3dfd36b4dc38db8a5765acf - Realm: 50071da38fe079e0735e47c9f2eae738c68c5996 + Realm: 864477d028db77f7c5a0cba64a4892ad53db128a Reusable: 188be1a54ac0691bc66e5bb24ec6eb91971b315b SwiftGen: f872ca75cbd17bf7103c17f13dcfa0d9a15667b0 + SwiftLint: a54bf1fe12b55c68560eb2a7689dfc81458508f7 WebRTC: f2a6203584745fe53532633397557876b5d71640 zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c -PODFILE CHECKSUM: 17a74795e75026048d90793d2ebb0880eac5c55f +PODFILE CHECKSUM: e35dd68cbd07be4c9dcf9e481000dd4498982e8a -COCOAPODS: 1.6.0 +COCOAPODS: 1.6.1 diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 6b4418e00..f5bef4c89 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -2964,6 +2964,7 @@ buildConfigurationList = F094A9C81B78D8F000B1FBBF /* Build configuration list for PBXNativeTarget "Riot" */; buildPhases = ( E34E30CD2CEE4A42FF8081D6 /* [CP] Check Pods Manifest.lock */, + B1D1AC122225A43600D64A6C /* ⚠️ SwiftLint */, B1098BD821ECD3ED000DDA48 /* 🛠 SwiftGen */, F094A99E1B78D8F000B1FBBF /* Sources */, F094A99F1B78D8F000B1FBBF /* Frameworks */, @@ -3363,6 +3364,24 @@ shellPath = /bin/sh; shellScript = "${PODS_ROOT}/SwiftGen/bin/swiftgen config run --config Tools/SwiftGen/swiftgen-config.yml\n"; }; + B1D1AC122225A43600D64A6C /* ⚠️ SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "⚠️ SwiftLint"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "${PODS_ROOT}/SwiftLint/swiftlint\n"; + }; E34E30CD2CEE4A42FF8081D6 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/Riot/Categories/UIControl.swift b/Riot/Categories/UIControl.swift index 0706d4c96..619f1e7cd 100644 --- a/Riot/Categories/UIControl.swift +++ b/Riot/Categories/UIControl.swift @@ -18,9 +18,9 @@ import UIKit // Source: https://stackoverflow.com/a/44917661 class ClosureSleeve { - let closure: () -> () + let closure: () -> Void - init(attachTo: AnyObject, closure: @escaping () -> ()) { + init(attachTo: AnyObject, closure: @escaping () -> Void) { self.closure = closure objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN) } @@ -31,7 +31,7 @@ class ClosureSleeve { } extension UIControl { - func vc_addAction(for controlEvents: UIControl.Event = .primaryActionTriggered, action: @escaping () -> ()) { + func vc_addAction(for controlEvents: UIControl.Event = .primaryActionTriggered, action: @escaping () -> Void) { let sleeve = ClosureSleeve(attachTo: self, closure: action) addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents) } diff --git a/Riot/Managers/OnBoarding/OnBoardingManager.swift b/Riot/Managers/OnBoarding/OnBoardingManager.swift index fbfc7c844..9656fb213 100644 --- a/Riot/Managers/OnBoarding/OnBoardingManager.swift +++ b/Riot/Managers/OnBoarding/OnBoardingManager.swift @@ -53,16 +53,16 @@ final public class OnBoardingManager: NSObject { self.session.matrixRestClient.avatarUrl(forUser: Constants.riotBotMatrixId) { (response) in switch response { - case .success(_): + case .success: // Create DM room with Riot-bot let httpOperation = self.session.createRoom(name: nil, visibility: .private, alias: nil, topic: nil, invite: [Constants.riotBotMatrixId], invite3PID: nil, isDirect: true, preset: .trustedPrivateChat) { (response) in switch response { - case .success(_): + case .success: success?() case .failure(let error): - NSLog("[OnBoardingManager] Create chat with riot-bot failed"); + NSLog("[OnBoardingManager] Create chat with riot-bot failed") failure?(error) } } @@ -71,7 +71,7 @@ final public class OnBoardingManager: NSObject { httpOperation.maxNumberOfTries = Constants.createRiotBotDMRequestMaxNumberOfTries case .failure(let error): - NSLog("[OnBoardingManager] riot-bot is unknown or the user hs is non federated. Do not try to create a room with riot-bot"); + NSLog("[OnBoardingManager] riot-bot is unknown or the user hs is non federated. Do not try to create a room with riot-bot") failure?(error) } } diff --git a/Riot/Managers/Theme/Theme.swift b/Riot/Managers/Theme/Theme.swift index 241c9924c..8ead5dbbe 100644 --- a/Riot/Managers/Theme/Theme.swift +++ b/Riot/Managers/Theme/Theme.swift @@ -60,7 +60,7 @@ import UIKit var scrollBarStyle: UIScrollView.IndicatorStyle { get } - var keyboardAppearance : UIKeyboardAppearance { get } + var keyboardAppearance: UIKeyboardAppearance { get } // MARK: - Colors not defined in the design palette diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index 4d08afb07..a3e6d1c5f 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -62,26 +62,26 @@ class DarkTheme: NSObject, Theme { var matrixSearchBackgroundImageTintColor: UIColor = UIColor(rgb: 0x7E7E7E) func applyStyle(onTabBar tabBar: UITabBar) { - tabBar.tintColor = self.tintColor; - tabBar.barTintColor = self.headerBackgroundColor; - tabBar.isTranslucent = false; + tabBar.tintColor = self.tintColor + tabBar.barTintColor = self.headerBackgroundColor + tabBar.isTranslucent = false } func applyStyle(onNavigationBar navigationBar: UINavigationBar) { - navigationBar.tintColor = self.baseTextPrimaryColor; + navigationBar.tintColor = self.baseTextPrimaryColor navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: self.baseTextPrimaryColor ] - navigationBar.barTintColor = self.baseColor; + navigationBar.barTintColor = self.baseColor // The navigation bar needs to be opaque so that its background color is the expected one - navigationBar.isTranslucent = false; + navigationBar.isTranslucent = false } func applyStyle(onSearchBar searchBar: UISearchBar) { searchBar.barStyle = .black - searchBar.tintColor = self.searchPlaceholderColor; - searchBar.barTintColor = self.headerBackgroundColor; + searchBar.tintColor = self.searchPlaceholderColor + searchBar.barTintColor = self.headerBackgroundColor } func applyStyle(onTextField texField: UITextField) { diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index 7690e6685..d2490640d 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -57,31 +57,31 @@ class DefaultTheme: NSObject, Theme { var keyboardAppearance: UIKeyboardAppearance = .light var placeholderTextColor: UIColor = UIColor(white: 0.7, alpha: 1.0) // Use default 70% gray color - var selectedBackgroundColor: UIColor? = nil // Use the default selection color + var selectedBackgroundColor: UIColor? // Use the default selection color var overlayBackgroundColor: UIColor = UIColor(white: 0.7, alpha: 0.5) var matrixSearchBackgroundImageTintColor: UIColor = UIColor(rgb: 0xE7E7E7) func applyStyle(onTabBar tabBar: UITabBar) { - tabBar.tintColor = self.tintColor; - tabBar.barTintColor = self.headerBackgroundColor; - tabBar.isTranslucent = false; + tabBar.tintColor = self.tintColor + tabBar.barTintColor = self.headerBackgroundColor + tabBar.isTranslucent = false } func applyStyle(onNavigationBar navigationBar: UINavigationBar) { - navigationBar.tintColor = self.baseTextPrimaryColor; + navigationBar.tintColor = self.baseTextPrimaryColor navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: self.baseTextPrimaryColor ] - navigationBar.barTintColor = self.baseColor; + navigationBar.barTintColor = self.baseColor // The navigation bar needs to be opaque so that its background color is the expected one - navigationBar.isTranslucent = false; + navigationBar.isTranslucent = false } func applyStyle(onSearchBar searchBar: UISearchBar) { searchBar.barStyle = .default - searchBar.tintColor = self.searchPlaceholderColor; - searchBar.barTintColor = self.headerBackgroundColor; + searchBar.tintColor = self.searchPlaceholderColor + searchBar.barTintColor = self.headerBackgroundColor } func applyStyle(onTextField texField: UITextField) { diff --git a/Riot/Modules/Authentication/Views/TermsView.swift b/Riot/Modules/Authentication/Views/TermsView.swift index 7a387fd7c..cc1f8b4a9 100644 --- a/Riot/Modules/Authentication/Views/TermsView.swift +++ b/Riot/Modules/Authentication/Views/TermsView.swift @@ -24,7 +24,7 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie @objc weak var delegate: MXKAuthInputsViewDelegate? - private var acceptedCallback: (()->Void)? + private var acceptedCallback: (() -> Void)? /// NavigationVC to display a policy content @@ -116,7 +116,7 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie acceptButton.alpha = acceptButton.isEnabled ? 1 : 0.5 } - @IBAction func didAcceptButtonTapped(_ sender: Any) { + @IBAction private func didAcceptButtonTapped(_ sender: Any) { if policies.count == acceptedPolicies.count { acceptedCallback?() } @@ -131,7 +131,9 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier(), for: indexPath) as! TableViewCellWithCheckBoxAndLabel + guard let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier(), for: indexPath) as? TableViewCellWithCheckBoxAndLabel else { + fatalError("\(String(describing: TableViewCellWithCheckBoxAndLabel.self)) should be registered") + } let policy = policies[indexPath.row] let accepted = acceptedPolicies .contains(indexPath.row) @@ -186,7 +188,7 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie let webViewViewController: WebViewViewController = WebViewViewController(url: policy.url) webViewViewController.title = policy.name - let leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action:#selector(didTapCancelOnPolicyScreen)) + let leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action: #selector(didTapCancelOnPolicyScreen)) webViewViewController.navigationItem.leftBarButtonItem = leftBarButtonItem navigationController = RiotNavigationController() diff --git a/Riot/Modules/KeyBackup/Recover/KeyBackupRecoverCoordinator.swift b/Riot/Modules/KeyBackup/Recover/KeyBackupRecoverCoordinator.swift index 084bdc25e..3912c1715 100644 --- a/Riot/Modules/KeyBackup/Recover/KeyBackupRecoverCoordinator.swift +++ b/Riot/Modules/KeyBackup/Recover/KeyBackupRecoverCoordinator.swift @@ -129,4 +129,3 @@ extension KeyBackupRecoverCoordinator: KeyBackupRecoverSuccessViewControllerDele self.delegate?.keyBackupRecoverCoordinatorDidRecover(self) } } - diff --git a/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseCoordinator.swift b/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseCoordinator.swift index 40c85ff7e..eaf5c7ee6 100644 --- a/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseCoordinator.swift +++ b/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseCoordinator.swift @@ -70,4 +70,3 @@ extension KeyBackupRecoverFromPassphraseCoordinator: KeyBackupRecoverFromPassphr self.delegate?.keyBackupRecoverFromPassphraseCoordinatorDidCancel(self) } } - diff --git a/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseViewController.swift b/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseViewController.swift index 018d0255f..3d7ac2c7b 100644 --- a/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseViewController.swift +++ b/Riot/Modules/KeyBackup/Recover/Passphrase/KeyBackupRecoverFromPassphraseViewController.swift @@ -130,16 +130,16 @@ final class KeyBackupRecoverFromPassphraseViewController: UIViewController { self.passphraseTitleLabel.textColor = theme.textPrimaryColor theme.applyStyle(onTextField: self.passphraseTextField) self.passphraseTextField.attributedPlaceholder = NSAttributedString(string: VectorL10n.keyBackupRecoverFromPassphrasePassphrasePlaceholder, - attributes: [.foregroundColor : theme.placeholderTextColor]) + attributes: [.foregroundColor: theme.placeholderTextColor]) self.theme.applyStyle(onButton: self.passphraseVisibilityButton) self.recoverButtonBackgroundView.backgroundColor = theme.backgroundColor theme.applyStyle(onButton: self.recoverButton) - let unknownRecoveryKeyAttributedString = NSMutableAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart1, attributes: [.foregroundColor : self.theme.textPrimaryColor]) - let unknownRecoveryKeyAttributedStringPart2 = NSAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart2, attributes: [.foregroundColor : self.theme.tintColor]) - let unknownRecoveryKeyAttributedStringPart3 = NSAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart3, attributes: [.foregroundColor : self.theme.textPrimaryColor]) + let unknownRecoveryKeyAttributedString = NSMutableAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart1, attributes: [.foregroundColor: self.theme.textPrimaryColor]) + let unknownRecoveryKeyAttributedStringPart2 = NSAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart2, attributes: [.foregroundColor: self.theme.tintColor]) + let unknownRecoveryKeyAttributedStringPart3 = NSAttributedString(string: VectorL10n.keyBackupRecoverFromPassphraseLostPassphraseActionPart3, attributes: [.foregroundColor: self.theme.textPrimaryColor]) unknownRecoveryKeyAttributedString.append(unknownRecoveryKeyAttributedStringPart2) unknownRecoveryKeyAttributedString.append(unknownRecoveryKeyAttributedStringPart3) diff --git a/Riot/Modules/KeyBackup/Recover/RecoveryKey/KeyBackupRecoverFromRecoveryKeyViewController.swift b/Riot/Modules/KeyBackup/Recover/RecoveryKey/KeyBackupRecoverFromRecoveryKeyViewController.swift index ac097bc27..4b2bc5356 100644 --- a/Riot/Modules/KeyBackup/Recover/RecoveryKey/KeyBackupRecoverFromRecoveryKeyViewController.swift +++ b/Riot/Modules/KeyBackup/Recover/RecoveryKey/KeyBackupRecoverFromRecoveryKeyViewController.swift @@ -135,7 +135,7 @@ final class KeyBackupRecoverFromRecoveryKeyViewController: UIViewController { self.recoveryKeyTitleLabel.textColor = theme.textPrimaryColor theme.applyStyle(onTextField: self.recoveryKeyTextField) self.recoveryKeyTextField.attributedPlaceholder = NSAttributedString(string: VectorL10n.keyBackupRecoverFromRecoveryKeyRecoveryKeyPlaceholder, - attributes: [.foregroundColor : theme.placeholderTextColor]) + attributes: [.foregroundColor: theme.placeholderTextColor]) theme.applyStyle(onButton: self.importFileButton) diff --git a/Riot/Modules/KeyBackup/Setup/Intro/KeyBackupSetupIntroViewController.swift b/Riot/Modules/KeyBackup/Setup/Intro/KeyBackupSetupIntroViewController.swift index 8963b5af8..c38f882a9 100644 --- a/Riot/Modules/KeyBackup/Setup/Intro/KeyBackupSetupIntroViewController.swift +++ b/Riot/Modules/KeyBackup/Setup/Intro/KeyBackupSetupIntroViewController.swift @@ -133,12 +133,12 @@ final class KeyBackupSetupIntroViewController: UIViewController { private func showSkipAlert() { let alertController = UIAlertController(title: VectorL10n.keyBackupSetupSkipAlertTitle, message: VectorL10n.keyBackupSetupSkipAlertMessage, - preferredStyle:.alert) + preferredStyle: .alert) alertController.addAction(UIAlertAction(title: VectorL10n.continue, style: .cancel, handler: { action in })) - alertController.addAction(UIAlertAction(title: VectorL10n.keyBackupSetupSkipAlertSkipAction , style: .default, handler: { action in + alertController.addAction(UIAlertAction(title: VectorL10n.keyBackupSetupSkipAlertSkipAction, style: .default, handler: { action in self.delegate?.keyBackupSetupIntroViewControllerDidCancel(self) })) diff --git a/Riot/Modules/KeyBackup/Setup/Passphrase/KeyBackupSetupPassphraseViewController.swift b/Riot/Modules/KeyBackup/Setup/Passphrase/KeyBackupSetupPassphraseViewController.swift index c9d51ff90..8fe14beac 100644 --- a/Riot/Modules/KeyBackup/Setup/Passphrase/KeyBackupSetupPassphraseViewController.swift +++ b/Riot/Modules/KeyBackup/Setup/Passphrase/KeyBackupSetupPassphraseViewController.swift @@ -150,7 +150,7 @@ final class KeyBackupSetupPassphraseViewController: UIViewController { self.passphraseTitleLabel.textColor = theme.textPrimaryColor theme.applyStyle(onTextField: self.passphraseTextField) self.passphraseTextField.attributedPlaceholder = NSAttributedString(string: VectorL10n.keyBackupSetupPassphrasePassphrasePlaceholder, - attributes: [.foregroundColor : theme.placeholderTextColor]) + attributes: [.foregroundColor: theme.placeholderTextColor]) self.updatePassphraseAdditionalLabel() self.formSeparatorView.backgroundColor = theme.lineBreakColor @@ -158,7 +158,7 @@ final class KeyBackupSetupPassphraseViewController: UIViewController { self.confirmPassphraseTitleLabel.textColor = theme.textPrimaryColor theme.applyStyle(onTextField: self.confirmPassphraseTextField) self.confirmPassphraseTextField.attributedPlaceholder = NSAttributedString(string: VectorL10n.keyBackupSetupPassphraseConfirmPassphraseTitle, - attributes: [.foregroundColor : theme.placeholderTextColor]) + attributes: [.foregroundColor: theme.placeholderTextColor]) self.updateConfirmPassphraseAdditionalLabel() self.setPassphraseButton.backgroundColor = theme.backgroundColor @@ -277,12 +277,12 @@ final class KeyBackupSetupPassphraseViewController: UIViewController { private func render(viewState: KeyBackupSetupPassphraseViewState) { switch viewState { - case .loading: - self.renderLoading() - case .loaded: - self.renderLoaded() - case .error(let error): - self.render(error: error) + case .loading: + self.renderLoading() + case .loaded: + self.renderLoaded() + case .error(let error): + self.render(error: error) } } @@ -308,13 +308,13 @@ final class KeyBackupSetupPassphraseViewController: UIViewController { let alertController = UIAlertController(title: VectorL10n.keyBackupSetupSkipAlertTitle, message: VectorL10n.keyBackupSetupSkipAlertMessage, - preferredStyle:.alert) + preferredStyle: .alert) alertController.addAction(UIAlertAction(title: VectorL10n.continue, style: .cancel, handler: { action in self.viewModel.process(viewAction: .skipAlertContinue) })) - alertController.addAction(UIAlertAction(title: VectorL10n.keyBackupSetupSkipAlertSkipAction , style: .default, handler: { action in + alertController.addAction(UIAlertAction(title: VectorL10n.keyBackupSetupSkipAlertSkipAction, style: .default, handler: { action in self.viewModel.process(viewAction: .skipAlertSkip) })) diff --git a/Riot/Modules/KeyBackup/Setup/RecoveryKey/KeyBackupSetupRecoveryKeyViewController.swift b/Riot/Modules/KeyBackup/Setup/RecoveryKey/KeyBackupSetupRecoveryKeyViewController.swift index 9f7ba38be..751747364 100644 --- a/Riot/Modules/KeyBackup/Setup/RecoveryKey/KeyBackupSetupRecoveryKeyViewController.swift +++ b/Riot/Modules/KeyBackup/Setup/RecoveryKey/KeyBackupSetupRecoveryKeyViewController.swift @@ -193,7 +193,7 @@ final class KeyBackupSetupRecoveryKeyViewController: UIViewController { let alertController = UIAlertController(title: VectorL10n.keyBackupSetupSkipAlertTitle, message: VectorL10n.keyBackupSetupSkipAlertMessage, - preferredStyle:.alert) + preferredStyle: .alert) alertController.addAction(UIAlertAction(title: VectorL10n.continue, style: .cancel, handler: { action in self.viewModel.process(viewAction: .skipAlertContinue) diff --git a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift index 549928268..4c50bcb3e 100644 --- a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift +++ b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift @@ -24,11 +24,11 @@ import UIKit func settingsKeyBackupTableViewSectionShowKeyBackupSetup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection) - func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showKeyBackupRecover keyBackupVersion:MXKeyBackupVersion) - func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showKeyBackupDeleteConfirm keyBackupVersion:MXKeyBackupVersion) + func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) + func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showKeyBackupDeleteConfirm keyBackupVersion: MXKeyBackupVersion) - func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showActivityIndicator show:Bool) - func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showError error:Error) + func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showActivityIndicator show: Bool) + func settingsKeyBackup(_ settingsKeyBackupTableViewSection: SettingsKeyBackupTableViewSection, showError error: Error) } @objc final class SettingsKeyBackupTableViewSection: NSObject { @@ -78,15 +78,15 @@ import UIKit return numberOfRows } - @objc func cellForRow(atRow row:Int) -> UITableViewCell { + @objc func cellForRow(atRow row: Int) -> UITableViewCell { var cell: UITableViewCell switch self.viewState { case .checkingBackup: - cell = self.renderCheckingBackupCell(atRow:row) + cell = self.renderCheckingBackupCell(atRow: row) case .noBackup: - cell = self.renderNoBackupCell(atRow:row) + cell = self.renderNoBackupCell(atRow: row) case .backup(let keyBackupVersion, let keyBackupVersionTrust): cell = self.renderBackupCell(atRow: row, @@ -94,13 +94,13 @@ import UIKit keyBackupVersionTrust: keyBackupVersionTrust) case .backupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, let backupProgress): - cell = self.renderBackupAndRunningCell(atRow:row, + cell = self.renderBackupAndRunningCell(atRow: row, keyBackupVersion: keyBackupVersion, keyBackupVersionTrust: keyBackupVersionTrust, backupProgress: backupProgress) case .backupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): - cell = self.renderBackupNotTrustedCell(atRow:row, + cell = self.renderBackupNotTrustedCell(atRow: row, keyBackupVersion: keyBackupVersion, keyBackupVersionTrust: keyBackupVersionTrust) } @@ -125,7 +125,7 @@ import UIKit private func renderCheckingBackupCell(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } let cell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) @@ -146,7 +146,7 @@ import UIKit private func renderNoBackupCell(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } var cell: UITableViewCell @@ -167,7 +167,7 @@ import UIKit cell = self.buttonCellForCreate(atRow: row) default: - cell = UITableViewCell.init() + cell = UITableViewCell() } return cell @@ -180,7 +180,7 @@ import UIKit private func renderBackupCell(atRow row: Int, keyBackupVersion: MXKeyBackupVersion, keyBackupVersionTrust: MXKeyBackupVersionTrust) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } var cell: UITableViewCell @@ -211,7 +211,7 @@ import UIKit case 2: let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) - let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust); + let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) infoCell.mxkTextView.text = backupTrust.joined(separator: "\n") cell = infoCell @@ -223,7 +223,7 @@ import UIKit cell = self.buttonCellForDelete(keyBackupVersion: keyBackupVersion, atRow: row) default: - cell = UITableViewCell.init() + cell = UITableViewCell() } return cell @@ -236,7 +236,7 @@ import UIKit private func renderBackupAndRunningCell(atRow row: Int, keyBackupVersion: MXKeyBackupVersion, keyBackupVersionTrust: MXKeyBackupVersionTrust, backupProgress: Progress) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } var cell: UITableViewCell @@ -269,7 +269,7 @@ import UIKit case 2: let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) - let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust); + let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) infoCell.mxkTextView.text = backupTrust.joined(separator: "\n") cell = infoCell @@ -281,7 +281,7 @@ import UIKit cell = self.buttonCellForDelete(keyBackupVersion: keyBackupVersion, atRow: row) default: - cell = UITableViewCell.init() + cell = UITableViewCell() } return cell @@ -294,7 +294,7 @@ import UIKit private func renderBackupNotTrustedCell(atRow row: Int, keyBackupVersion: MXKeyBackupVersion, keyBackupVersionTrust: MXKeyBackupVersionTrust) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } var cell: UITableViewCell @@ -325,7 +325,7 @@ import UIKit case 2: let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) - let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust); + let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) infoCell.mxkTextView.text = backupTrust.joined(separator: "\n") cell = infoCell @@ -337,7 +337,7 @@ import UIKit cell = self.buttonCellForDelete(keyBackupVersion: keyBackupVersion, atRow: row) default: - cell = UITableViewCell.init() + cell = UITableViewCell() } return cell @@ -357,64 +357,29 @@ import UIKit if device.fingerprint == self.userDevice.fingerprint { return VectorL10n.settingsKeyBackupInfoTrustSignatureValid - } - else if signature.valid && (device.verified == MXDeviceVerified) { + } else if signature.valid && (device.verified == MXDeviceVerified) { return VectorL10n.settingsKeyBackupInfoTrustSignatureValidDeviceVerified(displayName) - } - else if signature.valid && (device.verified != MXDeviceVerified) { + } else if signature.valid && (device.verified != MXDeviceVerified) { return VectorL10n.settingsKeyBackupInfoTrustSignatureValidDeviceUnverified(displayName) - } - else if !signature.valid && (device.verified == MXDeviceVerified) { + } else if !signature.valid && (device.verified == MXDeviceVerified) { return VectorL10n.settingsKeyBackupInfoTrustSignatureInvalidDeviceVerified(displayName) - } - else if !signature.valid && (device.verified != MXDeviceVerified) { + } else if !signature.valid && (device.verified != MXDeviceVerified) { return VectorL10n.settingsKeyBackupInfoTrustSignatureInvalidDeviceUnverified(displayName) } - return ""; + return "" } } - private func lastNonVerifiedDevice(_ keyBackupVersionTrust:MXKeyBackupVersionTrust) -> MXDeviceInfo? - { - var lastNonVerifiedDevice: MXDeviceInfo? - for signature in keyBackupVersionTrust.signatures.reversed() { - - guard let device = signature.device else { - continue - } - - if device.verified != MXDeviceVerified - { - lastNonVerifiedDevice = device - break - } - } - return lastNonVerifiedDevice - } - - private func lastUnVerifiableDevice(_ keyBackupVersionTrust:MXKeyBackupVersionTrust) -> String? - { - var lastUnVerifiableDevice: String? - for signature in keyBackupVersionTrust.signatures.reversed() { - - if signature.device == nil { - lastUnVerifiableDevice = signature.deviceId - break - } - } - return lastUnVerifiableDevice - } - // MARK: - Button cells private func buttonCellForCreate(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } - let cell:MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) + let cell: MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) let btnTitle = VectorL10n.settingsKeyBackupButtonCreate cell.mxkButton.setTitle(btnTitle, for: .normal) @@ -429,10 +394,10 @@ import UIKit private func buttonCellForRestore(keyBackupVersion: MXKeyBackupVersion, atRow row: Int, title: String = VectorL10n.settingsKeyBackupButtonRestore) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } - let cell:MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) + let cell: MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) cell.mxkButton.setTitle(title, for: .normal) cell.mxkButton.setTitle(title, for: .highlighted) cell.mxkButton.vc_addAction { @@ -443,10 +408,10 @@ import UIKit private func buttonCellForDelete(keyBackupVersion: MXKeyBackupVersion, atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { - return UITableViewCell.init() + return UITableViewCell() } - let cell:MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) + let cell: MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) let btnTitle = VectorL10n.settingsKeyBackupButtonDelete cell.mxkButton.setTitle(btnTitle, for: .normal) cell.mxkButton.setTitle(btnTitle, for: .highlighted) diff --git a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModel.swift b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModel.swift index c8a265684..bbe3cabcd 100644 --- a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModel.swift +++ b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModel.swift @@ -48,16 +48,12 @@ final class SettingsKeyBackupViewModel: SettingsKeyBackupViewModelType { self.checkKeyBackupState() case .create: viewDelegate.settingsKeyBackupViewModelShowKeyBackupSetup(self) - break case .restore(let keyBackupVersion): viewDelegate.settingsKeyBackup(self, showKeyBackupRecover: keyBackupVersion) - break case .confirmDelete(let keyBackupVersion): viewDelegate.settingsKeyBackup(self, showKeyBackupDeleteConfirm: keyBackupVersion) - break case .delete(let keyBackupVersion): self.deleteKeyBackupVersion(keyBackupVersion) - break } } @@ -76,15 +72,14 @@ final class SettingsKeyBackupViewModel: SettingsKeyBackupViewModelType { return } - sself.computeState(withBackupVersionTrust:keyBackupVersionTrust) + sself.computeState(withBackupVersionTrust: keyBackupVersionTrust) }) - } - else { + } else { computeState() } } - private func computeState(withBackupVersionTrust keyBackupVersionTrust:MXKeyBackupVersionTrust? = nil) { + private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) { var viewState: SettingsKeyBackupViewState? switch self.keyBackup.state { diff --git a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModelType.swift b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModelType.swift index f7cc5e3bf..662462145 100644 --- a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModelType.swift +++ b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupViewModelType.swift @@ -21,8 +21,8 @@ protocol SettingsKeyBackupViewModelViewDelegate: class { func settingsKeyBackupViewModel(_ viewModel: SettingsKeyBackupViewModelType, didUpdateNetworkRequestViewState networkRequestViewSate: SettingsKeyBackupNetworkRequestViewState) func settingsKeyBackupViewModelShowKeyBackupSetup(_ viewModel: SettingsKeyBackupViewModelType) - func settingsKeyBackup(_ viewModel: SettingsKeyBackupViewModelType, showKeyBackupRecover keyBackupVersion:MXKeyBackupVersion) - func settingsKeyBackup(_ viewModel: SettingsKeyBackupViewModelType, showKeyBackupDeleteConfirm keyBackupVersion:MXKeyBackupVersion) + func settingsKeyBackup(_ viewModel: SettingsKeyBackupViewModelType, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) + func settingsKeyBackup(_ viewModel: SettingsKeyBackupViewModelType, showKeyBackupDeleteConfirm keyBackupVersion: MXKeyBackupVersion) } protocol SettingsKeyBackupViewModelType {