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 +++++++++------------ 3 files changed, 86 insertions(+), 64 deletions(-) (limited to 'WireGuard/WireGuard/UI/iOS') 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? { -- cgit v1.2.3-59-g8ed1b