From 7a450089c0a0cda91b87c567c441af305ae12a58 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Wed, 27 Feb 2019 13:25:53 +0530 Subject: on-demand: Introducing ActivateOnDemandViewModel Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/Base.lproj/Localizable.strings | 11 ++ .../WireGuard/UI/ActivateOnDemandViewModel.swift | 128 +++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 WireGuard/WireGuard/UI/ActivateOnDemandViewModel.swift (limited to 'WireGuard/WireGuard') diff --git a/WireGuard/WireGuard/Base.lproj/Localizable.strings b/WireGuard/WireGuard/Base.lproj/Localizable.strings index e9658d2..ace9646 100644 --- a/WireGuard/WireGuard/Base.lproj/Localizable.strings +++ b/WireGuard/WireGuard/Base.lproj/Localizable.strings @@ -81,6 +81,17 @@ "tunnelSectionTitleOnDemand" = "On-Demand Activation"; +"tunnelOnDemandCellular" = "Cellular"; +"tunnelOnDemandEthernet" = "Ethernet"; +"tunnelOnDemandWiFi" = "Wi-Fi"; +"tunnelOnDemandSSIDDescription" = "Selected SSIDs"; +"tunnelOnDemandSSIDescriptionMac" = "SSIDs"; +"tunnelOnDemandSSIDEdit" = "Select SSIDs"; + +"tunnelOnDemandAnySSID" = "Any SSID"; +"tunnelOnDemandOnlySelectedSSIDs" = "Only selected SSIDs"; +"tunnelOnDemandExceptSelectedSSIDs" = "Except selected SSIDs"; + "tunnelOnDemandKey" = "Activate on demand"; "tunnelOnDemandOptionOff" = "Off"; "tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only"; diff --git a/WireGuard/WireGuard/UI/ActivateOnDemandViewModel.swift b/WireGuard/WireGuard/UI/ActivateOnDemandViewModel.swift new file mode 100644 index 0000000..b5ce633 --- /dev/null +++ b/WireGuard/WireGuard/UI/ActivateOnDemandViewModel.swift @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. + +import Foundation + +class ActivateOnDemandViewModel { + enum OnDemandField { + case nonWiFiInterface + case wiFiInterface + case ssidDescription + case ssidEdit + + var localizedUIString: String { + switch self { + case .nonWiFiInterface: + #if os(iOS) + return tr("tunnelOnDemandCellular") + #elseif os(macOS) + return tr("tunnelOnDemandEthernet") + #else + #error("Unimplemented") + #endif + case .wiFiInterface: return tr("tunnelOnDemandWiFi") + case .ssidDescription: return tr("tunnelOnDemandSSIDDescription") + case .ssidEdit: return tr("tunnelOnDemandSSIDEdit") + } + } + } + + enum OnDemandSSIDOption { + case anySSID + case onlySpecificSSIDs + case exceptSpecificSSIDs + + var localizedUIString: String { + switch self { + case .anySSID: return tr("tunnelOnDemandAnySSID") + case .onlySpecificSSIDs: return tr("tunnelOnDemandOnlySelectedSSIDs") + case .exceptSpecificSSIDs: return tr("tunnelOnDemandExceptSelectedSSIDs") + } + } + } + + var isNonWiFiInterfaceEnabled = false + var isWiFiInterfaceEnabled = false + var selectedSSIDs = [String]() + var ssidOption: OnDemandSSIDOption = .anySSID +} + +extension ActivateOnDemandViewModel { + convenience init(from option: ActivateOnDemandOption) { + self.init() + switch option { + case .none: + break + case .wiFiInterfaceOnly(let onDemandSSIDOption): + isWiFiInterfaceEnabled = true + (ssidOption, selectedSSIDs) = ssidViewModel(from: onDemandSSIDOption) + case .nonWiFiInterfaceOnly: + isNonWiFiInterfaceEnabled = true + case .anyInterface(let onDemandSSIDOption): + isWiFiInterfaceEnabled = true + isNonWiFiInterfaceEnabled = true + (ssidOption, selectedSSIDs) = ssidViewModel(from: onDemandSSIDOption) + } + } + + func toOnDemandOption() -> ActivateOnDemandOption { + switch (isWiFiInterfaceEnabled, isNonWiFiInterfaceEnabled) { + case (false, false): + return .none + case (false, true): + return .nonWiFiInterfaceOnly + case (true, false): + return .wiFiInterfaceOnly(toSSIDOption()) + case (true, true): + return .anyInterface(toSSIDOption()) + } + } +} + +extension ActivateOnDemandViewModel { + func isEnabled(field: OnDemandField) -> Bool { + switch field { + case .nonWiFiInterface: + return isNonWiFiInterfaceEnabled + case .wiFiInterface: + return isWiFiInterfaceEnabled + default: + return false + } + } + + func setEnabled(field: OnDemandField, isEnabled: Bool) { + switch field { + case .nonWiFiInterface: + isNonWiFiInterfaceEnabled = isEnabled + case .wiFiInterface: + isWiFiInterfaceEnabled = isEnabled + default: + break + } + } +} + +private extension ActivateOnDemandViewModel { + func ssidViewModel(from ssidOption: ActivateOnDemandSSIDOption) -> (OnDemandSSIDOption, [String]) { + switch ssidOption { + case .anySSID: + return (.anySSID, []) + case .onlySpecificSSIDs(let ssids): + return (.onlySpecificSSIDs, ssids) + case .exceptSpecificSSIDs(let ssids): + return (.exceptSpecificSSIDs, ssids) + } + } + + func toSSIDOption() -> ActivateOnDemandSSIDOption { + switch ssidOption { + case .anySSID: + return .anySSID + case .onlySpecificSSIDs: + return .onlySpecificSSIDs(selectedSSIDs) + case .exceptSpecificSSIDs: + return .exceptSpecificSSIDs(selectedSSIDs) + } + } +} -- cgit v1.2.3-59-g8ed1b