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 return QString::fromUtf16(QNetworkInformationBackend::PluginNames
17 [QNetworkInformationBackend::PluginNamesAndroidIndex]);
18}
19
21{
23public:
25 ~QAndroidNetworkInformationBackend() { m_valid = false; }
26
27 QString name() const override { return backendName(); }
29 {
30 return featuresSupportedStatic();
31 }
32
34 {
35 using Feature = QNetworkInformation::Feature;
36 return QNetworkInformation::Features(Feature::Reachability | Feature::CaptivePortal
37 | Feature::TransportMedium);
38 }
39
40 bool isValid() { return m_valid; }
41
42private:
44
45 void updateConnectivity(AndroidConnectivityManager::AndroidConnectivity connectivity);
46 void updateTransportMedium(AndroidConnectivityManager::AndroidTransport transport);
47
48 bool m_valid = false;
49};
50
52{
53 Q_OBJECT
54 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
56public:
59 QString name() const override { return backendName(); }
61 {
62 return QAndroidNetworkInformationBackend::featuresSupportedStatic();
63 }
64
66 create(QNetworkInformation::Features requiredFeatures) const override
67 {
68 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
69 return nullptr;
70 auto backend = new QAndroidNetworkInformationBackend();
71 if (!backend->isValid())
72 delete std::exchange(backend, nullptr);
73 return backend;
74 }
75
76private:
78};
79
80QAndroidNetworkInformationBackend::QAndroidNetworkInformationBackend()
81{
82 auto conman = AndroidConnectivityManager::getInstance();
83 if (!conman)
84 return;
85 m_valid = true;
86 setReachability(QNetworkInformation::Reachability::Unknown);
87 connect(conman, &AndroidConnectivityManager::connectivityChanged, this,
88 &QAndroidNetworkInformationBackend::updateConnectivity);
89
90 connect(conman, &AndroidConnectivityManager::captivePortalChanged, this,
91 &QAndroidNetworkInformationBackend::setBehindCaptivePortal);
92
93 connect(conman, &AndroidConnectivityManager::transportMediumChanged, this,
94 &QAndroidNetworkInformationBackend::updateTransportMedium);
95
96 connect(conman, &AndroidConnectivityManager::meteredChanged, this,
97 &QAndroidNetworkInformationBackend::setMetered);
98}
99
100void QAndroidNetworkInformationBackend::updateConnectivity(
101 AndroidConnectivityManager::AndroidConnectivity connectivity)
102{
103 using AndroidConnectivity = AndroidConnectivityManager::AndroidConnectivity;
104 static const auto mapState = [](AndroidConnectivity state) {
105 switch (state) {
106 case AndroidConnectivity::Connected:
107 return QNetworkInformation::Reachability::Online;
108 case AndroidConnectivity::Disconnected:
109 return QNetworkInformation::Reachability::Disconnected;
110 case AndroidConnectivity::Unknown:
111 default:
112 return QNetworkInformation::Reachability::Unknown;
113 }
114 };
115
116 setReachability(mapState(connectivity));
117}
118
119void QAndroidNetworkInformationBackend::updateTransportMedium(
120 AndroidConnectivityManager::AndroidTransport transport)
121{
122 using AndroidTransport = AndroidConnectivityManager::AndroidTransport;
123 using TransportMedium = QNetworkInformation::TransportMedium;
124 static const auto mapTransport = [](AndroidTransport state) -> TransportMedium {
125 switch (state) {
126 case AndroidTransport::Cellular:
127 return TransportMedium::Cellular;
128 case AndroidTransport::WiFi:
129 return TransportMedium::WiFi;
130 case AndroidTransport::Bluetooth:
131 return TransportMedium::Bluetooth;
132 case AndroidTransport::Ethernet:
133 return TransportMedium::Ethernet;
134 // These are not covered yet (but may be in the future)
135 case AndroidTransport::Usb:
136 case AndroidTransport::LoWPAN:
137 case AndroidTransport::WiFiAware:
138 case AndroidTransport::Unknown:
139 return TransportMedium::Unknown;
140 }
141 };
142
143 setTransportMedium(mapTransport(transport));
144}
145
146QT_END_NAMESPACE
147
148#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().
static QString backendName()