diff --git a/system/ui/lib/wifi_manager.py b/system/ui/lib/wifi_manager.py index 25c4548e9..f95ac7d88 100644 --- a/system/ui/lib/wifi_manager.py +++ b/system/ui/lib/wifi_manager.py @@ -146,6 +146,7 @@ class ConnectStatus(IntEnum): @dataclass class WifiState: ssid: str | None = None + prev_ssid: str | None = None status: ConnectStatus = ConnectStatus.DISCONNECTED @@ -284,7 +285,10 @@ class WifiManager: return self._tethering_password def _set_connecting(self, ssid: str | None): - self._wifi_state = WifiState(ssid=ssid, status=ConnectStatus.DISCONNECTED if ssid is None else ConnectStatus.CONNECTING) + # Track prev ssid so late NEED_AUTH signals target the right network + self._wifi_state = WifiState(ssid=ssid, + prev_ssid=self.connecting_to_ssid if ssid is not None else None, + status=ConnectStatus.DISCONNECTED if ssid is None else ConnectStatus.CONNECTING) def _enqueue_callbacks(self, cbs: list[Callable], *args): for cb in cbs: @@ -391,16 +395,18 @@ class WifiManager: self._wifi_state = wifi_state - # BAD PASSWORD + # BAD PASSWORD - use prev if current has already moved on to a new connection # - strong network rejects with NEED_AUTH+SUPPLICANT_DISCONNECT # - weak/gone network fails with FAILED+NO_SECRETS elif ((new_state == NMDeviceState.NEED_AUTH and change_reason == NMDeviceStateReason.SUPPLICANT_DISCONNECT) or (new_state == NMDeviceState.FAILED and change_reason == NMDeviceStateReason.NO_SECRETS)): - if self._wifi_state.ssid: - self._enqueue_callbacks(self._need_auth, self._wifi_state.ssid) - - self._set_connecting(None) + failed_ssid = self._wifi_state.prev_ssid or self._wifi_state.ssid + if failed_ssid: + self._enqueue_callbacks(self._need_auth, failed_ssid) + self._wifi_state.prev_ssid = None + if self._wifi_state.ssid == failed_ssid: + self._set_connecting(None) elif new_state in (NMDeviceState.NEED_AUTH, NMDeviceState.IP_CONFIG, NMDeviceState.IP_CHECK, NMDeviceState.SECONDARIES, NMDeviceState.FAILED): @@ -410,7 +416,7 @@ class WifiManager: # Note that IP address from Ip4Config may not be propagated immediately and could take until the next scan results self._update_networks() - wifi_state = replace(self._wifi_state, status=ConnectStatus.CONNECTED) + wifi_state = replace(self._wifi_state, prev_ssid=None, status=ConnectStatus.CONNECTED) conn_path, _ = self._get_active_wifi_connection(self._conn_monitor) if conn_path is None: