kiran-control-panel/0006-fix-network-fixd-an-issue-where-the-network-tray-ico.patch
2024-01-18 15:25:01 +08:00

184 lines
6.3 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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