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 @@ -47,12 +47,21 @@ function action_openKCM() { KCMShell.open(kcm) + + + } + function action_showPortal() { + Qt.openUrlExternally("http://networkcheck.kde.org") } Component.onCompleted: { if (kcmAuthorized) { plasmoid.setAction("openKCM", i18n("&Configure Network Connections..."), "preferences-system-network"); } + plasmoid.setAction("showPortal", i18n("Open Network Login Page..."), "internet-services"); + + var action = plasmoid.action("showPortal"); + action.visible = Qt.binding(function() { return connectionIconProvider.needsPortal; }) } PlasmaNM.NetworkStatus { diff --git a/libs/declarative/connectionicon.h b/libs/declarative/connectionicon.h --- a/libs/declarative/connectionicon.h +++ b/libs/declarative/connectionicon.h @@ -34,6 +34,7 @@ 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 needsPortal READ needsPortal NOTIFY needsPortalChanged) Q_PROPERTY(bool airplaneMode READ airplaneMode WRITE setAirplaneMode NOTIFY airplaneModeChanged) Q_OBJECT @@ -45,6 +46,8 @@ QString connectionIcon() const; QString connectionTooltipIcon() const; + bool needsPortal() const { return m_needsPortal; } + bool airplaneMode() const; void setAirplaneMode(bool airplaneMode); @@ -54,7 +57,7 @@ void activeConnectionDestroyed(); void activeConnectionStateChanged(NetworkManager::ActiveConnection::State state); void carrierChanged(bool carrier); - void connectivityChanged(); + void connectivityChanged(NetworkManager::Connectivity connectivity); void deviceAdded(const QString & device); void deviceRemoved(const QString & device); void networkingEnabledChanged(bool enabled); @@ -75,6 +78,7 @@ void connectionIconChanged(const QString & icon); void connectionTooltipIconChanged(const QString & icon); void airplaneModeChanged(bool airplaneMode); + void needsPortalChanged(bool needsPortal); private: void addActiveConnection(const QString & activeConnection); @@ -92,6 +96,7 @@ QString m_connectionIcon; QString m_connectionTooltipIcon; bool m_airplaneMode; + bool m_needsPortal = false; 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 @@ -81,8 +81,17 @@ } setStates(); - connectivityChanged(); setIcons(); + + QDBusPendingReply pendingReply = NetworkManager::checkConnectivity(); + QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingReply); + connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this] (QDBusPendingCallWatcher *watcher) { + QDBusPendingReply reply = *watcher; + if (reply.isValid()) { + connectivityChanged((NetworkManager::Connectivity)reply.value()); + } + watcher->deleteLater(); + }); } ConnectionIcon::~ConnectionIcon() @@ -172,9 +181,13 @@ setIcons(); } -void ConnectionIcon::connectivityChanged() +void ConnectionIcon::connectivityChanged(NetworkManager::Connectivity conn) { - NetworkManager::Connectivity conn = NetworkManager::connectivity(); + const bool needsPortal = conn == NetworkManager::Portal; + if (needsPortal != m_needsPortal) { + m_needsPortal = needsPortal; + Q_EMIT needsPortalChanged(needsPortal); + } setLimited(conn == NetworkManager::Portal || conn == NetworkManager::Limited); }