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
qandroidnetworkinformationbackend.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
5#include <QtNetwork/private/qnetworkinformation_p.h>
6
7#include "wrapper/androidconnectivitymanager.h"
8
9#include <QtCore/qglobal.h>
10
12Q_DECLARE_LOGGING_CATEGORY(lcNetInfoAndroid)
13Q_LOGGING_CATEGORY(lcNetInfoAndroid, "qt.network.info.android");
14
16{
17 return QString::fromUtf16(QNetworkInformationBackend::PluginNames
18 [QNetworkInformationBackend::PluginNamesAndroidIndex]);
19}
20
22{
24public:
26 ~QAndroidNetworkInformationBackend() { m_valid = false; }
27
28 QString name() const override { return backendName(); }
30 {
31 return featuresSupportedStatic();
32 }
33
35 {
36 using Feature = QNetworkInformation::Feature;
37 return QNetworkInformation::Features(Feature::Reachability | Feature::CaptivePortal
38 | Feature::TransportMedium | Feature::Metered);
39 }
40
41 bool isValid() { return m_valid; }
42
43private:
45
46 void updateConnectivity(AndroidConnectivityManager::AndroidConnectivity connectivity);
47 void updateTransportMedium(AndroidConnectivityManager::AndroidTransport transport);
48
49 bool m_valid = false;
50};
51
53{
54 Q_OBJECT
55 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
57public:
60 QString name() const override { return backendName(); }
62 {
63 return QAndroidNetworkInformationBackend::featuresSupportedStatic();
64 }
65
67 create(QNetworkInformation::Features requiredFeatures) const override
68 {
69 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
70 return nullptr;
71 auto backend = new QAndroidNetworkInformationBackend();
72 if (!backend->isValid())
73 delete std::exchange(backend, nullptr);
74 return backend;
75 }
76
77private:
79};
80
81QAndroidNetworkInformationBackend::QAndroidNetworkInformationBackend()
82{
83 auto conman = AndroidConnectivityManager::getInstance();
84 if (!conman)
85 return;
86 m_valid = true;
87 setReachability(QNetworkInformation::Reachability::Unknown);
88 connect(conman, &AndroidConnectivityManager::connectivityChanged, this,
89 &QAndroidNetworkInformationBackend::updateConnectivity);
90
91 connect(conman, &AndroidConnectivityManager::captivePortalChanged, this,
92 &QAndroidNetworkInformationBackend::setBehindCaptivePortal);
93
94 connect(conman, &AndroidConnectivityManager::transportMediumChanged, this,
95 &QAndroidNetworkInformationBackend::updateTransportMedium);
96
97 connect(conman, &AndroidConnectivityManager::meteredChanged, this,
98 &QAndroidNetworkInformationBackend::setMetered);
99}
100
101void QAndroidNetworkInformationBackend::updateConnectivity(
102 AndroidConnectivityManager::AndroidConnectivity connectivity)
103{
104 using AndroidConnectivity = AndroidConnectivityManager::AndroidConnectivity;
105 static const auto mapState = [](AndroidConnectivity state) {
106 switch (state) {
107 case AndroidConnectivity::Connected:
108 return QNetworkInformation::Reachability::Online;
109 case AndroidConnectivity::Disconnected:
110 return QNetworkInformation::Reachability::Disconnected;
111 case AndroidConnectivity::Unknown:
112 default:
113 return QNetworkInformation::Reachability::Unknown;
114 }
115 };
116
117 setReachability(mapState(connectivity));
118}
119
120void QAndroidNetworkInformationBackend::updateTransportMedium(
121 AndroidConnectivityManager::AndroidTransport transport)
122{
123 using AndroidTransport = AndroidConnectivityManager::AndroidTransport;
124 using TransportMedium = QNetworkInformation::TransportMedium;
125 static const auto mapTransport = [](AndroidTransport state) -> TransportMedium {
126 switch (state) {
127 case AndroidTransport::Cellular:
128 return TransportMedium::Cellular;
129 case AndroidTransport::WiFi:
130 return TransportMedium::WiFi;
131 case AndroidTransport::Bluetooth:
132 return TransportMedium::Bluetooth;
133 case AndroidTransport::Ethernet:
134 return TransportMedium::Ethernet;
135 // These are not covered yet (but may be in the future)
136 case AndroidTransport::Usb:
137 case AndroidTransport::LoWPAN:
138 case AndroidTransport::WiFiAware:
139 case AndroidTransport::Unknown:
140 return TransportMedium::Unknown;
141 }
142 };
143
144 setTransportMedium(mapTransport(transport));
145}
146
147QT_END_NAMESPACE
148
149#include "qandroidnetworkinformationbackend.moc"
QNetworkInformation::Features featuresSupported() const override
Features supported, return the same in QNetworkInformationBackend::featuresSupported().
QString name() const override
Backend name, return the same in QNetworkInformationBackend::name().
QNetworkInformationBackend * create(QNetworkInformation::Features requiredFeatures) const override
Create and return an instance of QNetworkInformationBackend.
static QNetworkInformation::Features featuresSupportedStatic()
QNetworkInformation::Features featuresSupported() const override
Features supported, return the same in QNetworkInformationBackendFactory::featuresSupported().
QString name() const override
Backend name, return the same in QNetworkInformationBackendFactory::name().
Combined button and popup list for selecting options.
static QString backendName()