Android: New bearer plugin
Replacement for the the generic bearer plugin. Compared to the generic bearer engine, this plugin provides a more detailed overview of the network configurations on Android. Added features are: - Correct bearer type, also for mobile connections. - Connection state (e.g., roaming). - Data statistics (On devices that supports it). - Polling is not required. Change-Id: I728cb91e04a66343648c0add6be2a003caca0f1f Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
This commit is contained in:
parent
50c04d6318
commit
ff7fdf78ef
@ -25,3 +25,14 @@ include(socket/socket.pri)
|
||||
include(ssl/ssl.pri)
|
||||
|
||||
QMAKE_LIBS += $$QMAKE_LIBS_NETWORK
|
||||
|
||||
ANDROID_BUNDLED_JAR_DEPENDENCIES = \
|
||||
jar/QtAndroidBearer-bundled.jar
|
||||
ANDROID_JAR_DEPENDENCIES = \
|
||||
jar/QtAndroidBearer.jar
|
||||
ANDROID_LIB_DEPENDENCIES = \
|
||||
plugins/bearer/libqandroidbearer.so
|
||||
MODULE_PLUGIN_TYPES = \
|
||||
bearer
|
||||
ANDROID_PERMISSIONS += \
|
||||
android.permission.ACCESS_NETWORK_STATE
|
||||
|
4
src/plugins/bearer/android/android.pro
Normal file
4
src/plugins/bearer/android/android.pro
Normal file
@ -0,0 +1,4 @@
|
||||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS += src \
|
||||
jar
|
3
src/plugins/bearer/android/jar/bundledjar.pro
Normal file
3
src/plugins/bearer/android/jar/bundledjar.pro
Normal file
@ -0,0 +1,3 @@
|
||||
TARGET = QtAndroidBearer-bundled
|
||||
CONFIG += bundled_jar_file
|
||||
include(jar.pri)
|
2
src/plugins/bearer/android/jar/distributedjar.pro
Normal file
2
src/plugins/bearer/android/jar/distributedjar.pro
Normal file
@ -0,0 +1,2 @@
|
||||
TARGET = QtAndroidBearer
|
||||
include(jar.pri)
|
13
src/plugins/bearer/android/jar/jar.pri
Normal file
13
src/plugins/bearer/android/jar/jar.pri
Normal file
@ -0,0 +1,13 @@
|
||||
load(qt_build_paths)
|
||||
CONFIG += java
|
||||
DESTDIR = $$MODULE_BASE_OUTDIR/jar
|
||||
|
||||
JAVACLASSPATH += $$PWD/src
|
||||
|
||||
JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_PREFIX]/jar
|
||||
INSTALLS += target
|
||||
|
||||
OTHER_FILES += $$JAVASOURCES
|
2
src/plugins/bearer/android/jar/jar.pro
Normal file
2
src/plugins/bearer/android/jar/jar.pro
Normal file
@ -0,0 +1,2 @@
|
||||
TEMPLATE=subdirs
|
||||
SUBDIRS += distributedjar.pro bundledjar.pro
|
@ -0,0 +1,95 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
package org.qtproject.qt5.android.bearer;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.util.Log;
|
||||
import android.app.Activity;
|
||||
import android.net.ConnectivityManager;
|
||||
|
||||
public class QtNetworkReceiver
|
||||
{
|
||||
private static final String LOG_TAG = "QtNetworkReceiver";
|
||||
private static native void activeNetworkInfoChanged();
|
||||
private static BroadcastReceiverPrivate m_broadcastReceiver = null;
|
||||
private static final Object m_lock = new Object();
|
||||
|
||||
private static class BroadcastReceiverPrivate extends BroadcastReceiver
|
||||
{
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
activeNetworkInfoChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private QtNetworkReceiver() {}
|
||||
|
||||
public static void registerReceiver(final Activity activity)
|
||||
{
|
||||
synchronized (m_lock) {
|
||||
if (m_broadcastReceiver == null) {
|
||||
m_broadcastReceiver = new BroadcastReceiverPrivate();
|
||||
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
|
||||
activity.registerReceiver(m_broadcastReceiver, intentFilter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void unregisterReceiver(final Activity activity)
|
||||
{
|
||||
synchronized (m_lock) {
|
||||
if (m_broadcastReceiver == null)
|
||||
return;
|
||||
|
||||
activity.unregisterReceiver(m_broadcastReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
public static ConnectivityManager getConnectivityManager(final Activity activity)
|
||||
{
|
||||
return (ConnectivityManager)activity.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
}
|
||||
}
|
3
src/plugins/bearer/android/src/android.json
Normal file
3
src/plugins/bearer/android/src/android.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"Keys": [ "android" ]
|
||||
}
|
65
src/plugins/bearer/android/src/main.cpp
Normal file
65
src/plugins/bearer/android/src/main.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qandroidbearerengine.h"
|
||||
#include <QtNetwork/private/qbearerplugin_p.h>
|
||||
|
||||
#ifndef QT_NO_BEARERMANAGEMENT
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QAndroidBearerEnginePlugin : public QBearerEnginePlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "android.json")
|
||||
|
||||
public:
|
||||
QBearerEngine *create(const QString &key) const Q_DECL_OVERRIDE
|
||||
{
|
||||
return (key == QStringLiteral("android")) ? new QAndroidBearerEngine() : 0;
|
||||
}
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "main.moc"
|
||||
|
||||
#endif // QT_NO_BEARERMANAGEMENT
|
405
src/plugins/bearer/android/src/qandroidbearerengine.cpp
Normal file
405
src/plugins/bearer/android/src/qandroidbearerengine.cpp
Normal file
@ -0,0 +1,405 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qandroidbearerengine.h"
|
||||
#include "../../qnetworksession_impl.h"
|
||||
#include "wrappers/androidconnectivitymanager.h"
|
||||
|
||||
#ifndef QT_NO_BEARERMANAGEMENT
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static QString networkConfType(const AndroidNetworkInfo &networkInfo)
|
||||
{
|
||||
switch (networkInfo.getType()) {
|
||||
case AndroidNetworkInfo::Mobile:
|
||||
return QStringLiteral("Mobile");
|
||||
case AndroidNetworkInfo::Wifi:
|
||||
return QStringLiteral("WiFi");
|
||||
case AndroidNetworkInfo::Wimax:
|
||||
return QStringLiteral("WiMax");
|
||||
case AndroidNetworkInfo::Ethernet:
|
||||
return QStringLiteral("Ethernet");
|
||||
case AndroidNetworkInfo::Bluetooth:
|
||||
return QStringLiteral("Bluetooth");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
static inline bool isMobile(QNetworkConfiguration::BearerType type)
|
||||
{
|
||||
if (type == QNetworkConfiguration::BearerWLAN
|
||||
|| type == QNetworkConfiguration::BearerWiMAX
|
||||
|| type == QNetworkConfiguration::BearerBluetooth
|
||||
|| type == QNetworkConfiguration::BearerEthernet
|
||||
|| type == QNetworkConfiguration::BearerUnknown) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static QNetworkConfiguration::BearerType getBearerType(const AndroidNetworkInfo &networkInfo)
|
||||
{
|
||||
switch (networkInfo.getType()) {
|
||||
case AndroidNetworkInfo::Mobile:
|
||||
{
|
||||
switch (networkInfo.getSubtype()) {
|
||||
case AndroidNetworkInfo::Gprs:
|
||||
case AndroidNetworkInfo::Edge:
|
||||
case AndroidNetworkInfo::Iden: // 2G
|
||||
return QNetworkConfiguration::Bearer2G;
|
||||
case AndroidNetworkInfo::Umts: // BearerWCDMA (3 .5 .75 G)
|
||||
case AndroidNetworkInfo::Hsdpa: // 3G (?) UMTS
|
||||
case AndroidNetworkInfo::Hsupa: // 3G (?) UMTS
|
||||
return QNetworkConfiguration::BearerWCDMA;
|
||||
case AndroidNetworkInfo::Cdma: // CDMA ISA95[AB]
|
||||
case AndroidNetworkInfo::Cdma1xRTT: // BearerCDMA2000 (3G)
|
||||
case AndroidNetworkInfo::Ehrpd: // CDMA Bridge thing?!?
|
||||
return QNetworkConfiguration::BearerCDMA2000;
|
||||
case AndroidNetworkInfo::Evdo0: // BearerEVDO
|
||||
case AndroidNetworkInfo::EvdoA: // BearerEVDO
|
||||
case AndroidNetworkInfo::EvdoB: // BearerEVDO
|
||||
return QNetworkConfiguration::BearerEVDO;
|
||||
case AndroidNetworkInfo::Hspa:
|
||||
case AndroidNetworkInfo::Hspap: // HSPA+
|
||||
return QNetworkConfiguration::BearerHSPA;
|
||||
case AndroidNetworkInfo::Lte: // BearerLTE (4G)
|
||||
return QNetworkConfiguration::BearerLTE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
case AndroidNetworkInfo::Wifi:
|
||||
return QNetworkConfiguration::BearerWLAN;
|
||||
case AndroidNetworkInfo::Wimax:
|
||||
return QNetworkConfiguration::BearerWiMAX;
|
||||
case AndroidNetworkInfo::Bluetooth:
|
||||
case AndroidNetworkInfo::MobileDun:
|
||||
return QNetworkConfiguration::BearerBluetooth;
|
||||
case AndroidNetworkInfo::Ethernet:
|
||||
return QNetworkConfiguration::BearerEthernet;
|
||||
case AndroidNetworkInfo::MobileMms:
|
||||
case AndroidNetworkInfo::MobileSupl:
|
||||
case AndroidNetworkInfo::MobileHipri:
|
||||
case AndroidNetworkInfo::Dummy:
|
||||
case AndroidNetworkInfo::UnknownType:
|
||||
break;
|
||||
}
|
||||
|
||||
return QNetworkConfiguration::BearerUnknown;
|
||||
}
|
||||
|
||||
QAndroidBearerEngine::QAndroidBearerEngine(QObject *parent)
|
||||
: QBearerEngineImpl(parent),
|
||||
m_connectivityManager(0)
|
||||
{
|
||||
}
|
||||
|
||||
QAndroidBearerEngine::~QAndroidBearerEngine()
|
||||
{
|
||||
}
|
||||
|
||||
QString QAndroidBearerEngine::getInterfaceFromId(const QString &id)
|
||||
{
|
||||
const QMutexLocker locker(&mutex);
|
||||
return m_configurationInterface.value(id);
|
||||
}
|
||||
|
||||
bool QAndroidBearerEngine::hasIdentifier(const QString &id)
|
||||
{
|
||||
const QMutexLocker locker(&mutex);
|
||||
return m_configurationInterface.contains(id);
|
||||
}
|
||||
|
||||
void QAndroidBearerEngine::connectToId(const QString &id)
|
||||
{
|
||||
Q_EMIT connectionError(id, OperationNotSupported);
|
||||
}
|
||||
|
||||
void QAndroidBearerEngine::disconnectFromId(const QString &id)
|
||||
{
|
||||
Q_EMIT connectionError(id, OperationNotSupported);
|
||||
}
|
||||
|
||||
QNetworkSession::State QAndroidBearerEngine::sessionStateForId(const QString &id)
|
||||
{
|
||||
const QMutexLocker locker(&mutex);
|
||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||
|
||||
if ((!ptr || !ptr->isValid) || m_connectivityManager == 0)
|
||||
return QNetworkSession::Invalid;
|
||||
|
||||
const QMutexLocker configLocker(&ptr->mutex);
|
||||
// Don't re-order...
|
||||
if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
||||
return (m_connectivityManager->isActiveNetworkMetered()
|
||||
|| m_connectivityManager->getActiveNetworkInfo().isRoaming())
|
||||
? QNetworkSession::Roaming
|
||||
: QNetworkSession::Connected;
|
||||
} else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
|
||||
return QNetworkSession::Disconnected;
|
||||
} else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
|
||||
return QNetworkSession::NotAvailable;
|
||||
} else if ((ptr->state & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined) {
|
||||
return QNetworkSession::NotAvailable;
|
||||
}
|
||||
|
||||
return QNetworkSession::Invalid;
|
||||
}
|
||||
|
||||
QNetworkConfigurationManager::Capabilities QAndroidBearerEngine::capabilities() const
|
||||
{
|
||||
|
||||
return AndroidTrafficStats::isTrafficStatsSupported()
|
||||
? QNetworkConfigurationManager::ForcedRoaming
|
||||
| QNetworkConfigurationManager::DataStatistics
|
||||
: QNetworkConfigurationManager::ForcedRoaming;
|
||||
|
||||
}
|
||||
|
||||
QNetworkSessionPrivate *QAndroidBearerEngine::createSessionBackend()
|
||||
{
|
||||
return new QNetworkSessionPrivateImpl();
|
||||
}
|
||||
|
||||
QNetworkConfigurationPrivatePointer QAndroidBearerEngine::defaultConfiguration()
|
||||
{
|
||||
return QNetworkConfigurationPrivatePointer();
|
||||
}
|
||||
|
||||
bool QAndroidBearerEngine::requiresPolling() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
quint64 QAndroidBearerEngine::bytesWritten(const QString &id)
|
||||
{
|
||||
QMutexLocker lock(&mutex);
|
||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||
if (!ptr || !ptr->isValid)
|
||||
return 0;
|
||||
|
||||
return isMobile(ptr->bearerType)
|
||||
? AndroidTrafficStats::getMobileTxBytes()
|
||||
: AndroidTrafficStats::getTotalTxBytes() - AndroidTrafficStats::getMobileTxBytes();
|
||||
}
|
||||
|
||||
quint64 QAndroidBearerEngine::bytesReceived(const QString &id)
|
||||
{
|
||||
QMutexLocker lock(&mutex);
|
||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||
if (!ptr || !ptr->isValid)
|
||||
return 0;
|
||||
|
||||
return isMobile(ptr->bearerType)
|
||||
? AndroidTrafficStats::getMobileRxBytes()
|
||||
: AndroidTrafficStats::getTotalRxBytes() - AndroidTrafficStats::getMobileRxBytes();
|
||||
}
|
||||
|
||||
quint64 QAndroidBearerEngine::startTime(const QString &id)
|
||||
{
|
||||
Q_UNUSED(id);
|
||||
return Q_UINT64_C(0);
|
||||
}
|
||||
|
||||
void QAndroidBearerEngine::initialize()
|
||||
{
|
||||
if (m_connectivityManager != 0)
|
||||
return;
|
||||
|
||||
m_connectivityManager = AndroidConnectivityManager::getInstance();
|
||||
if (m_connectivityManager == 0)
|
||||
return;
|
||||
|
||||
updateConfigurations();
|
||||
|
||||
connect(m_connectivityManager, &AndroidConnectivityManager::activeNetworkChanged,
|
||||
this, &QAndroidBearerEngine::updateConfigurations);
|
||||
|
||||
}
|
||||
|
||||
void QAndroidBearerEngine::requestUpdate()
|
||||
{
|
||||
updateConfigurations();
|
||||
}
|
||||
|
||||
void QAndroidBearerEngine::updateConfigurations()
|
||||
{
|
||||
#ifndef QT_NO_NETWORKINTERFACE
|
||||
if (m_connectivityManager == 0)
|
||||
return;
|
||||
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
QStringList oldKeys = accessPointConfigurations.keys();
|
||||
|
||||
// Create a configuration for each of the main types (WiFi, Mobile, Bluetooth, WiMax, Ethernet)
|
||||
foreach (const AndroidNetworkInfo &netInfo, m_connectivityManager->getAllNetworkInfo()) {
|
||||
|
||||
if (!netInfo.isValid())
|
||||
continue;
|
||||
|
||||
const QString name = networkConfType(netInfo);
|
||||
if (name.isEmpty())
|
||||
continue;
|
||||
|
||||
QNetworkConfiguration::BearerType bearerType = getBearerType(netInfo);
|
||||
|
||||
QNetworkConfiguration::StateFlag state;
|
||||
QString interfaceName;
|
||||
if (netInfo.isAvailable()) {
|
||||
if (netInfo.isConnected()) {
|
||||
state = QNetworkConfiguration::Active;
|
||||
// Attempt to map an interface to this configuration
|
||||
const QList<QNetworkInterface> &interfaces = QNetworkInterface::allInterfaces();
|
||||
foreach (const QNetworkInterface &interface, interfaces) {
|
||||
// ignore loopback interface
|
||||
if (!interface.isValid())
|
||||
continue;
|
||||
|
||||
if (interface.flags() & QNetworkInterface::IsLoopBack)
|
||||
continue;
|
||||
// There is no way to get the interface from the NetworkInfo, so
|
||||
// look for an active interface...
|
||||
if (interface.flags() & QNetworkInterface::IsRunning
|
||||
&& !interface.addressEntries().isEmpty()) {
|
||||
interfaceName = interface.humanReadableName();
|
||||
if (interfaceName.isEmpty())
|
||||
interfaceName = interface.name();
|
||||
}
|
||||
}
|
||||
} else if (netInfo.isConnectedOrConnecting()) {
|
||||
state = QNetworkConfiguration::Undefined;
|
||||
} else {
|
||||
state = QNetworkConfiguration::Discovered;
|
||||
}
|
||||
} else {
|
||||
state = QNetworkConfiguration::Defined;
|
||||
}
|
||||
|
||||
const uint identifier = qHash(QLatin1String("android:") + name);
|
||||
const QString id = QString::number(identifier);
|
||||
|
||||
oldKeys.removeAll(id);
|
||||
if (accessPointConfigurations.contains(id)) {
|
||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||
bool changed = false;
|
||||
{
|
||||
const QMutexLocker confLocker(&ptr->mutex);
|
||||
|
||||
if (!ptr->isValid) {
|
||||
ptr->isValid = true;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
// Don't reset the bearer type to 'Unknown'
|
||||
if (ptr->bearerType != QNetworkConfiguration::BearerUnknown
|
||||
&& ptr->bearerType != bearerType) {
|
||||
ptr->bearerType = bearerType;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (ptr->name != name) {
|
||||
ptr->name = name;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (ptr->id != id) {
|
||||
ptr->id = id;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (ptr->state != state) {
|
||||
ptr->state = state;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
QString &oldIfName = m_configurationInterface[id];
|
||||
if (oldIfName != interfaceName) {
|
||||
oldIfName = interfaceName;
|
||||
changed = true;
|
||||
}
|
||||
} // Unlock configuration
|
||||
|
||||
if (changed) {
|
||||
locker.unlock();
|
||||
Q_EMIT configurationChanged(ptr);
|
||||
locker.relock();
|
||||
}
|
||||
} else {
|
||||
QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
|
||||
ptr->name = name;
|
||||
ptr->isValid = true;
|
||||
ptr->id = id;
|
||||
ptr->state = state;
|
||||
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
||||
ptr->bearerType = bearerType;
|
||||
accessPointConfigurations.insert(id, ptr);
|
||||
m_configurationInterface.insert(id, interfaceName);
|
||||
|
||||
locker.unlock();
|
||||
Q_EMIT configurationAdded(ptr);
|
||||
locker.relock();
|
||||
}
|
||||
}
|
||||
|
||||
while (!oldKeys.isEmpty()) {
|
||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(oldKeys.takeFirst());
|
||||
m_configurationInterface.remove(ptr->id);
|
||||
locker.unlock();
|
||||
Q_EMIT configurationRemoved(ptr);
|
||||
locker.relock();
|
||||
}
|
||||
|
||||
} // Unlock engine
|
||||
|
||||
#endif // QT_NO_NETWORKINTERFACE
|
||||
|
||||
Q_EMIT updateCompleted();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_BEARERMANAGEMENT
|
97
src/plugins/bearer/android/src/qandroidbearerengine.h
Normal file
97
src/plugins/bearer/android/src/qandroidbearerengine.h
Normal file
@ -0,0 +1,97 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QANDROIDBEARERENGINE_H
|
||||
#define QANDROIDBEARERENGINE_H
|
||||
|
||||
#include "../../qbearerengine_impl.h"
|
||||
|
||||
#include <QAbstractEventDispatcher>
|
||||
#include <QAbstractNativeEventFilter>
|
||||
#include <QtCore/private/qjni_p.h>
|
||||
|
||||
#ifndef QT_NO_BEARERMANAGEMENT
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QNetworkConfigurationPrivate;
|
||||
class QNetworkSessionPrivate;
|
||||
class AndroidConnectivityManager;
|
||||
|
||||
class QAndroidBearerEngine : public QBearerEngineImpl
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QAndroidBearerEngine(QObject *parent = 0);
|
||||
~QAndroidBearerEngine() Q_DECL_OVERRIDE;
|
||||
|
||||
QString getInterfaceFromId(const QString &id) Q_DECL_OVERRIDE;
|
||||
bool hasIdentifier(const QString &id) Q_DECL_OVERRIDE;
|
||||
void connectToId(const QString &id) Q_DECL_OVERRIDE;
|
||||
void disconnectFromId(const QString &id) Q_DECL_OVERRIDE;
|
||||
QNetworkSession::State sessionStateForId(const QString &id) Q_DECL_OVERRIDE;
|
||||
QNetworkConfigurationManager::Capabilities capabilities() const Q_DECL_OVERRIDE;
|
||||
QNetworkSessionPrivate *createSessionBackend() Q_DECL_OVERRIDE;
|
||||
QNetworkConfigurationPrivatePointer defaultConfiguration() Q_DECL_OVERRIDE;
|
||||
bool requiresPolling() const Q_DECL_OVERRIDE;
|
||||
quint64 bytesWritten(const QString &id) Q_DECL_OVERRIDE;
|
||||
quint64 bytesReceived(const QString &id) Q_DECL_OVERRIDE;
|
||||
quint64 startTime(const QString &id) Q_DECL_OVERRIDE;
|
||||
|
||||
Q_INVOKABLE void initialize();
|
||||
Q_INVOKABLE void requestUpdate();
|
||||
|
||||
private Q_SLOTS:
|
||||
void updateConfigurations();
|
||||
|
||||
private:
|
||||
QJNIObjectPrivate m_networkReceiver;
|
||||
AndroidConnectivityManager *m_connectivityManager;
|
||||
QMap<QString, QString> m_configurationInterface;
|
||||
};
|
||||
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_BEARERMANAGEMENT
|
||||
|
||||
#endif // QANDROIDBEARERENGINE_H
|
17
src/plugins/bearer/android/src/src.pro
Normal file
17
src/plugins/bearer/android/src/src.pro
Normal file
@ -0,0 +1,17 @@
|
||||
include(wrappers/wrappers.pri)
|
||||
|
||||
TARGET = qandroidbearer
|
||||
|
||||
PLUGIN_TYPE = bearer
|
||||
PLUGIN_CLASS_NAME = QAndroidBearerEnginePlugin
|
||||
load(qt_plugin)
|
||||
|
||||
QT = core-private network-private
|
||||
|
||||
HEADERS += qandroidbearerengine.h \
|
||||
../../qnetworksession_impl.h \
|
||||
../../qbearerengine_impl.h
|
||||
|
||||
SOURCES += main.cpp \
|
||||
qandroidbearerengine.cpp \
|
||||
../../qnetworksession_impl.cpp
|
@ -0,0 +1,394 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "androidconnectivitymanager.h"
|
||||
#include <QtCore/private/qjni_p.h>
|
||||
#include <QtCore/private/qjnihelpers_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static inline bool exceptionCheckAndClear(JNIEnv *env)
|
||||
{
|
||||
if (!env->ExceptionCheck())
|
||||
return false;
|
||||
|
||||
#ifdef QT_DEBUG
|
||||
env->ExceptionDescribe();
|
||||
#endif // QT_DEBUG
|
||||
env->ExceptionClear();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct AndroidConnectivityManagerInstance
|
||||
{
|
||||
AndroidConnectivityManagerInstance()
|
||||
: connManager(new AndroidConnectivityManager)
|
||||
{ }
|
||||
~AndroidConnectivityManagerInstance()
|
||||
{
|
||||
delete connManager;
|
||||
}
|
||||
|
||||
AndroidConnectivityManager* connManager;
|
||||
};
|
||||
|
||||
Q_GLOBAL_STATIC(AndroidConnectivityManagerInstance, androidConnManagerInstance)
|
||||
|
||||
static const char networkReceiverClass[] = "org/qtproject/qt5/android/bearer/QtNetworkReceiver";
|
||||
static const char trafficStatsClass[] = "android/net/TrafficStats";
|
||||
|
||||
/**
|
||||
* Returns the number of bytes transmitted over the mobile network since last device boot.
|
||||
*/
|
||||
qint64 AndroidTrafficStats::getMobileTxBytes()
|
||||
{
|
||||
return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
|
||||
"getMobileTxBytes",
|
||||
"()J");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of bytes received over the mobile network since last device boot.
|
||||
*/
|
||||
qint64 AndroidTrafficStats::getMobileRxBytes()
|
||||
{
|
||||
return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
|
||||
"getMobileRxBytes",
|
||||
"()J");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total transmitted bytes since last device boot.
|
||||
*/
|
||||
qint64 AndroidTrafficStats::getTotalTxBytes()
|
||||
{
|
||||
return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
|
||||
"getTotalTxBytes",
|
||||
"()J");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total received bytes since last device boot.
|
||||
*/
|
||||
qint64 AndroidTrafficStats::getTotalRxBytes()
|
||||
{
|
||||
return QJNIObjectPrivate::callStaticMethod<jlong>(trafficStatsClass,
|
||||
"getTotalRxBytes",
|
||||
"()J");
|
||||
}
|
||||
|
||||
bool AndroidTrafficStats::isTrafficStatsSupported()
|
||||
{
|
||||
// Before API level 18 DataStatistics might not be supported, so make sure that we get something
|
||||
// else then -1 from from getXXBytes().
|
||||
return (AndroidTrafficStats::getMobileRxBytes() != -1
|
||||
&& AndroidTrafficStats::getTotalRxBytes() != -1);
|
||||
}
|
||||
|
||||
static AndroidNetworkInfo::NetworkState stateForName(const QString stateName)
|
||||
{
|
||||
if (stateName == QLatin1String("CONNECTED"))
|
||||
return AndroidNetworkInfo::Connected;
|
||||
else if (stateName == QLatin1String("CONNECTING"))
|
||||
return AndroidNetworkInfo::Connecting;
|
||||
else if (stateName == QLatin1String("DISCONNECTED"))
|
||||
return AndroidNetworkInfo::Disconnected;
|
||||
else if (stateName == QLatin1String("DISCONNECTING"))
|
||||
return AndroidNetworkInfo::Disconnecting;
|
||||
else if (stateName == QLatin1String("SUSPENDED"))
|
||||
return AndroidNetworkInfo::Suspended;
|
||||
|
||||
return AndroidNetworkInfo::UnknownState;
|
||||
}
|
||||
|
||||
AndroidNetworkInfo::NetworkState AndroidNetworkInfo::getDetailedState() const
|
||||
{
|
||||
QJNIObjectPrivate enumObject = m_networkInfo.callObjectMethod("getDetailedState",
|
||||
"()Landroid/net/NetworkInfo$DetailedState;");
|
||||
if (!enumObject.isValid())
|
||||
return UnknownState;
|
||||
|
||||
QJNIObjectPrivate enumName = enumObject.callObjectMethod<jstring>("name");
|
||||
if (!enumName.isValid())
|
||||
return UnknownState;
|
||||
|
||||
return stateForName(enumName.toString());
|
||||
}
|
||||
|
||||
QString AndroidNetworkInfo::getExtraInfo() const
|
||||
{
|
||||
QJNIObjectPrivate extraInfo = m_networkInfo.callObjectMethod<jstring>("getExtraInfo");
|
||||
if (!extraInfo.isValid())
|
||||
return QString();
|
||||
|
||||
return extraInfo.toString();
|
||||
}
|
||||
|
||||
QString AndroidNetworkInfo::getReason() const
|
||||
{
|
||||
QJNIObjectPrivate reason = m_networkInfo.callObjectMethod<jstring>("getReason");
|
||||
if (!reason.isValid())
|
||||
return QString();
|
||||
|
||||
return reason.toString();
|
||||
}
|
||||
|
||||
AndroidNetworkInfo::NetworkState AndroidNetworkInfo::getState() const
|
||||
{
|
||||
QJNIObjectPrivate enumObject = m_networkInfo.callObjectMethod("getState",
|
||||
"()Landroid/net/NetworkInfo$State;");
|
||||
if (!enumObject.isValid())
|
||||
return UnknownState;
|
||||
|
||||
QJNIObjectPrivate enumName = enumObject.callObjectMethod<jstring>("name");
|
||||
if (!enumName.isValid())
|
||||
return UnknownState;
|
||||
|
||||
return stateForName(enumName.toString());
|
||||
}
|
||||
|
||||
AndroidNetworkInfo::NetworkSubType AndroidNetworkInfo::getSubtype() const
|
||||
{
|
||||
return AndroidNetworkInfo::NetworkSubType(m_networkInfo.callMethod<jint>("getSubtype"));
|
||||
}
|
||||
|
||||
QString AndroidNetworkInfo::getSubtypeName() const
|
||||
{
|
||||
QJNIObjectPrivate subtypeName = m_networkInfo.callObjectMethod<jstring>("getSubtypeName");
|
||||
if (!subtypeName.isValid())
|
||||
return QString();
|
||||
|
||||
return subtypeName.toString();
|
||||
}
|
||||
|
||||
AndroidNetworkInfo::NetworkType AndroidNetworkInfo::getType() const
|
||||
{
|
||||
return AndroidNetworkInfo::NetworkType(m_networkInfo.callMethod<jint>("getType"));
|
||||
}
|
||||
|
||||
QString AndroidNetworkInfo::getTypeName() const
|
||||
{
|
||||
QJNIObjectPrivate typeName = m_networkInfo.callObjectMethod<jstring>("getTypeName");
|
||||
if (!typeName.isValid())
|
||||
return QString();
|
||||
|
||||
return typeName.toString();
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isAvailable() const
|
||||
{
|
||||
return m_networkInfo.callMethod<jboolean>("isAvailable");
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isConnected() const
|
||||
{
|
||||
return m_networkInfo.callMethod<jboolean>("isConnected");
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isConnectedOrConnecting() const
|
||||
{
|
||||
return m_networkInfo.callMethod<jboolean>("isConnectedOrConnecting");
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isFailover() const
|
||||
{
|
||||
return m_networkInfo.callMethod<jboolean>("isFailover");
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isRoaming() const
|
||||
{
|
||||
return m_networkInfo.callMethod<jboolean>("isRoaming");
|
||||
}
|
||||
|
||||
bool AndroidNetworkInfo::isValid() const
|
||||
{
|
||||
return m_networkInfo.isValid();
|
||||
}
|
||||
|
||||
AndroidConnectivityManager::AndroidConnectivityManager()
|
||||
{
|
||||
QJNIEnvironmentPrivate env;
|
||||
if (!registerNatives(env))
|
||||
return;
|
||||
|
||||
m_connectivityManager = QJNIObjectPrivate::callStaticObjectMethod(networkReceiverClass,
|
||||
"getConnectivityManager",
|
||||
"(Landroid/app/Activity;)Landroid/net/ConnectivityManager;",
|
||||
QtAndroidPrivate::activity());
|
||||
if (!m_connectivityManager.isValid())
|
||||
return;
|
||||
|
||||
QJNIObjectPrivate::callStaticMethod<void>(networkReceiverClass,
|
||||
"registerReceiver",
|
||||
"(Landroid/app/Activity;)V",
|
||||
QtAndroidPrivate::activity());
|
||||
}
|
||||
|
||||
AndroidConnectivityManager *AndroidConnectivityManager::getInstance()
|
||||
{
|
||||
return androidConnManagerInstance->connManager->isValid()
|
||||
? androidConnManagerInstance->connManager
|
||||
: 0;
|
||||
}
|
||||
|
||||
AndroidConnectivityManager::~AndroidConnectivityManager()
|
||||
{
|
||||
QJNIObjectPrivate::callStaticMethod<void>(networkReceiverClass,
|
||||
"unregisterReceiver",
|
||||
"(Landroid/app/Activity;)V",
|
||||
QtAndroidPrivate::activity());
|
||||
}
|
||||
|
||||
AndroidNetworkInfo AndroidConnectivityManager::getActiveNetworkInfo() const
|
||||
{
|
||||
QJNIObjectPrivate networkInfo = m_connectivityManager.callObjectMethod("getActiveNetworkInfo",
|
||||
"()Landroid/net/NetworkInfo;");
|
||||
return networkInfo;
|
||||
}
|
||||
|
||||
QList<AndroidNetworkInfo> AndroidConnectivityManager::getAllNetworkInfo() const
|
||||
{
|
||||
QJNIEnvironmentPrivate env;
|
||||
QJNIObjectPrivate objArray = m_connectivityManager.callObjectMethod("getAllNetworkInfo",
|
||||
"()[Landroid/net/NetworkInfo;");
|
||||
QList<AndroidNetworkInfo> list;
|
||||
if (!objArray.isValid())
|
||||
return list;
|
||||
|
||||
const jsize length = env->GetArrayLength(static_cast<jarray>(objArray.object()));
|
||||
if (exceptionCheckAndClear(env))
|
||||
return list;
|
||||
|
||||
for (int i = 0; i != length; ++i) {
|
||||
jobject lref = env->GetObjectArrayElement(static_cast<jobjectArray>(objArray.object()), i);
|
||||
if (exceptionCheckAndClear(env))
|
||||
break;
|
||||
|
||||
list << AndroidNetworkInfo(lref);
|
||||
env->DeleteLocalRef(lref);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
bool AndroidConnectivityManager::getBackgroundDataSetting() const
|
||||
{
|
||||
return m_connectivityManager.callMethod<jboolean>("getBackgroundDataSetting");
|
||||
}
|
||||
|
||||
AndroidNetworkInfo AndroidConnectivityManager::getNetworkInfo(int networkType) const
|
||||
{
|
||||
QJNIObjectPrivate networkInfo = m_connectivityManager.callObjectMethod("getNetworkInfo",
|
||||
"(I)Landroid/net/NetworkInfo;",
|
||||
networkType);
|
||||
return networkInfo;
|
||||
}
|
||||
|
||||
int AndroidConnectivityManager::getNetworkPreference() const
|
||||
{
|
||||
return m_connectivityManager.callMethod<jint>("getNetworkPreference");
|
||||
}
|
||||
|
||||
bool AndroidConnectivityManager::isActiveNetworkMetered() const
|
||||
{
|
||||
// This function was added in JB
|
||||
if (QtAndroidPrivate::androidSdkVersion() < 16)
|
||||
return false;
|
||||
|
||||
return m_connectivityManager.callMethod<jboolean>("isActiveNetworkMetered");
|
||||
}
|
||||
|
||||
bool AndroidConnectivityManager::isNetworkTypeValid(int networkType)
|
||||
{
|
||||
return QJNIObjectPrivate::callStaticMethod<jboolean>("android/net/ConnectivityManager",
|
||||
"isNetworkTypeValid",
|
||||
"(I)Z",
|
||||
networkType);
|
||||
}
|
||||
|
||||
bool AndroidConnectivityManager::requestRouteToHost(int networkType, int hostAddress)
|
||||
{
|
||||
return m_connectivityManager.callMethod<jboolean>("requestRouteToHost", "(II)Z", networkType, hostAddress);
|
||||
}
|
||||
|
||||
void AndroidConnectivityManager::setNetworkPreference(int preference)
|
||||
{
|
||||
m_connectivityManager.callMethod<void>("setNetworkPreference", "(I)V", preference);
|
||||
}
|
||||
|
||||
int AndroidConnectivityManager::startUsingNetworkFeature(int networkType, const QString &feature)
|
||||
{
|
||||
QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature);
|
||||
return m_connectivityManager.callMethod<jint>("startUsingNetworkFeature",
|
||||
"(ILjava/lang/String;)I",
|
||||
networkType,
|
||||
jfeature.object());
|
||||
}
|
||||
|
||||
int AndroidConnectivityManager::stopUsingNetworkFeature(int networkType, const QString &feature)
|
||||
{
|
||||
QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature);
|
||||
return m_connectivityManager.callMethod<jint>("stopUsingNetworkFeature",
|
||||
"(ILjava/lang/String;)I",
|
||||
networkType,
|
||||
jfeature.object());
|
||||
}
|
||||
|
||||
static void activeNetworkInfoChanged()
|
||||
{
|
||||
Q_EMIT androidConnManagerInstance->connManager->activeNetworkChanged();
|
||||
}
|
||||
|
||||
bool AndroidConnectivityManager::registerNatives(JNIEnv *env)
|
||||
{
|
||||
QJNIObjectPrivate networkReceiver(networkReceiverClass);
|
||||
if (!networkReceiver.isValid())
|
||||
return false;
|
||||
|
||||
jclass clazz = env->GetObjectClass(networkReceiver.object());
|
||||
static JNINativeMethod method = {"activeNetworkInfoChanged", "()V", reinterpret_cast<void *>(activeNetworkInfoChanged)};
|
||||
const bool ret = (env->RegisterNatives(clazz, &method, 1) == JNI_OK);
|
||||
env->DeleteLocalRef(clazz);
|
||||
return ret;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -0,0 +1,170 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ANDROIDCONNECTIVITYMANAGER_H
|
||||
#define ANDROIDCONNECTIVITYMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QtCore/private/qjni_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class AndroidTrafficStats
|
||||
{
|
||||
public:
|
||||
static qint64 getMobileTxBytes();
|
||||
static qint64 getMobileRxBytes();
|
||||
static qint64 getTotalTxBytes();
|
||||
static qint64 getTotalRxBytes();
|
||||
static bool isTrafficStatsSupported();
|
||||
};
|
||||
|
||||
class AndroidNetworkInfo
|
||||
{
|
||||
public:
|
||||
// Needs to be in sync with the values from the android api.
|
||||
enum NetworkState {
|
||||
UnknownState,
|
||||
Authenticating,
|
||||
Blocked,
|
||||
CaptivePortalCheck,
|
||||
Connected,
|
||||
Connecting,
|
||||
Disconnected,
|
||||
Disconnecting,
|
||||
Failed,
|
||||
Idle,
|
||||
ObtainingIpAddr,
|
||||
Scanning,
|
||||
Suspended,
|
||||
VerifyingPoorLink
|
||||
};
|
||||
|
||||
enum NetworkType {
|
||||
Mobile,
|
||||
Wifi,
|
||||
MobileMms,
|
||||
MobileSupl,
|
||||
MobileDun,
|
||||
MobileHipri,
|
||||
Wimax,
|
||||
Bluetooth,
|
||||
Dummy,
|
||||
Ethernet,
|
||||
UnknownType
|
||||
};
|
||||
|
||||
enum NetworkSubType {
|
||||
UnknownSubType,
|
||||
Gprs,
|
||||
Edge,
|
||||
Umts,
|
||||
Cdma,
|
||||
Evdo0,
|
||||
EvdoA,
|
||||
Cdma1xRTT,
|
||||
Hsdpa,
|
||||
Hsupa,
|
||||
Hspa,
|
||||
Iden,
|
||||
EvdoB,
|
||||
Lte,
|
||||
Ehrpd,
|
||||
Hspap
|
||||
};
|
||||
|
||||
inline AndroidNetworkInfo(const QJNIObjectPrivate &obj) : m_networkInfo(obj)
|
||||
{ }
|
||||
|
||||
NetworkState getDetailedState() const;
|
||||
QString getExtraInfo() const;
|
||||
QString getReason() const;
|
||||
NetworkState getState() const;
|
||||
NetworkSubType getSubtype() const;
|
||||
QString getSubtypeName() const;
|
||||
NetworkType getType() const;
|
||||
QString getTypeName() const;
|
||||
bool isAvailable() const;
|
||||
bool isConnected() const;
|
||||
bool isConnectedOrConnecting() const;
|
||||
bool isFailover() const;
|
||||
bool isRoaming() const;
|
||||
bool isValid() const;
|
||||
|
||||
private:
|
||||
QJNIObjectPrivate m_networkInfo;
|
||||
};
|
||||
|
||||
class AndroidConnectivityManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static AndroidConnectivityManager *getInstance();
|
||||
~AndroidConnectivityManager();
|
||||
|
||||
AndroidNetworkInfo getActiveNetworkInfo() const;
|
||||
QList<AndroidNetworkInfo> getAllNetworkInfo() const;
|
||||
bool getBackgroundDataSetting() const;
|
||||
AndroidNetworkInfo getNetworkInfo(int networkType) const;
|
||||
int getNetworkPreference() const;
|
||||
bool isActiveNetworkMetered() const;
|
||||
static bool isNetworkTypeValid(int networkType);
|
||||
bool requestRouteToHost(int networkType, int hostAddress);
|
||||
void setNetworkPreference(int preference);
|
||||
int startUsingNetworkFeature(int networkType, const QString &feature);
|
||||
int stopUsingNetworkFeature(int networkType, const QString &feature);
|
||||
inline bool isValid() const
|
||||
{
|
||||
return m_connectivityManager.isValid();
|
||||
}
|
||||
|
||||
Q_SIGNAL void activeNetworkChanged();
|
||||
|
||||
private:
|
||||
friend struct AndroidConnectivityManagerInstance;
|
||||
AndroidConnectivityManager();
|
||||
bool registerNatives(JNIEnv *env);
|
||||
QJNIObjectPrivate m_connectivityManager;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // ANDROIDCONNECTIVITYMANAGER_H
|
6
src/plugins/bearer/android/src/wrappers/wrappers.pri
Normal file
6
src/plugins/bearer/android/src/wrappers/wrappers.pri
Normal file
@ -0,0 +1,6 @@
|
||||
INCLUDEPATH += $$PWD
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/androidconnectivitymanager.h
|
||||
SOURCES += \
|
||||
$$PWD/androidconnectivitymanager.cpp
|
@ -11,5 +11,6 @@ blackberry:SUBDIRS += blackberry
|
||||
win32:!wince*:SUBDIRS += nativewifi
|
||||
mac:contains(QT_CONFIG, corewlan):SUBDIRS += corewlan
|
||||
mac:SUBDIRS += generic
|
||||
android:!android-no-sdk:SUBDIRS += android
|
||||
|
||||
isEmpty(SUBDIRS):SUBDIRS = generic
|
||||
|
Loading…
Reference in New Issue
Block a user