From 1df66a18d10b7d4f69ae9c6f71e8b4e009693bd9 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Thu, 17 Oct 2013 13:23:08 +0200 Subject: [PATCH] Android: Rework sdkTargets() to cache the output of adb Also rename/change highestAvailablePlatform to highestAvailableSdk. This fixes a bug reported on irc, where the lists for sdk and ndk were different and the highestAvailablePlatform was not available as in the sdk. Change-Id: I17fec9e8ce1913e933ddcf8eaa21d6bb6e14c5be Reviewed-by: BogDan Vatra --- src/plugins/android/androidconfigurations.cpp | 37 ++++++++++++++----- src/plugins/android/androidconfigurations.h | 5 ++- src/plugins/android/androiddeployqtstep.cpp | 2 +- src/plugins/android/androidmanager.cpp | 2 +- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 392f4ee9d87..543c66ab26a 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -224,6 +224,7 @@ void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs) save(); updateAvailableNdkPlatforms(); + updateAvailableSdkPlatforms(); updateAutomaticKitList(); updateAndroidDevice(); emit updated(); @@ -241,25 +242,38 @@ void AndroidConfigurations::updateAvailableNdkPlatforms() qSort(m_availableNdkPlatforms.begin(), m_availableNdkPlatforms.end(), qGreater()); } -QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const +void AndroidConfigurations::updateAvailableSdkPlatforms() { - QStringList targets; + m_availableSdkPlatforms.clear(); + QProcess proc; proc.start(androidToolPath().toString(), QStringList() << QLatin1String("list") << QLatin1String("target")); // list avaialbe AVDs if (!proc.waitForFinished(-1)) { proc.terminate(); - return targets; + return; } while (proc.canReadLine()) { const QString line = QString::fromLocal8Bit(proc.readLine().trimmed()); int index = line.indexOf(QLatin1String("\"android-")); if (index == -1) continue; - QString apiLevel = line.mid(index + 1, line.length() - index - 2); - if (apiLevel.mid(apiLevel.lastIndexOf(QLatin1Char('-')) + 1).toInt() >= minApiLevel) - targets.push_back(apiLevel); + QString androidTarget = line.mid(index + 1, line.length() - index - 2); + int apiLevel = androidTarget.mid(androidTarget.lastIndexOf(QLatin1Char('-')) + 1).toInt(); + QVector::iterator it = qLowerBound(m_availableSdkPlatforms.begin(), m_availableSdkPlatforms.end(), apiLevel, qGreater()); + m_availableSdkPlatforms.insert(it, apiLevel); } - return targets; +} + +QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const +{ + QStringList result; + for (int i = 0; i < m_availableSdkPlatforms.size(); ++i) { + if (m_availableSdkPlatforms.at(i) >= minApiLevel) + result << QLatin1String("android-") + QString::number(m_availableSdkPlatforms.at(i)); + else + break; + } + return result; } FileName AndroidConfigurations::adbToolPath() const @@ -470,6 +484,8 @@ QString AndroidConfigurations::createAVD(int minApiLevel, QString targetArch) co QDialog d; Ui::AddNewAVDDialog avdDialog; avdDialog.setupUi(&d); + // NOTE: adb list targets does actually include information on which abis are supported per apilevel + // we aren't using that information here avdDialog.targetComboBox->addItems(sdkTargets(minApiLevel)); if (targetArch.isEmpty()) @@ -735,11 +751,11 @@ QStringList AndroidConfigurations::getAbis(const QString &device) const return result; } -QString AndroidConfigurations::highestAvailableAndroidPlatform() const +QString AndroidConfigurations::highestAndroidSdk() const { - if (m_availableNdkPlatforms.isEmpty()) + if (m_availableSdkPlatforms.isEmpty()) return QString(); - return QLatin1String("android-") + QString::number(m_availableNdkPlatforms.first()); + return QLatin1String("android-") + QString::number(m_availableSdkPlatforms.first()); } QString AndroidConfigurations::bestNdkPlatformMatch(const QString &targetAPI) const @@ -902,6 +918,7 @@ AndroidConfigurations::AndroidConfigurations(QObject *parent) { load(); updateAvailableNdkPlatforms(); + updateAvailableSdkPlatforms(); connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(clearDefaultDevices(ProjectExplorer::Project*))); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 5fc114c355c..64d7e080684 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -124,7 +124,7 @@ public: AndroidDeviceInfo showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi); void setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber); // serial number or avd name QString defaultDevice(ProjectExplorer::Project *project, const QString &abi) const; // serial number or avd name - QString highestAvailableAndroidPlatform() const; + QString highestAndroidSdk() const; public slots: void clearDefaultDevices(ProjectExplorer::Project *project); @@ -146,11 +146,14 @@ private: int getSDKVersion(const QString &device) const; QStringList getAbis(const QString &device) const; void updateAvailableNdkPlatforms(); + void updateAvailableSdkPlatforms(); static AndroidConfigurations *m_instance; AndroidConfig m_config; QVector m_availableNdkPlatforms; + QVector m_availableSdkPlatforms; + mutable QHash m_serialNumberToDeviceName; QMap > m_defaultDeviceForAbi; diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index f4df82f5289..f2ea0956ec4 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -158,7 +158,7 @@ void AndroidDeployQtStep::ctor() m_verbose = false; // will be overwriten by settings if the user choose something different - m_buildTargetSdk = AndroidConfigurations::instance().highestAvailableAndroidPlatform(); + m_buildTargetSdk = AndroidConfigurations::instance().highestAndroidSdk(); connect(project(), SIGNAL(proFilesEvaluated()), this, SLOT(updateInputFile())); diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index e90b6b2c0bf..1b0a1d503f1 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -620,7 +620,7 @@ bool AndroidManager::createAndroidTemplatesIfNecessary(ProjectExplorer::Target * return false; } - updateTarget(target, AndroidConfigurations::instance().sdkTargets(minApiLevel).at(0)); + updateTarget(target, sdks.first()); QStringList apps = availableTargetApplications(target); if (!apps.isEmpty()) setTargetApplication(target, apps.at(0));