summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@kvadrat.se>2023-09-04 23:53:38 +0200
committerJon Petersson <jon.petersson@kvadrat.se>2023-09-07 16:46:26 +0200
commit7509670dd5d5cf3082feeb508ea5b3aabf5430cc (patch)
treef8f6cef66111e26a630740732840f361358f3376
parent827a84c9287705e30487f2f53b360e05dc418f54 (diff)
downloadmullvadvpn-7509670dd5d5cf3082feeb508ea5b3aabf5430cc.tar.xz
mullvadvpn-7509670dd5d5cf3082feeb508ea5b3aabf5430cc.zip
Fix or report all current smaller Swiftlint warnings in xcode
-rw-r--r--ios/.swiftlint.yml7
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj7
-rw-r--r--ios/MullvadVPN/AppDelegate.swift3
-rw-r--r--ios/MullvadVPN/Classes/AutomaticKeyboardResponder.swift4
-rw-r--r--ios/MullvadVPN/Classes/ConsolidatedApplicationLog.swift1
-rw-r--r--ios/MullvadVPN/Classes/InputTextFormatter.swift13
-rw-r--r--ios/MullvadVPN/Containers/Root/RootContainerViewController.swift2
-rw-r--r--ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift2
-rw-r--r--ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift2
-rw-r--r--ios/MullvadVPN/Extensions/NSRegularExpression+IPAddress.swift2
-rw-r--r--ios/MullvadVPN/Notifications/NotificationManager.swift5
-rw-r--r--ios/MullvadVPN/SceneDelegate.swift1
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProvider.swift1
-rw-r--r--ios/MullvadVPN/TunnelManager/SetAccountOperation.swift16
-rw-r--r--ios/MullvadVPN/TunnelManager/Tunnel.swift4
-rw-r--r--ios/MullvadVPN/TunnelManager/TunnelManager.swift1
-rw-r--r--ios/MullvadVPN/UI appearance/UIMetrics.swift23
-rw-r--r--ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift2
-rw-r--r--ios/MullvadVPN/View controllers/Login/LoginViewController.swift2
-rw-r--r--ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift10
-rw-r--r--ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift20
-rw-r--r--ios/MullvadVPN/View controllers/Preferences/PreferencesViewModel.swift8
-rw-r--r--ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift3
-rw-r--r--ios/MullvadVPN/View controllers/ProblemReport/ProblemReportViewController.swift25
-rw-r--r--ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift2
-rw-r--r--ios/MullvadVPN/View controllers/SelectLocation/SelectLocationCell.swift12
-rw-r--r--ios/MullvadVPN/View controllers/Settings/SettingsCell.swift6
-rw-r--r--ios/MullvadVPN/View controllers/TermsOfService/TermsOfServiceContentView.swift6
-rw-r--r--ios/MullvadVPN/View controllers/Tunnel/ConnectionPanelView.swift2
-rw-r--r--ios/MullvadVPN/View controllers/Tunnel/DisconnectSplitButton.swift5
-rw-r--r--ios/MullvadVPN/View controllers/Tunnel/TunnelControlView.swift2
-rw-r--r--ios/MullvadVPN/Views/AppButton.swift1
-rw-r--r--ios/MullvadVPNTests/DeviceCheckOperationTests.swift2
-rw-r--r--ios/Operations/AsyncOperation.swift27
-rw-r--r--ios/Operations/OperationBlockObserverSupport.swift35
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift2
-rw-r--r--ios/PacketTunnelCore/Pinger/Pinger.swift2
-rw-r--r--ios/PacketTunnelCore/TunnelMonitor/TunnelMonitor.swift2
-rw-r--r--ios/PacketTunnelCoreTests/TunnelMonitorTests.swift2
39 files changed, 166 insertions, 106 deletions
diff --git a/ios/.swiftlint.yml b/ios/.swiftlint.yml
index b5634621a3..9e7704961d 100644
--- a/ios/.swiftlint.yml
+++ b/ios/.swiftlint.yml
@@ -35,7 +35,8 @@ line_length:
type_name:
min_length: 4
max_length:
- error: 50
+ warning: 50
+ error: 60
excluded: iPhone # excluded via string
allowed_symbols: ["_"] # these are allowed in type names
identifier_name:
@@ -47,3 +48,7 @@ identifier_name:
- URL
- GlobalAPIKey
reporter: "xcode"
+nesting:
+ type_level:
+ warning: 2
+ error: 4
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 27f1694174..ccf1018d05 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -395,6 +395,7 @@
7A21DACF2A30AA3700A787A9 /* UITextField+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A21DACE2A30AA3700A787A9 /* UITextField+Appearance.swift */; };
7A307AD92A8CD8DA0017618B /* Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A307AD82A8CD8DA0017618B /* Duration.swift */; };
7A307ADB2A8F56DF0017618B /* Duration+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A307ADA2A8F56DF0017618B /* Duration+Extensions.swift */; };
+ 7A3353972AAA0F8600F0A71C /* OperationBlockObserverSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3353962AAA0F8600F0A71C /* OperationBlockObserverSupport.swift */; };
7A42DEC92A05164100B209BE /* SettingsInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A42DEC82A05164100B209BE /* SettingsInputCell.swift */; };
7A42DECD2A09064C00B209BE /* SelectableSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A42DECC2A09064C00B209BE /* SelectableSettingsCell.swift */; };
7A7AD28D29DC677800480EF1 /* FirstTimeLaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7AD28C29DC677800480EF1 /* FirstTimeLaunch.swift */; };
@@ -1311,6 +1312,7 @@
7A21DACE2A30AA3700A787A9 /* UITextField+Appearance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextField+Appearance.swift"; sourceTree = "<group>"; };
7A307AD82A8CD8DA0017618B /* Duration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Duration.swift; sourceTree = "<group>"; };
7A307ADA2A8F56DF0017618B /* Duration+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Duration+Extensions.swift"; sourceTree = "<group>"; };
+ 7A3353962AAA0F8600F0A71C /* OperationBlockObserverSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationBlockObserverSupport.swift; sourceTree = "<group>"; };
7A42DEC82A05164100B209BE /* SettingsInputCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCell.swift; sourceTree = "<group>"; };
7A42DECC2A09064C00B209BE /* SelectableSettingsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectableSettingsCell.swift; sourceTree = "<group>"; };
7A7AD28C29DC677800480EF1 /* FirstTimeLaunch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstTimeLaunch.swift; sourceTree = "<group>"; };
@@ -2456,8 +2458,9 @@
581813A628E09DF2002817DE /* MutuallyExclusive.swift */,
581813A028E09DBB002817DE /* NoCancelledDependenciesCondition.swift */,
581813A228E09DCD002817DE /* NoFailedDependenciesCondition.swift */,
- 5840BE34279EDB16002836BA /* OperationError.swift */,
+ 7A3353962AAA0F8600F0A71C /* OperationBlockObserverSupport.swift */,
589D28772846250500F9A7B3 /* OperationCondition.swift */,
+ 5840BE34279EDB16002836BA /* OperationError.swift */,
589D28792846250500F9A7B3 /* OperationObserver.swift */,
58059DDD28468158002B1049 /* OutputOperation.swift */,
5842102D282D3FC200F24E46 /* ResultBlockOperation.swift */,
@@ -4010,6 +4013,7 @@
58D223BB294C8A630029F5F8 /* NoCancelledDependenciesCondition.swift in Sources */,
58D223B3294C8A630029F5F8 /* OperationObserver.swift in Sources */,
58D223B7294C8A630029F5F8 /* MutuallyExclusive.swift in Sources */,
+ 7A3353972AAA0F8600F0A71C /* OperationBlockObserverSupport.swift in Sources */,
58D223B2294C8A630029F5F8 /* OperationError.swift in Sources */,
58D223AF294C8A630029F5F8 /* NoFailedDependenciesCondition.swift in Sources */,
58D223B9294C8A630029F5F8 /* AsyncOperationQueue.swift in Sources */,
@@ -4077,7 +4081,6 @@
58B465702A98C53300467203 /* RequestExecutorTests.swift in Sources */,
A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */,
58FBFBE9291622580020E046 /* ExponentialBackoffTests.swift in Sources */,
- 58FBFBF1291630700020E046 /* DurationTests.swift in Sources */,
58BDEB9D2A98F69E00F578F2 /* MemoryCache.swift in Sources */,
58BDEB9B2A98F58600F578F2 /* TimeServerProxy.swift in Sources */,
58BDEB992A98F4ED00F578F2 /* AnyTransport.swift in Sources */,
diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift
index 4c99cfd857..46d913e381 100644
--- a/ios/MullvadVPN/AppDelegate.swift
+++ b/ios/MullvadVPN/AppDelegate.swift
@@ -405,7 +405,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
let initTunnelManagerOperation = AsyncBlockOperation(dispatchQueue: .main) { finish in
self.tunnelManager.loadConfiguration { error in
- // TODO: avoid throwing fatal error and show the problem report UI instead.
if let error {
fatalError(error.localizedDescription)
}
@@ -492,4 +491,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
) {
completionHandler([.list, .banner, .sound])
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/Classes/AutomaticKeyboardResponder.swift b/ios/MullvadVPN/Classes/AutomaticKeyboardResponder.swift
index 99db0e966e..7a32ccf022 100644
--- a/ios/MullvadVPN/Classes/AutomaticKeyboardResponder.swift
+++ b/ios/MullvadVPN/Classes/AutomaticKeyboardResponder.swift
@@ -21,7 +21,9 @@ class AutomaticKeyboardResponder {
init<T: UIView>(targetView: T, handler: @escaping (T, CGFloat) -> Void) {
self.targetView = targetView
self.handler = { view, adjustment in
- handler(view as! T, adjustment)
+ if let view = view as? T {
+ handler(view, adjustment)
+ }
}
NotificationCenter.default.addObserver(
diff --git a/ios/MullvadVPN/Classes/ConsolidatedApplicationLog.swift b/ios/MullvadVPN/Classes/ConsolidatedApplicationLog.swift
index 22b9ec86f0..f6f5f0956f 100644
--- a/ios/MullvadVPN/Classes/ConsolidatedApplicationLog.swift
+++ b/ios/MullvadVPN/Classes/ConsolidatedApplicationLog.swift
@@ -176,6 +176,7 @@ class ConsolidatedApplicationLog: TextOutputStreamable {
private static func redactAccountNumber(string: String) -> String {
redact(
+ // swiftlint:disable:next force_try
regularExpression: try! NSRegularExpression(pattern: #"\d{16}"#),
string: string,
replacementString: kRedactedAccountPlaceholder
diff --git a/ios/MullvadVPN/Classes/InputTextFormatter.swift b/ios/MullvadVPN/Classes/InputTextFormatter.swift
index acb95e7960..c9a0cb88c5 100644
--- a/ios/MullvadVPN/Classes/InputTextFormatter.swift
+++ b/ios/MullvadVPN/Classes/InputTextFormatter.swift
@@ -75,8 +75,7 @@ class InputTextFormatter: NSObject, UITextFieldDelegate, UITextPasteDelegate {
// Since removing separator alone makes no sense, this computation extends the string range
// to include the digit preceding a separator.
- if replacementString.isEmpty, emptySelection,
- !formattedString.isEmpty {
+ if replacementString.isEmpty, emptySelection, !formattedString.isEmpty {
let precedingDigitIndex = formattedString
.prefix(through: stringRange.lowerBound)
.lastIndex { isAllowed($0) } ?? formattedString.startIndex
@@ -85,19 +84,13 @@ class InputTextFormatter: NSObject, UITextFieldDelegate, UITextPasteDelegate {
}
// Replace the given range within a formatted string
- let newString = formattedString.replacingCharacters(
- in: stringRange,
- with: replacementString
- )
+ let newString = formattedString.replacingCharacters(in: stringRange, with: replacementString)
// Number of digits within a string
var numDigits = 0
// Insertion location within the input string
- let insertionLocation = formattedString.distance(
- from: formattedString.startIndex,
- to: stringRange.lowerBound
- )
+ let insertionLocation = formattedString.distance(from: formattedString.startIndex, to: stringRange.lowerBound)
// Original caret location based on insertion location + number of characters added
let originalCaretPosition = insertionLocation + replacementString.count
diff --git a/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift b/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift
index afb28ce124..5b2f167d7d 100644
--- a/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift
+++ b/ios/MullvadVPN/Containers/Root/RootContainerViewController.swift
@@ -840,4 +840,6 @@ extension RootContainerViewController {
presentationContainerAccountButton?.isHidden = !configuration.showsAccountButton
headerBarView.update(configuration: configuration)
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
index 2c4a0cacab..ae302ea87d 100644
--- a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
@@ -979,4 +979,6 @@ fileprivate extension AppPreferencesDataSource {
mutating func markChangeLogSeen() {
self.lastSeenChangeLogVersion = Bundle.main.shortVersion
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift b/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift
index 33a09b4171..de341fbce8 100644
--- a/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift
@@ -96,7 +96,7 @@ extension WelcomeCoordinator: WelcomeViewControllerDelegate {
"""
let alertController = CustomAlertViewController(
message: NSLocalizedString(
- "WELCOME_DEVICE_CONCEPET_TEXT_DIALOG",
+ "WELCOME_DEVICE_CONCEPT_TEXT_DIALOG",
tableName: "Welcome",
value: message,
comment: ""
diff --git a/ios/MullvadVPN/Extensions/NSRegularExpression+IPAddress.swift b/ios/MullvadVPN/Extensions/NSRegularExpression+IPAddress.swift
index 7cb5ae90da..155de03d0a 100644
--- a/ios/MullvadVPN/Extensions/NSRegularExpression+IPAddress.swift
+++ b/ios/MullvadVPN/Extensions/NSRegularExpression+IPAddress.swift
@@ -22,6 +22,7 @@ extension NSRegularExpression {
return try! NSRegularExpression(pattern: pattern, options: [.allowCommentsAndWhitespace])
}
+ // swiftlint:disable line_length
static var ipv6RegularExpression: NSRegularExpression {
// Regular expression obtained from:
// https://stackoverflow.com/a/17871737
@@ -49,4 +50,5 @@ extension NSRegularExpression {
// swiftlint:disable:next force_try
return try! NSRegularExpression(pattern: pattern, options: [.allowCommentsAndWhitespace])
}
+ // swiftlint:enable line_length
}
diff --git a/ios/MullvadVPN/Notifications/NotificationManager.swift b/ios/MullvadVPN/Notifications/NotificationManager.swift
index 11da16407f..3f722a6280 100644
--- a/ios/MullvadVPN/Notifications/NotificationManager.swift
+++ b/ios/MullvadVPN/Notifications/NotificationManager.swift
@@ -207,7 +207,10 @@ final class NotificationManager: NotificationProviderDelegate {
}
}
- // Invalidate in-app notification
+ invalidateInAppNotification(notificationProvider)
+ }
+
+ private func invalidateInAppNotification(_ notificationProvider: NotificationProvider) {
if let notificationProvider = notificationProvider as? InAppNotificationProvider {
var newNotificationDescriptors = inAppNotificationDescriptors
diff --git a/ios/MullvadVPN/SceneDelegate.swift b/ios/MullvadVPN/SceneDelegate.swift
index 4720556fe4..c1e9b91f9c 100644
--- a/ios/MullvadVPN/SceneDelegate.swift
+++ b/ios/MullvadVPN/SceneDelegate.swift
@@ -27,6 +27,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, SettingsMigrationUIHand
private var tunnelObserver: TunnelObserver?
private var appDelegate: AppDelegate {
+ // swiftlint:disable:next force_cast
UIApplication.shared.delegate as! AppDelegate
}
diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProvider.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProvider.swift
index 637e0ad5f3..a2eb3d5f43 100644
--- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProvider.swift
+++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProvider.swift
@@ -423,4 +423,5 @@ final class SimulatorTunnelProviderManager: NSObject, VPNTunnelProviderManagerPr
}
}
+// swiftlint:disable:next file_length
#endif
diff --git a/ios/MullvadVPN/TunnelManager/SetAccountOperation.swift b/ios/MullvadVPN/TunnelManager/SetAccountOperation.swift
index 108b6be81b..080fdc36ab 100644
--- a/ios/MullvadVPN/TunnelManager/SetAccountOperation.swift
+++ b/ios/MullvadVPN/TunnelManager/SetAccountOperation.swift
@@ -216,10 +216,7 @@ class SetAccountOperation: ResultOperation<StoredAccountData?> {
let result = result.inspectError { error in
guard !error.isOperationCancellationError else { return }
- logger.error(
- error: error,
- message: "Failed to create new account."
- )
+ logger.error(error: error, message: "Failed to create new account.")
}.map { newAccountData -> StoredAccountData in
logger.debug("Created new account.")
@@ -322,10 +319,7 @@ class SetAccountOperation: ResultOperation<StoredAccountData?> {
dispatchQueue.async { [self] in
// Ignore error but log it.
if let error {
- logger.error(
- error: error,
- message: "Failed to remove VPN configuration."
- )
+ logger.error(error: error, message: "Failed to remove VPN configuration.")
}
interactor.setTunnel(nil, shouldRefreshTunnelState: false)
@@ -338,11 +332,7 @@ class SetAccountOperation: ResultOperation<StoredAccountData?> {
/// Create new private key and create new device via API.
private func createDevice(accountNumber: String, completion: @escaping (Result<NewDevice, Error>) -> Void) {
let privateKey = PrivateKey()
-
- let request = REST.CreateDeviceRequest(
- publicKey: privateKey.publicKey,
- hijackDNS: false
- )
+ let request = REST.CreateDeviceRequest(publicKey: privateKey.publicKey, hijackDNS: false)
logger.debug("Create device...")
diff --git a/ios/MullvadVPN/TunnelManager/Tunnel.swift b/ios/MullvadVPN/TunnelManager/Tunnel.swift
index fa830f1298..5a9990c886 100644
--- a/ios/MullvadVPN/TunnelManager/Tunnel.swift
+++ b/ios/MullvadVPN/TunnelManager/Tunnel.swift
@@ -108,9 +108,9 @@ final class Tunnel: Equatable {
}
func sendProviderMessage(_ messageData: Data, responseHandler: ((Data?) -> Void)?) throws {
- let session = tunnelProvider.connection as! VPNTunnelProviderSessionProtocol
+ let session = tunnelProvider.connection as? VPNTunnelProviderSessionProtocol
- try session.sendProviderMessage(messageData, responseHandler: responseHandler)
+ try session?.sendProviderMessage(messageData, responseHandler: responseHandler)
}
func setConfiguration(_ configuration: TunnelConfiguration) {
diff --git a/ios/MullvadVPN/TunnelManager/TunnelManager.swift b/ios/MullvadVPN/TunnelManager/TunnelManager.swift
index 905aec8445..3e0d159de8 100644
--- a/ios/MullvadVPN/TunnelManager/TunnelManager.swift
+++ b/ios/MullvadVPN/TunnelManager/TunnelManager.swift
@@ -755,7 +755,6 @@ final class TunnelManager: StorePaymentObserver {
}
case .invalid:
- // TODO: handle invalid account in some way?
break
}
}
diff --git a/ios/MullvadVPN/UI appearance/UIMetrics.swift b/ios/MullvadVPN/UI appearance/UIMetrics.swift
index d3145a821f..b257d5d46a 100644
--- a/ios/MullvadVPN/UI appearance/UIMetrics.swift
+++ b/ios/MullvadVPN/UI appearance/UIMetrics.swift
@@ -53,6 +53,20 @@ enum UIMetrics {
static let textFieldContentInsets = UIEdgeInsets(top: 8, left: 24, bottom: 8, right: 24)
static let textFieldNonEditingContentInsetLeft: CGFloat = 40
}
+
+ /// Group of constants related to in-app notifications banner.
+ enum InAppBannerNotification {
+ /// Layout margins for contents presented within the banner.
+ static let layoutMargins = NSDirectionalEdgeInsets(top: 16, leading: 24, bottom: 16, trailing: 24)
+
+ /// Size of little round severity indicator.
+ static let indicatorSize = CGSize(width: 12, height: 12)
+ }
+
+ enum DisconnectSplitButton {
+ static let secondaryButtonPhone = CGSize(width: 42, height: 42)
+ static let secondaryButtonPad = CGSize(width: 52, height: 52)
+ }
}
extension UIMetrics {
@@ -83,15 +97,6 @@ extension UIMetrics {
/// Common cell indentation width
static let cellIndentationWidth: CGFloat = 16
- /// Group of constants related to in-app notifications banner.
- enum InAppBannerNotification {
- /// Layout margins for contents presented within the banner.
- static let layoutMargins = NSDirectionalEdgeInsets(top: 16, leading: 24, bottom: 16, trailing: 24)
-
- /// Size of little round severity indicator.
- static let indicatorSize = CGSize(width: 12, height: 12)
- }
-
/// Spacing used in stack views of buttons
static let interButtonSpacing: CGFloat = 16
diff --git a/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift b/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift
index 2a34644b6d..e5eb0ddb77 100644
--- a/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift
+++ b/ios/MullvadVPN/View controllers/Login/AccountInputGroupView.swift
@@ -552,4 +552,6 @@ private class AccountInputBorderLayer: CAShapeLayer {
}
return super.defaultAction(forKey: event)
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/View controllers/Login/LoginViewController.swift b/ios/MullvadVPN/View controllers/Login/LoginViewController.swift
index e726107960..94e51afb55 100644
--- a/ios/MullvadVPN/View controllers/Login/LoginViewController.swift
+++ b/ios/MullvadVPN/View controllers/Login/LoginViewController.swift
@@ -433,4 +433,6 @@ private extension LoginState {
return .hidden
}
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift
index 651886277f..06b3dedb0b 100644
--- a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift
+++ b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift
@@ -156,7 +156,10 @@ class OutOfTimeViewController: UIViewController, RootContainment {
NSLocalizedString(
"OUT_OF_TIME_BODY_CONNECTED",
tableName: "OutOfTime",
- value: "You have no more VPN time left on this account. To add more, you will need to disconnect and access the Internet with an unsecure connection.",
+ value: """
+ You have no more VPN time left on this account. To add more, you will need to \
+ disconnect and access the Internet with an unsecure connection.
+ """,
comment: ""
)
)
@@ -165,7 +168,10 @@ class OutOfTimeViewController: UIViewController, RootContainment {
NSLocalizedString(
"OUT_OF_TIME_BODY_DISCONNECTED",
tableName: "OutOfTime",
- value: "You have no more VPN time left on this account. Either buy credit on our website or make an in-app purchase via the **Add 30 days time** button below.",
+ value: """
+ You have no more VPN time left on this account. Either buy credit on our website \
+ or make an in-app purchase via the **Add 30 days time** button below.
+ """,
comment: ""
)
)
diff --git a/ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift b/ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift
index 5c23cf4dcf..ef05999fe4 100644
--- a/ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift
+++ b/ios/MullvadVPN/View controllers/Preferences/PreferencesViewController.swift
@@ -117,6 +117,7 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
interactor.setDNSSettings(dnsSettings)
}
+ // swiftlint:disable:next function_body_length
func preferencesDataSource(
_ dataSource: PreferencesDataSource,
showInfo item: PreferencesDataSource.InfoButtonItem?
@@ -128,7 +129,11 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
message = NSLocalizedString(
"PREFERENCES_CONTENT_BLOCKERS_GENERAL",
tableName: "ContentBlockers",
- value: "When this feature is enabled it stops the device from contacting certain domains or websites known for distributing ads, malware, trackers and more. This might cause issues on certain websites, services, and programs.",
+ value: """
+ When this feature is enabled it stops the device from contacting certain \
+ domains or websites known for distributing ads, malware, trackers and more. \
+ This might cause issues on certain websites, services, and programs.
+ """,
comment: ""
)
@@ -136,7 +141,10 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
message = NSLocalizedString(
"PREFERENCES_CONTENT_BLOCKERS_MALWARE",
tableName: "ContentBlockers",
- value: "Warning: The malware blocker is not an anti-virus and should not be treated as such, this is just an extra layer of protection.",
+ value: """
+ Warning: The malware blocker is not an anti-virus and should not \
+ be treated as such, this is just an extra layer of protection.
+ """,
comment: ""
)
@@ -163,12 +171,15 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
)
#if DEBUG
-
case .wireGuardObfuscation:
message = NSLocalizedString(
"PREFERENCES_WIRE_GUARD_OBFUSCATION_GENERAL",
tableName: "WireGuardObfuscation",
- value: "Obfuscation hides the WireGuard traffic inside another protocol. It can be used to help circumvent censorship and other types of filtering, where a plain WireGuard connect would be blocked.",
+ value: """
+ Obfuscation hides the WireGuard traffic inside another protocol. \
+ It can be used to help circumvent censorship and other types of filtering, \
+ where a plain WireGuard connect would be blocked.
+ """,
comment: ""
)
@@ -180,6 +191,7 @@ class PreferencesViewController: UITableViewController, PreferencesDataSourceDel
comment: ""
)
#endif
+
default:
assertionFailure("No matching InfoButtonItem")
}
diff --git a/ios/MullvadVPN/View controllers/Preferences/PreferencesViewModel.swift b/ios/MullvadVPN/View controllers/Preferences/PreferencesViewModel.swift
index 091be496a5..85a381606a 100644
--- a/ios/MullvadVPN/View controllers/Preferences/PreferencesViewModel.swift
+++ b/ios/MullvadVPN/View controllers/Preferences/PreferencesViewModel.swift
@@ -53,7 +53,8 @@ enum CustomDNSPrecondition {
"CUSTOM_DNS_NO_DNS_ENTRIES_EDITING_OFF_FOOTNOTE",
tableName: "Preferences",
value: "Tap **Edit** to add at least one DNS server.",
- comment: "Foot note displayed if there are no DNS entries, but table view is not in editing mode."
+ comment:
+ "Foot note displayed if there are no DNS entries, but table view is not in editing mode."
),
options: MarkdownStylingOptions(font: preferredFont)
)
@@ -65,7 +66,10 @@ enum CustomDNSPrecondition {
"CUSTOM_DNS_DISABLE_CONTENT_BLOCKERS_FOOTNOTE",
tableName: "Preferences",
value: "Disable all content blockers (under VPN settings) to activate this setting.",
- comment: "Foot note displayed when custom DNS cannot be enabled, because content blockers should be disabled first."
+ comment: """
+ Foot note displayed when custom DNS cannot be enabled, because content blockers should be \
+ disabled first.
+ """
),
attributes: [.font: preferredFont]
)
diff --git a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
index 28aed41d77..b1bb49ccb2 100644
--- a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
+++ b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
@@ -17,9 +17,6 @@ final class ProblemReportInteractor {
private lazy var consolidatedLog: ConsolidatedApplicationLog = {
let securityGroupIdentifier = ApplicationConfiguration.securityGroupIdentifier
-
- // TODO: make sure we redact old tokens
-
let redactStrings = [tunnelManager.deviceState.accountData?.number].compactMap { $0 }
let report = ConsolidatedApplicationLog(
diff --git a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportViewController.swift b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportViewController.swift
index 93cfbde3eb..20b29e3364 100644
--- a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportViewController.swift
+++ b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportViewController.swift
@@ -43,7 +43,10 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
textLabel.text = NSLocalizedString(
"SUBHEAD_LABEL",
tableName: "ProblemReport",
- value: "To help you more effectively, your app’s log file will be attached to this message. Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel.",
+ value: """
+ To help you more effectively, your app’s log file will be attached to this message. \
+ Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel.
+ """,
comment: ""
)
return textLabel
@@ -82,7 +85,10 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
textView.placeholder = NSLocalizedString(
"DESCRIPTION_TEXTVIEW_PLACEHOLDER",
tableName: "ProblemReport",
- value: "To assist you better, please write in English or Swedish and include which country you are connecting from.",
+ value: """
+ To assist you better, please write in English or Swedish and include \
+ which country you are connecting from.
+ """,
comment: ""
)
textView.contentInsetAdjustmentBehavior = .never
@@ -453,14 +459,14 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
self.messageTextView.roundCorners = false
self.view.layoutIfNeeded()
- }) { _ in
+ }, completion: { _ in
self.isMessageTextViewExpanded = true
self.textViewKeyboardResponder?.updateContentInsets()
// Tell accessibility engine to scan the new layout
UIAccessibility.post(notification: .layoutChanged, argument: nil)
- }
+ })
} else {
// Re-enable the large title
@@ -476,7 +482,7 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
self.messageTextView.roundCorners = true
self.view.layoutIfNeeded()
- }) { _ in
+ }, completion: { _ in
// Revert the content adjustment behavior
self.messageTextView.contentInsetAdjustmentBehavior = .never
@@ -487,7 +493,7 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
// Tell accessibility engine to scan the new layout
UIAccessibility.post(notification: .layoutChanged, argument: nil)
- }
+ })
}
}
@@ -504,7 +510,10 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
let message = NSLocalizedString(
"EMPTY_EMAIL_ALERT_MESSAGE",
tableName: "ProblemReport",
- value: "You are about to send the problem report without a way for us to get back to you. If you want an answer to your report you will have to enter an email address.",
+ value: """
+ You are about to send the problem report without a way for us to get back to you. \
+ If you want an answer to your report you will have to enter an email address.
+ """,
comment: ""
)
@@ -718,4 +727,6 @@ final class ProblemReportViewController: UIViewController, UITextFieldDelegate {
messageTextView.becomeFirstResponder()
return false
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
index 8f07d64f71..3ee5e32452 100644
--- a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
+++ b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
@@ -518,4 +518,6 @@ private extension [RelayLocation] {
locations.contains(location)
})
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationCell.swift b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationCell.swift
index 89a44fa2f1..cb63f1428d 100644
--- a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationCell.swift
+++ b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationCell.swift
@@ -114,11 +114,7 @@ class SelectLocationCell: UITableViewCell {
collapseButton.accessibilityIdentifier = "CollapseButton"
collapseButton.isAccessibilityElement = false
collapseButton.tintColor = .white
- collapseButton.addTarget(
- self,
- action: #selector(handleCollapseButton(_:)),
- for: .touchUpInside
- )
+ collapseButton.addTarget(self, action: #selector(handleCollapseButton(_:)), for: .touchUpInside)
[locationLabel, tickImageView, statusIndicator, collapseButton].forEach { subview in
subview.translatesAutoresizingMaskIntoConstraints = false
@@ -132,8 +128,7 @@ class SelectLocationCell: UITableViewCell {
setLayoutMargins()
NSLayoutConstraint.activate([
- tickImageView.leadingAnchor
- .constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor),
+ tickImageView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor),
tickImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
statusIndicator.widthAnchor.constraint(equalToConstant: kRelayIndicatorSize),
@@ -148,8 +143,7 @@ class SelectLocationCell: UITableViewCell {
locationLabel.trailingAnchor.constraint(lessThanOrEqualTo: collapseButton.leadingAnchor)
.withPriority(.defaultHigh),
locationLabel.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor),
- locationLabel.bottomAnchor
- .constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor),
+ locationLabel.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor),
collapseButton.widthAnchor
.constraint(
diff --git a/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift b/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift
index a6333462ee..7cd88c8e81 100644
--- a/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift
+++ b/ios/MullvadVPN/View controllers/Settings/SettingsCell.swift
@@ -80,11 +80,7 @@ class SettingsCell: UITableViewCell {
contentView.backgroundColor = .clear
infoButton.isHidden = true
- infoButton.addTarget(
- self,
- action: #selector(handleInfoButton(_:)),
- for: .touchUpInside
- )
+ infoButton.addTarget(self, action: #selector(handleInfoButton(_:)), for: .touchUpInside)
titleLabel.translatesAutoresizingMaskIntoConstraints = false
titleLabel.font = UIFont.systemFont(ofSize: 17)
diff --git a/ios/MullvadVPN/View controllers/TermsOfService/TermsOfServiceContentView.swift b/ios/MullvadVPN/View controllers/TermsOfService/TermsOfServiceContentView.swift
index 11423c91e0..ec4541dabf 100644
--- a/ios/MullvadVPN/View controllers/TermsOfService/TermsOfServiceContentView.swift
+++ b/ios/MullvadVPN/View controllers/TermsOfService/TermsOfServiceContentView.swift
@@ -37,9 +37,11 @@ class TermsOfServiceContentView: UIView {
"PRIVACY_NOTICE_BODY",
tableName: "TermsOfService",
value: """
- You have a right to privacy. That’s why we never store activity logs, don’t ask for personal information, and encourage anonymous payments.
+ You have a right to privacy. That’s why we never store activity logs, don’t ask for personal \
+ information, and encourage anonymous payments.
- In some situations, as outlined in our privacy policy, we might process personal data that you choose to send, for example if you email us.
+ In some situations, as outlined in our privacy policy, we might process personal data that you \
+ choose to send, for example if you email us.
We strongly believe in retaining as little data as possible because we want you to remain anonymous.
""",
diff --git a/ios/MullvadVPN/View controllers/Tunnel/ConnectionPanelView.swift b/ios/MullvadVPN/View controllers/Tunnel/ConnectionPanelView.swift
index 30a0b7170e..65cae0c148 100644
--- a/ios/MullvadVPN/View controllers/Tunnel/ConnectionPanelView.swift
+++ b/ios/MullvadVPN/View controllers/Tunnel/ConnectionPanelView.swift
@@ -75,7 +75,7 @@ class ConnectionPanelView: UIView {
inAddressRow.translatesAutoresizingMaskIntoConstraints = false
outAddressRow.translatesAutoresizingMaskIntoConstraints = false
- // TODO: Unhide it when we have out address
+ // Remove this line when we have out address
outAddressRow.isHidden = true
inAddressRow.title = NSLocalizedString(
diff --git a/ios/MullvadVPN/View controllers/Tunnel/DisconnectSplitButton.swift b/ios/MullvadVPN/View controllers/Tunnel/DisconnectSplitButton.swift
index 59e807cfa0..8baa2eaac7 100644
--- a/ios/MullvadVPN/View controllers/Tunnel/DisconnectSplitButton.swift
+++ b/ios/MullvadVPN/View controllers/Tunnel/DisconnectSplitButton.swift
@@ -11,12 +11,11 @@ import UIKit
class DisconnectSplitButton: UIView {
private var secondaryButtonSize: CGSize {
- // TODO: make it less hardcoded
switch traitCollection.userInterfaceIdiom {
case .phone:
- return CGSize(width: 42, height: 42)
+ return UIMetrics.DisconnectSplitButton.secondaryButtonPhone
case .pad:
- return CGSize(width: 52, height: 52)
+ return UIMetrics.DisconnectSplitButton.secondaryButtonPad
default:
return .zero
}
diff --git a/ios/MullvadVPN/View controllers/Tunnel/TunnelControlView.swift b/ios/MullvadVPN/View controllers/Tunnel/TunnelControlView.swift
index 9c1103325d..2c26c6a07c 100644
--- a/ios/MullvadVPN/View controllers/Tunnel/TunnelControlView.swift
+++ b/ios/MullvadVPN/View controllers/Tunnel/TunnelControlView.swift
@@ -649,4 +649,6 @@ private extension TunnelState {
return []
}
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/MullvadVPN/Views/AppButton.swift b/ios/MullvadVPN/Views/AppButton.swift
index 2fc3603e22..48bbd20ac8 100644
--- a/ios/MullvadVPN/Views/AppButton.swift
+++ b/ios/MullvadVPN/Views/AppButton.swift
@@ -286,6 +286,7 @@ class CustomButton: UIButton {
}
}
+ // swiftlint:disable:next cyclomatic_complexity
private func computeLayout(forContentRect contentRect: CGRect) -> (CGRect, CGRect) {
var imageRect = super.imageRect(forContentRect: contentRect)
var titleRect = super.titleRect(forContentRect: contentRect)
diff --git a/ios/MullvadVPNTests/DeviceCheckOperationTests.swift b/ios/MullvadVPNTests/DeviceCheckOperationTests.swift
index cefd20ae45..887194d3d9 100644
--- a/ios/MullvadVPNTests/DeviceCheckOperationTests.swift
+++ b/ios/MullvadVPNTests/DeviceCheckOperationTests.swift
@@ -567,4 +567,6 @@ private extension AccountVerdict {
}
return false
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/Operations/AsyncOperation.swift b/ios/Operations/AsyncOperation.swift
index ea8edb24c4..638d6ff415 100644
--- a/ios/Operations/AsyncOperation.swift
+++ b/ios/Operations/AsyncOperation.swift
@@ -392,6 +392,8 @@ open class AsyncOperation: Operation {
}
}
+extension AsyncOperation: OperationBlockObserverSupport {}
+
extension Operation {
public func addDependencies(_ dependencies: [Operation]) {
for dependency in dependencies {
@@ -399,28 +401,3 @@ extension Operation {
}
}
}
-
-public protocol OperationBlockObserverSupport {}
-extension AsyncOperation: OperationBlockObserverSupport {}
-
-extension OperationBlockObserverSupport where Self: AsyncOperation {
- /// Add observer responding to cancellation event.
- public func onCancel(_ fn: @escaping (Self) -> Void) {
- addBlockObserver(OperationBlockObserver(didCancel: fn))
- }
-
- /// Add observer responding to finish event.
- public func onFinish(_ fn: @escaping (Self, Error?) -> Void) {
- addBlockObserver(OperationBlockObserver(didFinish: fn))
- }
-
- /// Add observer responding to start event.
- public func onStart(_ fn: @escaping (Self) -> Void) {
- addBlockObserver(OperationBlockObserver(didStart: fn))
- }
-
- /// Add block-based observer.
- public func addBlockObserver(_ observer: OperationBlockObserver<Self>) {
- addObserver(observer)
- }
-}
diff --git a/ios/Operations/OperationBlockObserverSupport.swift b/ios/Operations/OperationBlockObserverSupport.swift
new file mode 100644
index 0000000000..196adee763
--- /dev/null
+++ b/ios/Operations/OperationBlockObserverSupport.swift
@@ -0,0 +1,35 @@
+//
+// OperationBlockObserverSupport.swift
+// Operations
+//
+// Created by Jon Petersson on 2023-09-07.
+// Copyright © 2023 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+
+public protocol OperationBlockObserverSupport {}
+
+extension OperationBlockObserverSupport where Self: AsyncOperation {
+ /// Add observer responding to cancellation event.
+ public func onCancel(_ fn: @escaping (Self) -> Void) {
+ addBlockObserver(OperationBlockObserver(didCancel: fn))
+ }
+
+ /// Add observer responding to finish event.
+ public func onFinish(_ fn: @escaping (Self, Error?) -> Void) {
+ addBlockObserver(OperationBlockObserver(didFinish: fn))
+ }
+
+ /// Add observer responding to start event.
+ public func onStart(_ fn: @escaping (Self) -> Void) {
+ addBlockObserver(OperationBlockObserver(didStart: fn))
+ }
+
+ /// Add block-based observer.
+ public func addBlockObserver(_ observer: OperationBlockObserver<Self>) {
+ addObserver(observer)
+ }
+
+ // swiftlint:disable:next file_length
+}
diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift
index f06f1c0b4e..61e308d13b 100644
--- a/ios/PacketTunnel/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider.swift
@@ -763,4 +763,6 @@ extension PacketTunnelErrorWrapper {
return nil
}
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/PacketTunnelCore/Pinger/Pinger.swift b/ios/PacketTunnelCore/Pinger/Pinger.swift
index 8f220f38b6..0d754f3cfa 100644
--- a/ios/PacketTunnelCore/Pinger/Pinger.swift
+++ b/ios/PacketTunnelCore/Pinger/Pinger.swift
@@ -408,4 +408,6 @@ private extension IPv4Header {
var isIPv4Version: Bool {
(versionAndHeaderLength & 0xF0) == 0x40
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/PacketTunnelCore/TunnelMonitor/TunnelMonitor.swift b/ios/PacketTunnelCore/TunnelMonitor/TunnelMonitor.swift
index fc116fd7e1..443ff5dded 100644
--- a/ios/PacketTunnelCore/TunnelMonitor/TunnelMonitor.swift
+++ b/ios/PacketTunnelCore/TunnelMonitor/TunnelMonitor.swift
@@ -635,4 +635,6 @@ public final class TunnelMonitor: TunnelMonitorProtocol {
return nil
}
}
+
+ // swiftlint:disable:next file_length
}
diff --git a/ios/PacketTunnelCoreTests/TunnelMonitorTests.swift b/ios/PacketTunnelCoreTests/TunnelMonitorTests.swift
index e85a50617c..4677b042ad 100644
--- a/ios/PacketTunnelCoreTests/TunnelMonitorTests.swift
+++ b/ios/PacketTunnelCoreTests/TunnelMonitorTests.swift
@@ -118,7 +118,7 @@ final class TunnelMonitorTests: XCTestCase {
}
case .connectionEstablished:
- XCTFail()
+ XCTFail("Connection should fail.")
case .networkReachabilityChanged:
break