let peerFields: [TunnelViewModel.PeerField] = [
.publicKey, .preSharedKey, .endpoint,
- .allowedIPs, .persistentKeepAlive
+ .allowedIPs, .persistentKeepAlive,
+ .rxBytes, .txBytes, .lastHandshakeTime
]
let tunnelsManager: TunnelsManager
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
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()
}
}
}
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
}
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 {