aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard/UI/ActivateOnDemandViewModel.swift
blob: b5ce6331dbdc53061fd0e47bbffbdcc5a09d3b05 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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)
        }
    }
}