Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
androidconnectivitymanager.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
7#include <QtCore/qcoreapplication.h>
8#include <QtCore/qjnienvironment.h>
9
11
12using namespace QNativeInterface;
13
19Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance)
20
21static const char networkInformationClass[] =
22 "org/qtproject/qt/android/networkinformation/QtAndroidNetworkInformation";
23
24static AndroidConnectivityManager *liveConnManager()
25{
26 if (!androidConnManagerInstance())
27 return nullptr;
28 return androidConnManagerInstance->connManager.get();
29}
30
31static void networkConnectivityChanged(JNIEnv *, jobject, jint enumValue)
32{
33 AndroidConnectivityManager *manager = liveConnManager();
34 if (!manager)
35 return;
36 const auto connectivity =
37 static_cast<AndroidConnectivityManager::AndroidConnectivity>(enumValue);
38 QMetaObject::invokeMethod(manager, [manager, connectivity] {
39 Q_EMIT manager->connectivityChanged(connectivity);
40 }, Qt::QueuedConnection);
41}
42Q_DECLARE_JNI_NATIVE_METHOD(networkConnectivityChanged)
43
44static void genericInfoChanged(JNIEnv *, jobject, jboolean captivePortal, jboolean metered)
45{
46 AndroidConnectivityManager *manager = liveConnManager();
47 if (!manager)
48 return;
49 QMetaObject::invokeMethod(manager, [manager, captivePortal, metered] {
50 Q_EMIT manager->captivePortalChanged(captivePortal);
51 Q_EMIT manager->meteredChanged(metered);
52 }, Qt::QueuedConnection);
53}
54Q_DECLARE_JNI_NATIVE_METHOD(genericInfoChanged)
55
56static void transportMediumChanged(JNIEnv *, jobject, jint enumValue)
57{
58 AndroidConnectivityManager *manager = liveConnManager();
59 if (!manager)
60 return;
61 const auto transport = static_cast<AndroidConnectivityManager::AndroidTransport>(enumValue);
62 QMetaObject::invokeMethod(manager, [manager, transport] {
63 Q_EMIT manager->transportMediumChanged(transport);
64 }, Qt::QueuedConnection);
65}
66Q_DECLARE_JNI_NATIVE_METHOD(transportMediumChanged)
67
68Q_DECLARE_JNI_CLASS(ConnectivityManager, "android/net/ConnectivityManager")
69
70AndroidConnectivityManager::AndroidConnectivityManager()
71{
72 if (!registerNatives())
73 return;
74
75 QJniObject::callStaticMethod<void>(networkInformationClass, "registerReceiver",
76 QAndroidApplication::context());
77}
78
79AndroidConnectivityManager *AndroidConnectivityManager::getInstance()
80{
81 if (!androidConnManagerInstance())
82 return nullptr;
83 return androidConnManagerInstance->connManager->isValid()
84 ? androidConnManagerInstance->connManager.get()
85 : nullptr;
86}
87
88bool AndroidConnectivityManager::isValid() const
89{
90 return registerNatives();
91}
92
93AndroidConnectivityManager::~AndroidConnectivityManager()
94{
95 QJniObject::callStaticMethod<void>(networkInformationClass, "unregisterReceiver",
96 QAndroidApplication::context());
97}
98
99bool AndroidConnectivityManager::registerNatives() const
100{
101 static const bool registered = []() {
102 QJniEnvironment env;
103 return env.registerNativeMethods(networkInformationClass, {
104 Q_JNI_NATIVE_METHOD(networkConnectivityChanged),
105 Q_JNI_NATIVE_METHOD(genericInfoChanged),
106 Q_JNI_NATIVE_METHOD(transportMediumChanged),
107 });
108 }();
109 return registered;
110}
111
112QT_END_NAMESPACE
113
114#include "moc_androidconnectivitymanager.cpp"
static const char networkInformationClass[]
static void networkConnectivityChanged(JNIEnv *, jobject, jint enumValue)
static void transportMediumChanged(JNIEnv *, jobject, jint enumValue)
static AndroidConnectivityManager * liveConnManager()
static void genericInfoChanged(JNIEnv *, jobject, jboolean captivePortal, jboolean metered)
Combined button and popup list for selecting options.
std::unique_ptr< AndroidConnectivityManager > connManager