From 2bae469f6fdd42c15d574a0d4642d13a2fcf3d8b Mon Sep 17 00:00:00 2001 From: luoqing Date: Thu, 4 Jan 2024 11:17:57 +0800 Subject: [PATCH 06/17] fix(network):fixd an issue where the network tray icon was incorrectly displayed when there was no primary connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复当没有主连接时,网络托盘图标显示不准确的问题 Closes #25475, #25037, #25032 --- plugins/network/src/general.h | 1 + plugins/network/src/tray/network-tray.cpp | 90 +++++++++++++++++------ 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/plugins/network/src/general.h b/plugins/network/src/general.h index 8aa4f67..c65ce78 100644 --- a/plugins/network/src/general.h +++ b/plugins/network/src/general.h @@ -24,6 +24,7 @@ enum NetworkState { + UNKNOWN, WIRED_CONNECTED, WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET, WIRELESS_CONNECTED, diff --git a/plugins/network/src/tray/network-tray.cpp b/plugins/network/src/tray/network-tray.cpp index 00b6685..db6e0cd 100644 --- a/plugins/network/src/tray/network-tray.cpp +++ b/plugins/network/src/tray/network-tray.cpp @@ -20,17 +20,17 @@ #include #include #include +#include +#include #include #include "config.h" +#include "logging-category.h" #include "status-notification.h" #include "status-notifier-manager.h" #include "tray-page.h" #include "utils.h" #include "wired-tray-widget.h" #include "wireless-tray-widget.h" -#include -#include -#include "logging-category.h" using namespace NetworkManager; @@ -359,42 +359,70 @@ void NetworkTray::getTrayGeometry() void NetworkTray::updateTrayIcon() { auto status = NetworkManager::status(); - if (status != NetworkManager::Status::Connected) + if (status < NetworkManager::Status::ConnectedLinkLocal) { setTrayIcon(DISCONNECTED); return; } +#define SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state) \ + if (state != UNKNOWN) \ + { \ + setTrayIcon(state); \ + checkInternetConnectivity(); \ + return; \ + } + + NetworkState state = UNKNOWN; // 判断主连接类型,托盘网络图标以主连接类型为准 // NetworkManager::primaryConnectionType() 更新不及时,暂时不用 + /** + * NOTE: + * 注意特殊情况,如果当网络状态为已连接,但是没有主连接,则遍历所有已激活的连接, + * 按有线优先于无线的原则,如果存在激活的有线连接,则显示有线网络图标;其次显示无线网络图标 + * 如果既不是有线也不是无线,则显示有线网络图标 + */ ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); - if (primaryActiveConnection.isNull()) + if (!primaryActiveConnection.isNull()) { - KLOG_INFO(qLcNetwork) << "update tray icon failed, primary active connection is null"; - return; + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) + { + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; + } + else + { + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; + } } + SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); - // NetworkManager::connectivity() 不准确,使用checkConnectivity - QDBusPendingReply reply = NetworkManager::checkConnectivity(); - reply.waitForFinished(); - uint result = reply.value(); - - if (result == NetworkManager::Connectivity::Full) + KLOG_INFO(qLcNetwork) << "primary active connection is null"; + ActiveConnection::List list = activeConnections(); + for (auto connection : list) { - checkInternetConnectivity(); - return; + if (connection->type() == ConnectionSettings::ConnectionType::Wired) + { + state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; + break; + } } + SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); - NetworkState state; - if (primaryActiveConnection->type() == ConnectionSettings::Wireless) + for (auto connection : list) { - state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; + if (connection->type() == ConnectionSettings::ConnectionType::Wireless) + { + state = WIRELESS_CONNECTED_BUT_NOT_ACCESS_INTERNET; + break; + } } - else + + //最后如果既不是有线也不是无线,则显示有线网络图标 + if (state == UNKNOWN) { state = WIRED_CONNECTED_BUT_NOT_ACCESS_INTERNET; } - setTrayIcon(state); + SET_TRAY_ICON_AND_CHECK_CONNECTIVITY_AND_RETURN(state); } void NetworkTray::setTrayIcon(NetworkState state) @@ -712,6 +740,15 @@ void NetworkTray::initTcpSocket() void NetworkTray::checkInternetConnectivity() { + // NetworkManager::connectivity() 不准确,使用checkConnectivity + QDBusPendingReply reply = NetworkManager::checkConnectivity(); + reply.waitForFinished(); + uint result = reply.value(); + if (result != NetworkManager::Connectivity::Full) + { + return; + } + QSettings confSettings(SETTINGS_PATH, QSettings::NativeFormat); QVariant enable = confSettings.value(QString("Network/CheckInternetConnectivity")); KLOG_DEBUG(qLcNetwork) << "check Internet Connectivity : " << enable; @@ -728,11 +765,18 @@ void NetworkTray::checkInternetConnectivity() void NetworkTray::internetConnected() { KLOG_DEBUG(qLcNetwork) << "Connectivity check pass"; - ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); NetworkState state; - if (primaryActiveConnection->type() == ConnectionSettings::Wireless) + ActiveConnection::Ptr primaryActiveConnection = primaryConnection(); + if (!primaryActiveConnection.isNull()) { - state = WIRELESS_CONNECTED; + if (primaryActiveConnection->type() == ConnectionSettings::Wireless) + { + state = WIRELESS_CONNECTED; + } + else + { + state = WIRED_CONNECTED; + } } else { -- 2.33.0