summaryrefslogtreecommitdiffstats
path: root/src/plugins/networkinformation
diff options
context:
space:
mode:
authorMårten Nordheim <marten.nordheim@qt.io>2021-09-29 09:30:05 +0200
committerMårten Nordheim <marten.nordheim@qt.io>2021-10-07 19:08:30 +0200
commit5b8a4c2063e6f16ffe394ebd26c16aefb0a3e852 (patch)
treee2882a57912146aa0e7f1f1b7541c62f1036efec /src/plugins/networkinformation
parent589389843c1850e725972b4a6ba901d32bb59d73 (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')
-rw-r--r--src/plugins/networkinformation/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java5
-rw-r--r--src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp37
-rw-r--r--src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.cpp35
-rw-r--r--src/plugins/networkinformation/android/wrapper/androidconnectivitymanager.h4
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);