WireguardApp: iOS: Added Siri shortcuts donations for SetTunnelStatus intent
Signed-off-by: Alessio Nossa <alessio.nossa@gmail.com>
This commit is contained in:
@@ -5,6 +5,10 @@ import Foundation
|
|||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
import os.log
|
import os.log
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
import Intents
|
||||||
|
#endif
|
||||||
|
|
||||||
protocol TunnelsManagerListDelegate: AnyObject {
|
protocol TunnelsManagerListDelegate: AnyObject {
|
||||||
func tunnelAdded(at index: Int)
|
func tunnelAdded(at index: Int)
|
||||||
func tunnelModified(at index: Int)
|
func tunnelModified(at index: Int)
|
||||||
@@ -307,6 +311,12 @@ class TunnelsManager {
|
|||||||
}
|
}
|
||||||
#elseif os(iOS)
|
#elseif os(iOS)
|
||||||
(tunnelProviderManager.protocolConfiguration as? NETunnelProviderProtocol)?.destroyConfigurationReference()
|
(tunnelProviderManager.protocolConfiguration as? NETunnelProviderProtocol)?.destroyConfigurationReference()
|
||||||
|
|
||||||
|
INInteraction.delete(with: "com.wireguard.intents.tunnel.\(tunnel.name)") { error in
|
||||||
|
if let error = error {
|
||||||
|
wg_log(.error, message: "Error deleting donated interactions for tunnel \(tunnel.name): \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#error("Unimplemented")
|
#error("Unimplemented")
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import Intents
|
||||||
|
|
||||||
class MainViewController: UISplitViewController {
|
class MainViewController: UISplitViewController {
|
||||||
|
|
||||||
@@ -96,10 +97,25 @@ extension MainViewController {
|
|||||||
if let tunnel = tunnelsManager.tunnel(named: tunnelName) {
|
if let tunnel = tunnelsManager.tunnel(named: tunnelName) {
|
||||||
tunnelsListVC.showTunnelDetail(for: tunnel, animated: false)
|
tunnelsListVC.showTunnelDetail(for: tunnel, animated: false)
|
||||||
if shouldToggleStatus {
|
if shouldToggleStatus {
|
||||||
|
|
||||||
|
let intent = SetTunnelStatusIntent()
|
||||||
|
intent.tunnel = tunnel.name
|
||||||
|
intent.operation = .turn
|
||||||
|
|
||||||
if tunnel.status == .inactive {
|
if tunnel.status == .inactive {
|
||||||
tunnelsManager.startActivation(of: tunnel)
|
tunnelsManager.startActivation(of: tunnel)
|
||||||
|
intent.state = .on
|
||||||
} else if tunnel.status == .active {
|
} else if tunnel.status == .active {
|
||||||
tunnelsManager.startDeactivation(of: tunnel)
|
tunnelsManager.startDeactivation(of: tunnel)
|
||||||
|
intent.state = .off
|
||||||
|
}
|
||||||
|
|
||||||
|
let interaction = INInteraction(intent: intent, response: nil)
|
||||||
|
interaction.groupIdentifier = "com.wireguard.intents.tunnel.\(tunnel.name)"
|
||||||
|
interaction.donate { error in
|
||||||
|
if let error = error {
|
||||||
|
wg_log(.error, message: "Error donating interaction for SetTunnelStatusIntent: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import Intents
|
||||||
|
|
||||||
class TunnelDetailTableViewController: UITableViewController {
|
class TunnelDetailTableViewController: UITableViewController {
|
||||||
|
|
||||||
@@ -387,6 +388,18 @@ extension TunnelDetailTableViewController {
|
|||||||
cell.onSwitchToggled = { [weak self] isOn in
|
cell.onSwitchToggled = { [weak self] isOn in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
|
let intent = SetTunnelStatusIntent()
|
||||||
|
intent.tunnel = self.tunnel.name
|
||||||
|
intent.operation = .turn
|
||||||
|
intent.state = isOn ? .on : .off
|
||||||
|
let interaction = INInteraction(intent: intent, response: nil)
|
||||||
|
interaction.groupIdentifier = "com.wireguard.intents.tunnel.\(self.tunnel.name)"
|
||||||
|
interaction.donate { error in
|
||||||
|
if let error = error {
|
||||||
|
wg_log(.error, message: "Error donating interaction for SetTunnelStatusIntent: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if self.tunnel.hasOnDemandRules {
|
if self.tunnel.hasOnDemandRules {
|
||||||
self.tunnelsManager.setOnDemandEnabled(isOn, on: self.tunnel) { error in
|
self.tunnelsManager.setOnDemandEnabled(isOn, on: self.tunnel) { error in
|
||||||
if error == nil && !isOn {
|
if error == nil && !isOn {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import MobileCoreServices
|
import MobileCoreServices
|
||||||
import UserNotifications
|
import UserNotifications
|
||||||
|
import Intents
|
||||||
|
|
||||||
class TunnelsListTableViewController: UIViewController {
|
class TunnelsListTableViewController: UIViewController {
|
||||||
|
|
||||||
@@ -317,6 +318,19 @@ 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 }
|
||||||
|
|
||||||
|
let intent = SetTunnelStatusIntent()
|
||||||
|
intent.tunnel = tunnel.name
|
||||||
|
intent.operation = .turn
|
||||||
|
intent.state = isOn ? .on : .off
|
||||||
|
let interaction = INInteraction(intent: intent, response: nil)
|
||||||
|
interaction.groupIdentifier = "com.wireguard.intents.tunnel.\(tunnel.name)"
|
||||||
|
interaction.donate { error in
|
||||||
|
if let error = error {
|
||||||
|
wg_log(.error, message: "Error donating interaction for SetTunnelStatusIntent: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if tunnel.hasOnDemandRules {
|
if tunnel.hasOnDemandRules {
|
||||||
tunnelsManager.setOnDemandEnabled(isOn, on: tunnel) { error in
|
tunnelsManager.setOnDemandEnabled(isOn, on: tunnel) { error in
|
||||||
if error == nil && !isOn {
|
if error == nil && !isOn {
|
||||||
|
|||||||
Reference in New Issue
Block a user