Fix widget toggle not disabling On Demand before stopping VPN
Store wasOnDemandEnabled flag in providerConfiguration so the widget can restore On Demand state on next start. Clear the flag when On Demand is explicitly disabled in settings or when starting from the main app.
This commit is contained in:
@@ -179,7 +179,7 @@ public class LogViewModel: BaseViewModel {
|
||||
public init(commandClient: CommandClient, searchText: String = "") {
|
||||
self.commandClient = commandClient
|
||||
self.searchText = searchText
|
||||
self.isSearching = !searchText.isEmpty
|
||||
isSearching = !searchText.isEmpty
|
||||
super.init()
|
||||
dataModel = LogDataModel(commandClient: commandClient, viewModel: self)
|
||||
}
|
||||
|
||||
@@ -114,6 +114,14 @@ public class ExtensionProfile: ObservableObject {
|
||||
public func updateOnDemand(enabled: Bool, useDefaultRules: Bool) async throws {
|
||||
guard let manager else { return }
|
||||
manager.isOnDemandEnabled = enabled
|
||||
if !enabled {
|
||||
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
|
||||
var config = proto.providerConfiguration ?? [:]
|
||||
if config.removeValue(forKey: "wasOnDemandEnabled") != nil {
|
||||
proto.providerConfiguration = config
|
||||
}
|
||||
}
|
||||
}
|
||||
await setOnDemandRules(useDefaultRules: useDefaultRules)
|
||||
try await manager.saveToPreferences()
|
||||
}
|
||||
@@ -141,6 +149,12 @@ public class ExtensionProfile: ObservableObject {
|
||||
manager.isOnDemandEnabled = true
|
||||
await setOnDemandRules(useDefaultRules: alwaysOn)
|
||||
}
|
||||
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
|
||||
var config = proto.providerConfiguration ?? [:]
|
||||
if config.removeValue(forKey: "wasOnDemandEnabled") != nil {
|
||||
proto.providerConfiguration = config
|
||||
}
|
||||
}
|
||||
#if !os(tvOS)
|
||||
if let protocolConfiguration = manager.protocolConfiguration {
|
||||
let includeAllNetworks = await SharedPreferences.includeAllNetworks.get()
|
||||
@@ -239,6 +253,11 @@ public class ExtensionProfile: ObservableObject {
|
||||
}
|
||||
guard let manager else { return }
|
||||
if manager.isOnDemandEnabled {
|
||||
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
|
||||
var config = proto.providerConfiguration ?? [:]
|
||||
config["wasOnDemandEnabled"] = true
|
||||
proto.providerConfiguration = config
|
||||
}
|
||||
manager.isOnDemandEnabled = false
|
||||
try await manager.saveToPreferences()
|
||||
}
|
||||
|
||||
@@ -51,8 +51,17 @@ enum WidgetTunnelControl {
|
||||
if started {
|
||||
if manager.isEnabled == false {
|
||||
manager.isEnabled = true
|
||||
try await manager.saveToPreferences()
|
||||
}
|
||||
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol,
|
||||
let config = proto.providerConfiguration,
|
||||
config["wasOnDemandEnabled"] as? Bool == true
|
||||
{
|
||||
var newConfig = config
|
||||
newConfig.removeValue(forKey: "wasOnDemandEnabled")
|
||||
proto.providerConfiguration = newConfig
|
||||
manager.isOnDemandEnabled = true
|
||||
}
|
||||
try await manager.saveToPreferences()
|
||||
do {
|
||||
try manager.connection.startVPNTunnel()
|
||||
} catch {
|
||||
@@ -60,6 +69,15 @@ enum WidgetTunnelControl {
|
||||
throw error
|
||||
}
|
||||
} else {
|
||||
if manager.isOnDemandEnabled {
|
||||
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
|
||||
var config = proto.providerConfiguration ?? [:]
|
||||
config["wasOnDemandEnabled"] = true
|
||||
proto.providerConfiguration = config
|
||||
}
|
||||
manager.isOnDemandEnabled = false
|
||||
try await manager.saveToPreferences()
|
||||
}
|
||||
manager.connection.stopVPNTunnel()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user