summaryrefslogtreecommitdiffstats
path: root/src/plugins/networkinformationbackends
diff options
context:
space:
mode:
authorMårten Nordheim <marten.nordheim@qt.io>2021-05-26 09:08:07 +0200
committerMårten Nordheim <marten.nordheim@qt.io>2021-05-31 17:25:25 +0200
commit59a0539690f8fb5b97d9d2241167cd5fac236950 (patch)
tree8697f344b6d26f7eb389b4ab0253035526251731 /src/plugins/networkinformationbackends
parentda955aadf5d5189b4f8de3eb2ed1b2f2f129cb28 (diff)
QNetworkInformation: Captive portal support for Android
Task-number: QTBUG-93848 Change-Id: Ia74ed0a756dc2bf71c7172e21ac4ff2361150b32 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/plugins/networkinformationbackends')
-rw-r--r--src/plugins/networkinformationbackends/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java5
-rw-r--r--src/plugins/networkinformationbackends/android/qandroidnetworkinformationbackend.cpp9
-rw-r--r--src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.cpp20
-rw-r--r--src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.h1
4 files changed, 30 insertions, 5 deletions
diff --git a/src/plugins/networkinformationbackends/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java b/src/plugins/networkinformationbackends/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java
index 4ae17252eb..0e89d23ab4 100644
--- a/src/plugins/networkinformationbackends/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java
+++ b/src/plugins/networkinformationbackends/android/jar/src/org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation.java
@@ -53,6 +53,7 @@ public class QtAndroidNetworkInformation {
private static final String LOG_TAG = "QtAndroidNetworkInformation";
private static native void connectivityChanged();
+ private static native void behindCaptivePortalChanged(boolean state);
private static QtNetworkInformationCallback m_callback = null;
private static final Object m_lock = new Object();
@@ -77,6 +78,10 @@ public class QtAndroidNetworkInformation {
else
s = AndroidConnectivity.Unknown; // = we _may_ have Internet access
setState(s);
+
+ final boolean captive
+ = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+ behindCaptivePortalChanged(captive);
}
private void setState(AndroidConnectivity s) {
diff --git a/src/plugins/networkinformationbackends/android/qandroidnetworkinformationbackend.cpp b/src/plugins/networkinformationbackends/android/qandroidnetworkinformationbackend.cpp
index 81e30610a2..130b10d558 100644
--- a/src/plugins/networkinformationbackends/android/qandroidnetworkinformationbackend.cpp
+++ b/src/plugins/networkinformationbackends/android/qandroidnetworkinformationbackend.cpp
@@ -64,7 +64,8 @@ public:
static QNetworkInformation::Features featuresSupportedStatic()
{
- return QNetworkInformation::Features(QNetworkInformation::Feature::Reachability);
+ using Feature = QNetworkInformation::Feature;
+ return QNetworkInformation::Features(Feature::Reachability | Feature::CaptivePortal);
}
bool isValid() { return m_valid; }
@@ -125,6 +126,12 @@ QAndroidNetworkInformationBackend::QAndroidNetworkInformationBackend()
setReachability(mapState(conman->networkConnectivity()));
});
+
+ connect(conman, &AndroidConnectivityManager::captivePortalChanged, this,
+ [this](bool state) {
+ using TriState = QNetworkInformation::TriState;
+ setBehindCaptivePortal(state ? TriState::True : TriState::False);
+ });
}
QT_END_NAMESPACE
diff --git a/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.cpp b/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.cpp
index 1508ff35b8..e88fe7d955 100644
--- a/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.cpp
+++ b/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.cpp
@@ -56,11 +56,20 @@ Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance)
static const char networkInformationClass[] =
"org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation";
-static void networkConnectivityChanged()
+static void networkConnectivityChanged(JNIEnv *env, jobject obj)
{
+ Q_UNUSED(env);
+ Q_UNUSED(obj);
Q_EMIT androidConnManagerInstance->connManager->connectivityChanged();
}
+static void behindCaptivePortalChanged(JNIEnv *env, jobject obj, jboolean state)
+{
+ Q_UNUSED(env);
+ Q_UNUSED(obj);
+ Q_EMIT androidConnManagerInstance->connManager->captivePortalChanged(state);
+}
+
AndroidConnectivityManager::AndroidConnectivityManager()
{
if (!registerNatives())
@@ -124,9 +133,12 @@ bool AndroidConnectivityManager::registerNatives()
return false;
jclass clazz = env->GetObjectClass(networkReceiver.object());
- static JNINativeMethod method = { "connectivityChanged", "()V",
- reinterpret_cast<void *>(networkConnectivityChanged) };
- const bool ret = (env->RegisterNatives(clazz, &method, 1) == JNI_OK);
+ static JNINativeMethod methods[] = {
+ { "connectivityChanged", "()V", reinterpret_cast<void *>(networkConnectivityChanged) },
+ { "behindCaptivePortalChanged", "(Z)V",
+ reinterpret_cast<void *>(behindCaptivePortalChanged) }
+ };
+ const bool ret = (env->RegisterNatives(clazz, methods, std::size(methods)) == JNI_OK);
env->DeleteLocalRef(clazz);
return ret;
}
diff --git a/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.h b/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.h
index 8126125983..14f5aa9b57 100644
--- a/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.h
+++ b/src/plugins/networkinformationbackends/android/wrapper/androidconnectivitymanager.h
@@ -59,6 +59,7 @@ public:
Q_SIGNALS:
void connectivityChanged();
+ void captivePortalChanged(bool state);
private:
friend struct AndroidConnectivityManagerInstance;