]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
State restoration: Restore tunnel detail view
authorRoopesh Chander <roop@roopc.net>
Fri, 7 Dec 2018 13:35:04 +0000 (19:05 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 7 Dec 2018 13:35:08 +0000 (19:05 +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/TunnelDetailTableViewController.swift
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
WireGuard/WireGuard/VPN/TunnelsManager.swift

index 3b414dd1254228a74fedec2e3d3b5c1351ea9ec0..3116f7a2a0196159f31e9a9fe78efc1bf7bb06b8 100644 (file)
@@ -11,7 +11,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     var mainVC: MainViewController?
 
     func application(_ application: UIApplication,
-                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+                     willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 
         let window = UIWindow(frame: UIScreen.main.bounds)
         window.backgroundColor = UIColor.white
@@ -36,3 +36,38 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         mainVC?.refreshTunnelConnectionStatuses()
     }
 }
+
+// MARK: State restoration
+
+extension AppDelegate {
+    func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
+        return true
+    }
+
+    func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
+        return true
+    }
+
+    func application(_ application: UIApplication,
+                     viewControllerWithRestorationIdentifierPath identifierComponents: [String],
+                     coder: NSCoder) -> UIViewController? {
+        guard let vcIdentifier = identifierComponents.last else { return nil }
+        if (vcIdentifier == "MainVC") {
+            return MainViewController()
+        } else if (vcIdentifier == "TunnelsListVC") {
+            return TunnelsListTableViewController()
+        } else if (vcIdentifier.hasPrefix("TunnelDetailVC:")) {
+            let tunnelName = String(vcIdentifier.suffix(vcIdentifier.count - "TunnelDetailVC:".count))
+            if let tunnelsManager = mainVC?.tunnelsManager {
+                if let tunnel = tunnelsManager.tunnel(named: tunnelName) {
+                    return TunnelDetailTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
+                }
+            } else {
+                // Show it when tunnelsManager is available
+                mainVC?.showTunnelDetailForTunnel(named: tunnelName, animated: false)
+            }
+
+        }
+        return nil
+    }
+}
index 74ad1ca6009a3ae9ffe28d27dd93c19af271c643..69f40d5170a67e5b89289abe3392d1c5f69f3fdd 100644 (file)
@@ -23,6 +23,11 @@ class MainViewController: UISplitViewController {
         super.init(nibName: nil, bundle: nil)
 
         self.viewControllers = [ masterNC, detailNC ]
+
+        // State restoration
+        self.restorationIdentifier = "MainVC"
+        masterNC.restorationIdentifier = "MasterNC"
+        detailNC.restorationIdentifier = "DetailNC"
     }
 
     required init?(coder aDecoder: NSCoder) {
@@ -67,6 +72,30 @@ extension MainViewController {
             tunnelsManager.refreshStatuses()
         }
     }
+
+    func showTunnelDetailForTunnel(named tunnelName: String, animated: Bool) {
+        let showTunnelDetailBlock: (TunnelsManager) -> Void = { [weak self] (tunnelsManager) in
+            if let tunnel = tunnelsManager.tunnel(named: tunnelName) {
+                let tunnelDetailVC = TunnelDetailTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
+                let tunnelDetailNC = UINavigationController(rootViewController: tunnelDetailVC)
+                tunnelDetailNC.restorationIdentifier = "DetailNC"
+                if let self = self {
+                    if (animated) {
+                        self.showDetailViewController(tunnelDetailNC, sender: self)
+                    } else {
+                        UIView.performWithoutAnimation {
+                            self.showDetailViewController(tunnelDetailNC, sender: self)
+                        }
+                    }
+                }
+            }
+        }
+        if let tunnelsManager = tunnelsManager {
+            showTunnelDetailBlock(tunnelsManager)
+        } else {
+            onTunnelsManagerReady = showTunnelDetailBlock
+        }
+    }
 }
 
 extension MainViewController: UISplitViewControllerDelegate {
index 99d751b86288ec7c857c7e52a2320a1c54bcc5e2..b59c7b55443dd8d3a5fc63b93dd9e9d9c3cddfe1 100644 (file)
@@ -43,6 +43,9 @@ class TunnelDetailTableViewController: UITableViewController {
         self.tableView.register(TunnelDetailTableViewKeyValueCell.self, forCellReuseIdentifier: TunnelDetailTableViewKeyValueCell.id)
         self.tableView.register(TunnelDetailTableViewButtonCell.self, forCellReuseIdentifier: TunnelDetailTableViewButtonCell.id)
         self.tableView.register(TunnelDetailTableViewActivateOnDemandCell.self, forCellReuseIdentifier: TunnelDetailTableViewActivateOnDemandCell.id)
+
+        // State restoration
+        self.restorationIdentifier = "TunnelDetailVC:\(tunnel.name)"
     }
 
     @objc func editTapped() {
index f558de4222572af3d3ff6cbb88a52511569e2955..6449dbe83406d032f0a6f707c9872f7a3bac4ed4 100644 (file)
@@ -37,6 +37,9 @@ class TunnelsListTableViewController: UIViewController {
             ])
         busyIndicator.startAnimating()
         self.busyIndicator = busyIndicator
+
+        // State restoration
+        self.restorationIdentifier = "TunnelsListVC"
     }
 
     func setTunnelsManager(tunnelsManager: TunnelsManager) {
@@ -266,6 +269,7 @@ extension TunnelsListTableViewController: UITableViewDelegate {
         let tunnelDetailVC = TunnelDetailTableViewController(tunnelsManager: tunnelsManager,
                                                              tunnel: tunnel)
         let tunnelDetailNC = UINavigationController(rootViewController: tunnelDetailVC)
+        tunnelDetailNC.restorationIdentifier = "DetailNC"
         showDetailViewController(tunnelDetailNC, sender: self) // Shall get propagated up to the split-vc
     }
 
index 4aada0cde4bf03a931e623c9da1020d217c469a6..4653b4c7a5c8776817e54ae204a1fd792f005f19 100644 (file)
@@ -238,6 +238,10 @@ class TunnelsManager {
         return tunnels[index]
     }
 
+    func tunnel(named tunnelName: String) -> TunnelContainer? {
+        return self.tunnels.first(where: { $0.name == tunnelName })
+    }
+
     func startActivation(of tunnel: TunnelContainer, completionHandler: @escaping (TunnelsManagerError?) -> Void) {
         guard (tunnel.status == .inactive) else {
             return