Improve network settings

This commit is contained in:
Michael Zanetti 2020-04-21 23:11:53 +02:00
parent 2cedf36d52
commit 7505e986cb
8 changed files with 116 additions and 25 deletions

View File

@ -75,6 +75,11 @@ Engine *NetworkManager::engine() const
return m_engine; return m_engine;
} }
bool NetworkManager::loading()
{
return m_loading;
}
QString NetworkManager::nameSpace() const QString NetworkManager::nameSpace() const
{ {
return "NetworkManager"; return "NetworkManager";
@ -90,10 +95,18 @@ void NetworkManager::init()
return; return;
} }
m_loading = true;
emit loadingChanged();
m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkStatus", QVariantMap(), this, "getStatusReply"); m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkStatus", QVariantMap(), this, "getStatusReply");
m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkDevices", QVariantMap(), this, "getDevicesReply"); m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkDevices", QVariantMap(), this, "getDevicesReply");
} }
bool NetworkManager::available() const
{
return m_available;
}
NetworkManager::NetworkManagerState NetworkManager::state() const NetworkManager::NetworkManagerState NetworkManager::state() const
{ {
return m_state; return m_state;
@ -159,7 +172,18 @@ void NetworkManager::disconnectInterface(const QString &interface)
void NetworkManager::getStatusReply(const QVariantMap &params) void NetworkManager::getStatusReply(const QVariantMap &params)
{ {
// qDebug() << "NetworkManager reply" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented)); m_loading = false;
emit loadingChanged();
if (params.value("params").toMap().value("networkManagerError").toString() != "NetworkManagerErrorNoError") {
qWarning() << "NetworkManager error:" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented));
m_available = false;
emit availableChanged();
return;
}
m_available = true;
emit availableChanged();
QVariantMap statusMap = params.value("params").toMap().value("status").toMap(); QVariantMap statusMap = params.value("params").toMap().value("status").toMap();
@ -207,6 +231,7 @@ void NetworkManager::getDevicesReply(const QVariantMap &params)
device->currentAccessPoint()->setMacAddress(currentApMap.value("macAddress").toString()); device->currentAccessPoint()->setMacAddress(currentApMap.value("macAddress").toString());
device->currentAccessPoint()->setProtected(currentApMap.value("protected").toBool()); device->currentAccessPoint()->setProtected(currentApMap.value("protected").toBool());
device->currentAccessPoint()->setSignalStrength(currentApMap.value("signalStrength").toInt()); device->currentAccessPoint()->setSignalStrength(currentApMap.value("signalStrength").toInt());
device->currentAccessPoint()->setFrequency(currentApMap.value("frequency").toDouble());
m_wirelessNetworkDevices->addNetworkDevice(device); m_wirelessNetworkDevices->addNetworkDevice(device);
} }
} }
@ -237,6 +262,7 @@ void NetworkManager::getAccessPointsReply(const QVariantMap &params)
ap->setSsid(apMap.value("ssid").toString()); ap->setSsid(apMap.value("ssid").toString());
ap->setProtected(apMap.value("protected").toBool()); ap->setProtected(apMap.value("protected").toBool());
ap->setSignalStrength(apMap.value("signalStrength").toInt()); ap->setSignalStrength(apMap.value("signalStrength").toInt());
ap->setFrequency(apMap.value("frequency").toDouble());
dev->accessPoints()->addWirelessAccessPoint(ap); dev->accessPoints()->addWirelessAccessPoint(ap);
} }

View File

