summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2021-04-08 13:29:28 +0200
committerAndrej Mihajlov <and@mullvad.net>2021-05-05 10:56:34 +0200
commit19aef3a8bb4cd3e3f3d7db3514a0a2138090061d (patch)
tree44745ba800043e264fb9d90dac6da2d6a92d609d
parentbdbf5b751f54368087a916196a883cfbdb421e0d (diff)
downloadmullvadvpn-19aef3a8bb4cd3e3f3d7db3514a0a2138090061d.tar.xz
mullvadvpn-19aef3a8bb4cd3e3f3d7db3514a0a2138090061d.zip
Connect: add delegate
-rw-r--r--ios/MullvadVPN/ConnectViewController.swift194
1 files changed, 35 insertions, 159 deletions
diff --git a/ios/MullvadVPN/ConnectViewController.swift b/ios/MullvadVPN/ConnectViewController.swift
index 90c6c5f205..d394ea75b4 100644
--- a/ios/MullvadVPN/ConnectViewController.swift
+++ b/ios/MullvadVPN/ConnectViewController.swift
@@ -7,21 +7,27 @@
//
import UIKit
-import NetworkExtension
import Logging
+protocol ConnectViewControllerDelegate: class {
+ func connectViewControllerShouldShowSelectLocationPicker(_ controller: ConnectViewController)
+ func connectViewControllerShouldConnectTunnel(_ controller: ConnectViewController)
+ func connectViewControllerShouldDisconnectTunnel(_ controller: ConnectViewController)
+ func connectViewControllerShouldReconnectTunnel(_ controller: ConnectViewController)
+}
+
class ConnectViewController: UIViewController, RootContainment, TunnelObserver
{
- private lazy var mainContentView: ConnectMainContentView = {
+ weak var delegate: ConnectViewControllerDelegate?
+
+ private let mainContentView: ConnectMainContentView = {
let view = ConnectMainContentView(frame: UIScreen.main.bounds)
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
- private var relayConstraints: RelayConstraints?
-
private let logger = Logger(label: "ConnectViewController")
- private let alertPresenter = AlertPresenter()
+
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
@@ -49,8 +55,6 @@ class ConnectViewController: UIViewController, RootContainment, TunnelObserver
}
}
- private var showedAccountView = false
-
override func viewDidLoad() {
super.viewDidLoad()
@@ -61,24 +65,32 @@ class ConnectViewController: UIViewController, RootContainment, TunnelObserver
mainContentView.selectLocationButton.addTarget(self, action: #selector(handleSelectLocation(_:)), for: .touchUpInside)
- view.addSubview(mainContentView)
- NSLayoutConstraint.activate([
- mainContentView.topAnchor.constraint(equalTo: view.topAnchor),
- mainContentView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
- mainContentView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
- mainContentView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
- ])
-
TunnelManager.shared.addObserver(self)
self.tunnelState = TunnelManager.shared.tunnelState
- fetchRelayConstraints()
+ addSubviews()
}
- override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
+ func setMainContentHidden(_ isHidden: Bool, animated: Bool) {
+ let actions = {
+ self.mainContentView.containerView.alpha = isHidden ? 0 : 1
+ }
- showAccountViewForExpiredAccount()
+ if animated {
+ UIView.animate(withDuration: 0.25, animations: actions)
+ } else {
+ actions()
+ }
+ }
+
+ private func addSubviews() {
+ view.addSubview(mainContentView)
+ NSLayoutConstraint.activate([
+ mainContentView.topAnchor.constraint(equalTo: view.topAnchor),
+ mainContentView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+ mainContentView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+ mainContentView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+ ])
}
// MARK: - TunnelObserver
@@ -135,137 +147,6 @@ class ConnectViewController: UIViewController, RootContainment, TunnelObserver
}
}
- private func connectTunnel() {
- TunnelManager.shared.startTunnel { (result) in
- DispatchQueue.main.async {
- switch result {
- case .success:
- break
-
- case .failure(let error):
- self.logger.error(chainedError: error, message: "Failed to start the VPN tunnel")
-
- let alertController = UIAlertController(
- title: NSLocalizedString("Failed to start the VPN tunnel", comment: ""),
- message: error.errorChainDescription,
- preferredStyle: .alert
- )
- alertController.addAction(
- UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .cancel)
- )
-
- self.alertPresenter.enqueue(alertController, presentingController: self)
- }
- }
- }
- }
-
- private func disconnectTunnel() {
- TunnelManager.shared.stopTunnel { (result) in
- if case .failure(let error) = result {
- self.logger.error(chainedError: error, message: "Failed to stop the VPN tunnel")
-
- let alertController = UIAlertController(
- title: NSLocalizedString("Failed to stop the VPN tunnel", comment: ""),
- message: error.errorChainDescription,
- preferredStyle: .alert
- )
- alertController.addAction(
- UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .cancel)
- )
-
- self.alertPresenter.enqueue(alertController, presentingController: self)
- }
- }
- }
-
- private func reconnectTunnel() {
- TunnelManager.shared.reconnectTunnel(completionHandler: nil)
- }
-
- private func showAccountViewForExpiredAccount() {
- guard !showedAccountView else { return }
-
- showedAccountView = true
-
- if let accountExpiry = Account.shared.expiry, AccountExpiry(date: accountExpiry).isExpired {
- rootContainerController?.showSettings(navigateTo: .account, animated: true)
- }
- }
-
- private func showSelectLocationModal() {
- let contentController = SelectLocationViewController()
- contentController.navigationItem.title = NSLocalizedString("Select location", comment: "Navigation title")
- contentController.navigationItem.largeTitleDisplayMode = .never
- contentController.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDismissSelectLocationController(_:)))
-
- contentController.didSelectRelayLocation = { [weak self] (controller, relayLocation) in
- controller.view.isUserInteractionEnabled = false
- DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250)) {
- controller.view.isUserInteractionEnabled = true
- controller.dismiss(animated: true) {
- self?.selectLocationControllerDidSelectRelayLocation(relayLocation)
- }
- }
- }
-
- let navController = SelectLocationNavigationController(contentController: contentController)
-
- view.isUserInteractionEnabled = false
- contentController.setSelectedRelayLocation(self.relayConstraints?.location.value, animated: false, scrollPosition: .none)
- contentController.prefetchData { (error) in
- if let error = error {
- self.logger.error(chainedError: error, message: "Failed to prefetch the relays for SelectLocationViewController")
- }
-
- self.present(navController, animated: true) {
- self.view.isUserInteractionEnabled = true
- }
- }
- }
-
- private func fetchRelayConstraints() {
- TunnelManager.shared.getRelayConstraints { (result) in
- DispatchQueue.main.async {
- switch result {
- case .success(let relayConstraints):
- self.relayConstraints = relayConstraints
-
- case .failure(let error):
- self.logger.error(chainedError: error)
- }
- }
- }
- }
-
- private func selectLocationControllerDidSelectRelayLocation(_ relayLocation: RelayLocation) {
- let relayConstraints = makeRelayConstraints(relayLocation)
-
- self.setTunnelRelayConstraints(relayConstraints)
- self.relayConstraints = relayConstraints
- }
-
- private func makeRelayConstraints(_ location: RelayLocation) -> RelayConstraints {
- return RelayConstraints(location: .only(location))
- }
-
- private func setTunnelRelayConstraints(_ relayConstraints: RelayConstraints) {
- TunnelManager.shared.setRelayConstraints(relayConstraints) { [weak self] (result) in
- guard let self = self else { return }
-
- DispatchQueue.main.async {
- switch result {
- case .success:
- self.logger.debug("Updated relay constraints: \(relayConstraints)")
- self.connectTunnel()
-
- case .failure(let error):
- self.logger.error(chainedError: error, message: "Failed to update relay constraints")
- }
- }
- }
- }
-
// MARK: - Actions
@objc func handleConnectionPanelButton(_ sender: Any) {
@@ -273,25 +154,20 @@ class ConnectViewController: UIViewController, RootContainment, TunnelObserver
}
@objc func handleConnect(_ sender: Any) {
- connectTunnel()
+ delegate?.connectViewControllerShouldConnectTunnel(self)
}
@objc func handleDisconnect(_ sender: Any) {
- disconnectTunnel()
+ delegate?.connectViewControllerShouldDisconnectTunnel(self)
}
@objc func handleReconnect(_ sender: Any) {
- reconnectTunnel()
+ delegate?.connectViewControllerShouldReconnectTunnel(self)
}
@objc func handleSelectLocation(_ sender: Any) {
- showSelectLocationModal()
- }
-
- @objc func handleDismissSelectLocationController(_ sender: Any) {
- self.presentedViewController?.dismiss(animated: true)
+ delegate?.connectViewControllerShouldShowSelectLocationPicker(self)
}
-
}
private extension TunnelState {