Skip to content

Commit c583c80

Browse files
author
Jon Petersson
committed
Move IP Overrides into VPN Settings menu
1 parent a28507d commit c583c80

26 files changed

+296
-222
lines changed

ios/MullvadSettings/SettingsManager.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public enum SettingsManager {
144144
public static func resetStore(completely: Bool = false) {
145145
logger.debug("Reset store.")
146146

147-
let keys = completely ? SettingsKey.allCases : [.settings, .deviceState, .apiAccessMethods]
147+
let keys = completely ? SettingsKey.allCases : [.settings, .deviceState, .apiAccessMethods, .ipOverrides]
148148

149149
keys.forEach { key in
150150
do {

ios/MullvadVPN.xcodeproj/project.pbxproj

+36-32
Large diffs are not rendered by default.

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,11 @@ public enum AccessibilityIdentifier: String {
3737
case problemReportSendButton
3838

3939
// Cells
40-
case preferencesCell
40+
case vpnSettingsCell
4141
case versionCell
4242
case problemReportCell
4343
case faqCell
4444
case apiAccessCell
45-
case ipOverrideCell
4645
case relayFilterOwnershipCell
4746
case relayFilterProviderCell
4847

@@ -83,6 +82,7 @@ public enum AccessibilityIdentifier: String {
8382

8483
// DNS settings
8584
case dnsSettings
85+
case ipOverrides
8686
case wireGuardCustomPort
8787
case wireGuardObfuscationAutomatic
8888
case wireGuardObfuscationOff

ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,8 @@ final class ApplicationCoordinator: Coordinator, Presenting, RootContainerViewCo
772772
storePaymentManager: storePaymentManager,
773773
tunnelManager: tunnelManager,
774774
apiProxy: apiProxy,
775-
relayCacheTracker: relayCacheTracker
775+
relayCacheTracker: relayCacheTracker,
776+
ipOverrideRepository: ipOverrideRepository
776777
)
777778

778779
let navigationController = CustomNavigationController()

ios/MullvadVPN/Coordinators/Settings/IPOverride/IPOverrideCoordinator.swift

+8-10
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,6 @@ class IPOverrideCoordinator: Coordinator, Presenting, SettingsChildCoordinator {
1515
private let navigationController: UINavigationController
1616
private let interactor: IPOverrideInteractor
1717

18-
private lazy var ipOverrideViewController: IPOverrideViewController = {
19-
let viewController = IPOverrideViewController(
20-
interactor: interactor,
21-
alertPresenter: AlertPresenter(context: self)
22-
)
23-
viewController.delegate = self
24-
return viewController
25-
}()
26-
2718
var presentationContext: UIViewController {
2819
navigationController
2920
}
@@ -38,7 +29,14 @@ class IPOverrideCoordinator: Coordinator, Presenting, SettingsChildCoordinator {
3829
}
3930

4031
func start(animated: Bool) {
41-
navigationController.pushViewController(ipOverrideViewController, animated: animated)
32+
let controller = IPOverrideViewController(
33+
interactor: interactor,
34+
alertPresenter: AlertPresenter(context: self)
35+
)
36+
37+
controller.delegate = self
38+
39+
navigationController.pushViewController(controller, animated: animated)
4240
}
4341
}
4442

ios/MullvadVPN/Coordinators/Settings/IPOverride/IPOverrideViewController.swift

-2
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,8 @@ class IPOverrideViewController: UIViewController {
147147
value: """
148148
On some networks, where various types of censorship are being used, our server IP addresses are \
149149
sometimes blocked.
150-
151150
To circumvent this you can import a file or a text, provided by our support team, \
152151
with new IP addresses that override the default addresses of the servers in the Select location view.
153-
154152
If you are having issues connecting to VPN servers, please contact support.
155153
""",
156154
comment: ""

ios/MullvadVPN/Coordinators/Settings/SettingsCoordinator.swift

+8-19
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ enum SettingsNavigationRoute: Equatable {
1818
case root
1919

2020
/// VPN settings.
21-
case preferences
21+
case vpnSettings
2222

2323
/// Problem report.
2424
case problemReport
@@ -28,9 +28,6 @@ enum SettingsNavigationRoute: Equatable {
2828

2929
/// API access route.
3030
case apiAccess
31-
32-
/// IP override route.
33-
case ipOverride
3431
}
3532

3633
/// Top-level settings coordinator.
@@ -246,10 +243,11 @@ final class SettingsCoordinator: Coordinator, Presentable, Presenting, SettingsV
246243
controller.delegate = self
247244
return .viewController(controller)
248245

249-
case .preferences:
250-
return .viewController(PreferencesViewController(
251-
interactor: interactorFactory.makePreferencesInteractor(),
252-
alertPresenter: AlertPresenter(context: self)
246+
case .vpnSettings:
247+
return .childCoordinator(VPNSettingsCoordinator(
248+
navigationController: navigationController,
249+
interactorFactory: interactorFactory,
250+
ipOverrideRepository: ipOverrideRepository
253251
))
254252

255253
case .problemReport:
@@ -265,13 +263,6 @@ final class SettingsCoordinator: Coordinator, Presentable, Presenting, SettingsV
265263
proxyConfigurationTester: proxyConfigurationTester
266264
))
267265

268-
case .ipOverride:
269-
return .childCoordinator(IPOverrideCoordinator(
270-
navigationController: navigationController,
271-
repository: ipOverrideRepository,
272-
tunnelManager: interactorFactory.tunnelManager
273-
))
274-
275266
case .faq:
276267
// Handled separately and presented as a modal.
277268
return .failed
@@ -285,14 +276,12 @@ final class SettingsCoordinator: Coordinator, Presentable, Presenting, SettingsV
285276
switch viewController {
286277
case is SettingsViewController:
287278
return .root
288-
case is PreferencesViewController:
289-
return .preferences
279+
case is VPNSettingsViewController:
280+
return .vpnSettings
290281
case is ProblemReportViewController:
291282
return .problemReport
292283
case is ListAccessMethodViewController:
293284
return .apiAccess
294-
case is IPOverrideViewController:
295-
return .ipOverride
296285
default:
297286
return nil
298287
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//
2+
// VPNSettingsCoordinator.swift
3+
// MullvadVPN
4+
//
5+
// Created by Jon Petersson on 2024-03-18.
6+
// Copyright © 2024 Mullvad VPN AB. All rights reserved.
7+
//
8+
9+
import MullvadSettings
10+
import MullvadTypes
11+
import Routing
12+
import UIKit
13+
14+
class VPNSettingsCoordinator: Coordinator, Presenting, SettingsChildCoordinator {
15+
private let navigationController: UINavigationController
16+
private let interactorFactory: SettingsInteractorFactory
17+
private let ipOverrideRepository: IPOverrideRepositoryProtocol
18+
19+
var presentationContext: UIViewController {
20+
navigationController
21+
}
22+
23+
init(
24+
navigationController: UINavigationController,
25+
interactorFactory: SettingsInteractorFactory,
26+
ipOverrideRepository: IPOverrideRepositoryProtocol
27+
) {
28+
self.navigationController = navigationController
29+
self.interactorFactory = interactorFactory
30+
self.ipOverrideRepository = ipOverrideRepository
31+
}
32+
33+
func start(animated: Bool) {
34+
let controller = VPNSettingsViewController(
35+
interactor: interactorFactory.makeVPNSettingsInteractor(),
36+
alertPresenter: AlertPresenter(context: self)
37+
)
38+
39+
controller.delegate = self
40+
41+
navigationController.pushViewController(controller, animated: animated)
42+
}
43+
}
44+
45+
extension VPNSettingsCoordinator: VPNSettingsViewControllerDelegate {
46+
func showIPOverrides() {
47+
let coordinator = IPOverrideCoordinator(
48+
navigationController: navigationController,
49+
repository: ipOverrideRepository,
50+
tunnelManager: interactorFactory.tunnelManager
51+
)
52+
53+
addChild(coordinator)
54+
coordinator.start(animated: true)
55+
}
56+
}

ios/MullvadVPN/View controllers/Preferences/PreferencesDataSourceDelegate.swift

-16
This file was deleted.

ios/MullvadVPN/View controllers/Settings/SettingsCellFactory.swift

+2-15
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ struct SettingsCellFactory: CellFactoryProtocol {
2828
// swiftlint:disable:next function_body_length
2929
func configureCell(_ cell: UITableViewCell, item: SettingsDataSource.Item, indexPath: IndexPath) {
3030
switch item {
31-
case .preferences:
31+
case .vpnSettings:
3232
guard let cell = cell as? SettingsCell else { return }
3333

3434
cell.titleLabel.text = NSLocalizedString(
35-
"PREFERENCES_CELL_LABEL",
35+
"VPN_SETTINGS_CELL_LABEL",
3636
tableName: "Settings",
3737
value: "VPN settings",
3838
comment: ""
@@ -92,19 +92,6 @@ struct SettingsCellFactory: CellFactoryProtocol {
9292
cell.detailTitleLabel.text = nil
9393
cell.accessibilityIdentifier = item.accessibilityIdentifier
9494
cell.disclosureType = .chevron
95-
96-
case .ipOverride:
97-
guard let cell = cell as? SettingsCell else { return }
98-
99-
cell.titleLabel.text = NSLocalizedString(
100-
"IP_OVERRIDE_CELL_LABEL",
101-
tableName: "Settings",
102-
value: "Server IP override",
103-
comment: ""
104-
)
105-
cell.detailTitleLabel.text = nil
106-
cell.accessibilityIdentifier = item.accessibilityIdentifier
107-
cell.disclosureType = .chevron
10895
}
10996
}
11097
}

ios/MullvadVPN/View controllers/Settings/SettingsDataSource.swift

+4-8
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,16 @@ final class SettingsDataSource: UITableViewDiffableDataSource<SettingsDataSource
3434
}
3535

3636
enum Item: String {
37-
case preferences
37+
case vpnSettings
3838
case version
3939
case problemReport
4040
case faq
4141
case apiAccess
42-
case ipOverride
4342

4443
var accessibilityIdentifier: AccessibilityIdentifier {
4544
switch self {
46-
case .preferences:
47-
return .preferencesCell
45+
case .vpnSettings:
46+
return .vpnSettingsCell
4847
case .version:
4948
return .versionCell
5049
case .problemReport:
@@ -53,8 +52,6 @@ final class SettingsDataSource: UITableViewDiffableDataSource<SettingsDataSource
5352
return .faqCell
5453
case .apiAccess:
5554
return .apiAccessCell
56-
case .ipOverride:
57-
return .ipOverrideCell
5855
}
5956
}
6057

@@ -149,11 +146,10 @@ final class SettingsDataSource: UITableViewDiffableDataSource<SettingsDataSource
149146
snapshot.appendSections([.main])
150147

151148
if interactor.deviceState.isLoggedIn {
152-
snapshot.appendItems([.preferences], toSection: .main)
149+
snapshot.appendItems([.vpnSettings], toSection: .main)
153150
}
154151

155152
snapshot.appendItems([.apiAccess], toSection: .main)
156-
snapshot.appendItems([.ipOverride], toSection: .main)
157153

158154
snapshot.appendSections([.version, .problemReport])
159155
snapshot.appendItems([.version], toSection: .version)

ios/MullvadVPN/View controllers/Settings/SettingsInputCell.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class SettingsInputCell: SelectableSettingsCell {
2929
toolbarDoneButton = UIBarButtonItem(
3030
title: NSLocalizedString(
3131
"INPUT_CELL_TOOLBAR_BUTTON_DONE",
32-
tableName: "Preferences",
32+
tableName: "VPNSettings",
3333
value: "Done",
3434
comment: ""
3535
),

ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift

+11-4
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,33 @@
66
// Copyright © 2022 Mullvad VPN AB. All rights reserved.
77
//
88

9-
import Foundation
109
import MullvadREST
10+
import MullvadSettings
1111

1212
final class SettingsInteractorFactory {
1313
private let storePaymentManager: StorePaymentManager
1414
private let apiProxy: APIQuerying
1515
private let relayCacheTracker: RelayCacheTracker
16+
private let ipOverrideRepository: IPOverrideRepositoryProtocol
1617

1718
let tunnelManager: TunnelManager
1819

1920
init(
2021
storePaymentManager: StorePaymentManager,
2122
tunnelManager: TunnelManager,
2223
apiProxy: APIQuerying,
23-
relayCacheTracker: RelayCacheTracker
24+
relayCacheTracker: RelayCacheTracker,
25+
ipOverrideRepository: IPOverrideRepositoryProtocol
2426
) {
2527
self.storePaymentManager = storePaymentManager
2628
self.tunnelManager = tunnelManager
2729
self.apiProxy = apiProxy
2830
self.relayCacheTracker = relayCacheTracker
31+
self.ipOverrideRepository = ipOverrideRepository
2932
}
3033

31-
func makePreferencesInteractor() -> PreferencesInteractor {
32-
PreferencesInteractor(tunnelManager: tunnelManager, relayCacheTracker: relayCacheTracker)
34+
func makeVPNSettingsInteractor() -> VPNSettingsInteractor {
35+
VPNSettingsInteractor(tunnelManager: tunnelManager, relayCacheTracker: relayCacheTracker)
3336
}
3437

3538
func makeProblemReportInteractor() -> ProblemReportInteractor {
@@ -39,4 +42,8 @@ final class SettingsInteractorFactory {
3942
func makeSettingsInteractor() -> SettingsInteractor {
4043
SettingsInteractor(tunnelManager: tunnelManager)
4144
}
45+
46+
func makeIPOverrideInteractor() -> IPOverrideInteractor {
47+
IPOverrideInteractor(repository: ipOverrideRepository, tunnelManager: tunnelManager)
48+
}
4249
}

ios/MullvadVPN/View controllers/Settings/SettingsViewController.swift

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ class SettingsViewController: UITableViewController, SettingsDataSourceDelegate
7979
extension SettingsDataSource.Item {
8080
var navigationRoute: SettingsNavigationRoute? {
8181
switch self {
82-
case .preferences:
83-
return .preferences
82+
case .vpnSettings:
83+
return .vpnSettings
8484
case .version:
8585
return nil
8686
case .problemReport:
@@ -89,8 +89,6 @@ extension SettingsDataSource.Item {
8989
return .faq
9090
case .apiAccess:
9191
return .apiAccess
92-
case .ipOverride:
93-
return .ipOverride
9492
}
9593
}
9694
}

0 commit comments

Comments
 (0)