@ -46,6 +46,9 @@ class NetworkManager : public JsonHandler
Q_OBJECT Q_OBJECT
Q_PROPERTY(Engine *engine READ engine WRITE setEngine NOTIFY engineChanged) Q_PROPERTY(Engine *engine READ engine WRITE setEngine NOTIFY engineChanged)
Q_PROPERTY(bool loading READ loading NOTIFY loadingChanged)
Q_PROPERTY(bool available READ available NOTIFY availableChanged)
Q_PROPERTY(NetworkManagerState state READ state NOTIFY stateChanged) Q_PROPERTY(NetworkManagerState state READ state NOTIFY stateChanged)
Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged) Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged)
Q_PROPERTY(bool wirelessNetworkingEnabled READ wirelessNetworkingEnabled NOTIFY wirelessNetworkingEnabledChanged) Q_PROPERTY(bool wirelessNetworkingEnabled READ wirelessNetworkingEnabled NOTIFY wirelessNetworkingEnabledChanged)
@ -72,8 +75,11 @@ public:
void setEngine(Engine *engine); void setEngine(Engine *engine);
Engine *engine() const; Engine *engine() const;
bool loading();
QString nameSpace() const override; QString nameSpace() const override;
bool available() const;
NetworkManagerState state() const; NetworkManagerState state() const;
bool networkingEnabled() const; bool networkingEnabled() const;
bool wirelessNetworkingEnabled() const; bool wirelessNetworkingEnabled() const;
@ -103,13 +109,16 @@ private slots:
signals: signals:
void engineChanged(); void engineChanged();
void loadingChanged();
void availableChanged();
void stateChanged(); void stateChanged();
void networkingEnabledChanged(); void networkingEnabledChanged();
void wirelessNetworkingEnabledChanged(); void wirelessNetworkingEnabledChanged();
private: private:
Engine *m_engine = nullptr; Engine *m_engine = nullptr;
bool m_loading = false;
bool m_available = false;
NetworkManagerState m_state = NetworkManagerStateUnknown; NetworkManagerState m_state = NetworkManagerStateUnknown;
bool m_networkingEnabled = false; bool m_networkingEnabled = false;
bool m_wirelessNetworkingEnabled = false; bool m_wirelessNetworkingEnabled = false;

View File

@ -85,7 +85,7 @@ int WirelessAccessPoint::signalStrength() const
return m_signalStrength; return m_signalStrength;
} }
void WirelessAccessPoint::setSignalStrength(const int &signalStrength) void WirelessAccessPoint::setSignalStrength(int signalStrength)
{ {
if (m_signalStrength == signalStrength) if (m_signalStrength == signalStrength)
return; return;
@ -99,7 +99,7 @@ bool WirelessAccessPoint::isProtected() const
return m_isProtected; return m_isProtected;
} }
void WirelessAccessPoint::setProtected(const bool &isProtected) void WirelessAccessPoint::setProtected(bool isProtected)
{ {
if (m_isProtected == isProtected) if (m_isProtected == isProtected)
return; return;
@ -108,3 +108,16 @@ void WirelessAccessPoint::setProtected(const bool &isProtected)
emit isProtectedChanged(m_isProtected); emit isProtectedChanged(m_isProtected);
} }
double WirelessAccessPoint::frequency() const
{
return m_frequency;
}
void WirelessAccessPoint::setFrequency(double frequency)
{
if (!qFuzzyCompare(m_frequency,frequency)) {
m_frequency = frequency;
emit frequencyChanged();
}
}

View File

@ -42,6 +42,7 @@ class WirelessAccessPoint : public QObject
Q_PROPERTY(QString hostAddress READ hostAddress NOTIFY hostAddressChanged) Q_PROPERTY(QString hostAddress READ hostAddress NOTIFY hostAddressChanged)
Q_PROPERTY(int signalStrength READ signalStrength NOTIFY signalStrengthChanged) Q_PROPERTY(int signalStrength READ signalStrength NOTIFY signalStrengthChanged)
Q_PROPERTY(bool isProtected READ isProtected NOTIFY isProtectedChanged) Q_PROPERTY(bool isProtected READ isProtected NOTIFY isProtectedChanged)
Q_PROPERTY(double frequency READ frequency NOTIFY frequencyChanged)
public: public:
WirelessAccessPoint(QObject *parent = nullptr); WirelessAccessPoint(QObject *parent = nullptr);
@ -56,17 +57,13 @@ public:
void setHostAddress(const QString &hostAddress); void setHostAddress(const QString &hostAddress);
int signalStrength() const; int signalStrength() const;
void setSignalStrength(const int &signalStrength); void setSignalStrength(int signalStrength);
bool isProtected() const; bool isProtected() const;
void setProtected(const bool &isProtected); void setProtected(bool isProtected);
private: double frequency() const;
QString m_ssid; void setFrequency(double frequency);
QString m_macAddress;
QString m_hostAddress;
int m_signalStrength = 0;
bool m_isProtected = false;
signals: signals:
void ssidChanged(const QString &ssid); void ssidChanged(const QString &ssid);
@ -74,6 +71,15 @@ signals:
void hostAddressChanged(const QString &hostAddress); void hostAddressChanged(const QString &hostAddress);
void signalStrengthChanged(int signalStrength); void signalStrengthChanged(int signalStrength);
void isProtectedChanged(bool isProtected); void isProtectedChanged(bool isProtected);
void frequencyChanged();
private:
QString m_ssid;
QString m_macAddress;
QString m_hostAddress;
int m_signalStrength = 0;
bool m_isProtected = false;
double m_frequency = 0;
}; };
#endif // WIRELESSACCESSPOINT_H #endif // WIRELESSACCESSPOINT_H

