]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Refactor out VPN-handling stuff from tunnels list VC to the main VC
authorRoopesh Chander <roop@roopc.net>
Mon, 3 Dec 2018 13:21:51 +0000 (18:51 +0530)
committerRoopesh Chander <roop@roopc.net>
Mon, 3 Dec 2018 13:21:51 +0000 (18:51 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/UI/iOS/AppDelegate.swift
WireGuard/WireGuard/UI/iOS/MainViewController.swift
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
WireGuard/WireGuard/VPN/TunnelsManager.swift

index fabdae9f2a8f360623b5d2e03a906f480d9a35ee..7ba77e4aeb6ad86dfbb6f9d40492345c3cd6ba8b 100644 (file)
@@ -39,6 +39,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
 
     func applicationDidBecomeActive(_ application: UIApplication) {
-        mainVC?.tunnelsListVC?.refreshTunnelConnectionStatuses()
+        mainVC?.refreshTunnelConnectionStatuses()
     }
 }
index 359fcfeb7b9e1142441ce915ea29b9aa2ff3eb1d..18853d94037af94c5b41e3195eef94c1592444c1 100644 (file)
@@ -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()
+            }
+        }
     }
 }
 
index c2c7b58e0ce7da9282cf4e1da0d407688f9c51a1..3cc3fa1710a4b87923c1f323bc3339a5e89659cb 100644 (file)
@@ -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? {
index 4306fd11ce7c219f92e707423fabe75ff5719a36..3e6c9c2d12a73f01b1b7dc804dcc68953b636512 100644 (file)
@@ -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)
         }