diff --git a/applet/contents/ui/Toolbar.qml b/applet/contents/ui/Toolbar.qml --- a/applet/contents/ui/Toolbar.qml +++ b/applet/contents/ui/Toolbar.qml @@ -94,21 +94,29 @@ SwitchButton { id: planeModeSwitchButton + property bool initialized: false property bool airplaneModeEnabled: false checked: airplaneModeEnabled tooltip: i18n("Enable airplane mode") icon: airplaneModeEnabled ? "network-flightmode-on" : "network-flightmode-off" + visible: availableDevices.modemDeviceAvailable || availableDevices.wirelessDeviceAvailable onClicked: { handler.enableAirplaneMode(checked); airplaneModeEnabled = !airplaneModeEnabled; } Binding { - target: connectionIconProvider - property: "airplaneMode" + target: configuration + property: "airplaneModeEnabled" value: planeModeSwitchButton.airplaneModeEnabled + when: planeModeSwitchButton.initialized + } + + Component.onCompleted: { + airplaneModeEnabled = configuration.airplaneModeEnabled + initialized = true } } } diff --git a/applet/contents/ui/main.qml b/applet/contents/ui/main.qml --- a/applet/contents/ui/main.qml +++ b/applet/contents/ui/main.qml @@ -84,6 +84,7 @@ } PlasmaNM.Configuration { + id: configuration unlockModemOnDetection: plasmoid.configuration.unlockModemOnDetection manageVirtualConnections: plasmoid.configuration.manageVirtualConnections } diff --git a/libs/configuration.h b/libs/configuration.h --- a/libs/configuration.h +++ b/libs/configuration.h @@ -29,6 +29,8 @@ { Q_PROPERTY(bool unlockModemOnDetection READ unlockModemOnDetection WRITE setUnlockModemOnDetection) Q_PROPERTY(bool manageVirtualConnections READ manageVirtualConnections WRITE setManageVirtualConnections) + Q_PROPERTY(bool airplaneModeEnabled READ airplaneModeEnabled WRITE setAirplaneModeEnabled) + //Readonly constant property, as this value should only be set by the platform Q_PROPERTY(bool showPasswordDialog READ showPasswordDialog CONSTANT) Q_OBJECT @@ -39,6 +41,9 @@ static bool manageVirtualConnections(); static void setManageVirtualConnections(bool manage); + static bool airplaneModeEnabled(); + static void setAirplaneModeEnabled(bool enabled); + static bool showPasswordDialog(); }; diff --git a/libs/configuration.cpp b/libs/configuration.cpp --- a/libs/configuration.cpp +++ b/libs/configuration.cpp @@ -65,6 +65,38 @@ } } +bool Configuration::airplaneModeEnabled() +{ + // Check whether other devices are disabled to assume airplane mode is enabled + // after suspend + const bool isWifiDisabled = !NetworkManager::isWirelessEnabled() || !NetworkManager::isWirelessHardwareEnabled(); + const bool isWwanDisabled = !NetworkManager::isWwanEnabled() || !NetworkManager::isWwanHardwareEnabled(); + + KConfigGroup grp(*config, QLatin1String("General")); + + if (grp.isValid()) { + if (grp.readEntry(QLatin1String("AirplaneModeEnabled"), false)) { + // We can assume that airplane mode is still activated after resume + if (isWifiDisabled && isWwanDisabled) + return true; + else { + setAirplaneModeEnabled(false); + } + } + } + + return false; +} + +void Configuration::setAirplaneModeEnabled(bool enabled) +{ + KConfigGroup grp(*config, QLatin1String("General")); + + if (grp.isValid()) { + grp.writeEntry(QLatin1String("AirplaneModeEnabled"), enabled); + } +} + bool Configuration::showPasswordDialog() { KConfigGroup grp(*config, QLatin1String("General")); diff --git a/libs/declarative/connectionicon.h b/libs/declarative/connectionicon.h --- a/libs/declarative/connectionicon.h +++ b/libs/declarative/connectionicon.h @@ -34,8 +34,6 @@ Q_PROPERTY(bool connecting READ connecting NOTIFY connectingChanged) Q_PROPERTY(QString connectionIcon READ connectionIcon NOTIFY connectionIconChanged) Q_PROPERTY(QString connectionTooltipIcon READ connectionTooltipIcon NOTIFY connectionTooltipIconChanged) - -Q_PROPERTY(bool airplaneMode READ airplaneMode WRITE setAirplaneMode NOTIFY airplaneModeChanged) Q_OBJECT public: explicit ConnectionIcon(QObject* parent = nullptr); @@ -45,9 +43,6 @@ QString connectionIcon() const; QString connectionTooltipIcon() const; - bool airplaneMode() const; - void setAirplaneMode(bool airplaneMode); - private Q_SLOTS: void activatingConnectionChanged(const QString & connection); void activeConnectionAdded(const QString & activeConnection); @@ -91,7 +86,6 @@ bool m_vpn; QString m_connectionIcon; QString m_connectionTooltipIcon; - bool m_airplaneMode; void setDisconnectedIcon(); void setIcons(); diff --git a/libs/declarative/connectionicon.cpp b/libs/declarative/connectionicon.cpp --- a/libs/declarative/connectionicon.cpp +++ b/libs/declarative/connectionicon.cpp @@ -19,6 +19,7 @@ */ #include "connectionicon.h" +#include "configuration.h" #include "uiutils.h" #include @@ -43,7 +44,6 @@ , m_connecting(false) , m_limited(false) , m_vpn(false) - , m_airplaneMode(false) #if WITH_MODEMMANAGER_SUPPORT , m_modemNetwork(nullptr) #endif @@ -112,21 +112,6 @@ return m_connectionTooltipIcon; } -bool ConnectionIcon::airplaneMode() const -{ - return m_airplaneMode; -} - -void ConnectionIcon::setAirplaneMode(bool airplaneMode) -{ - if (m_airplaneMode != airplaneMode) { - m_airplaneMode = airplaneMode; - Q_EMIT airplaneModeChanged(airplaneMode); - - setIcons(); - } -} - void ConnectionIcon::activatingConnectionChanged(const QString& connection) { Q_UNUSED(connection); @@ -417,7 +402,7 @@ void ConnectionIcon::setDisconnectedIcon() { - if (m_airplaneMode) { + if (Configuration::airplaneModeEnabled()) { setConnectionIcon(QStringLiteral("network-flightmode-on")); return; } diff --git a/libs/handler.cpp b/libs/handler.cpp --- a/libs/handler.cpp +++ b/libs/handler.cpp @@ -368,9 +368,8 @@ message.setArguments(arguments); QDBusConnection::systemBus().asyncCall(message); } - + watcher->deleteLater(); }); - getWatcher->deleteLater(); } else if (enable && m_bluetoothAdapters.value(objPath)) { QDBusMessage message = QDBusMessage::createMethodCall("org.bluez", objPath, "org.freedesktop.DBus.Properties", "Set"); QList arguments; @@ -383,8 +382,8 @@ } } } + watcher->deleteLater(); }); - watcher->deleteLater(); } void Handler::enableNetworking(bool enable)