diff options
Diffstat (limited to 'src/plugins/networkinformation/android/wrapper')
-rw-r--r-- | src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp | 97 | ||||
-rw-r--r-- | src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h | 54 |
2 files changed, 151 insertions, 0 deletions
diff --git a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp new file mode 100644 index 0000000000..3c9f952968 --- /dev/null +++ b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp @@ -0,0 +1,97 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "androidconnectivitymanager.h" + +#include <QtCore/qcoreapplication.h> +#include <QtCore/qjnienvironment.h> + +QT_BEGIN_NAMESPACE + +using namespace QNativeInterface; + +struct AndroidConnectivityManagerInstance +{ + AndroidConnectivityManagerInstance() : connManager(new AndroidConnectivityManager) { } + std::unique_ptr<AndroidConnectivityManager> connManager = nullptr; +}; +Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance) + +static const char networkInformationClass[] = + "org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation"; + +static void networkConnectivityChanged(JNIEnv *env, jobject obj, jint enumValue) +{ + Q_UNUSED(env); + Q_UNUSED(obj); + const auto connectivity = + static_cast<AndroidConnectivityManager::AndroidConnectivity>(enumValue); + Q_EMIT androidConnManagerInstance->connManager->connectivityChanged(connectivity); +} +Q_DECLARE_JNI_NATIVE_METHOD(networkConnectivityChanged) + +static void genericInfoChanged(JNIEnv *env, jobject obj, jboolean captivePortal, jboolean metered) +{ + Q_UNUSED(env); + Q_UNUSED(obj); + Q_EMIT androidConnManagerInstance->connManager->captivePortalChanged(captivePortal); + Q_EMIT androidConnManagerInstance->connManager->meteredChanged(metered); +} +Q_DECLARE_JNI_NATIVE_METHOD(genericInfoChanged) + +static void transportMediumChanged(JNIEnv *env, jobject obj, jint enumValue) +{ + Q_UNUSED(env); + Q_UNUSED(obj); + const auto transport = static_cast<AndroidConnectivityManager::AndroidTransport>(enumValue); + emit androidConnManagerInstance->connManager->transportMediumChanged(transport); +} +Q_DECLARE_JNI_NATIVE_METHOD(transportMediumChanged) + +Q_DECLARE_JNI_CLASS(ConnectivityManager, "android/net/ConnectivityManager") + +AndroidConnectivityManager::AndroidConnectivityManager() +{ + if (!registerNatives()) + return; + + QJniObject::callStaticMethod<void>(networkInformationClass, "registerReceiver", + QAndroidApplication::context()); +} + +AndroidConnectivityManager *AndroidConnectivityManager::getInstance() +{ + if (!androidConnManagerInstance()) + return nullptr; + return androidConnManagerInstance->connManager->isValid() + ? androidConnManagerInstance->connManager.get() + : nullptr; +} + +bool AndroidConnectivityManager::isValid() const +{ + return registerNatives(); +} + +AndroidConnectivityManager::~AndroidConnectivityManager() +{ + QJniObject::callStaticMethod<void>(networkInformationClass, "unregisterReceiver", + QAndroidApplication::context()); +} + +bool AndroidConnectivityManager::registerNatives() const +{ + static const bool registered = []() { + QJniEnvironment env; + return env.registerNativeMethods(networkInformationClass, { + Q_JNI_NATIVE_METHOD(networkConnectivityChanged), + Q_JNI_NATIVE_METHOD(genericInfoChanged), + Q_JNI_NATIVE_METHOD(transportMediumChanged), + }); + }(); + return registered; +} + +QT_END_NAMESPACE + +#include "moc_androidconnectivitymanager.cpp" diff --git a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h new file mode 100644 index 0000000000..d15faf0e8e --- /dev/null +++ b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h @@ -0,0 +1,54 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef ANDROIDCONNECTIVITYMANAGER_H +#define ANDROIDCONNECTIVITYMANAGER_H + +#include <QObject> +#include <QtCore/qjniobject.h> + +QT_BEGIN_NAMESPACE + +class AndroidConnectivityManager : public QObject +{ + Q_OBJECT +public: + // Keep synchronized with AndroidConnectivity in QtAndroidNetworkInformation.java + enum class AndroidConnectivity { Connected, Unknown, Disconnected }; + Q_ENUM(AndroidConnectivity); + + // Keep synchronized with Transport in QtAndroidNetworkInformation.java + enum class AndroidTransport { + Unknown, + Bluetooth, + Cellular, + Ethernet, + LoWPAN, + Usb, + WiFi, + WiFiAware, + }; + Q_ENUM(AndroidTransport); + + static AndroidConnectivityManager *getInstance(); + ~AndroidConnectivityManager(); + + inline bool isValid() const; + +Q_SIGNALS: + void connectivityChanged(AndroidConnectivity connectivity); + void captivePortalChanged(bool state); + void transportMediumChanged(AndroidTransport transport); + void meteredChanged(bool state); + +private: + friend struct AndroidConnectivityManagerInstance; + AndroidConnectivityManager(); + bool registerNatives() const; + + Q_DISABLE_COPY_MOVE(AndroidConnectivityManager); +}; + +QT_END_NAMESPACE + +#endif // ANDROIDCONNECTIVITYMANAGER_H |