diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2021-05-26 09:08:07 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2021-05-31 17:25:25 +0200 |
commit | 59a0539690f8fb5b97d9d2241167cd5fac236950 (patch) | |
tree | 8697f344b6d26f7eb389b4ab0253035526251731 /src/plugins/networkinformationbackends | |
parent | da955aadf5d5189b4f8de3eb2ed1b2f2f129cb28 (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')
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; |