View File

@ -69,16 +69,19 @@ QVariant WirelessAccessPoints::data(const QModelIndex &index, int role) const
return QVariant(); return QVariant();
WirelessAccessPoint *accessPoint = m_wirelessAccessPoints.at(index.row()); WirelessAccessPoint *accessPoint = m_wirelessAccessPoints.at(index.row());
if (role == WirelessAccesspointRoleSsid) { switch (role) {
case WirelessAccesspointRoleSsid:
return accessPoint->ssid(); return accessPoint->ssid();
} else if (role == WirelessAccesspointRoleMacAddress) { case WirelessAccesspointRoleMacAddress:
return accessPoint->macAddress(); return accessPoint->macAddress();
} else if (role == WirelessAccesspointRoleHostAddress) { case WirelessAccesspointRoleHostAddress:
return accessPoint->hostAddress(); return accessPoint->hostAddress();
} else if (role == WirelessAccesspointRoleSignalStrength) { case WirelessAccesspointRoleSignalStrength:
return accessPoint->signalStrength(); return accessPoint->signalStrength();
} else if (role == WirelessAccesspointRoleProtected) { case WirelessAccesspointRoleProtected:
return accessPoint->isProtected(); return accessPoint->isProtected();
case WirelessAccessPointRoleFrequency:
return accessPoint->frequency();
} }
return QVariant(); return QVariant();
@ -159,6 +162,7 @@ QHash<int, QByteArray> WirelessAccessPoints::roleNames() const
roles[WirelessAccesspointRoleHostAddress] = "hostAddress"; roles[WirelessAccesspointRoleHostAddress] = "hostAddress";
roles[WirelessAccesspointRoleSignalStrength] = "signalStrength"; roles[WirelessAccesspointRoleSignalStrength] = "signalStrength";
roles[WirelessAccesspointRoleProtected] = "protected"; roles[WirelessAccesspointRoleProtected] = "protected";
roles[WirelessAccessPointRoleFrequency] = "frequency";
return roles; return roles;
} }

View File

@ -47,7 +47,8 @@ public:
WirelessAccesspointRoleMacAddress, WirelessAccesspointRoleMacAddress,
WirelessAccesspointRoleHostAddress, WirelessAccesspointRoleHostAddress,
WirelessAccesspointRoleSignalStrength, WirelessAccesspointRoleSignalStrength,
WirelessAccesspointRoleProtected WirelessAccesspointRoleProtected,
WirelessAccessPointRoleFrequency
}; };
explicit WirelessAccessPoints(QObject *parent = nullptr); explicit WirelessAccessPoints(QObject *parent = nullptr);

View File

