summaryrefslogtreecommitdiffstats
path: root/src/plugins/bearer/android
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2014-10-10 14:23:00 +0200
committerCaroline Chao <caroline.chao@theqtcompany.com>2014-10-27 08:33:07 +0100
commit81998b4e8e440076bd22a9164f0a93481c0e597a (patch)
treebd509f30d45ed58d45a6103b412a80e55d756b1d /src/plugins/bearer/android
parent0ca0ecdb32b3d7df76fe9782d04493ebe0da0a9e (diff)
Android: Fix android bearer implementation.
1. If the interface used by a configuration changes, remove the whole configuration and replace it with a new one (instead of updating it). While this isn't intuitive, this is the exact behavior we used to have on android when using the generic plugin... 2. Setting the session state to roaming is not correct in this context as it's a transitional state where we should end up in connected state (forced roaming). Before this patch we would get stuck in the roaming state for mobile networks. 4. Use QNetworkInterface::name() instead of QNetworkInterface::humanReadableName(), as this is the expected value when querying the interface used. 3. Don't re-iterate through the interface list for each configuration. Task-number: QTBUG-41832 Change-Id: I315f725434bc6a1a8dca13dffd41f606c87bd06d Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Diffstat (limited to 'src/plugins/bearer/android')
-rw-r--r--src/plugins/bearer/android/src/qandroidbearerengine.cpp41
1 files changed, 14 insertions, 27 deletions
diff --git a/src/plugins/bearer/android/src/qandroidbearerengine.cpp b/src/plugins/bearer/android/src/qandroidbearerengine.cpp
index 2d047ba612..64c1a20ecc 100644
--- a/src/plugins/bearer/android/src/qandroidbearerengine.cpp
+++ b/src/plugins/bearer/android/src/qandroidbearerengine.cpp
@@ -166,10 +166,7 @@ QNetworkSession::State QAndroidBearerEngine::sessionStateForId(const QString &id
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;
+ return QNetworkSession::Connected;
} else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
return QNetworkSession::Disconnected;
} else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
@@ -267,6 +264,10 @@ void QAndroidBearerEngine::updateConfigurations()
QMutexLocker locker(&mutex);
QStringList oldKeys = accessPointConfigurations.keys();
+ QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
+ if (interfaces.isEmpty())
+ interfaces = QNetworkInterface::allInterfaces();
+
// Create a configuration for each of the main types (WiFi, Mobile, Bluetooth, WiMax, Ethernet)
foreach (const AndroidNetworkInfo &netInfo, m_connectivityManager->getAllNetworkInfo()) {
@@ -279,14 +280,13 @@ void QAndroidBearerEngine::updateConfigurations()
QNetworkConfiguration::BearerType bearerType = getBearerType(netInfo);
- QNetworkConfiguration::StateFlag state;
QString interfaceName;
+ QNetworkConfiguration::StateFlag state = QNetworkConfiguration::Defined;
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) {
+ while (!interfaces.isEmpty()) {
+ QNetworkInterface interface = interfaces.takeFirst();
// ignore loopback interface
if (!interface.isValid())
continue;
@@ -297,22 +297,17 @@ void QAndroidBearerEngine::updateConfigurations()
// look for an active interface...
if (interface.flags() & QNetworkInterface::IsRunning
&& !interface.addressEntries().isEmpty()) {
- interfaceName = interface.humanReadableName();
- if (interfaceName.isEmpty())
- interfaceName = interface.name();
+ state = QNetworkConfiguration::Active;
+ interfaceName = interface.name();
+ break;
}
}
- } 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);
+ const QString key = QString(QLatin1String("android:%1:%2")).arg(name).arg(interfaceName);
+ const QString id = QString::number(qHash(key));
+ m_configurationInterface[id] = interfaceName;
oldKeys.removeAll(id);
if (accessPointConfigurations.contains(id)) {
@@ -347,12 +342,6 @@ void QAndroidBearerEngine::updateConfigurations()
ptr->state = state;
changed = true;
}
-
- QString &oldIfName = m_configurationInterface[id];
- if (oldIfName != interfaceName) {
- oldIfName = interfaceName;
- changed = true;
- }
} // Unlock configuration
if (changed) {
@@ -369,8 +358,6 @@ void QAndroidBearerEngine::updateConfigurations()
ptr->type = QNetworkConfiguration::InternetAccessPoint;
ptr->bearerType = bearerType;
accessPointConfigurations.insert(id, ptr);
- m_configurationInterface.insert(id, interfaceName);
-
locker.unlock();
Q_EMIT configurationAdded(ptr);
locker.relock();