QNetworkInformation: Captive portal support for Android

Task-number: QTBUG-93848
Change-Id: Ia74ed0a756dc2bf71c7172e21ac4ff2361150b32
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
bb10
Mårten Nordheim 2021-05-26 09:08:07 +02:00
parent da955aadf5
commit 59a0539690
4 changed files with 30 additions and 5 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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;
}

View File

@ -59,6 +59,7 @@ public:
Q_SIGNALS:
void connectivityChanged();
void captivePortalChanged(bool state);
private:
friend struct AndroidConnectivityManagerInstance;