UI: iOS: Tunnels list: Incorporate on-demand-ness in the switch
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
parent
df9934a4b8
commit
a115dd3bd9
|
@ -17,6 +17,7 @@
|
||||||
"tunnelsListSelectAllButtonTitle" = "Select All";
|
"tunnelsListSelectAllButtonTitle" = "Select All";
|
||||||
"tunnelsListDeleteButtonTitle" = "Delete";
|
"tunnelsListDeleteButtonTitle" = "Delete";
|
||||||
"tunnelsListSelectedTitle (%d)" = "%d selected";
|
"tunnelsListSelectedTitle (%d)" = "%d selected";
|
||||||
|
"tunnelListCaptionOnDemand" = "On Demand";
|
||||||
|
|
||||||
// Tunnels list menu
|
// Tunnels list menu
|
||||||
|
|
||||||
|
|
|
@ -12,9 +12,16 @@ class TunnelListCell: UITableViewCell {
|
||||||
self?.nameLabel.text = tunnel.name
|
self?.nameLabel.text = tunnel.name
|
||||||
}
|
}
|
||||||
// Bind to the tunnel's status
|
// Bind to the tunnel's status
|
||||||
update(from: tunnel?.status, animated: false)
|
update(from: tunnel, animated: false)
|
||||||
statusObservationToken = tunnel?.observe(\.status) { [weak self] tunnel, _ in
|
statusObservationToken = tunnel?.observe(\.status) { [weak self] tunnel, _ in
|
||||||
self?.update(from: tunnel.status, animated: true)
|
self?.update(from: tunnel, animated: true)
|
||||||
|
}
|
||||||
|
// Bind to tunnel's on-demand settings
|
||||||
|
isOnDemandEnabledObservationToken = tunnel?.observe(\.isActivateOnDemandEnabled) { [weak self] tunnel, _ in
|
||||||
|
self?.update(from: tunnel, animated: true)
|
||||||
|
}
|
||||||
|
hasOnDemandRulesObservationToken = tunnel?.observe(\.hasOnDemandRules) { [weak self] tunnel, _ in
|
||||||
|
self?.update(from: tunnel, animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,8 +48,10 @@ class TunnelListCell: UITableViewCell {
|
||||||
|
|
||||||
let statusSwitch = UISwitch()
|
let statusSwitch = UISwitch()
|
||||||
|
|
||||||
private var statusObservationToken: NSKeyValueObservation?
|
|
||||||
private var nameObservationToken: NSKeyValueObservation?
|
private var nameObservationToken: NSKeyValueObservation?
|
||||||
|
private var statusObservationToken: NSKeyValueObservation?
|
||||||
|
private var isOnDemandEnabledObservationToken: NSKeyValueObservation?
|
||||||
|
private var hasOnDemandRulesObservationToken: NSKeyValueObservation?
|
||||||
|
|
||||||
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||||
|
@ -94,13 +103,29 @@ class TunnelListCell: UITableViewCell {
|
||||||
onSwitchToggled?(statusSwitch.isOn)
|
onSwitchToggled?(statusSwitch.isOn)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func update(from status: TunnelStatus?, animated: Bool) {
|
private func update(from tunnel: TunnelContainer?, animated: Bool) {
|
||||||
guard let status = status else {
|
guard let tunnel = tunnel else {
|
||||||
reset(animated: animated)
|
reset(animated: animated)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
statusSwitch.setOn(!(status == .deactivating || status == .inactive), animated: animated)
|
let status = tunnel.status
|
||||||
statusSwitch.isUserInteractionEnabled = (status == .inactive || status == .active)
|
let isOnDemandEngaged = tunnel.isActivateOnDemandEnabled
|
||||||
|
|
||||||
|
let isSwitchOn = (status == .activating || status == .active || isOnDemandEngaged)
|
||||||
|
statusSwitch.setOn(isSwitchOn, animated: true)
|
||||||
|
|
||||||
|
if isOnDemandEngaged && !(status == .activating || status == .active) {
|
||||||
|
statusSwitch.onTintColor = UIColor.systemYellow
|
||||||
|
} else {
|
||||||
|
statusSwitch.onTintColor = UIColor.systemGreen
|
||||||
|
}
|
||||||
|
|
||||||
|
if tunnel.hasOnDemandRules {
|
||||||
|
statusSwitch.isUserInteractionEnabled = true
|
||||||
|
} else {
|
||||||
|
statusSwitch.isUserInteractionEnabled = (status == .inactive || status == .active)
|
||||||
|
}
|
||||||
|
|
||||||
if status == .inactive || status == .active {
|
if status == .inactive || status == .active {
|
||||||
busyIndicator.stopAnimating()
|
busyIndicator.stopAnimating()
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -317,10 +317,18 @@ extension TunnelsListTableViewController: UITableViewDataSource {
|
||||||
cell.tunnel = tunnel
|
cell.tunnel = tunnel
|
||||||
cell.onSwitchToggled = { [weak self] isOn in
|
cell.onSwitchToggled = { [weak self] isOn in
|
||||||
guard let self = self, let tunnelsManager = self.tunnelsManager else { return }
|
guard let self = self, let tunnelsManager = self.tunnelsManager else { return }
|
||||||
if isOn {
|
if tunnel.hasOnDemandRules {
|
||||||
tunnelsManager.startActivation(of: tunnel)
|
tunnelsManager.setOnDemandEnabled(isOn, on: tunnel) { error in
|
||||||
|
if error == nil && !isOn {
|
||||||
|
tunnelsManager.startDeactivation(of: tunnel)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
tunnelsManager.startDeactivation(of: tunnel)
|
if isOn {
|
||||||
|
tunnelsManager.startActivation(of: tunnel)
|
||||||
|
} else {
|
||||||
|
tunnelsManager.startDeactivation(of: tunnel)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue