Skip to content

Commit 5dd533c

Browse files
committed
Merge branch 'change-multihop-toggle-behavior-ios-770'
2 parents 5871bd8 + 16936b6 commit 5dd533c

8 files changed

+24
-106
lines changed

ios/MullvadVPN.xcodeproj/project.pbxproj

+5-9
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,6 @@
954954
F0DA87492A9CBA9F006044F1 /* AccountDeviceRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */; };
955955
F0DA874B2A9CBACB006044F1 /* AccountNumberRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */; };
956956
F0DAC8AD2C16EFE400F80144 /* TunnelSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04DD3D72C130DF600E03E28 /* TunnelSettingsManager.swift */; };
957-
F0DAC8AF2C1712C300F80144 /* MultihopPromptAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DAC8AE2C1712C300F80144 /* MultihopPromptAlert.swift */; };
958957
F0DDE4152B220458006B57A7 /* ShadowsocksConfigurationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */; };
959958
F0DDE4162B220458006B57A7 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4112B220458006B57A7 /* TransportProvider.swift */; };
960959
F0DDE4182B220458006B57A7 /* ShadowsocksConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */; };
@@ -2129,7 +2128,6 @@
21292128
F0DA87462A9CB9A2006044F1 /* AccountExpiryRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountExpiryRow.swift; sourceTree = "<group>"; };
21302129
F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDeviceRow.swift; sourceTree = "<group>"; };
21312130
F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountNumberRow.swift; sourceTree = "<group>"; };
2132-
F0DAC8AE2C1712C300F80144 /* MultihopPromptAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultihopPromptAlert.swift; sourceTree = "<group>"; };
21332131
F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowSocksProxy.swift; sourceTree = "<group>"; };
21342132
F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfigurationCache.swift; sourceTree = "<group>"; };
21352133
F0DDE4112B220458006B57A7 /* TransportProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = "<group>"; };
@@ -3911,33 +3909,32 @@
39113909
children = (
39123910
85FB5A0F2B6960A30015DCED /* AccountDeletionPage.swift */,
39133911
85557B1F2B5FBBD700795FE1 /* AccountPage.swift */,
3912+
852D054E2BC43DF7008578D2 /* AddAccessMethodPage.swift */,
39143913
7ACD79382C0DAADC00DBEE14 /* AddCustomListLocationsPage.swift */,
39153914
8529693B2B4F0257007EAD4C /* Alert.swift */,
3915+
852D054C2BC3DE3A008578D2 /* APIAccessPage.swift */,
3916+
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */,
39163917
8587A05C2B84D43100152938 /* ChangeLogAlert.swift */,
39173918
A9BFB0002BD00B7F00F2BCA1 /* CustomListPage.swift */,
39183919
85A42B872BB44D31007BABF7 /* DeviceManagementPage.swift */,
39193920
852A26452BA9C9CB006EB9C8 /* DNSSettingsPage.swift */,
3921+
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */,
39203922
A998DA822BD2B055001D61A2 /* EditCustomListLocationsPage.swift */,
39213923
85557B1D2B5FB8C700795FE1 /* HeaderBar.swift */,
39223924
A998DA802BD147AD001D61A2 /* ListCustomListsPage.swift */,
39233925
852969342B4E9270007EAD4C /* LoginPage.swift */,
3924-
F0DAC8AE2C1712C300F80144 /* MultihopPromptAlert.swift */,
39253926
85139B2C2B84B4A700734217 /* OutOfTimePage.swift */,
39263927
852969322B4E9232007EAD4C /* Page.swift */,
39273928
855D9F5A2B63E56B00D7C64D /* ProblemReportPage.swift */,
39283929
8532E6862B8CCED600ACECD1 /* ProblemReportSubmittedPage.swift */,
39293930
8556EB552B9B0AC500D26DD4 /* RevokedDevicePage.swift */,
3931+
8542F7522BCFBD050035C042 /* SelectLocationFilterPage.swift */,
39303932
850201DC2B503D8C00EF8C96 /* SelectLocationPage.swift */,
39313933
850201E22B51A93C00EF8C96 /* SettingsPage.swift */,
39323934
852969392B4F0238007EAD4C /* TermsOfServicePage.swift */,
39333935
850201DE2B5040A500EF8C96 /* TunnelControlPage.swift */,
39343936
8542CE232B95F7B9006FCA14 /* VPNSettingsPage.swift */,
39353937
85FB5A0B2B6903990015DCED /* WelcomePage.swift */,
3936-
8542F7522BCFBD050035C042 /* SelectLocationFilterPage.swift */,
3937-
852D054C2BC3DE3A008578D2 /* APIAccessPage.swift */,
3938-
852D054E2BC43DF7008578D2 /* AddAccessMethodPage.swift */,
3939-
8585CBE22BC684180015B6A4 /* EditAccessMethodPage.swift */,
3940-
85021CAD2BDBC4290098B400 /* AppLogsPage.swift */,
39413938
);
39423939
path = Pages;
39433940
sourceTree = "<group>";
@@ -6049,7 +6046,6 @@
60496046
7A45CFC72C071DD400D80B21 /* SnapshotHelper.swift in Sources */,
60506047
856952DC2BD2922A008C1F84 /* PartnerAPIClient.swift in Sources */,
60516048
85557B162B5ABBBE00795FE1 /* XCUIElementQuery+Extensions.swift in Sources */,
6052-
F0DAC8AF2C1712C300F80144 /* MultihopPromptAlert.swift in Sources */,
60536049
855D9F5B2B63E56B00D7C64D /* ProblemReportPage.swift in Sources */,
60546050
8529693A2B4F0238007EAD4C /* TermsOfServicePage.swift in Sources */,
60556051
85A42B882BB44D31007BABF7 /* DeviceManagementPage.swift in Sources */,

ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift

