From 3ba3f7405148f3975a2fdb336f7e5c2d2d38bb9d Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 27 Jul 2018 12:58:10 +0200 Subject: [PATCH] Android: Use QVariant for targetData/setTargetData This makes it more similar to the classic QAbstractItemModel::{data/setData} pattern and hides qmake-specific semantic (variables are QString*Lists*) behind something more general. Change-Id: I82d7006affd4af208be2b7640076698d13fd3a61 Reviewed-by: Vikas Pachdha --- src/plugins/android/androidbuildapkstep.cpp | 4 +- src/plugins/android/androiddebugsupport.cpp | 3 +- src/plugins/android/androiddeployqtstep.cpp | 2 +- .../android/androidextralibrarylistmodel.cpp | 2 +- src/plugins/android/androidmanager.cpp | 5 +- src/plugins/android/androidqtsupport.h | 13 +++-- .../android/createandroidmanifestwizard.cpp | 6 +-- .../qmakeandroidsupport.cpp | 53 ++++++++----------- .../qmakeandroidsupport/qmakeandroidsupport.h | 5 +- 9 files changed, 41 insertions(+), 52 deletions(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index d9ce630e20c..d095a96061b 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -180,7 +180,7 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) &Utils::FileName::toString)); AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target()); - QFileInfo sourceDirInfo(qtSupport->targetDataItem(Constants::AndroidPackageSourceDir, target())); + QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target()).toString()); parser->setSourceDirectory(Utils::FileName::fromString(sourceDirInfo.canonicalFilePath())); parser->setBuildDirectory(Utils::FileName::fromString(bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString())); setOutputParser(parser); @@ -202,7 +202,7 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); QString inputFile = AndroidManager::androidQtSupport(target()) - ->targetDataItem(Constants::AndroidDeploySettingsFile, target()); + ->targetData(Constants::AndroidDeploySettingsFile, target()).toString(); if (inputFile.isEmpty()) { m_skipBuilding = true; return true; diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index bbeb72138ab..369beabd544 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -135,8 +135,9 @@ void AndroidDebugSupport::start() qCDebug(androidDebugSupportLog) << "C++ debugging enabled"; AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target); QStringList solibSearchPath = qtSupport->soLibSearchPath(target); + QStringList extraLibs = qtSupport->targetData(Android::Constants::AndroidExtraLibs, target).toStringList(); solibSearchPath.append(qtSoPaths(qtVersion)); - solibSearchPath.append(uniquePaths(qtSupport->targetData(Android::Constants::AndroidExtraLibs, target))); + solibSearchPath.append(uniquePaths(extraLibs)); setSolibSearchPath(solibSearchPath); qCDebug(androidDebugSupportLog) << "SoLibSearchPath: "<activeBuildConfiguration()->buildDirectory().toString() diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index f3f4f5d38df..767ea101b2a 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -191,7 +191,7 @@ bool AndroidDeployQtStep::init(QList &earlierSteps) Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input")); - const QString jsonFile = qtSupport->targetDataItem(Constants::AndroidDeploySettingsFile, target()); + const QString jsonFile = qtSupport->targetData(Constants::AndroidDeploySettingsFile, target()).toString(); if (jsonFile.isEmpty()) { emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr); return false; diff --git a/src/plugins/android/androidextralibrarylistmodel.cpp b/src/plugins/android/androidextralibrarylistmodel.cpp index 70f68749226..60956c963a7 100644 --- a/src/plugins/android/androidextralibrarylistmodel.cpp +++ b/src/plugins/android/androidextralibrarylistmodel.cpp @@ -93,7 +93,7 @@ void AndroidExtraLibraryListModel::updateModel() bool enabled; beginResetModel(); if (qtSupport->validParse(m_target)) { - m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target); + m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target).toStringList(); enabled = true; } else { // parsing error or not a application template diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 19b783066ed..df678d1f741 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -305,7 +305,8 @@ Utils::FileName AndroidManager::apkPath(const ProjectExplorer::Target *target) Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *target) { if (AndroidQtSupport *androidQtSupport = AndroidManager::androidQtSupport(target)) { - const QString packageSource = androidQtSupport->targetDataItem(Android::Constants::AndroidPackageSourceDir, target); + const QString packageSource + = androidQtSupport->targetData(Android::Constants::AndroidPackageSourceDir, target).toString(); if (!packageSource.isEmpty()) { const FileName manifest = FileName::fromUserInput(packageSource + "/AndroidManifest.xml"); if (manifest.exists()) @@ -630,7 +631,7 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target) if (!qtSupport) return false; - QFileInfo sourceDirInfo(qtSupport->targetDataItem(Constants::AndroidPackageSourceDir, target)); + QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target).toString()); FileName packageSourceDir = FileName::fromString(sourceDirInfo.canonicalFilePath()); if (!packageSourceDir.appendPath("gradlew").exists()) return false; diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h index fa5c9db82b3..7b8c6bd2b81 100644 --- a/src/plugins/android/androidqtsupport.h +++ b/src/plugins/android/androidqtsupport.h @@ -38,10 +38,10 @@ namespace Utils { class FileName; } namespace Android { namespace Constants { -const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; -const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; -const char AndroidExtraLibs[] = "AndroidExtraLibs"; -const char AndroidArch[] = "AndroidArch"; +const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString +const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString +const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList +const char AndroidArch[] = "AndroidArch"; // QString } // namespace Constants @@ -64,9 +64,8 @@ public: virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0; virtual QStringList projectTargetApplications(const ProjectExplorer::Target *target) const = 0; - 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, + virtual QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const = 0; + virtual bool setTargetData(Core::Id role, const QVariant &value, const ProjectExplorer::Target *target) const = 0; virtual bool parseInProgress(const ProjectExplorer::Target *target) const = 0; diff --git a/src/plugins/android/createandroidmanifestwizard.cpp b/src/plugins/android/createandroidmanifestwizard.cpp index a8f78964b5b..01b167342b8 100644 --- a/src/plugins/android/createandroidmanifestwizard.cpp +++ b/src/plugins/android/createandroidmanifestwizard.cpp @@ -183,7 +183,7 @@ void ChooseDirectoryPage::initializePage() AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_wizard->target()); const QString androidPackageDir - = qtSupport->targetDataItem(Android::Constants::AndroidPackageSourceDir, m_wizard->target()); + = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_wizard->target()).toString(); if (androidPackageDir.isEmpty()) { m_label->setText(tr("Select the Android package source directory.\n\n" @@ -348,13 +348,13 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles() qtSupport->addFiles(m_target, m_buildKey, addedFiles); const QString androidPackageDir - = qtSupport->targetDataItem(Android::Constants::AndroidPackageSourceDir, m_target); + = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_target).toString(); if (androidPackageDir.isEmpty()) { // and now time for some magic const BuildTargetInfo bti = m_target->applicationTargets().buildTargetInfo(m_buildKey); const QString value = "$$PWD/" + bti.projectFilePath.toFileInfo().absoluteDir().relativeFilePath(m_directory); - bool result = qtSupport->setTargetData(Android::Constants::AndroidPackageSourceDir, {value}, m_target); + bool result = qtSupport->setTargetData(Android::Constants::AndroidPackageSourceDir, value, m_target); if (!result) { QMessageBox::warning(this, tr("Project File not Updated"), diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp index 117d7308304..ffd1ef72434 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp @@ -54,11 +54,11 @@ bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const return qobject_cast(target->project()); } -QStringList QmakeAndroidSupport::targetData(Core::Id role, const Target *target) const +QVariant QmakeAndroidSupport::targetData(Core::Id role, const Target *target) const { RunConfiguration *rc = target->activeRunConfiguration(); if (!rc) - return QStringList(); + return {}; const FileName projectFilePath = FileName::fromString(rc->buildKey()); const QmakeProject *pro = qobject_cast(target->project()); @@ -67,19 +67,17 @@ QStringList QmakeAndroidSupport::targetData(Core::Id role, const Target *target) const QmakeProFileNode *profileNode = pro->rootProjectNode()->findProFileFor(projectFilePath); QTC_ASSERT(profileNode, return {}); - Variable var = {}; if (role == Android::Constants::AndroidPackageSourceDir) - var = Variable::AndroidPackageSourceDir; - else if (role == Android::Constants::AndroidDeploySettingsFile) - 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->singleVariableValue(Variable::AndroidPackageSourceDir); + if (role == Android::Constants::AndroidDeploySettingsFile) + return profileNode->singleVariableValue(Variable::AndroidDeploySettingsFile); + if (role == Android::Constants::AndroidExtraLibs) + return profileNode->variableValue(Variable::AndroidExtraLibs); + if (role == Android::Constants::AndroidArch) + return profileNode->singleVariableValue(Variable::AndroidArch); - return profileNode->variableValue(var); + QTC_CHECK(false); + return {}; } static QmakeProFile *applicationProFile(const Target *target) @@ -115,32 +113,23 @@ FileName QmakeAndroidSupport::projectFilePath(const Target *target) const return pro ? pro->filePath() : FileName(); } -bool QmakeAndroidSupport::setTargetData(Core::Id role, const QStringList &values, const Target *target) const +bool QmakeAndroidSupport::setTargetData(Core::Id role, const QVariant &value, const Target *target) const { QmakeProFile *pro = applicationProFile(target); if (!pro) return false; - QString var; - if (role == Android::Constants::AndroidExtraLibs) - var = "ANDROID_EXTRA_LIBS"; - else if (role == Android::Constants::AndroidPackageSourceDir) - var = "ANDROID_PACKAGE_SOURCE_DIR"; - - 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); -} + auto flags = QmakeProjectManager::Internal::ProWriter::ReplaceValues + | QmakeProjectManager::Internal::ProWriter::MultiLine; -QString QmakeAndroidSupport::targetDataItem(Core::Id role, const Target *target) const -{ - const QStringList data = targetData(role, target); - return data.isEmpty() ? QString() : data.first(); + if (role == Android::Constants::AndroidExtraLibs) + return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags); + if (role == Android::Constants::AndroidPackageSourceDir) + return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags); + + return false; } QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const @@ -162,7 +151,7 @@ QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target * res.insert(destDir.toString()); } - const QString jsonFile = targetDataItem(Android::Constants::AndroidDeploySettingsFile, target); + const QString jsonFile = targetData(Android::Constants::AndroidDeploySettingsFile, target).toString(); QFile deploymentSettings(jsonFile); if (deploymentSettings.open(QIODevice::ReadOnly)) { QJsonParseError error; diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h index 989b42cf92d..21d10a81533 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h @@ -39,9 +39,8 @@ public: QStringList soLibSearchPath(const ProjectExplorer::Target *target) const override; QStringList projectTargetApplications(const ProjectExplorer::Target *target) const override; - 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, + QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const override; + bool setTargetData(Core::Id role, const QVariant &value, const ProjectExplorer::Target *target) const override; bool parseInProgress(const ProjectExplorer::Target *target) const override;