184 lines
6.3 KiB
Diff
184 lines
6.3 KiB
Diff
|
|
From 2bae469f6fdd42c15d574a0d4642d13a2fcf3d8b Mon Sep 17 00:00:00 2001
|
|||
|
|
From: luoqing <luoqing@kylinsec.com.cn>
|
|||
|
|
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 <QMenu>
|
|||
|
|
#include <QPainter>
|
|||
|
|
#include <QPainterPath>
|
|||
|
|
+#include <QTcpSocket>
|
|||
|
|
+#include <QTimer>
|
|||
|
|
#include <QVBoxLayout>
|
|||
|
|
#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 <QTcpSocket>
|
|||
|
|
-#include <QTimer>
|
|||
|
|
-#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<uint> 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<uint> 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
|
|||
|
|
|