+4
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ final class VPNSettingsCellFactory: CellFactoryProtocol {
218218
cell.accessibilityIdentifier = item.accessibilityIdentifier
219219
cell.setOn(viewModel.multihopState.isEnabled, animated: false)
220220

221+
cell.infoButtonHandler = { [weak self] in
222+
self?.delegate?.showInfo(for: .multihop)
223+
}
224+
221225
cell.action = { [weak self] isEnabled in
222226
let state: MultihopState = isEnabled ? .on : .off
223227
self?.delegate?.switchMultihop(state)

ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsDataSource.swift

+2-13
Original file line numberDiff line numberDiff line change
@@ -617,19 +617,8 @@ extension VPNSettingsDataSource: VPNSettingsCellEventHandler {
617617
}
618618

619619
func switchMultihop(_ state: MultihopState) {
620-
if state == .on {
621-
delegate?.showMultihopConfirmation({ [weak self] in
622-
guard let self else { return }
623-
viewModel.setMultihop(state)
624-
self.delegate?.didChangeViewModel(viewModel)
625-
}, onDiscard: { [weak self] in
626-
guard let self else { return }
627-
reload(item: .multihop)
628-
})
629-
} else {
630-
viewModel.setMultihop(state)
631-
delegate?.didChangeViewModel(viewModel)
632-
}
620+
viewModel.setMultihop(state)
621+
delegate?.didChangeViewModel(viewModel)
633622
}
634623
}
635624

ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsDataSourceDelegate.swift

-1
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,4 @@ protocol VPNSettingsDataSourceDelegate: AnyObject {
2020
func showDNSSettings()
2121
func showIPOverrides()
2222
func didSelectWireGuardPort(_ port: UInt16?)
23-
func showMultihopConfirmation(_ onSave: @escaping () -> Void, onDiscard: @escaping () -> Void)
2423
}

ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInfoButtonItem.swift

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ enum VPNSettingsInfoButtonItem {
1313
case wireGuardObfuscation
1414
case wireGuardObfuscationPort
1515
case quantumResistance
16+
case multihop
1617
}

ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsViewController.swift

+12-44
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ extension VPNSettingsViewController: VPNSettingsDataSourceDelegate {
175175
""",
176176
comment: ""
177177
)
178+
179+
case .multihop:
180+
message = NSLocalizedString(
181+
"MULTIHOP_INFORMATION_TEXT",
182+
tableName: "Multihop",
183+
value: """
184+
Multihop routes your traffic into one WireGuard server and out another, making it harder to trace.
185+
This results in increased latency but increases anonymity online.
186+
""",
187+
188+
comment: ""
189+
)
178190
default:
179191
assertionFailure("No matching InfoButtonItem")
180192
}
@@ -194,48 +206,4 @@ extension VPNSettingsViewController: VPNSettingsDataSourceDelegate {
194206
func didSelectWireGuardPort(_ port: UInt16?) {
195207
interactor.setPort(port)
196208
}
197-
198-
func showMultihopConfirmation(_ onSave: @escaping () -> Void, onDiscard: @escaping () -> Void) {
199-
let presentation = AlertPresentation(
200-
id: "multihop-confirm-alert",
201-
accessibilityIdentifier: .multihopPromptAlert,
202-
icon: .info,
203-
message: NSLocalizedString(
204-
"MULTIHOP_CONFIRM_ALERT_TEXT",
205-
tableName: "Multihop",
206-
value: "This setting increases latency. Use only if needed.",
207-
comment: ""
208-
),
209-
buttons: [
210-
AlertAction(
211-
title: NSLocalizedString(
212-
"MULTIHOP_CONFIRM_ALERT_ENABLE_BUTTON",
213-
tableName: "Multihop",
214-
value: "Enable anyway",
215-
comment: ""
216-
),
217-
style: .destructive,
218-
accessibilityId: .multihopConfirmAlertEnableButton,
219-
handler: {
220-
onSave()
221-
}
222-
),
223-
AlertAction(
224-
title: NSLocalizedString(
225-
"MULTIHOP_CONFIRM_ALERT_BACK_BUTTON",
226-
tableName: "Multihop",
227-
value: "Back",
228-
comment: ""
229-
),
230-
style: .default,
231-
accessibilityId: .multihopConfirmAlertBackButton,
232-
handler: {
233-
onDiscard()
234-
}
235-
),
236-
]
237-
)
238-
239-
alertPresenter.showAlert(presentation: presentation, animated: true)
240-
}
241209
}

ios/MullvadVPNUITests/Pages/MultihopPromptAlert.swift

-29
This file was deleted.

ios/MullvadVPNUITests/Pages/VPNSettingsPage.swift

-10
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,6 @@ class VPNSettingsPage: Page {
123123
app.cells[AccessibilityIdentifier.multihopSwitch]
124124
.switches[AccessibilityIdentifier.customSwitch]
125125
.tap()
126-
127-
let promptIsShown = app
128-
.otherElements[AccessibilityIdentifier.multihopPromptAlert.rawValue]
129-
.waitForExistence(timeout: 1.0)
130-
131-
if promptIsShown {
132-
MultihopPromptAlert(app)
133-
.tapEnableAnyway()
134-
}
135-
136126
return self
137127
}
138128

0 commit comments

Comments
 (0)