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 <vikas.pachdha@qt.io>
This commit is contained in:
hjk
2018-07-27 12:58:10 +02:00
parent 888d940de2
commit 3ba3f74051
9 changed files with 41 additions and 52 deletions

View File

@@ -180,7 +180,7 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
&Utils::FileName::toString)); &Utils::FileName::toString));
AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target()); 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->setSourceDirectory(Utils::FileName::fromString(sourceDirInfo.canonicalFilePath()));
parser->setBuildDirectory(Utils::FileName::fromString(bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString())); parser->setBuildDirectory(Utils::FileName::fromString(bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString()));
setOutputParser(parser); setOutputParser(parser);
@@ -202,7 +202,7 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString();
QString inputFile = AndroidManager::androidQtSupport(target()) QString inputFile = AndroidManager::androidQtSupport(target())
->targetDataItem(Constants::AndroidDeploySettingsFile, target()); ->targetData(Constants::AndroidDeploySettingsFile, target()).toString();
if (inputFile.isEmpty()) { if (inputFile.isEmpty()) {
m_skipBuilding = true; m_skipBuilding = true;
return true; return true;

View File

@@ -135,8 +135,9 @@ void AndroidDebugSupport::start()
qCDebug(androidDebugSupportLog) << "C++ debugging enabled"; qCDebug(androidDebugSupportLog) << "C++ debugging enabled";
AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target); AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target);
QStringList solibSearchPath = qtSupport->soLibSearchPath(target); QStringList solibSearchPath = qtSupport->soLibSearchPath(target);
QStringList extraLibs = qtSupport->targetData(Android::Constants::AndroidExtraLibs, target).toStringList();
solibSearchPath.append(qtSoPaths(qtVersion)); solibSearchPath.append(qtSoPaths(qtVersion));
solibSearchPath.append(uniquePaths(qtSupport->targetData(Android::Constants::AndroidExtraLibs, target))); solibSearchPath.append(uniquePaths(extraLibs));
setSolibSearchPath(solibSearchPath); setSolibSearchPath(solibSearchPath);
qCDebug(androidDebugSupportLog) << "SoLibSearchPath: "<<solibSearchPath; qCDebug(androidDebugSupportLog) << "SoLibSearchPath: "<<solibSearchPath;
setSymbolFile(target->activeBuildConfiguration()->buildDirectory().toString() setSymbolFile(target->activeBuildConfiguration()->buildDirectory().toString()

View File

@@ -191,7 +191,7 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps)
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory);
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build"));
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input")); 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()) { if (jsonFile.isEmpty()) {
emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr); emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr);
return false; return false;

View File

