From fad3b097d95f2b95c1dc601f05dc6c8390bc4f0f Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 10 Jul 2023 17:21:55 -0400 Subject: [PATCH] fix(network): better handle disconnect --- cosmic-applet-network/src/app.rs | 30 ++++++++-------- .../src/network_manager/mod.rs | 36 ++++++++++++++----- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/cosmic-applet-network/src/app.rs b/cosmic-applet-network/src/app.rs index c44b9c1c..a49de9a5 100644 --- a/cosmic-applet-network/src/app.rs +++ b/cosmic-applet-network/src/app.rs @@ -257,23 +257,21 @@ impl Application for CosmicNetworkApplet { success, req, } => { - if success { - match req { - NetworkManagerRequest::SelectAccessPoint(ssid) - | NetworkManagerRequest::Password(ssid, _) => { - if self - .new_connection - .as_ref() - .map(|c| c.ssid() == ssid) - .unwrap_or_default() - { - self.new_connection.take(); - } - } - _ => { - self.update_togglers(&state); - } + if let NetworkManagerRequest::SelectAccessPoint(ssid) + | NetworkManagerRequest::Password(ssid, _) + | NetworkManagerRequest::Disconnect(ssid) = &req + { + if self + .new_connection + .as_ref() + .map(|c| c.ssid() == ssid) + .unwrap_or_default() + { + self.new_connection = None; } + } + if success { + self.update_togglers(&state); } else { match req { NetworkManagerRequest::Password(_, _) => { diff --git a/cosmic-applet-network/src/network_manager/mod.rs b/cosmic-applet-network/src/network_manager/mod.rs index 4e9fbf84..a4ac7097 100644 --- a/cosmic-applet-network/src/network_manager/mod.rs +++ b/cosmic-applet-network/src/network_manager/mod.rs @@ -9,7 +9,11 @@ use std::{collections::HashMap, fmt::Debug, hash::Hash, ops::Deref, time::Durati use cosmic::iced::{self, subscription}; use cosmic_dbus_networkmanager::{ device::SpecificDevice, - interface::{active_connection::ActiveConnectionProxy, enums, enums::DeviceType}, + interface::{ + active_connection::ActiveConnectionProxy, + enums::DeviceType, + enums::{self, ActiveConnectionState}, + }, nm::NetworkManager, settings::{connection::Settings, NetworkManagerSettings}, }; @@ -28,10 +32,6 @@ use self::{ 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( id: I, ) -> iced::Subscription<(I, NetworkManagerEvent)> { @@ -102,9 +102,30 @@ async fn start_listening( if c.id().await.unwrap_or_default() == ssid { if let Ok(_) = network_manager.deactivate_connection(&c).await { 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(( id, @@ -539,7 +560,6 @@ impl NetworkManagerState { pub async fn new(conn: &Connection) -> anyhow::Result { let network_manager = NetworkManager::new(&conn).await?; let mut _self = Self::default(); - // airplane mode let airplaine_mode = Command::new("rfkill") .arg("list") @@ -557,9 +577,8 @@ impl NetworkManagerState { }; let s = NetworkManagerSettings::new(&conn).await?; - + _ = s.load_connections(&[]).await; let known_conns = s.list_connections().await.unwrap_or_default(); - let mut active_conns = active_connections( network_manager .active_connections() @@ -617,7 +636,6 @@ impl NetworkManagerState { .cloned() .collect(); wireless_access_points.sort_by(|a, b| b.strength.cmp(&a.strength)); - _self.wireless_access_points = wireless_access_points; _self.active_conns = active_conns; _self.known_access_points = known_access_points;