diff --git a/libnymea-app/configuration/networkmanager.cpp b/libnymea-app/configuration/networkmanager.cpp index 52cd7121..2a1eb9d8 100644 --- a/libnymea-app/configuration/networkmanager.cpp +++ b/libnymea-app/configuration/networkmanager.cpp @@ -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 ¶ms) { -// 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 ¶ms) 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 ¶ms) 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); } diff --git a/libnymea-app/configuration/networkmanager.h b/libnymea-app/configuration/networkmanager.h index 907d3b4c..3b06bad3 100644 --- a/libnymea-app/configuration/networkmanager.h +++ b/libnymea-app/configuration/networkmanager.h @@ -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; diff --git a/libnymea-app/types/wirelessaccesspoint.cpp b/libnymea-app/types/wirelessaccesspoint.cpp index c55860ab..920ee98d 100644 --- a/libnymea-app/types/wirelessaccesspoint.cpp +++ b/libnymea-app/types/wirelessaccesspoint.cpp @@ -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(); + } +} diff --git a/libnymea-app/types/wirelessaccesspoint.h b/libnymea-app/types/wirelessaccesspoint.h index da2f2d94..cd49f64e 100644 --- a/libnymea-app/types/wirelessaccesspoint.h +++ b/libnymea-app/types/wirelessaccesspoint.h @@ -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 diff --git a/libnymea-app/types/wirelessaccesspoints.cpp b/libnymea-app/types/wirelessaccesspoints.cpp index 498d77a2..c98bab9e 100644 --- a/libnymea-app/types/wirelessaccesspoints.cpp +++ b/libnymea-app/types/wirelessaccesspoints.cpp @@ -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 WirelessAccessPoints::roleNames() const roles[WirelessAccesspointRoleHostAddress] = "hostAddress"; roles[WirelessAccesspointRoleSignalStrength] = "signalStrength"; roles[WirelessAccesspointRoleProtected] = "protected"; + roles[WirelessAccessPointRoleFrequency] = "frequency"; return roles; } diff --git a/libnymea-app/types/wirelessaccesspoints.h b/libnymea-app/types/wirelessaccesspoints.h index b06e7e37..0ecf96d8 100644 --- a/libnymea-app/types/wirelessaccesspoints.h +++ b/libnymea-app/types/wirelessaccesspoints.h @@ -47,7 +47,8 @@ public: WirelessAccesspointRoleMacAddress, WirelessAccesspointRoleHostAddress, WirelessAccesspointRoleSignalStrength, - WirelessAccesspointRoleProtected + WirelessAccesspointRoleProtected, + WirelessAccessPointRoleFrequency }; explicit WirelessAccessPoints(QObject *parent = nullptr); diff --git a/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml b/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml index 68e6a0d2..8255df69 100644 --- a/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml +++ b/nymea-app/ui/connection/wifisetup/ConnectWiFiPage.qml @@ -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 diff --git a/nymea-app/ui/system/NetworkSettingsPage.qml b/nymea-app/ui/system/NetworkSettingsPage.qml index 75d17c27..fff94ebd 100644 --- a/nymea-app/ui/system/NetworkSettingsPage.qml +++ b/nymea-app/ui/system/NetworkSettingsPage.qml @@ -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); } } - } } }