@@ -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