From c3e6e1ecd506b00edd2272f9524eb5b8f8976193 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Mon, 18 Mar 2019 17:06:19 +0100 Subject: [PATCH] Move intents to Core target Suppress responses for consistency. --- Passepartout-iOS/AppDelegate.swift | 2 +- .../Organizer/OrganizerViewController.swift | 6 +- .../Scenes/ServiceViewController.swift | 14 ++-- Passepartout.xcodeproj/project.pbxproj | 14 ++-- .../Sources/Intents/IntentDispatcher.swift | 65 ++++++++++--------- .../Intents/en.lproj/Intents.intentdefinition | 6 +- 6 files changed, 57 insertions(+), 50 deletions(-) rename Passepartout-iOS/Intents/InteractionsHandler.swift => Passepartout/Sources/Intents/IntentDispatcher.swift (83%) rename {Passepartout-iOS => Passepartout/Sources}/Intents/en.lproj/Intents.intentdefinition (99%) diff --git a/Passepartout-iOS/AppDelegate.swift b/Passepartout-iOS/AppDelegate.swift index dcaaf4f3..607e5792 100644 --- a/Passepartout-iOS/AppDelegate.swift +++ b/Passepartout-iOS/AppDelegate.swift @@ -161,7 +161,7 @@ extension AppDelegate { return false } if #available(iOS 12, *) { - InteractionsHandler.handleInteraction(interaction) + IntentDispatcher.handleInteraction(interaction) } return true } diff --git a/Passepartout-iOS/Scenes/Organizer/OrganizerViewController.swift b/Passepartout-iOS/Scenes/Organizer/OrganizerViewController.swift index 621d10da..14cbc0df 100644 --- a/Passepartout-iOS/Scenes/Organizer/OrganizerViewController.swift +++ b/Passepartout-iOS/Scenes/Organizer/OrganizerViewController.swift @@ -225,7 +225,7 @@ class OrganizerViewController: UITableViewController, TableModelHost { service.removeProfile(rowProfile) if #available(iOS 12, *) { - InteractionsHandler.forgetProfile(withKey: rowProfile) + IntentDispatcher.forgetProfile(withKey: rowProfile) } } @@ -473,7 +473,7 @@ extension OrganizerViewController: ConnectionServiceDelegate { tableView.reloadData() if #available(iOS 12, *) { - InteractionsHandler.donateConnection(with: profile) + IntentDispatcher.donateConnection(with: profile) } // XXX: hack around bad replace when detail presented in compact view @@ -520,7 +520,7 @@ extension OrganizerViewController: ConnectionServiceDelegate { tableView.reloadData() if #available(iOS 12, *) { - InteractionsHandler.donateConnection(with: profile) + IntentDispatcher.donateConnection(with: profile) } } } diff --git a/Passepartout-iOS/Scenes/ServiceViewController.swift b/Passepartout-iOS/Scenes/ServiceViewController.swift index 6483a641..1a051dd6 100644 --- a/Passepartout-iOS/Scenes/ServiceViewController.swift +++ b/Passepartout-iOS/Scenes/ServiceViewController.swift @@ -254,8 +254,8 @@ class ServiceViewController: UIViewController, TableModelHost { } if #available(iOS 12, *) { - InteractionsHandler.donateEnableVPN() - InteractionsHandler.donateDisableVPN() + IntentDispatcher.donateEnableVPN() + IntentDispatcher.donateDisableVPN() } } @@ -790,8 +790,8 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .trustedAddCurrentWiFi: if #available(iOS 12, *) { - InteractionsHandler.donateTrustCurrentNetwork() - InteractionsHandler.donateUntrustCurrentNetwork() + IntentDispatcher.donateTrustCurrentNetwork() + IntentDispatcher.donateUntrustCurrentNetwork() } guard trustedNetworks.addCurrentWifi() else { @@ -839,8 +839,8 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .trustedMobile: if #available(iOS 12, *) { - InteractionsHandler.donateTrustCellularNetwork() - InteractionsHandler.donateUntrustCellularNetwork() + IntentDispatcher.donateTrustCellularNetwork() + IntentDispatcher.donateUntrustCellularNetwork() } trustedNetworks.setMobile(cell.isOn) @@ -1104,7 +1104,7 @@ extension ServiceViewController: ProviderPoolViewControllerDelegate { vpn.reinstallIfEnabled() if #available(iOS 12, *) { - InteractionsHandler.donateConnection(with: uncheckedProviderProfile) + IntentDispatcher.donateConnection(with: uncheckedProviderProfile) } } } diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj index 85ecf532..a0612ac2 100644 --- a/Passepartout.xcodeproj/project.pbxproj +++ b/Passepartout.xcodeproj/project.pbxproj @@ -63,7 +63,6 @@ 0E3DA371215CB5BF00B40FC9 /* VersionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3DA370215CB5BF00B40FC9 /* VersionViewController.swift */; }; 0E4C9CBB20DCF0D600A0C59C /* DestructiveTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4C9CBA20DCF0D600A0C59C /* DestructiveTableViewCell.swift */; }; 0E4FD7F120D58618002221FF /* Macros.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4FD7F020D58618002221FF /* Macros.swift */; }; - 0E50E7C6223318A500D5F76C /* InteractionsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E50E7C5223318A500D5F76C /* InteractionsHandler.swift */; }; 0E57F63C20C83FC5008323CF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E57F63B20C83FC5008323CF /* AppDelegate.swift */; }; 0E57F63E20C83FC5008323CF /* ServiceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E57F63D20C83FC5008323CF /* ServiceViewController.swift */; }; 0E57F64120C83FC5008323CF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E57F63F20C83FC5008323CF /* Main.storyboard */; }; @@ -86,6 +85,8 @@ 0ED38ADA213F44D00004D387 /* Organizer.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0ED38ADC213F44D00004D387 /* Organizer.storyboard */; }; 0ED38AEA214054A50004D387 /* OptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED38AE9214054A50004D387 /* OptionViewController.swift */; }; 0ED38AEC2141260D0004D387 /* ConfigurationModificationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED38AEB2141260D0004D387 /* ConfigurationModificationDelegate.swift */; }; + 0ED993B1223FF8C700B0F9C9 /* IntentDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED993B0223FF8C700B0F9C9 /* IntentDispatcher.swift */; }; + 0ED993B2223FF92000B0F9C9 /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 0EFE0D5C2233D1C7002B5E8C /* Intents.intentdefinition */; }; 0EDE8DC420C86910004C739C /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDE8DC320C86910004C739C /* PacketTunnelProvider.swift */; }; 0EDE8DC820C86910004C739C /* Passepartout-Tunnel.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0EDE8DBF20C86910004C739C /* Passepartout-Tunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 0EE3BBB2215ED3A900F30952 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE3BBB1215ED3A900F30952 /* AboutViewController.swift */; }; @@ -95,7 +96,7 @@ 0EFBFAC121AC464800887A8C /* CreditsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFBFAC021AC464800887A8C /* CreditsViewController.swift */; }; 0EFD943E215BE10800529B64 /* IssueReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFD943D215BE10800529B64 /* IssueReporter.swift */; }; 0EFD9440215BED8E00529B64 /* LabelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFD943F215BED8E00529B64 /* LabelViewController.swift */; }; - 0EFE0D5A2233D1C7002B5E8C /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 0EFE0D5C2233D1C7002B5E8C /* Intents.intentdefinition */; }; + 0EFE0D5A2233D1C7002B5E8C /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 0EFE0D5C2233D1C7002B5E8C /* Intents.intentdefinition */; settings = {ATTRIBUTES = (no_codegen, ); }; }; 390EEC911382C4814FB97475 /* Pods_Passepartout_iOS_Tunnel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D0C619B826C7140001C0F32 /* Pods_Passepartout_iOS_Tunnel.framework */; }; 4557767FEDE747E8096E8D2B /* Pods_Passepartout_CoreTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F0B03FAF4A0F1620CCA4B19 /* Pods_Passepartout_CoreTests.framework */; }; 61E05ED5CCEEA859AD1752F3 /* Pods_Passepartout_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9FBA5419C4B758FB5D68E96 /* Pods_Passepartout_iOS.framework */; }; @@ -182,7 +183,6 @@ 0E4FD7ED20D539A0002221FF /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 0E4FD7F020D58618002221FF /* Macros.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macros.swift; sourceTree = ""; }; 0E4FD80420D683A2002221FF /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetworkExtension.framework; sourceTree = DEVELOPER_DIR; }; - 0E50E7C5223318A500D5F76C /* InteractionsHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractionsHandler.swift; sourceTree = ""; }; 0E57F63820C83FC5008323CF /* Passepartout.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Passepartout.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0E57F63B20C83FC5008323CF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 0E57F63D20C83FC5008323CF /* ServiceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceViewController.swift; sourceTree = ""; }; @@ -232,6 +232,7 @@ 0ED38AF1214177920004D387 /* VPNProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNProvider.swift; sourceTree = ""; }; 0ED824C920D12B8700F2FE9E /* ToggleTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleTableViewCell.swift; sourceTree = ""; }; 0ED824CD20D12DBE00F2FE9E /* SettingTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingTableViewCell.swift; sourceTree = ""; }; + 0ED993B0223FF8C700B0F9C9 /* IntentDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IntentDispatcher.swift; path = Passepartout/Sources/Intents/IntentDispatcher.swift; sourceTree = SOURCE_ROOT; }; 0EDE8DBF20C86910004C739C /* Passepartout-Tunnel.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Passepartout-Tunnel.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 0EDE8DC320C86910004C739C /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = ""; }; 0EDE8DC520C86910004C739C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -356,8 +357,8 @@ 0E50E7C422330E5100D5F76C /* Intents */ = { isa = PBXGroup; children = ( + 0ED993B0223FF8C700B0F9C9 /* IntentDispatcher.swift */, 0EFE0D5C2233D1C7002B5E8C /* Intents.intentdefinition */, - 0E50E7C5223318A500D5F76C /* InteractionsHandler.swift */, ); path = Intents; sourceTree = ""; @@ -394,7 +395,6 @@ 0E1066CA20E0F85C004F98B7 /* Cells */, 0ECEE44C20E1120F00A6BB43 /* Tables */, 0EDE8DF120C93ED8004C739C /* Scenes */, - 0E50E7C422330E5100D5F76C /* Intents */, 0EDE8DE220C86A13004C739C /* Passepartout.entitlements */, 0E57F63B20C83FC5008323CF /* AppDelegate.swift */, 0E57F63F20C83FC5008323CF /* Main.storyboard */, @@ -524,6 +524,7 @@ 0ED31C0E20CF09890027975F /* Model */, 0ED31C1B20CF0ACE0027975F /* Services */, 0E4FD7D920D3E43F002221FF /* VPN */, + 0E50E7C422330E5100D5F76C /* Intents */, 0E39BCF2214DA9310035E9DE /* AppConstants.swift */, 0E6BE13920CFB76800A6DD36 /* ApplicationError.swift */, 0EDE8DED20C93E4C004C739C /* GroupConstants.swift */, @@ -959,12 +960,14 @@ 0E3152BB223FA03D00F61841 /* AppConstants.swift in Sources */, 0E3152CA223FA04D00F61841 /* InfrastructurePreset.swift in Sources */, 0E3152CE223FA05400F61841 /* ConnectionService.swift in Sources */, + 0ED993B1223FF8C700B0F9C9 /* IntentDispatcher.swift in Sources */, 0E3152BE223FA03D00F61841 /* Reviewer.swift in Sources */, 0E3152C3223FA04800F61841 /* StandardVPNProvider.swift in Sources */, 0E3152D1223FA05400F61841 /* Credentials.swift in Sources */, 0E3152CD223FA05400F61841 /* ConnectionProfile.swift in Sources */, 0E3152BC223FA03D00F61841 /* ApplicationError.swift in Sources */, 0E3152C9223FA04D00F61841 /* InfrastructureFactory.swift in Sources */, + 0ED993B2223FF92000B0F9C9 /* Intents.intentdefinition in Sources */, 0E3152D3223FA05400F61841 /* EndpointDataSource.swift in Sources */, 0E3152D4223FA05400F61841 /* Preferences.swift in Sources */, 0E3152C0223FA03D00F61841 /* Utils.swift in Sources */, @@ -1002,7 +1005,6 @@ 0EFE0D5A2233D1C7002B5E8C /* Intents.intentdefinition in Sources */, 0E3DA371215CB5BF00B40FC9 /* VersionViewController.swift in Sources */, 0E05C5D620D1645F006EE732 /* SwiftGen+Scenes.swift in Sources */, - 0E50E7C6223318A500D5F76C /* InteractionsHandler.swift in Sources */, 0EFD9440215BED8E00529B64 /* LabelViewController.swift in Sources */, 0ED31C2C20CF2D6F0027975F /* ProviderPoolViewController.swift in Sources */, 0E2B494020FCFF990094784C /* Theme+Titles.swift in Sources */, diff --git a/Passepartout-iOS/Intents/InteractionsHandler.swift b/Passepartout/Sources/Intents/IntentDispatcher.swift similarity index 83% rename from Passepartout-iOS/Intents/InteractionsHandler.swift rename to Passepartout/Sources/Intents/IntentDispatcher.swift index b5dae4fb..c48e87b9 100644 --- a/Passepartout-iOS/Intents/InteractionsHandler.swift +++ b/Passepartout/Sources/Intents/IntentDispatcher.swift @@ -1,6 +1,6 @@ // -// InteractionsHandler.swift -// Passepartout-iOS +// IntentDispatcher.swift +// Passepartout // // Created by Davide De Rosa on 3/8/19. // Copyright (c) 2019 Davide De Rosa. All rights reserved. @@ -26,23 +26,22 @@ import Foundation import Intents import SwiftyBeaver -import Passepartout_Core private let log = SwiftyBeaver.self -extension Notification.Name { +public extension Notification.Name { static let IntentDidUpdateService = Notification.Name("IntentDidUpdateService") } @available(iOS 12, *) -class InteractionsHandler { +public class IntentDispatcher { private class Groups { static let vpn = "VPN" static let trust = "Trust" } - static func donateConnection(with profile: ConnectionProfile) { + public static func donateConnection(with profile: ConnectionProfile) { let profileKey = ProfileKey(profile) let genericIntent: INIntent @@ -64,7 +63,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateEnableVPN() { + public static func donateEnableVPN() { let intent = EnableVPNIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -72,7 +71,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateDisableVPN() { + public static func donateDisableVPN() { let intent = DisableVPNIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -80,7 +79,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateTrustCurrentNetwork() { + public static func donateTrustCurrentNetwork() { let intent = TrustCurrentNetworkIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -88,7 +87,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateUntrustCurrentNetwork() { + public static func donateUntrustCurrentNetwork() { let intent = UntrustCurrentNetworkIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -96,7 +95,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateTrustCellularNetwork() { + public static func donateTrustCellularNetwork() { let intent = TrustCellularNetworkIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -104,7 +103,7 @@ class InteractionsHandler { interaction.donateAndLog() } - static func donateUntrustCellularNetwork() { + public static func donateUntrustCellularNetwork() { let intent = UntrustCellularNetworkIntent() let interaction = INInteraction(intent: intent, response: nil) @@ -113,30 +112,36 @@ class InteractionsHandler { } // - - static func handleInteraction(_ interaction: INInteraction) { - if let custom = interaction.intent as? ConnectVPNIntent { + + public static func handleInteraction(_ interaction: INInteraction) { + handleIntent(interaction.intent, interaction: interaction) + } + + public static func handleIntent(_ intent: INIntent, interaction: INInteraction?) { + if let custom = intent as? ConnectVPNIntent { handleConnectVPN(custom, interaction: interaction) - } else if let custom = interaction.intent as? EnableVPNIntent { + } else if let custom = intent as? EnableVPNIntent { handleEnableVPN(custom, interaction: interaction) - } else if let custom = interaction.intent as? DisableVPNIntent { + } else if let custom = intent as? DisableVPNIntent { handleDisableVPN(custom, interaction: interaction) - } else if let custom = interaction.intent as? MoveToLocationIntent { + } else if let custom = intent as? MoveToLocationIntent { handleMoveToLocation(custom, interaction: interaction) - } else if let _ = interaction.intent as? TrustCurrentNetworkIntent { + } else if let _ = intent as? TrustCurrentNetworkIntent { handleCurrentNetwork(trust: true, interaction: interaction) - } else if let _ = interaction.intent as? UntrustCurrentNetworkIntent { + } else if let _ = intent as? UntrustCurrentNetworkIntent { handleCurrentNetwork(trust: false, interaction: interaction) - } else if let _ = interaction.intent as? TrustCellularNetworkIntent { + } else if let _ = intent as? TrustCellularNetworkIntent { handleCellularNetwork(trust: true, interaction: interaction) - } else if let _ = interaction.intent as? UntrustCellularNetworkIntent { + } else if let _ = intent as? UntrustCellularNetworkIntent { handleCellularNetwork(trust: false, interaction: interaction) } } - private static func handleConnectVPN(_ intent: ConnectVPNIntent, interaction: INInteraction) { + private static func handleConnectVPN(_ intent: ConnectVPNIntent, interaction: INInteraction?) { guard let contextValue = intent.context, let context = Context(rawValue: contextValue), let id = intent.profileId else { - INInteraction.delete(with: [interaction.identifier], completion: nil) + if let interactionIdentifier = interaction?.identifier { + INInteraction.delete(with: [interactionIdentifier], completion: nil) + } return } let profileKey = ProfileKey(context, id) @@ -156,7 +161,7 @@ class InteractionsHandler { refreshVPN(service: service, doReconnect: true) } - private static func handleMoveToLocation(_ intent: MoveToLocationIntent, interaction: INInteraction) { + private static func handleMoveToLocation(_ intent: MoveToLocationIntent, interaction: INInteraction?) { guard let providerId = intent.providerId, let poolId = intent.poolId else { return } @@ -177,20 +182,20 @@ class InteractionsHandler { refreshVPN(service: service, doReconnect: true) } - private static func handleEnableVPN(_ intent: EnableVPNIntent, interaction: INInteraction) { + private static func handleEnableVPN(_ intent: EnableVPNIntent, interaction: INInteraction?) { let service = TransientStore.shared.service log.info("Enabling VPN...") refreshVPN(service: service, doReconnect: true) } - private static func handleDisableVPN(_ intent: DisableVPNIntent, interaction: INInteraction) { + private static func handleDisableVPN(_ intent: DisableVPNIntent, interaction: INInteraction?) { log.info("Disabling VPN...") VPN.shared.disconnect { (error) in notifyServiceController() } } - private static func handleCurrentNetwork(trust: Bool, interaction: INInteraction) { + private static func handleCurrentNetwork(trust: Bool, interaction: INInteraction?) { guard let currentWifi = Utils.currentWifiNetworkName() else { return } @@ -202,7 +207,7 @@ class InteractionsHandler { refreshVPN(service: service, doReconnect: false) } - private static func handleCellularNetwork(trust: Bool, interaction: INInteraction) { + private static func handleCellularNetwork(trust: Bool, interaction: INInteraction?) { guard Utils.hasCellularData() else { return } @@ -240,7 +245,7 @@ class InteractionsHandler { // - static func forgetProfile(withKey profileKey: ProfileKey) { + public static func forgetProfile(withKey profileKey: ProfileKey) { INInteraction.delete(with: profileKey.rawValue) { (error) in if let error = error { log.error("Unable to forget interactions: \(error)") diff --git a/Passepartout-iOS/Intents/en.lproj/Intents.intentdefinition b/Passepartout/Sources/Intents/en.lproj/Intents.intentdefinition similarity index 99% rename from Passepartout-iOS/Intents/en.lproj/Intents.intentdefinition rename to Passepartout/Sources/Intents/en.lproj/Intents.intentdefinition index e319b4fd..dc074d31 100644 --- a/Passepartout-iOS/Intents/en.lproj/Intents.intentdefinition +++ b/Passepartout/Sources/Intents/en.lproj/Intents.intentdefinition @@ -7,7 +7,7 @@ INIntentDefinitionModelVersion 1.0 INIntentDefinitionSystemVersion - 17G3025 + 18D42 INIntentDefinitionToolsBuildVersion 10B61 INIntentDefinitionToolsVersion @@ -74,7 +74,7 @@ INIntentResponseCodeFormatString - Unable to connect + INIntentResponseCodeFormatStringID uKU9RD INIntentResponseCodeName @@ -84,7 +84,7 @@ INIntentResponseCodeFormatString - Successfully connected! + INIntentResponseCodeFormatStringID WNbRl5 INIntentResponseCodeName