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>
bb10
Mårten Nordheim 2021-09-29 09:30:05 +02:00
parent 589389843c
commit 5b8a4c2063
4 changed files with 35 additions and 46 deletions

View File

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

View File

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

View File

@ -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(),

View File

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