]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
WireguardApp: iOS: Added Siri shortcuts donations for SetTunnelStatus intent
authorAlessio Nossa <alessio.nossa@gmail.com>
Tue, 1 Feb 2022 16:51:18 +0000 (17:51 +0100)
committerAlessio Nossa <alessio.nossa@gmail.com>
Tue, 1 Feb 2022 19:14:21 +0000 (20:14 +0100)
Signed-off-by: Alessio Nossa <alessio.nossa@gmail.com>
Sources/WireGuardApp/Tunnel/TunnelsManager.swift
Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift
Sources/WireGuardApp/UI/iOS/ViewController/TunnelDetailTableViewController.swift
Sources/WireGuardApp/UI/iOS/ViewController/TunnelsListTableViewController.swift

index 7751e545792312f14d59cd86f2bfb681355d9592..fbf29c4fe95f075e8a7923bad72cddeb744f6984 100644 (file)
@@ -5,6 +5,10 @@ import Foundation
 import NetworkExtension
 import os.log
 
+#if os(iOS)
+import Intents
+#endif
+
 protocol TunnelsManagerListDelegate: AnyObject {
     func tunnelAdded(at index: Int)
     func tunnelModified(at index: Int)
@@ -307,6 +311,12 @@ class TunnelsManager {
         }
         #elseif os(iOS)
         (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
         #error("Unimplemented")
         #endif
index 6aab559086731fbae34375513886924e3cfab53c..74a8149fe306d60eaa250da155b4b195ee726552 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
 
 import UIKit
+import Intents
 
 class MainViewController: UISplitViewController {
 
@@ -96,10 +97,25 @@ extension MainViewController {
             if let tunnel = tunnelsManager.tunnel(named: tunnelName) {
                 tunnelsListVC.showTunnelDetail(for: tunnel, animated: false)
                 if shouldToggleStatus {
+
+                    let intent = SetTunnelStatusIntent()
+                    intent.tunnel = tunnel.name
+                    intent.operation = .turn
+
                     if tunnel.status == .inactive {
                         tunnelsManager.startActivation(of: tunnel)
+                        intent.state = .on
                     } else if tunnel.status == .active {
                         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)")
+                        }
                     }
                 }
             }
index 196de0c69064e0c4eaeec548ea680ee4b4c04eea..0361d44b8ea4738aa1d4f847d0759ba30725ca44 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
 
 import UIKit
+import Intents
 
 class TunnelDetailTableViewController: UITableViewController {
 
@@ -387,6 +388,18 @@ extension TunnelDetailTableViewController {
         cell.onSwitchToggled = { [weak self] isOn in
             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 {
                 self.tunnelsManager.setOnDemandEnabled(isOn, on: self.tunnel) { error in
                     if error == nil && !isOn {
index 85e64cea2eb825fad5f6fcbfb10f880de8cf2af2..c5132a207b59395a9341834288c94527c18921cf 100644 (file)
@@ -4,6 +4,7 @@
 import UIKit
 import MobileCoreServices
 import UserNotifications
+import Intents
 
 class TunnelsListTableViewController: UIViewController {
 
@@ -317,6 +318,19 @@ extension TunnelsListTableViewController: UITableViewDataSource {
             cell.tunnel = tunnel
             cell.onSwitchToggled = { [weak self] isOn in
                 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 {
                     tunnelsManager.setOnDemandEnabled(isOn, on: tunnel) { error in
                         if error == nil && !isOn {