From 046d1413ec83670bb9fb2de5a461c6e4b5d6e400 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Mon, 3 Dec 2018 18:51:51 +0530 Subject: Refactor out VPN-handling stuff from tunnels list VC to the main VC Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/UI/iOS/AppDelegate.swift | 2 +- .../WireGuard/UI/iOS/MainViewController.swift | 36 +++++++ .../UI/iOS/TunnelsListTableViewController.swift | 112 +++++++++------------ WireGuard/WireGuard/VPN/TunnelsManager.swift | 16 +-- 4 files changed, 94 insertions(+), 72 deletions(-) (limited to 'WireGuard/WireGuard') diff --git a/WireGuard/WireGuard/UI/iOS/AppDelegate.swift b/WireGuard/WireGuard/UI/iOS/AppDelegate.swift index fabdae9..7ba77e4 100644 --- a/WireGuard/WireGuard/UI/iOS/AppDelegate.swift +++ b/WireGuard/WireGuard/UI/iOS/AppDelegate.swift @@ -39,6 +39,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func applicationDidBecomeActive(_ application: UIApplication) { - mainVC?.tunnelsListVC?.refreshTunnelConnectionStatuses() + mainVC?.refreshTunnelConnectionStatuses() } } diff --git a/WireGuard/WireGuard/UI/iOS/MainViewController.swift b/WireGuard/WireGuard/UI/iOS/MainViewController.swift index 359fcfe..18853d9 100644 --- a/WireGuard/WireGuard/UI/iOS/MainViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/MainViewController.swift @@ -4,6 +4,10 @@ import UIKit class MainViewController: UISplitViewController { + + var tunnelsManager: TunnelsManager? + var onTunnelsManagerReady: ((TunnelsManager) -> Void)? + var tunnelsListVC: TunnelsListTableViewController? init() { @@ -30,6 +34,38 @@ class MainViewController: UISplitViewController { // On iPad, always show both masterVC and detailVC, even in portrait mode, like the Settings app self.preferredDisplayMode = .allVisible + + // Create the tunnels manager, and when it's ready, inform tunnelsListVC + TunnelsManager.create { [weak self] tunnelsManager in + guard let tunnelsManager = tunnelsManager else { return } + guard let s = self else { return } + + s.tunnelsManager = tunnelsManager + s.tunnelsListVC?.setTunnelsManager(tunnelsManager: tunnelsManager) + + tunnelsManager.activationDelegate = s + + s.onTunnelsManagerReady?(tunnelsManager) + s.onTunnelsManagerReady = nil + } + } +} + +extension MainViewController: TunnelsManagerActivationDelegate { + func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) { + ErrorPresenter.showErrorAlert(error: error, from: self) + } +} + +extension MainViewController { + func refreshTunnelConnectionStatuses() { + if let tunnelsManager = tunnelsManager { + tunnelsManager.refreshStatuses() + } else { + onTunnelsManagerReady = { tunnelsManager in + tunnelsManager.refreshStatuses() + } + } } } diff --git a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift index c2c7b58..3cc3fa1 100644 --- a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift @@ -8,7 +8,6 @@ import UserNotifications class TunnelsListTableViewController: UIViewController { var tunnelsManager: TunnelsManager? - var onTunnelsManagerReady: ((TunnelsManager) -> Void)? var busyIndicator: UIActivityIndicatorView? var centeredAddButton: BorderedTextButton? @@ -38,53 +37,58 @@ class TunnelsListTableViewController: UIViewController { ]) busyIndicator.startAnimating() self.busyIndicator = busyIndicator + } - // Create the tunnels manager, and when it's ready, create the tableView - TunnelsManager.create { [weak self] tunnelsManager in - guard let tunnelsManager = tunnelsManager else { return } - guard let s = self else { return } - - let tableView = UITableView(frame: CGRect.zero, style: .plain) - tableView.rowHeight = 60 - tableView.separatorStyle = .none - tableView.register(TunnelsListTableViewCell.self, forCellReuseIdentifier: TunnelsListTableViewCell.id) - - s.view.addSubview(tableView) - tableView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - tableView.leftAnchor.constraint(equalTo: s.view.leftAnchor), - tableView.rightAnchor.constraint(equalTo: s.view.rightAnchor), - tableView.topAnchor.constraint(equalTo: s.view.topAnchor), - tableView.bottomAnchor.constraint(equalTo: s.view.bottomAnchor) - ]) - tableView.dataSource = s - tableView.delegate = s - s.tableView = tableView - - // Add an add button, centered - let centeredAddButton = BorderedTextButton() - centeredAddButton.title = "Add a tunnel" - centeredAddButton.isHidden = true - s.view.addSubview(centeredAddButton) - centeredAddButton.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - centeredAddButton.centerXAnchor.constraint(equalTo: s.view.centerXAnchor), - centeredAddButton.centerYAnchor.constraint(equalTo: s.view.centerYAnchor) - ]) - centeredAddButton.onTapped = { [weak self] in - self?.addButtonTapped(sender: centeredAddButton) - } - s.centeredAddButton = centeredAddButton + func setTunnelsManager(tunnelsManager: TunnelsManager) { + if (self.tunnelsManager != nil) { + // If a tunnels manager is already set, do nothing + return + } + + // Create the table view + + let tableView = UITableView(frame: CGRect.zero, style: .plain) + tableView.rowHeight = 60 + tableView.separatorStyle = .none + tableView.register(TunnelsListTableViewCell.self, forCellReuseIdentifier: TunnelsListTableViewCell.id) - centeredAddButton.isHidden = (tunnelsManager.numberOfTunnels() > 0) - busyIndicator.stopAnimating() + self.view.addSubview(tableView) + tableView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + tableView.leftAnchor.constraint(equalTo: self.view.leftAnchor), + tableView.rightAnchor.constraint(equalTo: self.view.rightAnchor), + tableView.topAnchor.constraint(equalTo: self.view.topAnchor), + tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor) + ]) + tableView.dataSource = self + tableView.delegate = self + self.tableView = tableView + + // Add button at the center - tunnelsManager.delegate = s - tunnelsManager.activationDelegate = s - s.tunnelsManager = tunnelsManager - s.onTunnelsManagerReady?(tunnelsManager) - s.onTunnelsManagerReady = nil + let centeredAddButton = BorderedTextButton() + centeredAddButton.title = "Add a tunnel" + centeredAddButton.isHidden = true + self.view.addSubview(centeredAddButton) + centeredAddButton.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + centeredAddButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), + centeredAddButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor) + ]) + centeredAddButton.onTapped = { [weak self] in + self?.addButtonTapped(sender: centeredAddButton) } + centeredAddButton.isHidden = (tunnelsManager.numberOfTunnels() > 0) + self.centeredAddButton = centeredAddButton + + // Hide the busy indicator + + self.busyIndicator?.stopAnimating() + + // Keep track of the tunnels manager + + self.tunnelsManager = tunnelsManager + tunnelsManager.tunnelsListDelegate = self } @objc func addButtonTapped(sender: AnyObject) { @@ -188,16 +192,6 @@ class TunnelsListTableViewController: UIViewController { } } } - - func refreshTunnelConnectionStatuses() { - if let tunnelsManager = tunnelsManager { - tunnelsManager.refreshStatuses() - } else { - onTunnelsManagerReady = { tunnelsManager in - tunnelsManager.refreshStatuses() - } - } - } } // MARK: UIDocumentPickerDelegate @@ -293,7 +287,7 @@ extension TunnelsListTableViewController: UITableViewDelegate { // MARK: TunnelsManagerDelegate -extension TunnelsListTableViewController: TunnelsManagerDelegate { +extension TunnelsListTableViewController: TunnelsManagerListDelegate { func tunnelAdded(at index: Int) { tableView?.insertRows(at: [IndexPath(row: index, section: 0)], with: .automatic) centeredAddButton?.isHidden = (tunnelsManager?.numberOfTunnels() ?? 0 > 0) @@ -313,14 +307,6 @@ extension TunnelsListTableViewController: TunnelsManagerDelegate { } } -// MARK: TunnelActivationDelegate - -extension TunnelsListTableViewController: TunnelActivationDelegate { - func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) { - ErrorPresenter.showErrorAlert(error: error, from: self) - } -} - class TunnelsListTableViewCell: UITableViewCell { static let id: String = "TunnelsListTableViewCell" var tunnel: TunnelContainer? { diff --git a/WireGuard/WireGuard/VPN/TunnelsManager.swift b/WireGuard/WireGuard/VPN/TunnelsManager.swift index 4306fd1..3e6c9c2 100644 --- a/WireGuard/WireGuard/VPN/TunnelsManager.swift +++ b/WireGuard/WireGuard/VPN/TunnelsManager.swift @@ -5,14 +5,14 @@ import Foundation import NetworkExtension import os.log -protocol TunnelsManagerDelegate: class { +protocol TunnelsManagerListDelegate: class { func tunnelAdded(at: Int) func tunnelModified(at: Int) func tunnelMoved(at oldIndex: Int, to newIndex: Int) func tunnelRemoved(at: Int) } -protocol TunnelActivationDelegate: class { +protocol TunnelsManagerActivationDelegate: class { func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) } @@ -35,8 +35,8 @@ enum TunnelManagementError: Error { class TunnelsManager { private var tunnels: [TunnelContainer] - weak var delegate: TunnelsManagerDelegate? - weak var activationDelegate: TunnelActivationDelegate? + weak var tunnelsListDelegate: TunnelsManagerListDelegate? + weak var activationDelegate: TunnelsManagerActivationDelegate? private var isAddingTunnel: Bool = false private var isModifyingTunnel: Bool = false @@ -94,7 +94,7 @@ class TunnelsManager { let tunnel = TunnelContainer(tunnel: tunnelProviderManager) s.tunnels.append(tunnel) s.tunnels.sort { $0.name < $1.name } - s.delegate?.tunnelAdded(at: s.tunnels.firstIndex(of: tunnel)!) + s.tunnelsListDelegate?.tunnelAdded(at: s.tunnels.firstIndex(of: tunnel)!) completionHandler(tunnel, nil) } } @@ -157,9 +157,9 @@ class TunnelsManager { let oldIndex = s.tunnels.firstIndex(of: tunnel)! s.tunnels.sort { $0.name < $1.name } let newIndex = s.tunnels.firstIndex(of: tunnel)! - s.delegate?.tunnelMoved(at: oldIndex, to: newIndex) + s.tunnelsListDelegate?.tunnelMoved(at: oldIndex, to: newIndex) } - s.delegate?.tunnelModified(at: s.tunnels.firstIndex(of: tunnel)!) + s.tunnelsListDelegate?.tunnelModified(at: s.tunnels.firstIndex(of: tunnel)!) if (tunnel.status == .active || tunnel.status == .activating || tunnel.status == .reasserting) { // Turn off the tunnel, and then turn it back on, so the changes are made effective @@ -200,7 +200,7 @@ class TunnelsManager { if let s = self { let index = s.tunnels.firstIndex(of: tunnel)! s.tunnels.remove(at: index) - s.delegate?.tunnelRemoved(at: index) + s.tunnelsListDelegate?.tunnelRemoved(at: index) } completionHandler(nil) } -- cgit v1.2.3-59-g8ed1b