From 81998b4e8e440076bd22a9164f0a93481c0e597a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Fri, 10 Oct 2014 14:23:00 +0200 Subject: 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 --- .../bearer/android/src/qandroidbearerengine.cpp | 41 ++++++++-------------- 1 file changed, 14 insertions(+), 27 deletions(-) (limited to 'src') 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 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 &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(); -- cgit v1.2.3