diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro index e17c7e284be..7feab8752ff 100644 --- a/src/plugins/android/android.pro +++ b/src/plugins/android/android.pro @@ -53,7 +53,8 @@ HEADERS += \ androidsdkpackage.h \ androidsdkmodel.h \ androidsdkmanagerwidget.h \ - androidpackageinstallationstep.h + androidpackageinstallationstep.h \ + androidextralibrarylistmodel.h SOURCES += \ androidconfigurations.cpp \ @@ -100,7 +101,8 @@ SOURCES += \ androidsdkpackage.cpp \ androidsdkmodel.cpp \ androidsdkmanagerwidget.cpp \ - androidpackageinstallationstep.cpp + androidpackageinstallationstep.cpp \ + androidextralibrarylistmodel.cpp FORMS += \ androidsettingswidget.ui \ diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs index b573d3883be..501f9bb80cf 100644 --- a/src/plugins/android/android.qbs +++ b/src/plugins/android/android.qbs @@ -55,6 +55,8 @@ Project { "androiddevicefactory.h", "androiderrormessage.h", "androiderrormessage.cpp", + "androidextralibrarylistmodel.cpp", + "androidextralibrarylistmodel.h", "androidgdbserverkitinformation.cpp", "androidgdbserverkitinformation.h", "androidglobal.h", diff --git a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp b/src/plugins/android/androidextralibrarylistmodel.cpp similarity index 65% rename from src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp rename to src/plugins/android/androidextralibrarylistmodel.cpp index 2d2647196ac..70f68749226 100644 --- a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp +++ b/src/plugins/android/androidextralibrarylistmodel.cpp @@ -26,18 +26,14 @@ #include "androidextralibrarylistmodel.h" +#include +#include + +#include #include #include -#include -#include - -#include - - -using namespace QmakeAndroidSupport; -using namespace Internal; -using QmakeProjectManager::QmakeProject; +namespace Android { AndroidExtraLibraryListModel::AndroidExtraLibraryListModel(ProjectExplorer::Target *target, QObject *parent) @@ -86,20 +82,18 @@ QVariant AndroidExtraLibraryListModel::data(const QModelIndex &index, int role) void AndroidExtraLibraryListModel::updateModel() { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro || pro->parseInProgress()) { + AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + + if (qtSupport->parseInProgress(m_target)) { emit enabledChanged(false); return; } - m_scope = QLatin1String("contains(ANDROID_TARGET_ARCH,") - + pro->singleVariableValue(QmakeProjectManager::Variable::AndroidArch) - + QLatin1Char(')'); - bool enabled; beginResetModel(); - if (pro->validParse() && pro->projectType() == QmakeProjectManager::ProjectType::ApplicationTemplate) { - m_entries = pro->variableValue(QmakeProjectManager::Variable::AndroidExtraLibs); + if (qtSupport->validParse(m_target)) { + m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target); enabled = true; } else { // parsing error or not a application template @@ -111,37 +105,19 @@ void AndroidExtraLibraryListModel::updateModel() emit enabledChanged(enabled); } -QmakeProjectManager::QmakeProFile *AndroidExtraLibraryListModel::activeProFile() const -{ - ProjectExplorer::RunConfiguration *rc = m_target->activeRunConfiguration(); - if (!rc) - return nullptr; - auto project = static_cast(m_target->project()); - return project->rootProFile()->findProFile(Utils::FileName::fromString(rc->buildKey())); -} - -bool AndroidExtraLibraryListModel::isEnabled() const -{ - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - return pro && !pro->parseInProgress() && pro->projectType() == QmakeProjectManager::ProjectType::ApplicationTemplate; -} - void AndroidExtraLibraryListModel::addEntries(const QStringList &list) { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro || pro->projectType() != QmakeProjectManager::ProjectType::ApplicationTemplate) - return; + AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + Utils::FileName projectFilePath = qtSupport->projectFilePath(m_target); beginInsertRows(QModelIndex(), m_entries.size(), m_entries.size() + list.size()); - foreach (const QString &path, list) - m_entries += QLatin1String("$$PWD/") - + pro->filePath().toFileInfo().absoluteDir().relativeFilePath(path); - - pro->setProVariable("ANDROID_EXTRA_LIBS", m_entries, m_scope, - QmakeProjectManager::Internal::ProWriter::ReplaceValues - | QmakeProjectManager::Internal::ProWriter::MultiLine); + const QDir dir = qtSupport->projectFilePath(m_target).toFileInfo().absoluteDir(); + for (const QString &path : list) + m_entries += "$$PWD/" + dir.relativeFilePath(path); + qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target); endInsertRows(); } @@ -152,10 +128,7 @@ bool greaterModelIndexByRow(const QModelIndex &a, const QModelIndex &b) void AndroidExtraLibraryListModel::removeEntries(QModelIndexList list) { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro) - return; - if (list.isEmpty() || !pro || pro->projectType() != QmakeProjectManager::ProjectType::ApplicationTemplate) + if (list.isEmpty()) return; std::sort(list.begin(), list.end(), greaterModelIndexByRow); @@ -174,5 +147,9 @@ void AndroidExtraLibraryListModel::removeEntries(QModelIndexList list) endRemoveRows(); } - pro->setProVariable(QLatin1String("ANDROID_EXTRA_LIBS"), m_entries, m_scope); + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target); } + +} // Android diff --git a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.h b/src/plugins/android/androidextralibrarylistmodel.h similarity index 85% rename from src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.h rename to src/plugins/android/androidextralibrarylistmodel.h index 460b7c20cf8..3c4213668a9 100644 --- a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.h +++ b/src/plugins/android/androidextralibrarylistmodel.h @@ -26,6 +26,8 @@ #pragma once +#include "android_global.h" + #include #include @@ -34,12 +36,9 @@ class RunConfiguration; class Target; } -namespace QmakeProjectManager { class QmakeProFile; } +namespace Android { -namespace QmakeAndroidSupport { - -namespace Internal { -class AndroidExtraLibraryListModel : public QAbstractItemModel +class ANDROID_EXPORT AndroidExtraLibraryListModel : public QAbstractItemModel { Q_OBJECT public: @@ -55,19 +54,14 @@ public: void removeEntries(QModelIndexList list); void addEntries(const QStringList &list); - bool isEnabled() const; - signals: void enabledChanged(bool); private: void updateModel(); - QmakeProjectManager::QmakeProFile *activeProFile() const; ProjectExplorer::Target *m_target; QStringList m_entries; - QString m_scope; }; -} // namespace Internal -} // namespace QmakeAndroidSupport +} // namespace Android diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h index e4096c3c9fb..3270e99b270 100644 --- a/src/plugins/android/androidqtsupport.h +++ b/src/plugins/android/androidqtsupport.h @@ -47,6 +47,7 @@ namespace Constants { const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; const char AndroidExtraLibs[] = "AndroidExtraLibs"; +const char AndroidArch[] = "AndroidArch"; } // namespace Constants @@ -73,6 +74,13 @@ public: virtual QString targetDataItem(Core::Id role, const ProjectExplorer::Target *target) const = 0; virtual QStringList targetData(Core::Id role, const ProjectExplorer::Target *target) const = 0; + virtual bool setTargetData(Core::Id role, const QStringList &values, + const ProjectExplorer::Target *target) const = 0; + + virtual bool parseInProgress(const ProjectExplorer::Target *target) const = 0; + virtual bool validParse(const ProjectExplorer::Target *target) const = 0; + virtual bool extraLibraryEnabled(const ProjectExplorer::Target *target) const = 0; + virtual Utils::FileName projectFilePath(const ProjectExplorer::Target *target) const = 0; }; } // namespace Android diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp index cf3412688f2..e2aa077a39a 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp @@ -41,6 +41,8 @@ #include #include +using namespace Android; + namespace QmakeAndroidSupport { namespace Internal { @@ -108,7 +110,9 @@ QmakeAndroidBuildApkWidget::QmakeAndroidBuildApkWidget(Android::AndroidBuildApkS connect(m_extraLibraryListModel, &AndroidExtraLibraryListModel::enabledChanged, additionalLibrariesGroupBox, &QWidget::setEnabled); - additionalLibrariesGroupBox->setEnabled(m_extraLibraryListModel->isEnabled()); + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_step->target()); + QTC_ASSERT(qtSupport, return); + additionalLibrariesGroupBox->setEnabled(qtSupport->extraLibraryEnabled(m_step->target())); } void QmakeAndroidBuildApkWidget::createAndroidTemplatesButton() diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h index d10479e776f..2a65d9ea980 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h @@ -25,10 +25,11 @@ #pragma once -#include "androidextralibrarylistmodel.h" - #include + #include +#include +#include #include #include @@ -57,7 +58,7 @@ private: QToolButton *m_removeAndroidExtraLibButton = nullptr; Android::AndroidBuildApkStep *m_step = nullptr; - AndroidExtraLibraryListModel *m_extraLibraryListModel = nullptr; + Android::AndroidExtraLibraryListModel *m_extraLibraryListModel = nullptr; bool m_ignoreChange = false; }; diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp index 34c16f83dc2..4a8d09b3834 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp @@ -74,12 +74,67 @@ QStringList QmakeAndroidSupport::targetData(Core::Id role, const Target *target) var = Variable::AndroidDeploySettingsFile; else if (role == Android::Constants::AndroidExtraLibs) var = Variable::AndroidExtraLibs; + else if (role == Android::Constants::AndroidArch) + var = Variable::AndroidArch; else QTC_CHECK(false); return profileNode->variableValue(var); } +static QmakeProFile *applicationProFile(const Target *target) +{ + ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration(); + if (!rc) + return nullptr; + auto project = static_cast(target->project()); + return project->rootProFile()->findProFile(FileName::fromString(rc->buildKey())); +} + +bool QmakeAndroidSupport::parseInProgress(const Target *target) const +{ + QmakeProjectManager::QmakeProFile *pro = applicationProFile(target); + return !pro || pro->parseInProgress(); +} + +bool QmakeAndroidSupport::validParse(const Target *target) const +{ + QmakeProjectManager::QmakeProFile *pro = applicationProFile(target); + return pro->validParse() && pro->projectType() == ProjectType::ApplicationTemplate; +} + +bool QmakeAndroidSupport::extraLibraryEnabled(const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + return pro && !pro->parseInProgress(); +} + +FileName QmakeAndroidSupport::projectFilePath(const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + return pro ? pro->filePath() : FileName(); +} + +bool QmakeAndroidSupport::setTargetData(Core::Id role, const QStringList &values, const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + if (!pro) + return false; + + QString var; + if (role == Android::Constants::AndroidExtraLibs) + var = "ANDROID_EXTRA_LIBS"; + + if (var.isEmpty()) + return false; + + const QString arch = pro->singleVariableValue(Variable::AndroidArch); + const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')'; + return pro->setProVariable(var, values, scope, + QmakeProjectManager::Internal::ProWriter::ReplaceValues + | QmakeProjectManager::Internal::ProWriter::MultiLine); +} + QString QmakeAndroidSupport::targetDataItem(Core::Id role, const Target *target) const { const QStringList data = targetData(role, target); diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h index 5658f1bcd2d..ffaf8208529 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h @@ -42,6 +42,13 @@ public: QString targetDataItem(Core::Id role, const ProjectExplorer::Target *target) const override; QStringList targetData(Core::Id role, const ProjectExplorer::Target *target) const override; + bool setTargetData(Core::Id role, const QStringList &values, + const ProjectExplorer::Target *target) const override; + + bool parseInProgress(const ProjectExplorer::Target *target) const override; + bool validParse(const ProjectExplorer::Target *target) const override; + bool extraLibraryEnabled(const ProjectExplorer::Target *target) const override; + Utils::FileName projectFilePath(const ProjectExplorer::Target *target) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro index 6d2489e49a1..215da23b0c3 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro @@ -5,7 +5,6 @@ DEFINES += \ QMAKEANDROID_LIBRARY HEADERS += \ - androidextralibrarylistmodel.h \ createandroidmanifestwizard.h \ qmakeandroidsupport.h \ qmakeandroidbuildapkstep.h \ @@ -14,7 +13,6 @@ HEADERS += \ qmakeandroidsupportplugin.h SOURCES += \ - androidextralibrarylistmodel.cpp \ createandroidmanifestwizard.cpp \ qmakeandroidsupport.cpp \ qmakeandroidbuildapkstep.cpp \ diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs index 8a2eefbfee4..af8e70d2749 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs @@ -16,8 +16,6 @@ QtcPlugin { Depends { name: "Qt.widgets" } files: [ - "androidextralibrarylistmodel.cpp", - "androidextralibrarylistmodel.h", "createandroidmanifestwizard.cpp", "createandroidmanifestwizard.h", "qmakeandroidbuildapkstep.cpp",