@@ -93,7 +93,7 @@ void AndroidExtraLibraryListModel::updateModel()
bool enabled; bool enabled;
beginResetModel(); beginResetModel();
if (qtSupport->validParse(m_target)) { if (qtSupport->validParse(m_target)) {
m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target); m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target).toStringList();
enabled = true; enabled = true;
} else { } else {
// parsing error or not a application template // parsing error or not a application template

View File

@@ -305,7 +305,8 @@ Utils::FileName AndroidManager::apkPath(const ProjectExplorer::Target *target)
Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *target) Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *target)
{ {
if (AndroidQtSupport *androidQtSupport = AndroidManager::androidQtSupport(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()) { if (!packageSource.isEmpty()) {
const FileName manifest = FileName::fromUserInput(packageSource + "/AndroidManifest.xml"); const FileName manifest = FileName::fromUserInput(packageSource + "/AndroidManifest.xml");
if (manifest.exists()) if (manifest.exists())
@@ -630,7 +631,7 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target)
if (!qtSupport) if (!qtSupport)
return false; return false;
QFileInfo sourceDirInfo(qtSupport->targetDataItem(Constants::AndroidPackageSourceDir, target)); QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target).toString());
FileName packageSourceDir = FileName::fromString(sourceDirInfo.canonicalFilePath()); FileName packageSourceDir = FileName::fromString(sourceDirInfo.canonicalFilePath());
if (!packageSourceDir.appendPath("gradlew").exists()) if (!packageSourceDir.appendPath("gradlew").exists())
return false; return false;

View File

@@ -38,10 +38,10 @@ namespace Utils { class FileName; }
namespace Android { namespace Android {
namespace Constants { namespace Constants {
const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString
const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString
const char AndroidExtraLibs[] = "AndroidExtraLibs"; const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList
const char AndroidArch[] = "AndroidArch"; const char AndroidArch[] = "AndroidArch"; // QString
} // namespace Constants } // namespace Constants
@@ -64,9 +64,8 @@ public:
virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0; virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0;
virtual QStringList projectTargetApplications(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 QVariant targetData(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 QVariant &value,
virtual bool setTargetData(Core::Id role, const QStringList &values,
const ProjectExplorer::Target *target) const = 0; const ProjectExplorer::Target *target) const = 0;
virtual bool parseInProgress(const ProjectExplorer::Target *target) const = 0; virtual bool parseInProgress(const ProjectExplorer::Target *target) const = 0;

View File

@@ -183,7 +183,7 @@ void ChooseDirectoryPage::initializePage()
AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_wizard->target()); AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_wizard->target());
const QString androidPackageDir const QString androidPackageDir
= qtSupport->targetDataItem(Android::Constants::AndroidPackageSourceDir, m_wizard->target()); = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_wizard->target()).toString();
if (androidPackageDir.isEmpty()) { if (androidPackageDir.isEmpty()) {
m_label->setText(tr("Select the Android package source directory.\n\n" 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); qtSupport->addFiles(m_target, m_buildKey, addedFiles);
const QString androidPackageDir const QString androidPackageDir
= qtSupport->targetDataItem(Android::Constants::AndroidPackageSourceDir, m_target); = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_target).toString();
if (androidPackageDir.isEmpty()) { if (androidPackageDir.isEmpty()) {
// and now time for some magic // and now time for some magic
const BuildTargetInfo bti = m_target->applicationTargets().buildTargetInfo(m_buildKey); const BuildTargetInfo bti = m_target->applicationTargets().buildTargetInfo(m_buildKey);
const QString value = "$$PWD/" + bti.projectFilePath.toFileInfo().absoluteDir().relativeFilePath(m_directory); 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) { if (!result) {
QMessageBox::warning(this, tr("Project File not Updated"), QMessageBox::warning(this, tr("Project File not Updated"),

View File

@@ -54,11 +54,11 @@ bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const
return qobject_cast<QmakeProject*>(target->project()); return qobject_cast<QmakeProject*>(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(); RunConfiguration *rc = target->activeRunConfiguration();
if (!rc) if (!rc)
return QStringList(); return {};
const FileName projectFilePath = FileName::fromString(rc->buildKey()); const FileName projectFilePath = FileName::fromString(rc->buildKey());
const QmakeProject *pro = qobject_cast<QmakeProject *>(target->project()); const QmakeProject *pro = qobject_cast<QmakeProject *>(target->project());
@@ -67,19 +67,17 @@ QStringList QmakeAndroidSupport::targetData(Core::Id role, const Target *target)
const QmakeProFileNode *profileNode = pro->rootProjectNode()->findProFileFor(projectFilePath); const QmakeProFileNode *profileNode = pro->rootProjectNode()->findProFileFor(projectFilePath);
QTC_ASSERT(profileNode, return {}); QTC_ASSERT(profileNode, return {});
Variable var = {};
if (role == Android::Constants::AndroidPackageSourceDir) if (role == Android::Constants::AndroidPackageSourceDir)
var = Variable::AndroidPackageSourceDir; return profileNode->singleVariableValue(Variable::AndroidPackageSourceDir);
else if (role == Android::Constants::AndroidDeploySettingsFile) if (role == Android::Constants::AndroidDeploySettingsFile)
var = Variable::AndroidDeploySettingsFile; return profileNode->singleVariableValue(Variable::AndroidDeploySettingsFile);
else if (role == Android::Constants::AndroidExtraLibs) if (role == Android::Constants::AndroidExtraLibs)
var = Variable::AndroidExtraLibs; return profileNode->variableValue(Variable::AndroidExtraLibs);
else if (role == Android::Constants::AndroidArch) if (role == Android::Constants::AndroidArch)
var = Variable::AndroidArch; return profileNode->singleVariableValue(Variable::AndroidArch);
else
QTC_CHECK(false);
return profileNode->variableValue(var); QTC_CHECK(false);
return {};
} }
static QmakeProFile *applicationProFile(const Target *target) static QmakeProFile *applicationProFile(const Target *target)
@@ -115,32 +113,23 @@ FileName QmakeAndroidSupport::projectFilePath(const Target *target) const
return pro ? pro->filePath() : FileName(); 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); QmakeProFile *pro = applicationProFile(target);
if (!pro) if (!pro)
return false; 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 arch = pro->singleVariableValue(Variable::AndroidArch);
const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')'; const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')';
return pro->setProVariable(var, values, scope, auto flags = QmakeProjectManager::Internal::ProWriter::ReplaceValues
QmakeProjectManager::Internal::ProWriter::ReplaceValues | QmakeProjectManager::Internal::ProWriter::MultiLine;
| QmakeProjectManager::Internal::ProWriter::MultiLine);
}
QString QmakeAndroidSupport::targetDataItem(Core::Id role, const Target *target) const if (role == Android::Constants::AndroidExtraLibs)
{ return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags);
const QStringList data = targetData(role, target); if (role == Android::Constants::AndroidPackageSourceDir)
return data.isEmpty() ? QString() : data.first(); return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags);
return false;
} }
QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const
@@ -162,7 +151,7 @@ QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *
res.insert(destDir.toString()); res.insert(destDir.toString());
} }
const QString jsonFile = targetDataItem(Android::Constants::AndroidDeploySettingsFile, target); const QString jsonFile = targetData(Android::Constants::AndroidDeploySettingsFile, target).toString();
QFile deploymentSettings(jsonFile); QFile deploymentSettings(jsonFile);
if (deploymentSettings.open(QIODevice::ReadOnly)) { if (deploymentSettings.open(QIODevice::ReadOnly)) {
QJsonParseError error; QJsonParseError error;

View File

@@ -39,9 +39,8 @@ public:
QStringList soLibSearchPath(const ProjectExplorer::Target *target) const override; QStringList soLibSearchPath(const ProjectExplorer::Target *target) const override;
QStringList projectTargetApplications(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; QVariant targetData(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 QVariant &value,
bool setTargetData(Core::Id role, const QStringList &values,
const ProjectExplorer::Target *target) const override; const ProjectExplorer::Target *target) const override;
bool parseInProgress(const ProjectExplorer::Target *target) const override; bool parseInProgress(const ProjectExplorer::Target *target) const override;