@@ -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}
0 commit comments