diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2021-09-29 09:30:05 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2021-10-07 19:08:30 +0200 |
commit | 5b8a4c2063e6f16ffe394ebd26c16aefb0a3e852 (patch) | |
tree | e2882a57912146aa0e7f1f1b7541c62f1036efec /src/plugins/networkinformation | |
parent | 589389843c1850e725972b4a6ba901d32bb59d73 (diff) |
QNI:Android: unify behavior of callbacks
The first callback added for the android backend does not have the value
as a parameter which is something the other callbacks have. Change it so
it does.
And promote the lambda to a real function.
Change-Id: I06f10f7c79f33a5ea3154f2fc6d20d550cd7eca7
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/plugins/networkinformation')
4 files changed, 35 insertions, 46 deletions
diff --git a/src/plugins/networkinformation/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java b/src/plugins/networkinformation/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java index 403286121e..bf1bd6a329 100644 --- a/src/plugins/networkinformation/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java +++ b/src/plugins/networkinformation/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java @@ -53,13 +53,14 @@ import android.os.Build; public class QtAndroidNetworkInformation { private static final String LOG_TAG = "QtAndroidNetworkInformation"; - private static native void connectivityChanged(); + private static native void connectivityChanged(AndroidConnectivity connectivity); private static native void behindCaptivePortalChanged(boolean state); private static native void transportMediumChanged(Transport transportMedium); private static QtNetworkInformationCallback m_callback = null; private static final Object m_lock = new Object(); + // Keep synchronized with AndroidConnectivity in androidconnectivitymanager.h enum AndroidConnectivity { Connected, Unknown, Disconnected } @@ -131,7 +132,7 @@ public class QtAndroidNetworkInformation { private void setState(AndroidConnectivity s) { if (previousState != s) { previousState = s; - connectivityChanged(); + connectivityChanged(s); } } diff --git a/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp b/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp index 33103b00b7..14e42a9de8 100644 --- a/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp +++ b/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp @@ -74,6 +74,7 @@ public: private: Q_DISABLE_COPY_MOVE(QAndroidNetworkInformationBackend); + void updateConnectivity(AndroidConnectivityManager::AndroidConnectivity connectivity); void updateTransportMedium(AndroidConnectivityManager::AndroidTransport transport); bool m_valid = false; @@ -115,21 +116,8 @@ QAndroidNetworkInformationBackend::QAndroidNetworkInformationBackend() return; m_valid = true; setReachability(QNetworkInformation::Reachability::Unknown); - connect(conman, &AndroidConnectivityManager::connectivityChanged, this, [this, conman]() { - static const auto mapState = [](AndroidConnectivityManager::AndroidConnectivity state) { - switch (state) { - case AndroidConnectivityManager::AndroidConnectivity::Connected: - return QNetworkInformation::Reachability::Online; - case AndroidConnectivityManager::AndroidConnectivity::Disconnected: - return QNetworkInformation::Reachability::Disconnected; - case AndroidConnectivityManager::AndroidConnectivity::Unknown: - default: - return QNetworkInformation::Reachability::Unknown; - } - }; - - setReachability(mapState(conman->networkConnectivity())); - }); + connect(conman, &AndroidConnectivityManager::connectivityChanged, this, + &QAndroidNetworkInformationBackend::updateConnectivity); connect(conman, &AndroidConnectivityManager::captivePortalChanged, this, &QAndroidNetworkInformationBackend::setBehindCaptivePortal); @@ -138,6 +126,25 @@ QAndroidNetworkInformationBackend::QAndroidNetworkInformationBackend() &QAndroidNetworkInformationBackend::updateTransportMedium); } +void QAndroidNetworkInformationBackend::updateConnectivity( + AndroidConnectivityManager::AndroidConnectivity connectivity) +{ + using AndroidConnectivity = AndroidConnectivityManager::AndroidConnectivity; + static const auto mapState = [](AndroidConnectivity state) { + switch (state) { + case AndroidConnectivity::Connected: + return QNetworkInformation::Reachability::Online; + case AndroidConnectivity::Disconnected: + return QNetworkInformation::Reachability::Disconnected; + case AndroidConnectivity::Unknown: + default: + return QNetworkInformation::Reachability::Unknown; + } + }; + + setReachability(mapState(connectivity)); +} + void QAndroidNetworkInformationBackend::updateTransportMedium( AndroidConnectivityManager::AndroidTransport transport) { diff --git a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp index 281ad4a2a6..e95a7db610 100644 --- a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp +++ b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp @@ -56,11 +56,13 @@ Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance) static const char networkInformationClass[] = "org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation"; -static void networkConnectivityChanged(JNIEnv *env, jobject obj) +static void networkConnectivityChanged(JNIEnv *env, jobject obj, jobject enumValue) { Q_UNUSED(env); Q_UNUSED(obj); - Q_EMIT androidConnManagerInstance->connManager->connectivityChanged(); + const jint value = QJniObject(enumValue).callMethod<jint>("ordinal"); + const auto connectivity = static_cast<AndroidConnectivityManager::AndroidConnectivity>(value); + Q_EMIT androidConnManagerInstance->connManager->connectivityChanged(connectivity); } static void behindCaptivePortalChanged(JNIEnv *env, jobject obj, jboolean state) @@ -110,30 +112,6 @@ AndroidConnectivityManager::~AndroidConnectivityManager() "(Landroid/content/Context;)V", QAndroidApplication::context()); } -AndroidConnectivityManager::AndroidConnectivity AndroidConnectivityManager::networkConnectivity() -{ - QJniEnvironment env; - QJniObject networkReceiver(networkInformationClass); - jclass clazz = env->GetObjectClass(networkReceiver.object()); - static const QByteArray functionSignature = - QByteArray(QByteArray("()L") + networkInformationClass + "$AndroidConnectivity;"); - QJniObject enumObject = - QJniObject::callStaticObjectMethod(clazz, "state", functionSignature.data()); - if (!enumObject.isValid()) - return AndroidConnectivityManager::AndroidConnectivity::Unknown; - - QJniObject enumName = enumObject.callObjectMethod<jstring>("name"); - if (!enumName.isValid()) - return AndroidConnectivityManager::AndroidConnectivity::Unknown; - - QString name = enumName.toString(); - if (name == u"Connected") - return AndroidConnectivity::Connected; - if (name == u"Disconnected") - return AndroidConnectivity::Disconnected; - return AndroidConnectivity::Unknown; -} - bool AndroidConnectivityManager::registerNatives() { QJniEnvironment env; @@ -141,12 +119,15 @@ bool AndroidConnectivityManager::registerNatives() if (!networkReceiver.isValid()) return false; + const QByteArray connectivityEnumSig = + QByteArray("(L") + networkInformationClass + "$AndroidConnectivity;)V"; const QByteArray transportEnumSig = QByteArray("(L") + networkInformationClass + "$Transport;)V"; jclass clazz = env->GetObjectClass(networkReceiver.object()); static JNINativeMethod methods[] = { - { "connectivityChanged", "()V", reinterpret_cast<void *>(networkConnectivityChanged) }, + { "connectivityChanged", connectivityEnumSig.data(), + reinterpret_cast<void *>(networkConnectivityChanged) }, { "behindCaptivePortalChanged", "(Z)V", reinterpret_cast<void *>(behindCaptivePortalChanged) }, { "transportMediumChanged", transportEnumSig.data(), diff --git a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h index 790f6f3bd0..b335a4a3e4 100644 --- a/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h +++ b/src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h @@ -49,6 +49,7 @@ class AndroidConnectivityManager : public QObject { Q_OBJECT public: + // Keep synchronized with AndroidConnectivity in QtAndroidNetworkInformation.java enum class AndroidConnectivity { Connected, Unknown, Disconnected }; Q_ENUM(AndroidConnectivity); @@ -68,11 +69,10 @@ public: static AndroidConnectivityManager *getInstance(); ~AndroidConnectivityManager(); - AndroidConnectivity networkConnectivity(); inline bool isValid() const { return m_connectivityManager.isValid(); } Q_SIGNALS: - void connectivityChanged(); + void connectivityChanged(AndroidConnectivity connectivity); void captivePortalChanged(bool state); void transportMediumChanged(AndroidTransport transport); |