]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
iOS: Tunnel detail: Reload runtime config every second
authorRoopesh Chander <roop@roopc.net>
Thu, 31 Jan 2019 14:04:44 +0000 (19:34 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 1 Feb 2019 09:57:17 +0000 (15:27 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift

index f24c48a13b97d8086891832ba9bb1ca2a231cc57..9aeab35f24c673297058c61d4b61888c9e18c10b 100644 (file)
@@ -20,7 +20,8 @@ class TunnelDetailTableViewController: UITableViewController {
 
     let peerFields: [TunnelViewModel.PeerField] = [
         .publicKey, .preSharedKey, .endpoint,
-        .allowedIPs, .persistentKeepAlive
+        .allowedIPs, .persistentKeepAlive,
+        .rxBytes, .txBytes, .lastHandshakeTime
     ]
 
     let tunnelsManager: TunnelsManager
@@ -30,6 +31,7 @@ class TunnelDetailTableViewController: UITableViewController {
     private weak var statusCell: SwitchCell?
     private var onDemandStatusObservationToken: AnyObject?
     private var statusObservationToken: AnyObject?
+    private var reloadRuntimeConfigurationTimer: Timer?
 
     init(tunnelsManager: TunnelsManager, tunnel: TunnelContainer) {
         self.tunnelsManager = tunnelsManager
@@ -38,8 +40,15 @@ class TunnelDetailTableViewController: UITableViewController {
         super.init(style: .grouped)
         loadSections()
         statusObservationToken = tunnel.observe(\.status) { [weak self] _, _ in
-            if let cell = self?.statusCell {
-                self?.updateStatus(statusCell: cell)
+            guard let self = self else { return }
+            if let cell = self.statusCell {
+                self.updateStatus(statusCell: cell)
+            }
+            if tunnel.status == .active {
+                self.startUpdatingRuntimeConfiguration()
+            } else if tunnel.status == .inactive {
+                self.reloadRuntimeConfiguration()
+                self.stopUpdatingRuntimeConfiguration()
             }
         }
     }
@@ -72,6 +81,16 @@ class TunnelDetailTableViewController: UITableViewController {
         sections.append(.delete)
     }
 
+    override func viewWillAppear(_ animated: Bool) {
+        if tunnel.status == .active {
+            self.startUpdatingRuntimeConfiguration()
+        }
+    }
+
+    override func viewDidDisappear(_ animated: Bool) {
+        stopUpdatingRuntimeConfiguration()
+    }
+
     @objc func editTapped() {
         let editVC = TunnelEditTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
         editVC.delegate = self
@@ -121,6 +140,30 @@ class TunnelDetailTableViewController: UITableViewController {
         }
         cell.isEnabled = status == .active || status == .inactive
     }
+
+    func startUpdatingRuntimeConfiguration() {
+        reloadRuntimeConfiguration()
+        reloadRuntimeConfigurationTimer?.invalidate()
+        let reloadTimer = Timer(timeInterval: 1 /* second */, repeats: true) { [weak self] _ in
+            self?.reloadRuntimeConfiguration()
+        }
+        reloadRuntimeConfigurationTimer = reloadTimer
+        RunLoop.main.add(reloadTimer, forMode: .common)
+    }
+
+    func stopUpdatingRuntimeConfiguration() {
+        reloadRuntimeConfigurationTimer?.invalidate()
+        reloadRuntimeConfigurationTimer = nil
+    }
+
+    private func reloadRuntimeConfiguration() {
+        tunnel.getRuntimeTunnelConfiguration(completionHandler: {
+            guard let tunnelConfiguration = $0 else { return }
+            self.tunnelViewModel = TunnelViewModel(tunnelConfiguration: tunnelConfiguration)
+            self.loadSections()
+            self.tableView.reloadData()
+        })
+    }
 }
 
 extension TunnelDetailTableViewController: TunnelEditTableViewControllerDelegate {