fix(network): better handle disconnect

This commit is contained in:
Ashley Wulber 2023-07-10 17:21:55 -04:00 committed by Ashley Wulber
parent 0b0a30898d
commit fad3b097d9
2 changed files with 41 additions and 25 deletions

View file

@ -257,23 +257,21 @@ impl Application for CosmicNetworkApplet {
success, success,
req, req,
} => { } => {
if success { if let NetworkManagerRequest::SelectAccessPoint(ssid)
match req { | NetworkManagerRequest::Password(ssid, _)
NetworkManagerRequest::SelectAccessPoint(ssid) | NetworkManagerRequest::Disconnect(ssid) = &req
| NetworkManagerRequest::Password(ssid, _) => { {
if self if self
.new_connection .new_connection
.as_ref() .as_ref()
.map(|c| c.ssid() == ssid) .map(|c| c.ssid() == ssid)
.unwrap_or_default() .unwrap_or_default()
{ {
self.new_connection.take(); self.new_connection = None;
}
}
_ => {
self.update_togglers(&state);
}
} }
}
if success {
self.update_togglers(&state);
} else { } else {
match req { match req {
NetworkManagerRequest::Password(_, _) => { NetworkManagerRequest::Password(_, _) => {

View file

@ -9,7 +9,11 @@ use std::{collections::HashMap, fmt::Debug, hash::Hash, ops::Deref, time::Durati
use cosmic::iced::{self, subscription}; use cosmic::iced::{self, subscription};
use cosmic_dbus_networkmanager::{ use cosmic_dbus_networkmanager::{
device::SpecificDevice, device::SpecificDevice,
interface::{active_connection::ActiveConnectionProxy, enums, enums::DeviceType}, interface::{
active_connection::ActiveConnectionProxy,
enums::DeviceType,
enums::{self, ActiveConnectionState},
},
nm::NetworkManager, nm::NetworkManager,
settings::{connection::Settings, NetworkManagerSettings}, settings::{connection::Settings, NetworkManagerSettings},
}; };
@ -28,10 +32,6 @@ use self::{
current_networks::{active_connections, ActiveConnectionInfo}, current_networks::{active_connections, ActiveConnectionInfo},
}; };
// TODO subscription for wifi list & selection of wifi
// TODO subscription & channel for enabling / disabling wifi
// TODO subscription for displaying active connections & devices
pub fn network_manager_subscription<I: 'static + Hash + Copy + Send + Sync + Debug>( pub fn network_manager_subscription<I: 'static + Hash + Copy + Send + Sync + Debug>(
id: I, id: I,
) -> iced::Subscription<(I, NetworkManagerEvent)> { ) -> iced::Subscription<(I, NetworkManagerEvent)> {
@ -102,9 +102,30 @@ async fn start_listening<I: Copy + Debug>(
if c.id().await.unwrap_or_default() == ssid { if c.id().await.unwrap_or_default() == ssid {
if let Ok(_) = network_manager.deactivate_connection(&c).await { if let Ok(_) = network_manager.deactivate_connection(&c).await {
success = true; success = true;
if let Ok(ActiveConnectionState::Deactivated) = c.state().await {
break;
} else {
let mut changed = c.receive_state_changed().await;
_ = tokio::time::timeout(Duration::from_secs(5), async move {
loop {
if let Some(next) = changed.next().await {
if let Ok(ActiveConnectionState::Deactivated) = next
.get()
.await
.map(|p| ActiveConnectionState::from(p))
{
break;
}
}
}
})
.await;
}
break;
} }
} }
} }
( (
Some(( Some((
id, id,
@ -539,7 +560,6 @@ impl NetworkManagerState {
pub async fn new(conn: &Connection) -> anyhow::Result<Self> { pub async fn new(conn: &Connection) -> anyhow::Result<Self> {
let network_manager = NetworkManager::new(&conn).await?; let network_manager = NetworkManager::new(&conn).await?;
let mut _self = Self::default(); let mut _self = Self::default();
// airplane mode // airplane mode
let airplaine_mode = Command::new("rfkill") let airplaine_mode = Command::new("rfkill")
.arg("list") .arg("list")
@ -557,9 +577,8 @@ impl NetworkManagerState {
}; };
let s = NetworkManagerSettings::new(&conn).await?; let s = NetworkManagerSettings::new(&conn).await?;
_ = s.load_connections(&[]).await;
let known_conns = s.list_connections().await.unwrap_or_default(); let known_conns = s.list_connections().await.unwrap_or_default();
let mut active_conns = active_connections( let mut active_conns = active_connections(
network_manager network_manager
.active_connections() .active_connections()
@ -617,7 +636,6 @@ impl NetworkManagerState {
.cloned() .cloned()
.collect(); .collect();
wireless_access_points.sort_by(|a, b| b.strength.cmp(&a.strength)); wireless_access_points.sort_by(|a, b| b.strength.cmp(&a.strength));
_self.wireless_access_points = wireless_access_points; _self.wireless_access_points = wireless_access_points;
_self.active_conns = active_conns; _self.active_conns = active_conns;
_self.known_access_points = known_access_points; _self.known_access_points = known_access_points;