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;
}
bool NetworkManager::loading()
{
return m_loading;
}
QString NetworkManager::nameSpace() const
{
return "NetworkManager";
@ -90,10 +95,18 @@ void NetworkManager::init()
return;
}
m_loading = true;
emit loadingChanged();
m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkStatus", QVariantMap(), this, "getStatusReply");
m_engine->jsonRpcClient()->sendCommand("NetworkManager.GetNetworkDevices", QVariantMap(), this, "getDevicesReply");
}
bool NetworkManager::available() const
{
return m_available;
}
NetworkManager::NetworkManagerState NetworkManager::state() const
{
return m_state;
@ -159,7 +172,18 @@ void NetworkManager::disconnectInterface(const QString &interface)
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();
@ -207,6 +231,7 @@ void NetworkManager::getDevicesReply(const QVariantMap &params)
device->currentAccessPoint()->setMacAddress(currentApMap.value("macAddress").toString());
device->currentAccessPoint()->setProtected(currentApMap.value("protected").toBool());
device->currentAccessPoint()->setSignalStrength(currentApMap.value("signalStrength").toInt());
device->currentAccessPoint()->setFrequency(currentApMap.value("frequency").toDouble());
m_wirelessNetworkDevices->addNetworkDevice(device);
}
}
@ -237,6 +262,7 @@ void NetworkManager::getAccessPointsReply(const QVariantMap &params)
ap->setSsid(apMap.value("ssid").toString());
ap->setProtected(apMap.value("protected").toBool());
ap->setSignalStrength(apMap.value("signalStrength").toInt());
ap->setFrequency(apMap.value("frequency").toDouble());
dev->accessPoints()->addWirelessAccessPoint(ap);
}

View File

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

View File

@ -85,7 +85,7 @@ int WirelessAccessPoint::signalStrength() const
return m_signalStrength;
}
void WirelessAccessPoint::setSignalStrength(const int &signalStrength)
void WirelessAccessPoint::setSignalStrength(int signalStrength)
{
if (m_signalStrength == signalStrength)
return;
@ -99,7 +99,7 @@ bool WirelessAccessPoint::isProtected() const
return m_isProtected;
}
void WirelessAccessPoint::setProtected(const bool &isProtected)
void WirelessAccessPoint::setProtected(bool isProtected)
{
if (m_isProtected == isProtected)
return;
@ -108,3 +108,16 @@ void WirelessAccessPoint::setProtected(const bool &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(int signalStrength READ signalStrength NOTIFY signalStrengthChanged)
Q_PROPERTY(bool isProtected READ isProtected NOTIFY isProtectedChanged)
Q_PROPERTY(double frequency READ frequency NOTIFY frequencyChanged)
public:
WirelessAccessPoint(QObject *parent = nullptr);
@ -56,17 +57,13 @@ public:
void setHostAddress(const QString &hostAddress);
int signalStrength() const;
void setSignalStrength(const int &signalStrength);
void setSignalStrength(int signalStrength);
bool isProtected() const;
void setProtected(const bool &isProtected);
void setProtected(bool isProtected);
private:
QString m_ssid;
QString m_macAddress;
QString m_hostAddress;
int m_signalStrength = 0;
bool m_isProtected = false;
double frequency() const;
void setFrequency(double frequency);
signals:
void ssidChanged(const QString &ssid);
@ -74,6 +71,15 @@ signals:
void hostAddressChanged(const QString &hostAddress);
void signalStrengthChanged(int signalStrength);
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

View File

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

View File

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

View File

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

View File

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