@ -75,7 +75,7 @@ Page {
delegate: NymeaListItemDelegate { delegate: NymeaListItemDelegate {
width: parent.width width: parent.width
text: model.ssid text: model.ssid !== "" ? model.ssid : qsTr("Hidden Network")
enabled: !networkManagerController.manager.working enabled: !networkManagerController.manager.working
subText: model.hostAddress subText: model.hostAddress

View File

@ -38,6 +38,7 @@ import "../components"
SettingsPageBase { SettingsPageBase {
id: root id: root
title: qsTr("Network settings") title: qsTr("Network settings")
busy: networkManager.loading
NetworkManager { NetworkManager {
id: networkManager id: networkManager
@ -75,14 +76,33 @@ SettingsPageBase {
} }
} }
RowLayout {
Layout.topMargin: app.margins * 6
visible: !networkManager.available
spacing: app.margins
ColorIcon {
Layout.preferredHeight: app.iconSize
Layout.preferredWidth: app.iconSize
name: "../images/network-wired-offline.svg"
}
Label {
Layout.fillWidth: true
wrapMode: Text.WordWrap
text: qsTr("Network management is unavailable on this system.")
}
}
SettingsPageSectionHeader { SettingsPageSectionHeader {
text: qsTr("General") text: qsTr("General")
visible: networkManager.available
} }
NymeaListItemDelegate { NymeaListItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Current connection state") text: qsTr("Current connection state")
prominentSubText: false prominentSubText: false
visible: networkManager.available
subText: { subText: {
switch (networkManager.state) { switch (networkManager.state) {
case NetworkManager.NetworkManagerStateUnknown: case NetworkManager.NetworkManagerStateUnknown:
@ -133,6 +153,7 @@ SettingsPageBase {
subText: qsTr("Enable or disable networking altogether") subText: qsTr("Enable or disable networking altogether")
prominentSubText: false prominentSubText: false
progressive: false progressive: false
visible: networkManager.available
additionalItem: Switch { additionalItem: Switch {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
checked: networkManager.networkingEnabled checked: networkManager.networkingEnabled
@ -165,6 +186,7 @@ SettingsPageBase {
SettingsPageSectionHeader { SettingsPageSectionHeader {
text: qsTr("Wired network") text: qsTr("Wired network")
visible: networkManager.available
} }
Label { Label {
@ -173,15 +195,17 @@ SettingsPageBase {
Layout.rightMargin: app.margins Layout.rightMargin: app.margins
text: qsTr("No wired network interfaces available") text: qsTr("No wired network interfaces available")
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
visible: networkManager.wiredNetworkDevices.count == 0 visible: networkManager.available && networkManager.wiredNetworkDevices.count == 0
} }
Repeater { Repeater {
model: networkManager.wiredNetworkDevices model: networkManager.wiredNetworkDevices
NymeaListItemDelegate { NymeaListItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
iconName: model.pluggedIn ? "../images/network-wired.svg" : "../images/network-wired-offline.svg" iconName: model.pluggedIn ? "../images/network-wired.svg" : "../images/network-wired-offline.svg"
text: model.interface + " (" + model.macAddress + ")" text: model.interface + " (" + model.macAddress + ")"
visible: networkManager.available
subText: { subText: {
var ret = model.pluggedIn ? qsTr("Plugged in") : qsTr("Unplugged") var ret = model.pluggedIn ? qsTr("Plugged in") : qsTr("Unplugged")
ret += " - " ret += " - "
@ -194,6 +218,7 @@ SettingsPageBase {
SettingsPageSectionHeader { SettingsPageSectionHeader {
text: qsTr("Wireless network") text: qsTr("Wireless network")
visible: networkManager.available
} }
NymeaListItemDelegate { NymeaListItemDelegate {
@ -205,6 +230,7 @@ SettingsPageBase {
additionalItem: Switch { additionalItem: Switch {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
checked: networkManager.wirelessNetworkingEnabled checked: networkManager.wirelessNetworkingEnabled
visible: networkManager.available
onClicked: { onClicked: {
if (!checked) { if (!checked) {
var dialog = Qt.createComponent(Qt.resolvedUrl("../components/MeaDialog.qml")); var dialog = Qt.createComponent(Qt.resolvedUrl("../components/MeaDialog.qml"));
@ -238,11 +264,12 @@ SettingsPageBase {
Layout.rightMargin: app.margins Layout.rightMargin: app.margins
text: qsTr("No wired network interfaces available") text: qsTr("No wired network interfaces available")
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
visible: networkManager.wirelessNetworkDevices.count == 0 visible: networkManager.available &&networkManager.wirelessNetworkDevices.count == 0
} }
Repeater { Repeater {
model: networkManager.wirelessNetworkDevices model: networkManager.wirelessNetworkDevices
visible: networkManager.available
NymeaListItemDelegate { NymeaListItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
iconName: { iconName: {
@ -304,8 +331,8 @@ SettingsPageBase {
model: apProxy model: apProxy
delegate: NymeaListItemDelegate { delegate: NymeaListItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
text: model.ssid text: model.ssid !== "" ? model.ssid : qsTr("Hidden Network")
subText: model.macAddress subText: "%1 (%2)".arg(model.macAddress).arg(model.frequency < 3 ? "2.4GHz" : "5GHz")
iconName: { iconName: {
var ret = "../images/nm-signal-"; var ret = "../images/nm-signal-";
if (model.signalStrength > 90) { if (model.signalStrength > 90) {
@ -412,7 +439,13 @@ SettingsPageBase {
NymeaListItemDelegate { NymeaListItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Signal strength") text: qsTr("Signal strength")
subText: currentApPage.wirelessNetworkDevice.currentAccessPoint.signalStrength subText: currentApPage.wirelessNetworkDevice.currentAccessPoint.signalStrength + " %"
progressive: false
}
NymeaListItemDelegate {
Layout.fillWidth: true
text: qsTr("WiFi frequency")
subText: currentApPage.wirelessNetworkDevice.currentAccessPoint.frequency + " GHz"
progressive: false progressive: false
} }
@ -425,7 +458,6 @@ SettingsPageBase {
pageStack.pop(root); pageStack.pop(root);
} }
} }
} }
} }
} }