diff --git a/cosmic-applet-network/src/app.rs b/cosmic-applet-network/src/app.rs index ce8c7434..9e0179aa 100644 --- a/cosmic-applet-network/src/app.rs +++ b/cosmic-applet-network/src/app.rs @@ -34,14 +34,11 @@ use zbus::Connection; use crate::{ config, fl, network_manager::{ - active_conns::active_conns_subscription, - available_wifi::AccessPoint, - current_networks::ActiveConnectionInfo, - devices::devices_subscription, - hw_address::{self, HwAddress}, - network_manager_subscription, - wireless_enabled::wireless_enabled_subscription, - NetworkManagerEvent, NetworkManagerRequest, NetworkManagerState, + active_conns::active_conns_subscription, available_wifi::AccessPoint, + current_networks::ActiveConnectionInfo, devices::devices_subscription, + hw_address::HwAddress, network_manager_subscription, + wireless_enabled::wireless_enabled_subscription, NetworkManagerEvent, + NetworkManagerRequest, NetworkManagerState, }, }; @@ -391,7 +388,7 @@ impl cosmic::Application for CosmicNetworkApplet { access_point, .. }) = self.new_connection.clone() { - if success && ssid == &access_point.ssid && *hw_address == access_point.hw_address{ + if success && ssid == &access_point.ssid && *hw_address == access_point.hw_address { self.new_connection = None; self.show_visible_networks = false; } @@ -429,7 +426,7 @@ impl cosmic::Application for CosmicNetworkApplet { let _ = tx.unbounded_send(NetworkManagerRequest::SelectAccessPoint( access_point.ssid.clone(), - access_point.hw_address.clone(), + access_point.hw_address, )); self.new_connection = Some(NewConnectionState::EnterPassword { @@ -505,7 +502,7 @@ impl cosmic::Application for CosmicNetworkApplet { } else { return Task::none(); }; - let _ = tx.unbounded_send(NetworkManagerRequest::Disconnect(ssid)); + let _ = tx.unbounded_send(NetworkManagerRequest::Disconnect(ssid, hw_address)); } Message::CloseRequested(id) => { self.hw_device_to_show = None; @@ -539,9 +536,7 @@ impl cosmic::Application for CosmicNetworkApplet { tokio::spawn(cosmic::process::spawn(cmd)); } }, - Message::OpenHwDevice(hw_address) => { - self.hw_device_to_show = hw_address; - } + Message::OpenHwDevice(hw_address) => self.hw_device_to_show = hw_address, Message::ResetFailedKnownSsid(ssid, hw_address) => { let ap = if let Some(pos) = self .nm_state @@ -569,7 +564,8 @@ impl cosmic::Application for CosmicNetworkApplet { return Task::none(); }; if let Some(tx) = self.nm_sender.as_ref() { - let _ = tx.unbounded_send(NetworkManagerRequest::Forget(ssid.clone())); + let _ = + tx.unbounded_send(NetworkManagerRequest::Forget(ssid.clone(), hw_address)); self.show_visible_networks = true; return self.update(Message::SelectWirelessAccessPoint(ap)); } @@ -731,7 +727,7 @@ impl cosmic::Application for CosmicNetworkApplet { }; } - let mut content = if let Some(hw_device_to_show) = self.hw_device_to_show.as_ref() { + let mut content = if let Some(hw_device_to_show) = self.hw_device_to_show { column![ vpn_ethernet_col, menu_button(row![ @@ -819,18 +815,31 @@ impl cosmic::Application for CosmicNetworkApplet { for hw_device in wireless_hw_devices { let display_name = hw_device.to_string(); - let btn_content = vec![ - column![ - text::body(display_name), - Column::with_children(vec![text("Adapter").size(10).into()]) - ] - .width(Length::Fill) - .into(), + let is_connected = self + .nm_state + .active_conns + .iter() + .any(|conn| conn.hw_address() == hw_device); + let mut btn_content = vec![column![ + text::body(display_name), + Column::with_children(vec![text("Adapter").size(10).into()]) + ] + .width(Length::Fill) + .into()]; + if is_connected { + btn_content.push( + text::body(fl!("connected")) + .width(Length::Fill) + .align_x(Alignment::End) + .into(), + ); + } + btn_content.push( icon::from_name("go-next-symbolic") .size(16) .symbolic(true) .into(), - ]; + ); content = content.push(Element::from( column![menu_button( Row::with_children(btn_content) @@ -846,8 +855,8 @@ impl cosmic::Application for CosmicNetworkApplet { } for known in &self.nm_state.known_access_points { - if let Some(filter_hw_address) = self.hw_device_to_show.as_ref() { - if filter_hw_address != &known.hw_address { + if let Some(filter_hw_address) = self.hw_device_to_show { + if filter_hw_address != known.hw_address { continue; } } @@ -909,7 +918,7 @@ impl cosmic::Application for CosmicNetworkApplet { | DeviceState::Disconnected | DeviceState::NeedAuth => btn.on_press(Message::ActivateKnownWifi( known.ssid.clone(), - known.hw_address.clone(), + known.hw_address, )), DeviceState::Activated => { btn.on_press(Message::Disconnect(known.ssid.clone(), known.hw_address)) @@ -941,7 +950,7 @@ impl cosmic::Application for CosmicNetworkApplet { .on_press(Message::ToggleVisibleNetworks); content = content.push(available_connections_btn); - if self.show_visible_networks { + if !self.show_visible_networks { return self.view_window_return(content); } @@ -1052,14 +1061,6 @@ impl cosmic::Application for CosmicNetworkApplet { { continue; } - if self - .nm_state - .known_access_points - .iter() - .any(|a| ap.ssid == a.ssid && ap.hw_address == a.hw_address) - { - continue; - } let button = menu_button( row![ icon::from_name(wifi_icon(ap.strength)) diff --git a/cosmic-applet-network/src/network_manager/mod.rs b/cosmic-applet-network/src/network_manager/mod.rs index 3f61f850..a6d9d0a6 100644 --- a/cosmic-applet-network/src/network_manager/mod.rs +++ b/cosmic-applet-network/src/network_manager/mod.rs @@ -93,14 +93,26 @@ async fn start_listening( }; match rx.next().await { - Some(NetworkManagerRequest::Disconnect(ssid)) => { + Some(NetworkManagerRequest::Disconnect(ssid, hw_address)) => { let mut success = false; for c in network_manager .active_connections() .await .unwrap_or_default() { - if c.id().await.unwrap_or_default() == ssid + if c.id().await.unwrap_or_default() != ssid { + continue; + } + let mut is_there_device = false; + for device in c.devices().await.unwrap_or_default() { + if HwAddress::from_string(device.hw_address().await.as_ref().unwrap()) + == Some(hw_address) + { + is_there_device = true; + } + } + + if is_there_device && network_manager.deactivate_connection(&c).await.is_ok() { success = true; @@ -126,7 +138,7 @@ async fn start_listening( } _ = output .send(NetworkManagerEvent::RequestResponse { - req: NetworkManagerRequest::Disconnect(ssid.clone()), + req: NetworkManagerRequest::Disconnect(ssid.clone(), hw_address), success, state: NetworkManagerState::new(&conn).await.unwrap_or_default(), }) @@ -232,7 +244,7 @@ async fn start_listening( }) .await; } - Some(NetworkManagerRequest::Forget(ssid)) => { + Some(NetworkManagerRequest::Forget(ssid, hw_address)) => { let s = NetworkManagerSettings::new(&conn).await.unwrap(); let known_conns = s.list_connections().await.unwrap_or_default(); let mut success = false; @@ -245,6 +257,7 @@ async fn start_listening( .and_then(|ssid| String::from_utf8(ssid).ok()) .is_some_and(|s| s == ssid) { + // todo most likely we can here forget ssid from wrong hw_address _ = c.delete().await; success = true; break; @@ -253,7 +266,7 @@ async fn start_listening( let state = NetworkManagerState::new(&conn).await.unwrap_or_default(); _ = output .send(NetworkManagerEvent::RequestResponse { - req: NetworkManagerRequest::Forget(ssid.clone()), + req: NetworkManagerRequest::Forget(ssid.clone(), hw_address), success, state, }) @@ -275,9 +288,9 @@ pub enum NetworkManagerRequest { SetAirplaneMode(bool), SetWiFi(bool), SelectAccessPoint(String, HwAddress), - Disconnect(String), + Disconnect(String, HwAddress), Password(String, String, HwAddress), - Forget(String), + Forget(String, HwAddress), Reload, } @@ -426,7 +439,7 @@ impl NetworkManagerState { if self .wireless_access_points .iter() - .any(|w| Ok(Some(w.ssid.clone())) == c.cached_id()) + .any(|w| Ok(Some(w.ssid.clone())) == c.cached_id() && w.hw_address == hw_address) { _ = nm.deactivate_connection(&c).await; } @@ -466,6 +479,18 @@ impl NetworkManagerState { let devices = nm.devices().await?; for device in devices { + let device_hw_address = device.hw_address().await; + if device_hw_address.is_err() { + continue; + } + let device_hw_address = HwAddress::from_string(&device_hw_address.unwrap()); + if device_hw_address.is_none() { + continue; + } + let device_hw_address = device_hw_address.unwrap(); + if device_hw_address != hw_address { + continue; + } if !matches!( device.device_type().await.unwrap_or(DeviceType::Other), DeviceType::Wifi @@ -480,19 +505,14 @@ impl NetworkManagerState { let settings = c.get_settings().await.ok().unwrap_or_default(); let s = Settings::new(settings); - let cur_hw_address = s - .wifi - .as_ref() - .and_then(|w| w.assigned_mac_address.as_ref()) - .and_then(|mac| HwAddress::from_string(&mac)); - // s.wifi.clone(). + // todo try to add hw_address comparing here if it changes anything if let Some(cur_ssid) = s .wifi .clone() .and_then(|w| w.ssid) .and_then(|ssid| String::from_utf8(ssid).ok()) { - if cur_ssid == ssid && hw_address == cur_hw_address.unwrap_or_default() { + if cur_ssid == ssid { known_conn = Some(c); break; }