summaryrefslogtreecommitdiff
path: root/src/plugins/android
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2014-09-22 16:20:51 +0300
committerBogDan Vatra <bogdan@kde.org>2014-09-25 13:15:25 +0200
commit3bcae5258456577682437c2f09eae7bef59c4c34 (patch)
treef641b594ac52d876d7f9ef51431f65e71828d5e8 /src/plugins/android
parent222fbdb58bc08ae54480cec448d1578a55376348 (diff)
downloadqt-creator-3bcae5258456577682437c2f09eae7bef59c4c34.tar.gz
Android: Say hello to gradle!
Switching from Ant to Gradle brings lots of advantages: - it is way faster when rebuilding (25-50% faster than ant). - it enables first class Android Studio integration. - adding Android Extras libs (e.g. Google Play services, OBB, etc.) to your project is now painless. [ChangeLog][Android] Added Gradle support to build the APK. Change-Id: Iee492954f8ffb2c22e6ab14a8a25faf644de9a51 Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Diffstat (limited to 'src/plugins/android')
-rw-r--r--src/plugins/android/android.pro3
-rw-r--r--src/plugins/android/android.qbs1
-rw-r--r--src/plugins/android/androidbuildapkstep.cpp28
-rw-r--r--src/plugins/android/androidbuildapkstep.h8
-rw-r--r--src/plugins/android/androidbuildapkwidget.cpp11
-rw-r--r--src/plugins/android/androidbuildapkwidget.h1
-rw-r--r--src/plugins/android/androidbuildapkwidget.ui11
-rw-r--r--src/plugins/android/androidconfigurations.cpp16
-rw-r--r--src/plugins/android/androidconfigurations.h4
-rw-r--r--src/plugins/android/androiddeployqtstep.cpp8
-rw-r--r--src/plugins/android/androidmanager.cpp108
-rw-r--r--src/plugins/android/androidmanager.h2
-rw-r--r--src/plugins/android/androidqtsupport.cpp67
-rw-r--r--src/plugins/android/androidqtsupport.h3
-rw-r--r--src/plugins/android/androidsettingswidget.cpp6
-rw-r--r--src/plugins/android/androidsettingswidget.h1
-rw-r--r--src/plugins/android/androidsettingswidget.ui101
17 files changed, 329 insertions, 50 deletions
diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro
index f978d78918..b3514dc038 100644
--- a/src/plugins/android/android.pro
+++ b/src/plugins/android/android.pro
@@ -89,7 +89,8 @@ SOURCES += \
javafilewizard.cpp \
avddialog.cpp \
androidbuildapkstep.cpp \
- androidbuildapkwidget.cpp
+ androidbuildapkwidget.cpp \
+ androidqtsupport.cpp
FORMS += \
androidsettingswidget.ui \
diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs
index 0574d80f63..914266b3af 100644
--- a/src/plugins/android/android.qbs
+++ b/src/plugins/android/android.qbs
@@ -67,6 +67,7 @@ QtcPlugin {
"androidplugin.h",
"androidpotentialkit.cpp",
"androidpotentialkit.h",
+ "androidqtsupport.cpp",
"androidqtsupport.h",
"androidqtversion.cpp",
"androidqtversion.h",
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp
index c1b6a4cfcf..fc9ce9eca9 100644
--- a/src/plugins/android/androidbuildapkstep.cpp
+++ b/src/plugins/android/androidbuildapkstep.cpp
@@ -59,18 +59,22 @@ const QLatin1String DeployActionKey("Qt4ProjectManager.AndroidDeployQtStep.Deplo
const QLatin1String KeystoreLocationKey("KeystoreLocation");
const QLatin1String BuildTargetSdkKey("BuildTargetSdk");
const QLatin1String VerboseOutputKey("VerboseOutput");
+const QLatin1String UseGradleKey("UseGradle");
AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, const Core::Id id)
: ProjectExplorer::AbstractProcessStep(parent, id),
m_deployAction(BundleLibrariesDeployment),
m_signPackage(false),
m_verbose(false),
+ m_useGradle(false),
m_openPackageLocation(false),
m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations::currentConfig().highestAndroidSdk()))
{
const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
- if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0))
+ if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0)) {
m_deployAction = DebugDeployment;
+ m_useGradle = AndroidConfigurations::currentConfig().useGrandle();
+ }
//: AndroidBuildApkStep default display name
setDefaultDisplayName(tr("Build Android APK"));
}
@@ -81,6 +85,7 @@ AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent,
m_deployAction(other->deployAction()),
m_signPackage(other->signPackage()),
m_verbose(other->m_verbose),
+ m_useGradle(other->m_useGradle),
m_openPackageLocation(other->m_openPackageLocation),
m_buildTargetSdk(other->m_buildTargetSdk)
{
@@ -88,6 +93,8 @@ AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent,
if (version->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) {
if (m_deployAction == DebugDeployment)
m_deployAction = BundleLibrariesDeployment;
+ if (m_useGradle)
+ m_useGradle = false;
}
}
@@ -123,8 +130,7 @@ bool AndroidBuildApkStep::init()
setOutputParser(parser);
m_openPackageLocationForRun = m_openPackageLocation;
- m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target(), m_signPackage ? AndroidQtSupport::ReleaseBuildSigned
- : AndroidQtSupport::DebugBuild).toString();
+ m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target()).toString();
bool result = AbstractProcessStep::init();
if (!result)
@@ -169,6 +175,7 @@ bool AndroidBuildApkStep::fromMap(const QVariantMap &map)
if (m_buildTargetSdk.isEmpty())
m_buildTargetSdk = AndroidConfig::apiLevelNameFor(AndroidConfigurations::currentConfig().highestAndroidSdk());
m_verbose = map.value(VerboseOutputKey).toBool();
+ m_useGradle = map.value(UseGradleKey).toBool();
return ProjectExplorer::BuildStep::fromMap(map);
}
@@ -179,6 +186,7 @@ QVariantMap AndroidBuildApkStep::toMap() const
map.insert(KeystoreLocationKey, m_keystorePath.toString());
map.insert(BuildTargetSdkKey, m_buildTargetSdk);
map.insert(VerboseOutputKey, m_verbose);
+ map.insert(UseGradleKey, m_useGradle);
return map;
}
@@ -195,6 +203,8 @@ QString AndroidBuildApkStep::buildTargetSdk() const
void AndroidBuildApkStep::setBuildTargetSdk(const QString &sdk)
{
m_buildTargetSdk = sdk;
+ if (m_useGradle)
+ AndroidManager::updateGradleProperties(target());
}
AndroidBuildApkStep::AndroidDeployAction AndroidBuildApkStep::deployAction() const
@@ -254,6 +264,18 @@ void AndroidBuildApkStep::setVerboseOutput(bool verbose)
m_verbose = verbose;
}
+bool AndroidBuildApkStep::useGradle() const
+{
+ return m_useGradle;
+}
+
+void AndroidBuildApkStep::setUseGradle(bool b)
+{
+ m_useGradle = b;
+ if (m_useGradle)
+ AndroidManager::updateGradleProperties(target());
+}
+
bool AndroidBuildApkStep::runInGuiThread() const
{
return true;
diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h
index 668f5b4b7e..2d82b7b261 100644
--- a/src/plugins/android/androidbuildapkstep.h
+++ b/src/plugins/android/androidbuildapkstep.h
@@ -72,13 +72,19 @@ public:
bool openPackageLocation() const;
void setOpenPackageLocation(bool open);
+
bool verboseOutput() const;
void setVerboseOutput(bool verbose);
+ bool useGradle() const;
+ void setUseGradle(bool b);
+
bool runInGuiThread() const;
QString buildTargetSdk() const;
void setBuildTargetSdk(const QString &sdk);
+
+ virtual Utils::FileName androidPackageSourceDir() const = 0;
public slots:
void setDeployAction(AndroidDeployAction deploy);
@@ -95,12 +101,12 @@ protected:
ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
bool immutable() const { return true; }
void processFinished(int exitCode, QProcess::ExitStatus status);
- virtual Utils::FileName androidPackageSourceDir() const = 0;
protected:
AndroidDeployAction m_deployAction;
bool m_signPackage;
bool m_verbose;
+ bool m_useGradle;
bool m_openPackageLocation;
bool m_openPackageLocationForRun;
QString m_buildTargetSdk;
diff --git a/src/plugins/android/androidbuildapkwidget.cpp b/src/plugins/android/androidbuildapkwidget.cpp
index 6bc769d7ca..ade9d09bb7 100644
--- a/src/plugins/android/androidbuildapkwidget.cpp
+++ b/src/plugins/android/androidbuildapkwidget.cpp
@@ -91,6 +91,7 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step)
m_ui->signingDebugWarningLabel->hide();
signPackageCheckBoxToggled(m_step->signPackage());
+ m_ui->useGradleCheckBox->setChecked(m_step->useGradle());
m_ui->verboseOutputCheckBox->setChecked(m_step->verboseOutput());
m_ui->openPackageLocationCheckBox->setChecked(m_step->openPackageLocation());
@@ -105,6 +106,8 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step)
connect(m_ui->temporaryQtOption, SIGNAL(clicked()), SLOT(updateDebugDeploySigningWarning()));
connect(m_ui->bundleQtOption, SIGNAL(clicked()), SLOT(updateDebugDeploySigningWarning()));
+ connect(m_ui->useGradleCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(useGradleCheckBoxToggled(bool)));
connect(m_ui->openPackageLocationCheckBox, SIGNAL(toggled(bool)),
this, SLOT(openPackageLocationCheckBoxToggled(bool)));
connect(m_ui->verboseOutputCheckBox, SIGNAL(toggled(bool)),
@@ -128,7 +131,9 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step)
updateSigningWarning();
updateDebugDeploySigningWarning();
QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(step->target()->kit());
- m_ui->temporaryQtOption->setVisible(qt->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0));
+ bool qt54 = qt->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0);
+ m_ui->temporaryQtOption->setVisible(qt54);
+ m_ui->useGradleCheckBox->setVisible(qt54);
}
AndroidBuildApkWidget::~AndroidBuildApkWidget()
@@ -254,3 +259,7 @@ void AndroidBuildApkWidget::updateDebugDeploySigningWarning()
}
}
+void AndroidBuildApkWidget::useGradleCheckBoxToggled(bool checked)
+{
+ m_step->setUseGradle(checked);
+}
diff --git a/src/plugins/android/androidbuildapkwidget.h b/src/plugins/android/androidbuildapkwidget.h
index 33215f171c..708c400883 100644
--- a/src/plugins/android/androidbuildapkwidget.h
+++ b/src/plugins/android/androidbuildapkwidget.h
@@ -64,6 +64,7 @@ private slots:
void certificatesAliasComboBoxActivated(const QString &alias);
void updateSigningWarning();
void updateDebugDeploySigningWarning();
+ void useGradleCheckBoxToggled(bool checked);
void openPackageLocationCheckBoxToggled(bool checked);
void verboseOutputCheckBoxToggled(bool checked);
void updateKeyStorePath(const QString &path);
diff --git a/src/plugins/android/androidbuildapkwidget.ui b/src/plugins/android/androidbuildapkwidget.ui
index bdcaca57c3..13d638b659 100644
--- a/src/plugins/android/androidbuildapkwidget.ui
+++ b/src/plugins/android/androidbuildapkwidget.ui
@@ -184,20 +184,27 @@
<string>Advanced Actions</string>
</property>
<layout class="QGridLayout" name="gridLayout">
- <item row="1" column="0">
+ <item row="2" column="0">
<widget class="QCheckBox" name="verboseOutputCheckBox">
<property name="text">
<string>Verbose output</string>
</property>
</widget>
</item>
- <item row="0" column="0">
+ <item row="1" column="0">
<widget class="QCheckBox" name="openPackageLocationCheckBox">
<property name="text">
<string>Open package location after build</string>
</property>
</widget>
</item>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="useGradleCheckBox">
+ <property name="text">
+ <string>Use Gradle</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index 0a2faf9e8b..76465f2452 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -84,6 +84,7 @@ namespace {
const QLatin1String OpenJDKLocationKey("OpenJDKLocation");
const QLatin1String KeystoreLocationKey("KeystoreLocation");
const QLatin1String AutomaticKitCreationKey("AutomatiKitCreation");
+ const QLatin1String UseGradleKey("UseGradle");
const QLatin1String MakeExtraSearchDirectory("MakeExtraSearchDirectory");
const QLatin1String DefaultDevice("DefaultDevice");
const QLatin1String PartitionSizeKey("PartitionSize");
@@ -181,6 +182,7 @@ void AndroidConfig::load(const QSettings &settings)
m_sdkLocation = FileName::fromString(settings.value(SDKLocationKey).toString());
m_ndkLocation = FileName::fromString(settings.value(NDKLocationKey).toString());
m_antLocation = FileName::fromString(settings.value(AntLocationKey).toString());
+ m_useGradle = settings.value(UseGradleKey, true).toBool();
m_openJDKLocation = FileName::fromString(settings.value(OpenJDKLocationKey).toString());
m_keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString());
m_toolchainHost = settings.value(ToolchainHostKey).toString();
@@ -214,7 +216,8 @@ void AndroidConfig::load(const QSettings &settings)
}
AndroidConfig::AndroidConfig()
- : m_availableSdkPlatformsUpToDate(false),
+ : m_useGradle(true),
+ m_availableSdkPlatformsUpToDate(false),
m_NdkInformationUpToDate(false)
{
@@ -230,6 +233,7 @@ void AndroidConfig::save(QSettings &settings) const
settings.setValue(SDKLocationKey, m_sdkLocation.toString());
settings.setValue(NDKLocationKey, m_ndkLocation.toString());
settings.setValue(AntLocationKey, m_antLocation.toString());
+ settings.setValue(UseGradleKey, m_useGradle);
settings.setValue(OpenJDKLocationKey, m_openJDKLocation.toString());
settings.setValue(KeystoreLocationKey, m_keystoreLocation.toString());
settings.setValue(PartitionSizeKey, m_partitionSize);
@@ -912,6 +916,16 @@ void AndroidConfig::setAutomaticKitCreation(bool b)
m_automaticKitCreation = b;
}
+bool AndroidConfig::useGrandle() const
+{
+ return m_useGradle;
+}
+
+void AndroidConfig::setUseGradle(bool b)
+{
+ m_useGradle = b;
+}
+
///////////////////////////////////
// AndroidConfigurations
///////////////////////////////////
diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h
index 025ca5dced..4914e37b14 100644
--- a/src/plugins/android/androidconfigurations.h
+++ b/src/plugins/android/androidconfigurations.h
@@ -115,6 +115,9 @@ public:
bool automaticKitCreation() const;
void setAutomaticKitCreation(bool b);
+ bool useGrandle() const;
+ void setUseGradle(bool b);
+
Utils::FileName adbToolPath() const;
Utils::FileName androidToolPath() const;
Utils::Environment androidToolEnvironment() const;
@@ -179,6 +182,7 @@ private:
QStringList m_makeExtraSearchDirectories;
unsigned m_partitionSize;
bool m_automaticKitCreation;
+ bool m_useGradle;
//caches
mutable bool m_availableSdkPlatformsUpToDate;
diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp
index 333d3e02b5..6a180201b4 100644
--- a/src/plugins/android/androiddeployqtstep.cpp
+++ b/src/plugins/android/androiddeployqtstep.cpp
@@ -165,6 +165,8 @@ void AndroidDeployQtStep::ctor()
bool AndroidDeployQtStep::init()
{
+ m_androiddeployqtArgs.clear();
+
if (AndroidManager::checkForQt51Files(project()->projectDirectory()))
emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), ErrorOutput);
@@ -252,12 +254,12 @@ bool AndroidDeployQtStep::init()
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("bundled"));
break;
}
+ if (androidBuildApkStep->useGradle())
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--gradle"));
} else {
m_uninstallPreviousPackageRun = true;
pp->setCommand(AndroidConfigurations::currentConfig().adbToolPath().toString());
- m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target(), AndroidManager::signPackage(target())
- ? AndroidQtSupport::ReleaseBuildSigned
- : AndroidQtSupport::DebugBuild).toString();
+ m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target()).toString();
pp->setWorkingDirectory(bc->buildDirectory().toString());
}
pp->setMacroExpander(bc->macroExpander());
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 6419c6dca8..bace0759ea 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -595,4 +595,112 @@ AndroidQtSupport *AndroidManager::androidQtSupport(ProjectExplorer::Target *targ
return 0;
}
+bool AndroidManager::useGradle(ProjectExplorer::Target *target)
+{
+ if (!target)
+ return false;
+ AndroidBuildApkStep *buildApkStep
+ = AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration());
+ return buildApkStep && buildApkStep->useGradle();
+}
+
+typedef QMap<QByteArray, QByteArray> GradleProperties;
+
+static GradleProperties readGradleProperties(const QString &path)
+{
+ GradleProperties properties;
+ QFile file(path);
+ if (!file.open(QIODevice::ReadOnly))
+ return properties;
+
+ foreach (const QByteArray &line, file.readAll().split('\n')) {
+ if (line.trimmed().startsWith('#'))
+ continue;
+
+ QList<QByteArray> prop(line.split('='));
+ if (prop.size() > 1)
+ properties[prop.at(0).trimmed()] = prop.at(1).trimmed();
+ }
+ file.close();
+ return properties;
+}
+
+static bool mergeGradleProperties(const QString &path, GradleProperties properties)
+{
+ QFile::remove(path + QLatin1Char('~'));
+ QFile::rename(path, path + QLatin1Char('~'));
+ QFile file(path);
+ if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly | QIODevice::Text))
+ return false;
+
+ QFile oldFile(path + QLatin1Char('~'));
+ if (oldFile.open(QIODevice::ReadOnly)) {
+ while (!oldFile.atEnd()) {
+ QByteArray line(oldFile.readLine());
+ QList<QByteArray> prop(line.split('='));
+ if (prop.size() > 1) {
+ GradleProperties::iterator it = properties.find(prop.at(0).trimmed());
+ if (it != properties.end()) {
+ file.write(it.key() + '=' + it.value() + '\n');
+ properties.erase(it);
+ continue;
+ }
+ }
+ file.write(line);
+ }
+ oldFile.close();
+ } else {
+ file.write("## This file is automatically generated by QtCreator.\n"
+ "#\n"
+ "# This file must *NOT* be checked into Version Control Systems,\n"
+ "# as it contains information specific to your local configuration.\n\n");
+
+ }
+
+ for (GradleProperties::const_iterator it = properties.begin(); it != properties.end(); ++it)
+ file.write(it.key() + '=' + it.value() + '\n');
+
+ file.close();
+ return true;
+}
+
+
+bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target)
+{
+ QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
+ if (!version)
+ return false;
+
+ AndroidBuildApkStep *buildApkStep
+ = AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration());
+
+ if (!buildApkStep || !buildApkStep->androidPackageSourceDir().appendPath(QLatin1String("gradlew")).toFileInfo().exists())
+ return false;
+
+ GradleProperties localProperties;
+ localProperties["sdk.dir"] = AndroidConfigurations::currentConfig().sdkLocation().toString().toLocal8Bit();
+ if (!mergeGradleProperties(buildApkStep->androidPackageSourceDir().appendPath(QLatin1String("local.properties")).toString(), localProperties))
+ return false;
+
+ QString gradlePropertiesPath = buildApkStep->androidPackageSourceDir().appendPath(QLatin1String("gradle.properties")).toString();
+ GradleProperties gradleProperties = readGradleProperties(gradlePropertiesPath);
+ gradleProperties["qt5AndroidDir"] = version->qmakeProperty("QT_INSTALL_PREFIX")
+ .append(QLatin1String("/src/android/java")).toLocal8Bit();
+ gradleProperties["buildDir"] = ".build";
+ gradleProperties["androidCompileSdkVersion"] = buildTargetSDK(target).split(QLatin1Char('-')).last().toLocal8Bit();
+ if (gradleProperties["androidBuildToolsVersion"].isEmpty()) {
+ QString maxVersion;
+ QDir buildToolsDir(AndroidConfigurations::currentConfig().sdkLocation().appendPath(QLatin1String("build-tools")).toString());
+ foreach (const QFileInfo &file, buildToolsDir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)) {
+ QString ver(file.fileName());
+ if (maxVersion < ver)
+ maxVersion = ver;
+ }
+ if (maxVersion.isEmpty())
+ return false;
+ gradleProperties["androidBuildToolsVersion"] = maxVersion.toLocal8Bit();
+ }
+ return mergeGradleProperties(gradlePropertiesPath, gradleProperties);
+}
+
} // namespace Android
diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h
index a738555d2b..a7d36e77e0 100644
--- a/src/plugins/android/androidmanager.h
+++ b/src/plugins/android/androidmanager.h
@@ -96,6 +96,8 @@ public:
static bool checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd, const QString &alias, const QString &certificatePasswd);
static bool checkForQt51Files(Utils::FileName fileName);
static AndroidQtSupport *androidQtSupport(ProjectExplorer::Target *target);
+ static bool useGradle(ProjectExplorer::Target *target);
+ static bool updateGradleProperties(ProjectExplorer::Target *target);
};
} // namespace Android
diff --git a/src/plugins/android/androidqtsupport.cpp b/src/plugins/android/androidqtsupport.cpp
new file mode 100644
index 0000000000..52c2360d44
--- /dev/null
+++ b/src/plugins/android/androidqtsupport.cpp
@@ -0,0 +1,67 @@
+/**************************************************************************
+**
+** Copyright (c) 2014 BogDan Vatra <bog_dan_ro@yahoo.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "androidbuildapkstep.h"
+#include "androidconstants.h"
+#include "androidglobal.h"
+#include "androidqtsupport.h"
+
+#include <projectexplorer/target.h>
+
+Utils::FileName Android::AndroidQtSupport::apkPath(ProjectExplorer::Target *target) const
+{
+ if (!target)
+ return Utils::FileName();
+
+ AndroidBuildApkStep *buildApkStep
+ = Android::AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration());
+
+ if (!buildApkStep)
+ return Utils::FileName();
+
+ QString apkPath;
+ if (buildApkStep->useGradle())
+ apkPath = QLatin1String("/build/outputs/apk/android-build-");
+ else
+ apkPath = QLatin1String("/bin/QtApp-");
+ if (buildApkStep->buildConfiguration()->buildType() == ProjectExplorer::BuildConfiguration::Release) {
+ apkPath += QLatin1String("release-");
+ if (!buildApkStep->signPackage())
+ apkPath += QLatin1String("un");
+ apkPath += QLatin1String("signed.apk");
+ } else {
+ apkPath += QLatin1String("debug");
+ if (buildApkStep->signPackage())
+ apkPath += QLatin1String("-signed");
+ apkPath += QLatin1String(".apk");
+ }
+ return target->activeBuildConfiguration()->buildDirectory()
+ .appendPath(QLatin1String(Android::Constants::ANDROID_BUILDDIRECTORY))
+ .appendPath(apkPath);
+}
diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h
index 2283bf07d0..7c28878bf8 100644
--- a/src/plugins/android/androidqtsupport.h
+++ b/src/plugins/android/androidqtsupport.h
@@ -62,10 +62,9 @@ public:
virtual bool canHandle(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 Utils::FileName apkPath(ProjectExplorer::Target *target, BuildType buildType) const = 0;
+ virtual Utils::FileName apkPath(ProjectExplorer::Target *target) const;
virtual Utils::FileName androiddeployqtPath(ProjectExplorer::Target *target) const = 0;
virtual Utils::FileName androiddeployJsonPath(ProjectExplorer::Target *target) const = 0;
-
virtual void resetBuild(const ProjectExplorer::Target *target) = 0;
};
diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp
index 363d1b1a76..67fc53f105 100644
--- a/src/plugins/android/androidsettingswidget.cpp
+++ b/src/plugins/android/androidsettingswidget.cpp
@@ -162,6 +162,7 @@ AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent)
m_ui->AntLocationPathChooser->setPromptDialogTitle(tr("Select ant Script"));
m_ui->AntLocationPathChooser->setInitialBrowsePathBackup(dir);
m_ui->AntLocationPathChooser->setPromptDialogFilter(filter);
+ m_ui->UseGradleCheckBox->setChecked(m_androidConfig.useGrandle());
m_ui->OpenJDKLocationPathChooser->setFileName(m_androidConfig.openJDKLocation());
m_ui->OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path"));
@@ -577,6 +578,11 @@ void AndroidSettingsWidget::createKitToggled()
m_androidConfig.setAutomaticKitCreation(m_ui->CreateKitCheckBox->isChecked());
}
+void AndroidSettingsWidget::useGradleToggled()
+{
+ m_androidConfig.setUseGradle(m_ui->UseGradleCheckBox->isChecked());
+}
+
void AndroidSettingsWidget::checkGdbFinished()
{
QPair<QStringList, bool> result = m_checkGdbWatcher.future().result();
diff --git a/src/plugins/android/androidsettingswidget.h b/src/plugins/android/androidsettingswidget.h
index 8e7aaf5b89..668a0d6b4e 100644
--- a/src/plugins/android/androidsettingswidget.h
+++ b/src/plugins/android/androidsettingswidget.h
@@ -91,6 +91,7 @@ private slots:
void dataPartitionSizeEditingFinished();
void manageAVD();
void createKitToggled();
+ void useGradleToggled();
void checkGdbFinished();
void showGdbWarningDialog();
diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui
index 4b4321f70a..147d49ed55 100644
--- a/src/plugins/android/androidsettingswidget.ui
+++ b/src/plugins/android/androidsettingswidget.ui
@@ -30,7 +30,7 @@
</property>
</widget>
</item>
- <item row="10" column="1">
+ <item row="11" column="1">
<widget class="Utils::PathChooser" name="AntLocationPathChooser" native="true"/>
</item>
<item row="1" column="1">
@@ -108,7 +108,7 @@
<item row="0" column="1">
<widget class="Utils::PathChooser" name="OpenJDKLocationPathChooser" native="true"/>
</item>
- <item row="10" column="2">
+ <item row="11" column="2">
<widget class="QToolButton" name="downloadAntToolButton">
<property name="toolTip">
<string>Download Ant</string>
@@ -119,7 +119,7 @@
</property>
</widget>
</item>
- <item row="10" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="AntLocationLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -157,7 +157,7 @@
</property>
</widget>
</item>
- <item row="11" column="0" colspan="2">
+ <item row="12" column="0" colspan="2">
<widget class="QFrame" name="AVDManagerFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
@@ -452,6 +452,19 @@
</item>
</layout>
</item>
+ <item row="10" column="1">
+ <widget class="QCheckBox" name="UseGradleCheckBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Use Gradle instead of Ant</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<customwidgets>
@@ -474,8 +487,8 @@
<slot>ndkLocationEditingFinished()</slot>
<hints>
<hint type="sourcelabel">
- <x>420</x>
- <y>49</y>
+ <x>605</x>
+ <y>143</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -490,8 +503,8 @@
<slot>sdkLocationEditingFinished()</slot>
<hints>
<hint type="sourcelabel">
- <x>420</x>
- <y>17</y>
+ <x>605</x>
+ <y>82</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -506,8 +519,8 @@
<slot>antLocationEditingFinished()</slot>
<hints>
<hint type="sourcelabel">
- <x>420</x>
- <y>113</y>
+ <x>605</x>
+ <y>315</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -522,8 +535,8 @@
<slot>openJDKLocationEditingFinished()</slot>
<hints>
<hint type="sourcelabel">
- <x>420</x>
- <y>49</y>
+ <x>605</x>
+ <y>31</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -538,8 +551,8 @@
<slot>addAVD()</slot>
<hints>
<hint type="sourcelabel">
- <x>693</x>
- <y>199</y>
+ <x>793</x>
+ <y>394</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -554,8 +567,8 @@
<slot>removeAVD()</slot>
<hints>
<hint type="sourcelabel">
- <x>693</x>
- <y>230</y>
+ <x>793</x>
+ <y>427</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -570,8 +583,8 @@
<slot>startAVD()</slot>
<hints>
<hint type="sourcelabel">
- <x>693</x>
- <y>261</y>
+ <x>793</x>
+ <y>460</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -586,8 +599,8 @@
<slot>avdActivated(QModelIndex)</slot>
<hints>
<hint type="sourcelabel">
- <x>309</x>
- <y>260</y>
+ <x>328</x>
+ <y>605</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -602,8 +615,8 @@
<slot>avdActivated(QModelIndex)</slot>
<hints>
<hint type="sourcelabel">
- <x>309</x>
- <y>260</y>
+ <x>328</x>
+ <y>605</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -618,8 +631,8 @@
<slot>dataPartitionSizeEditingFinished()</slot>
<hints>
<hint type="sourcelabel">
- <x>543</x>
- <y>153</y>
+ <x>614</x>
+ <y>360</y>
</hint>
<hint type="destinationlabel">
<x>352</x>
@@ -634,8 +647,8 @@
<slot>manageAVD()</slot>
<hints>
<hint type="sourcelabel">
- <x>568</x>
- <y>268</y>
+ <x>792</x>
+ <y>359</y>
</hint>
<hint type="destinationlabel">
<x>339</x>
@@ -650,8 +663,8 @@
<slot>createKitToggled()</slot>
<hints>
<hint type="sourcelabel">
- <x>358</x>
- <y>99</y>
+ <x>543</x>
+ <y>228</y>
</hint>
<hint type="destinationlabel">
<x>339</x>
@@ -666,8 +679,8 @@
<slot>openSDKDownloadUrl()</slot>
<hints>
<hint type="sourcelabel">
- <x>20</x>
- <y>20</y>
+ <x>830</x>
+ <y>85</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
@@ -682,8 +695,8 @@
<slot>openNDKDownloadUrl()</slot>
<hints>
<hint type="sourcelabel">
- <x>20</x>
- <y>20</y>
+ <x>830</x>
+ <y>141</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
@@ -698,8 +711,8 @@
<slot>openAntDownloadUrl()</slot>
<hints>
<hint type="sourcelabel">
- <x>20</x>
- <y>20</y>
+ <x>830</x>
+ <y>313</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
@@ -714,8 +727,8 @@
<slot>openOpenJDKDownloadUrl()</slot>
<hints>
<hint type="sourcelabel">
- <x>20</x>
- <y>20</y>
+ <x>830</x>
+ <y>29</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
@@ -723,6 +736,22 @@
</hint>
</hints>
</connection>
+ <connection>
+ <sender>UseGradleCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AndroidSettingsWidget</receiver>
+ <slot>useGradleToggled()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>395</x>
+ <y>238</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>324</x>
+ <y>223</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
<slots>
<slot>sdkLocationEditingFinished()</slot>