]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
iOS: SwitchCell should hold the observation token
authorRoopesh Chander <roop@roopc.net>
Sun, 3 Feb 2019 07:07:57 +0000 (12:37 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 3 Feb 2019 07:10:19 +0000 (12:40 +0530)
And should nil the token when preparing for reuse.

This also reverts "iOS: Tunnel detail: Refactor updation of status"

Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/UI/iOS/View/SwitchCell.swift
WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift

index 758083f1bb52b8189fa839122d59245381041a3e..616959300ff2c093657c7e3f22cc4578e652874d 100644 (file)
@@ -22,6 +22,8 @@ class SwitchCell: UITableViewCell {
 
     var onSwitchToggled: ((Bool) -> Void)?
 
+    var observationToken: AnyObject?
+
     let switchView = UISwitch()
 
     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
@@ -45,5 +47,6 @@ class SwitchCell: UITableViewCell {
         isEnabled = true
         message = ""
         isOn = false
+        observationToken = nil
     }
 }
index 3e80d944c12bd1bd5b421d0934eeaa9f21210d66..31ad111296a2c23aa15241bfaf4b44c3bd5c5ecf 100644 (file)
@@ -32,7 +32,6 @@ class TunnelDetailTableViewController: UITableViewController {
     private var interfaceFieldIsVisible = [Bool]()
     private var peerFieldIsVisible = [[Bool]]()
 
-    private weak var statusCell: SwitchCell?
     private var statusObservationToken: AnyObject?
     private var reloadRuntimeConfigurationTimer: Timer?
 
@@ -45,9 +44,6 @@ class TunnelDetailTableViewController: UITableViewController {
         loadVisibleFields()
         statusObservationToken = tunnel.observe(\.status) { [weak self] _, _ in
             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 {
@@ -129,33 +125,6 @@ class TunnelDetailTableViewController: UITableViewController {
         present(alert, animated: true, completion: nil)
     }
 
-    func updateStatus(statusCell cell: SwitchCell) {
-        let status = tunnel.status
-        let text: String
-        switch status {
-        case .inactive:
-            text = tr("tunnelStatusInactive")
-        case .activating:
-            text = tr("tunnelStatusActivating")
-        case .active:
-            text = tr("tunnelStatusActive")
-        case .deactivating:
-            text = tr("tunnelStatusDeactivating")
-        case .reasserting:
-            text = tr("tunnelStatusReasserting")
-        case .restarting:
-            text = tr("tunnelStatusRestarting")
-        case .waiting:
-            text = tr("tunnelStatusWaiting")
-        }
-        cell.textLabel?.text = text
-        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) { [weak cell] in
-            cell?.switchView.isOn = !(status == .deactivating || status == .inactive)
-            cell?.switchView.isUserInteractionEnabled = (status == .inactive || status == .active)
-        }
-        cell.isEnabled = status == .active || status == .inactive
-    }
-
     func startUpdatingRuntimeConfiguration() {
         reloadRuntimeConfiguration()
         reloadRuntimeConfigurationTimer?.invalidate()
@@ -312,7 +281,39 @@ extension TunnelDetailTableViewController {
 
     private func statusCell(for tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell {
         let cell: SwitchCell = tableView.dequeueReusableCell(for: indexPath)
-        updateStatus(statusCell: cell)
+
+        let statusUpdate: (SwitchCell, TunnelStatus) -> Void = { cell, status in
+            let text: String
+            switch status {
+            case .inactive:
+                text = tr("tunnelStatusInactive")
+            case .activating:
+                text = tr("tunnelStatusActivating")
+            case .active:
+                text = tr("tunnelStatusActive")
+            case .deactivating:
+                text = tr("tunnelStatusDeactivating")
+            case .reasserting:
+                text = tr("tunnelStatusReasserting")
+            case .restarting:
+                text = tr("tunnelStatusRestarting")
+            case .waiting:
+                text = tr("tunnelStatusWaiting")
+            }
+            cell.textLabel?.text = text
+            DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) { [weak cell] in
+                cell?.switchView.isOn = !(status == .deactivating || status == .inactive)
+                cell?.switchView.isUserInteractionEnabled = (status == .inactive || status == .active)
+            }
+            cell.isEnabled = status == .active || status == .inactive
+        }
+
+        statusUpdate(cell, tunnel.status)
+        cell.observationToken = tunnel.observe(\.status) { [weak cell] tunnel, _ in
+            guard let cell = cell else { return }
+            statusUpdate(cell, tunnel.status)
+        }
+
         cell.onSwitchToggled = { [weak self] isOn in
             guard let self = self else { return }
             if isOn {
@@ -321,7 +322,6 @@ extension TunnelDetailTableViewController {
                 self.tunnelsManager.startDeactivation(of: self.tunnel)
             }
         }
-        self.statusCell = cell
         return cell
     }