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));
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<const BuildStep *> &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;

View File

@@ -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: "<<solibSearchPath;
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, 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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"),

View File

@@ -54,11 +54,11 @@ bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const
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();
if (!rc)
return QStringList();
return {};
const FileName projectFilePath = FileName::fromString(rc->buildKey());
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);
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;

View File

@@ -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;