Skip to content

Commit f11c87e

Browse files
committed
sameerasw#114 preserve last network until it become sunavailable
1 parent 11ab9d2 commit f11c87e

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

airsync-mac/Core/AppState.swift

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ class AppState: ObservableObject {
7575
// Initialize persisted UI toggles
7676
self.isMusicCardHidden = UserDefaults.standard.bool(forKey: "isMusicCardHidden")
7777

78+
// Load and validate saved network adapter
79+
let savedAdapterName = UserDefaults.standard.string(forKey: "selectedNetworkAdapterName")
80+
self.selectedNetworkAdapterName = validateAndGetNetworkAdapter(savedName: savedAdapterName)
81+
7882
self.myDevice = Device(
7983
name: name,
8084
ipAddress: WebSocketServer.shared
@@ -119,7 +123,11 @@ class AppState: ObservableObject {
119123
@Published var adbConnected: Bool = false
120124
@Published var adbConnecting: Bool = false
121125
@Published var currentDeviceWallpaperBase64: String? = nil
122-
@Published var selectedNetworkAdapterName: String? // e.g., "en0"
126+
@Published var selectedNetworkAdapterName: String? { // e.g., "en0"
127+
didSet {
128+
UserDefaults.standard.set(selectedNetworkAdapterName, forKey: "selectedNetworkAdapterName")
129+
}
130+
}
123131
@Published var showMenubarText: Bool {
124132
didSet {
125133
UserDefaults.standard.set(showMenubarText, forKey: "showMenubarText")
@@ -598,4 +606,43 @@ class AppState: ObservableObject {
598606
}
599607
}
600608
}
609+
610+
/// Revalidates the current network adapter selection and falls back to auto if no longer valid
611+
func revalidateNetworkAdapter() {
612+
let currentSelection = selectedNetworkAdapterName
613+
let validated = validateAndGetNetworkAdapter(savedName: currentSelection)
614+
615+
if currentSelection != validated {
616+
print("[state] Network adapter changed from '\(currentSelection ?? "auto")' to '\(validated ?? "auto")'")
617+
selectedNetworkAdapterName = validated
618+
shouldRefreshQR = true
619+
}
620+
}
621+
622+
/// Validates a saved network adapter name and returns it if available with valid IP, otherwise returns nil (auto)
623+
private func validateAndGetNetworkAdapter(savedName: String?) -> String? {
624+
guard let savedName = savedName else {
625+
print("[state] No saved network adapter, using auto selection")
626+
return nil // Auto mode
627+
}
628+
629+
// Get available adapters from WebSocketServer
630+
let availableAdapters = WebSocketServer.shared.getAvailableNetworkAdapters()
631+
632+
// Check if the saved adapter is still available
633+
guard let matchingAdapter = availableAdapters.first(where: { $0.name == savedName }) else {
634+
print("[state] Saved network adapter '\(savedName)' not found, falling back to auto")
635+
return nil // Fall back to auto
636+
}
637+
638+
// Verify the adapter has a valid IP address
639+
let ipAddress = WebSocketServer.shared.getLocalIPAddress(adapterName: savedName)
640+
guard let validIP = ipAddress, !validIP.isEmpty, validIP != "127.0.0.1" else {
641+
print("[state] Saved network adapter '\(savedName)' has no valid IP (\(ipAddress ?? "nil")), falling back to auto")
642+
return nil // Fall back to auto
643+
}
644+
645+
print("[state] Using saved network adapter: \(savedName) -> \(validIP)")
646+
return savedName
647+
}
601648
}

airsync-mac/Core/WebSocket/WebSocketServer.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,9 @@ class WebSocketServer: ObservableObject {
10831083
if adapterAddresses != lastAddresses {
10841084
lastKnownAdapters = adapters
10851085

1086+
// Revalidate the current network adapter selection
1087+
AppState.shared.revalidateNetworkAdapter()
1088+
10861089
for adapter in adapters {
10871090
let activeMark = (adapter.address == chosenIP) ? " [ACTIVE]" : ""
10881091
print("[websocket] (network) \(adapter.name) -> \(adapter.address)\(activeMark)")

0 commit comments

Comments
 (0)