Tunnel detail: Show VPN-on-demand information

This commit is contained in:
Roopesh Chander 2018-11-12 16:34:17 +05:30
parent dc19529f10
commit 8385e8d19e
1 changed files with 67 additions and 2 deletions

View File

@ -42,6 +42,7 @@ class TunnelDetailTableViewController: UITableViewController {
self.tableView.register(TunnelDetailTableViewStatusCell.self, forCellReuseIdentifier: TunnelDetailTableViewStatusCell.id) self.tableView.register(TunnelDetailTableViewStatusCell.self, forCellReuseIdentifier: TunnelDetailTableViewStatusCell.id)
self.tableView.register(TunnelDetailTableViewKeyValueCell.self, forCellReuseIdentifier: TunnelDetailTableViewKeyValueCell.id) self.tableView.register(TunnelDetailTableViewKeyValueCell.self, forCellReuseIdentifier: TunnelDetailTableViewKeyValueCell.id)
self.tableView.register(TunnelDetailTableViewButtonCell.self, forCellReuseIdentifier: TunnelDetailTableViewButtonCell.id) self.tableView.register(TunnelDetailTableViewButtonCell.self, forCellReuseIdentifier: TunnelDetailTableViewButtonCell.id)
self.tableView.register(TunnelDetailTableViewActivateOnDemandCell.self, forCellReuseIdentifier: TunnelDetailTableViewActivateOnDemandCell.id)
} }
@objc func editTapped() { @objc func editTapped() {
@ -95,7 +96,7 @@ extension TunnelDetailTableViewController: TunnelEditTableViewControllerDelegate
extension TunnelDetailTableViewController { extension TunnelDetailTableViewController {
override func numberOfSections(in tableView: UITableView) -> Int { override func numberOfSections(in tableView: UITableView) -> Int {
return 3 + tunnelViewModel.peersData.count return 4 + tunnelViewModel.peersData.count
} }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@ -112,7 +113,11 @@ extension TunnelDetailTableViewController {
// Peer // Peer
let peerData = tunnelViewModel.peersData[section - 2] let peerData = tunnelViewModel.peersData[section - 2]
return peerData.filterFieldsWithValueOrControl(peerFields: peerFields).count return peerData.filterFieldsWithValueOrControl(peerFields: peerFields).count
} else if (section < (3 + numberOfPeerSections)) {
// Activate on demand
return 1
} else { } else {
assert(section == (3 + numberOfPeerSections))
// Delete tunnel // Delete tunnel
return 1 return 1
} }
@ -130,6 +135,9 @@ extension TunnelDetailTableViewController {
} else if ((numberOfPeerSections > 0) && (section < (2 + numberOfPeerSections))) { } else if ((numberOfPeerSections > 0) && (section < (2 + numberOfPeerSections))) {
// Peer // Peer
return "Peer" return "Peer"
} else if (section < (3 + numberOfPeerSections)) {
// On-Demand Activation
return "On-Demand Activation"
} else { } else {
// Delete tunnel // Delete tunnel
return nil return nil
@ -181,8 +189,13 @@ extension TunnelDetailTableViewController {
cell.key = field.rawValue cell.key = field.rawValue
cell.value = peerData[field] cell.value = peerData[field]
return cell return cell
} else if (section < (3 + numberOfPeerSections)) {
// On-Demand Activation
let cell = tableView.dequeueReusableCell(withIdentifier: TunnelDetailTableViewActivateOnDemandCell.id, for: indexPath) as! TunnelDetailTableViewActivateOnDemandCell
cell.tunnel = self.tunnel
return cell
} else { } else {
assert(section == (2 + numberOfPeerSections)) assert(section == (3 + numberOfPeerSections))
// Delete configuration // Delete configuration
let cell = tableView.dequeueReusableCell(withIdentifier: TunnelDetailTableViewButtonCell.id, for: indexPath) as! TunnelDetailTableViewButtonCell let cell = tableView.dequeueReusableCell(withIdentifier: TunnelDetailTableViewButtonCell.id, for: indexPath) as! TunnelDetailTableViewButtonCell
cell.buttonText = "Delete tunnel" cell.buttonText = "Delete tunnel"
@ -392,3 +405,55 @@ class TunnelDetailTableViewButtonCell: UITableViewCell {
hasDestructiveAction = false hasDestructiveAction = false
} }
} }
class TunnelDetailTableViewActivateOnDemandCell: UITableViewCell {
static let id: String = "TunnelDetailTableViewActivateOnDemandCell"
var tunnel: TunnelContainer? {
didSet(value) {
update(from: tunnel?.activateOnDemandSetting())
onDemandStatusObservervationToken = tunnel?.observe(\.isActivateOnDemandEnabled) { [weak self] (tunnel, _) in
self?.update(from: tunnel.activateOnDemandSetting())
}
}
}
var onDemandStatusObservervationToken: AnyObject?
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .value1, reuseIdentifier: reuseIdentifier)
textLabel?.text = "Activate on demand"
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(from activateOnDemandSetting: ActivateOnDemandSetting?) {
let detailText: String
if let activateOnDemandSetting = activateOnDemandSetting {
if (activateOnDemandSetting.isActivateOnDemandEnabled) {
switch (activateOnDemandSetting.activateOnDemandOption) {
case .none:
detailText = "Off"
case .useOnDemandOverWifiOrCellular:
detailText = "Wifi or cellular"
case .useOnDemandOverWifiOnly:
detailText = "Wifi only"
case .useOnDemandOverCellularOnly:
detailText = "Cellular only"
}
} else {
detailText = "Off"
}
} else {
detailText = "Off"
}
detailTextLabel?.text = detailText
}
override func prepareForReuse() {
super.prepareForReuse()
detailTextLabel?.text = ""
}
}