Skip to content

Commit c05355a

Browse files
authored
Merge pull request #313 from urnetwork/persist-performance-profile
load performance profile from local storage
2 parents cb3da13 + 901db2a commit c05355a

1 file changed

Lines changed: 52 additions & 37 deletions

File tree

app/network/Shared/ViewModels/DeviceManager.swift

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -81,33 +81,26 @@ class DeviceManager: ObservableObject {
8181
@Published private(set) var provideEnabled: Bool = false
8282
@Published private(set) var providePaused: Bool = false
8383

84-
// @Published private(set) var performanceProfile: SdkPerformanceProfile? = nil // nil == auto
84+
private var isLoadingFromDevice = false
85+
8586
@Published var selectedWindowType: WindowType = .auto {
8687
didSet {
88+
guard !isLoadingFromDevice else { return }
8789

8890
if selectedWindowType == .auto && fixedIpSize != false {
8991
self.fixedIpSize = false
9092
// this will trigger createPerformanceProfile
9193
return
9294
}
9395

94-
let updatedPerformanceProfile = createPerformanceProfile(
95-
windowType: selectedWindowType,
96-
isFixedSize: fixedIpSize
97-
)
98-
99-
updatePerformanceProfile(updatedPerformanceProfile)
96+
propagatePerformanceProfileToDevice()
10097
}
10198
}
102-
99+
103100
@Published var fixedIpSize: Bool = false {
104101
didSet {
105-
let updatedPerformanceProfile = createPerformanceProfile(
106-
windowType: selectedWindowType,
107-
isFixedSize: fixedIpSize
108-
)
109-
110-
updatePerformanceProfile(updatedPerformanceProfile)
102+
guard !isLoadingFromDevice else { return }
103+
propagatePerformanceProfileToDevice()
111104
}
112105
}
113106

@@ -129,15 +122,49 @@ class DeviceManager: ObservableObject {
129122
performanceProfile.windowSize = windowSizeSettings
130123

131124
return performanceProfile
132-
133125
}
134126

135-
private func updatePerformanceProfile(_ profile: SdkPerformanceProfile?) {
127+
/// Propagates UI state to device and storage (one direction only)
128+
private func propagatePerformanceProfileToDevice() {
136129
guard let device = self.device else { return }
137-
// self.performanceProfile = profile
130+
131+
let profile = createPerformanceProfile(
132+
windowType: selectedWindowType,
133+
isFixedSize: fixedIpSize
134+
)
135+
136+
// Save to storage
137+
do {
138+
try asyncLocalState?.getLocalState()?.setPerformanceProfile(profile)
139+
} catch {
140+
print("error updating performance profile: \(error)")
141+
}
142+
143+
// Update device
138144
device.setPerformanceProfile(profile)
139145
}
140146

147+
/// Loads performance profile from device into UI (called only during init)
148+
private func loadPerformanceProfileFromDevice(_ device: SdkDeviceRemote) {
149+
// Set flag to prevent didSet from triggering propagation
150+
isLoadingFromDevice = true
151+
defer { isLoadingFromDevice = false }
152+
153+
let performanceProfile = device.getPerformanceProfile()
154+
if performanceProfile == nil {
155+
self.selectedWindowType = .auto
156+
self.fixedIpSize = false
157+
} else {
158+
self.selectedWindowType = performanceProfile?.windowType == SdkWindowTypeQuality ? .quality : .speed
159+
160+
if performanceProfile?.windowSize?.windowSizeMin == 1 && performanceProfile?.windowSize?.windowSizeMax == 1 {
161+
self.fixedIpSize = true
162+
} else {
163+
self.fixedIpSize = false
164+
}
165+
}
166+
}
167+
141168
@Published private(set) var isPro: Bool = false
142169
private func setIsPro(_ value: Bool) {
143170
self.isPro = value
@@ -185,20 +212,8 @@ class DeviceManager: ObservableObject {
185212
if let provideNetworkMode = ProvideNetworkMode(rawValue: device.getProvideNetworkMode()) {
186213
self.allowProvidingCell = provideNetworkMode == .All
187214
}
188-
189-
// let performanceProfile = device.getPerformanceProfile()
190-
// if performanceProfile == nil {
191-
// self.selectedWindowType = .auto
192-
// self.fixedIpSize = false
193-
// } else {
194-
// self.selectedWindowType = performanceProfile?.windowType == SdkWindowTypeQuality ? .quality : .speed
195-
//
196-
// if performanceProfile?.windowSize?.windowSizeMin == 1 && performanceProfile?.windowSize?.windowSizeMax == 1 {
197-
// self.fixedIpSize = true
198-
// } else {
199-
// self.fixedIpSize = false
200-
// }
201-
// }
215+
216+
loadPerformanceProfileFromDevice(device)
202217

203218
self.deviceInitialized = true
204219
self.vpnManager = VPNManager(device: device)
@@ -511,14 +526,12 @@ extension DeviceManager {
511526

512527
if let localState = localState {
513528

514-
// let instanceId = localState.getInstanceId()
515529
let routeLocal = localState.getRouteLocal()
516530
let connectLocation = localState.getConnectLocation()
517531
let defaultLocation = localState.getDefaultLocation()
518532
let canShowRatingDialog = localState.getCanShowRatingDialog()
519-
520-
// let provideWhileDisconnected = localState.getProvideWhileDisconnected()
521-
533+
let performanceProfile = localState.getPerformanceProfile()
534+
522535
let provideControlModeStr = localState.getProvideControlMode()
523536
let provideControlMode = ProvideControlMode(rawValue: provideControlModeStr)
524537

@@ -577,6 +590,10 @@ extension DeviceManager {
577590
device.setProvideNetworkMode(provideNetworkMode?.rawValue ?? ProvideNetworkMode.WiFi.rawValue)
578591
device.setCanRefer(canRefer)
579592

593+
if (performanceProfile != nil) {
594+
device.setPerformanceProfile(performanceProfile)
595+
}
596+
580597
// only set the location if the current location is not already equivalent
581598
// this avoid resetting the connection
582599
if let remoteLocation = device.getConnectLocation() {
@@ -592,8 +609,6 @@ extension DeviceManager {
592609
device.setDefaultLocation(defaultLocation)
593610
}
594611

595-
596-
597612
self.setDevice(device: device)
598613

599614
} else {

0 commit comments

Comments
 (0)