From d7f96e3201ed8c2fd769caf7f6d6937a970c628e Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Wed, 22 May 2013 17:24:15 +0200 Subject: [PATCH] Android Deploy Options: Clean up ui Task-number: QTCREATORBUG-9208 Change-Id: I1b1864908a24af3cd7c576831656267a6390b583 Reviewed-by: BogDan Vatra --- src/plugins/android/androiddeploystep.cpp | 69 +++--- src/plugins/android/androiddeploystep.h | 13 +- .../android/androiddeploystepwidget.cpp | 35 +-- src/plugins/android/androiddeploystepwidget.h | 5 +- .../android/androiddeploystepwidget.ui | 206 +++++++----------- src/plugins/android/androidmanager.cpp | 10 +- .../android/androidpackagecreationwidget.cpp | 6 +- src/plugins/android/androidrunner.cpp | 4 +- 8 files changed, 152 insertions(+), 196 deletions(-) diff --git a/src/plugins/android/androiddeploystep.cpp b/src/plugins/android/androiddeploystep.cpp index 222da0e35c3..c11ced5f1e4 100644 --- a/src/plugins/android/androiddeploystep.cpp +++ b/src/plugins/android/androiddeploystep.cpp @@ -83,10 +83,9 @@ void AndroidDeployStep::ctor() setDefaultDisplayName(tr("Deploy to Android device")); m_deployAction = NoDeploy; - m_useLocalQtLibs = false; if (QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target()->kit())) if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0)) - m_useLocalQtLibs = true; + m_deployAction = BundleLibraries; } bool AndroidDeployStep::init() @@ -118,7 +117,6 @@ bool AndroidDeployStep::init() m_apkPathDebug = AndroidManager::apkPath(target(), AndroidManager::DebugBuild).toString(); m_apkPathRelease = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned).toString(); m_buildDirectory = static_cast(target()->project())->rootQt4ProjectNode()->buildDir(); - m_runQASIPackagePath = m_QASIPackagePath; m_runDeployAction = m_deployAction; ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (!tc || tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)) { @@ -148,15 +146,15 @@ AndroidDeployStep::AndroidDeployAction AndroidDeployStep::deployAction() return m_deployAction; } -bool AndroidDeployStep::useLocalQtLibs() -{ - return m_useLocalQtLibs; -} - bool AndroidDeployStep::fromMap(const QVariantMap &map) { - m_useLocalQtLibs = map.value(QLatin1String(USE_LOCAL_QT_KEY), false).toBool(); m_deployAction = AndroidDeployAction(map.value(QLatin1String(DEPLOY_ACTION_KEY), NoDeploy).toInt()); + QVariant useLocalQt = map.value(QLatin1String(USE_LOCAL_QT_KEY)); + if (useLocalQt.isValid()) { // old settings + if (useLocalQt.toBool() && m_deployAction == NoDeploy) + m_deployAction = BundleLibraries; + } + if (m_deployAction == InstallQASI) m_deployAction = NoDeploy; return ProjectExplorer::BuildStep::fromMap(map); @@ -165,7 +163,6 @@ bool AndroidDeployStep::fromMap(const QVariantMap &map) QVariantMap AndroidDeployStep::toMap() const { QVariantMap map = ProjectExplorer::BuildStep::toMap(); - map.insert(QLatin1String(USE_LOCAL_QT_KEY), m_useLocalQtLibs); map.insert(QLatin1String(DEPLOY_ACTION_KEY), m_deployAction); return map; } @@ -184,7 +181,7 @@ void AndroidDeployStep::cleanLibsOnDevice() QProcess *process = new QProcess(this); QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); arguments << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/tmp/qt"); - connect(process, SIGNAL(finished(int)), this, SLOT(cleanLibsFinished())); + connect(process, SIGNAL(finished(int)), this, SLOT(processFinished())); const QString adb = AndroidConfigurations::instance().adbToolPath().toString(); Core::MessageManager::instance()->printToOutputPane(adb + QLatin1String(" ") + arguments.join(QLatin1String(" ")), @@ -194,7 +191,7 @@ void AndroidDeployStep::cleanLibsOnDevice() delete process; } -void AndroidDeployStep::cleanLibsFinished() +void AndroidDeployStep::processFinished() { QProcess *process = qobject_cast(sender()); QTC_ASSERT(process, return); @@ -204,6 +201,31 @@ void AndroidDeployStep::cleanLibsFinished() process->deleteLater(); } +void AndroidDeployStep::installQASIPackage(const QString &packagePath) +{ + const QString targetArch = AndroidManager::targetArch(target()); + const QString targetSDK = AndroidManager::targetSDK(target()); + int deviceAPILevel = targetSDK.mid(targetSDK.indexOf(QLatin1Char('-')) + 1).toInt(); + QString deviceSerialNumber = AndroidConfigurations::instance().getDeployDeviceSerialNumber(&deviceAPILevel, targetArch); + if (!deviceSerialNumber.length()) { + Core::MessageManager::instance()->printToOutputPane(tr("Could not run adb. No device found."), Core::MessageManager::NoModeSwitch); + return; + } + + QProcess *process = new QProcess(this); + QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); + arguments << QLatin1String("install") << QLatin1String("-r ") << packagePath; + + connect(process, SIGNAL(finished(int)), this, SLOT(processFinished())); + const QString adb = AndroidConfigurations::instance().adbToolPath().toString(); + Core::MessageManager::instance()->printToOutputPane(adb + QLatin1String(" ") + + arguments.join(QLatin1String(" ")), + Core::MessageManager::NoModeSwitch); + process->start(adb, arguments); + if (!process->waitForFinished(500)) + delete process; +} + void AndroidDeployStep::setDeployAction(AndroidDeployStep::AndroidDeployAction deploy) { m_deployAction = deploy; @@ -211,18 +233,6 @@ void AndroidDeployStep::setDeployAction(AndroidDeployStep::AndroidDeployAction d AndroidManager::updateDeploymentSettings(target()); } -void AndroidDeployStep::setDeployQASIPackagePath(const QString &package) -{ - m_QASIPackagePath = package; - setDeployAction(InstallQASI); -} - -void AndroidDeployStep::setUseLocalQtLibs(bool useLocal) -{ - m_useLocalQtLibs = useLocal; - AndroidManager::updateDeploymentSettings(target()); -} - bool AndroidDeployStep::runCommand(QProcess *buildProc, const QString &program, const QStringList &arguments) { @@ -453,17 +463,6 @@ bool AndroidDeployStep::deployPackage() AndroidPackageCreationStep::removeDirectory(tempPath); } - if (m_runDeployAction == InstallQASI) { - if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), - AndroidDeviceInfo::adbSelector(m_deviceSerialNumber) - << QLatin1String("install") << QLatin1String("-r ") << m_runQASIPackagePath)) { - raiseError(tr("Qt Android smart installer installation failed")); - disconnect(deployProc, 0, this, 0); - deployProc->deleteLater(); - return false; - } - emit resetDelopyAction(); - } deployProc->setWorkingDirectory(m_androidDirPath.toString()); writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber)); diff --git a/src/plugins/android/androiddeploystep.h b/src/plugins/android/androiddeploystep.h index 0fa090aa54a..ad922c46e1d 100644 --- a/src/plugins/android/androiddeploystep.h +++ b/src/plugins/android/androiddeploystep.h @@ -75,9 +75,10 @@ class AndroidDeployStep : public ProjectExplorer::BuildStep public: enum AndroidDeployAction { - NoDeploy, + NoDeploy, // use ministro DeployLocal, - InstallQASI + InstallQASI, // unused old value + BundleLibraries }; public: @@ -89,28 +90,25 @@ public: int deviceAPILevel(); AndroidDeployAction deployAction(); - bool useLocalQtLibs(); bool fromMap(const QVariantMap &map); QVariantMap toMap() const; void cleanLibsOnDevice(); + void installQASIPackage(const QString &packagePath); public slots: void setDeployAction(AndroidDeployAction deploy); - void setDeployQASIPackagePath(const QString &package); - void setUseLocalQtLibs(bool useLocal); signals: void done(); void error(); - void resetDelopyAction(); private slots: bool deployPackage(); void handleBuildOutput(); void handleBuildError(); - void cleanLibsFinished(); + void processFinished(); private: AndroidDeployStep(ProjectExplorer::BuildStepList *bc, @@ -140,7 +138,6 @@ private: QString m_QASIPackagePath; AndroidDeployAction m_deployAction; - bool m_useLocalQtLibs; // members to transfer data from init() to run QString m_packageName; diff --git a/src/plugins/android/androiddeploystepwidget.cpp b/src/plugins/android/androiddeploystepwidget.cpp index 45a8373b742..482051342cd 100644 --- a/src/plugins/android/androiddeploystepwidget.cpp +++ b/src/plugins/android/androiddeploystepwidget.cpp @@ -47,21 +47,26 @@ AndroidDeployStepWidget::AndroidDeployStepWidget(AndroidDeployStep *step) : { ui->setupUi(this); - ui->useLocalQtLibs->setChecked(m_step->useLocalQtLibs()); switch (m_step->deployAction()) { + case AndroidDeployStep::NoDeploy: + ui->ministroOption->setChecked(true); + break; case AndroidDeployStep::DeployLocal: - ui->deployQtLibs->setChecked(true); + ui->temporaryQtOption->setChecked(true); + break; + case AndroidDeployStep::BundleLibraries: + ui->bundleQtOption->setChecked(true); break; default: - ui->devicesQtLibs->setChecked(true); + ui->ministroOption->setChecked(true); break; } - connect(m_step, SIGNAL(resetDelopyAction()), SLOT(resetAction())); - connect(ui->devicesQtLibs, SIGNAL(clicked()), SLOT(resetAction())); - connect(ui->deployQtLibs, SIGNAL(clicked()), SLOT(setDeployLocalQtLibs())); + connect(ui->ministroOption, SIGNAL(clicked()), SLOT(setMinistro())); + connect(ui->temporaryQtOption, SIGNAL(clicked()), SLOT(setDeployLocalQtLibs())); + connect(ui->bundleQtOption, SIGNAL(clicked()), SLOT(setBundleQtLibs())); + connect(ui->chooseButton, SIGNAL(clicked()), SLOT(setQASIPackagePath())); - connect(ui->useLocalQtLibs, SIGNAL(stateChanged(int)), SLOT(useLocalQtLibsStateChanged(int))); connect(ui->cleanLibsPushButton, SIGNAL(clicked()), SLOT(cleanLibsOnDevice())); } @@ -80,9 +85,8 @@ QString AndroidDeployStepWidget::summaryText() const return displayName(); } -void AndroidDeployStepWidget::resetAction() +void AndroidDeployStepWidget::setMinistro() { - ui->devicesQtLibs->setChecked(true); m_step->setDeployAction(AndroidDeployStep::NoDeploy); } @@ -91,19 +95,20 @@ void AndroidDeployStepWidget::setDeployLocalQtLibs() m_step->setDeployAction(AndroidDeployStep::DeployLocal); } +void AndroidDeployStepWidget::setBundleQtLibs() +{ + m_step->setDeployAction(AndroidDeployStep::BundleLibraries); +} + void AndroidDeployStepWidget::setQASIPackagePath() { QString packagePath = QFileDialog::getOpenFileName(this, tr("Qt Android Smart Installer"), QDir::homePath(), tr("Android package (*.apk)")); - if (packagePath.length()) - m_step->setDeployQASIPackagePath(packagePath); + if (!packagePath.isEmpty()) + m_step->installQASIPackage(packagePath); } -void AndroidDeployStepWidget::useLocalQtLibsStateChanged(int state) -{ - m_step->setUseLocalQtLibs(state == Qt::Checked); -} void AndroidDeployStepWidget::cleanLibsOnDevice() { diff --git a/src/plugins/android/androiddeploystepwidget.h b/src/plugins/android/androiddeploystepwidget.h index 90db7d43420..8c05d0aa629 100644 --- a/src/plugins/android/androiddeploystepwidget.h +++ b/src/plugins/android/androiddeploystepwidget.h @@ -49,10 +49,11 @@ public: ~AndroidDeployStepWidget(); private slots: - void resetAction(); + void setMinistro(); void setDeployLocalQtLibs(); + void setBundleQtLibs(); + void setQASIPackagePath(); - void useLocalQtLibsStateChanged(int); void cleanLibsOnDevice(); private: diff --git a/src/plugins/android/androiddeploystepwidget.ui b/src/plugins/android/androiddeploystepwidget.ui index 4458c494081..96ed9eb5330 100644 --- a/src/plugins/android/androiddeploystepwidget.ui +++ b/src/plugins/android/androiddeploystepwidget.ui @@ -6,8 +6,8 @@ 0 0 - 560 - 145 + 678 + 155 @@ -19,138 +19,88 @@ Form - - - - - Use Qt libraries from device - - - Use Qt libraries from device - - - true + + + + + Qt Deployment + + + + + Use the external Ministro application to download and maintain Qt libraries. + + + Use Ministro service to install Qt + + + true + + + + + + + Push local Qt libraries to device. You must have Qt libraries compiled for that platform. +The APK will not be usable on any other device. + + + Deploy local Qt libraries to temporary directory + + + + + + + Creates a standalone APK. + + + Bundle Qt libraries in APK + + + + - - - - - - Push local Qt libraries to device. -You must have Qt libraries compiled for that platform - - - Deploy local Qt libraries - - - - - - - Check this option to force the application to use local Qt libraries instead of system libraries. - - - Use local Qt libraries - - - - - - - Clean Libs on Device - - - - - - - - - - - Choose and install Ministro system wide Qt shared libraries. -This option is useful when you want to try your application on devices which don't have Android Market (e.g. Android Emulator). - - - Install Ministro, system-wide Qt shared libraries installer - - - - - - - false - - - Choose APK - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical + + + + Advanced Actions - - - 20 - 41 - - - + + + + + Clean Temporary Libraries Directory on Device + + + + + + + Install Ministro from APK + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - installQASI - toggled(bool) - chooseButton - setEnabled(bool) - - - 119 - 68 - - - 272 - 64 - - - - - deployQtLibs - clicked(bool) - useLocalQtLibs - setChecked(bool) - - - 138 - 43 - - - 343 - 44 - - - - + diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index c712a0b06de..b17e044b80b 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -319,8 +319,7 @@ bool AndroidManager::bundleQt(ProjectExplorer::Target *target) AndroidRunConfiguration *androidRunConfiguration = qobject_cast(runConfiguration); if (androidRunConfiguration != 0) { AndroidDeployStep *deployStep = androidRunConfiguration->deployStep(); - return deployStep->deployAction() == AndroidDeployStep::NoDeploy - && deployStep->useLocalQtLibs(); + return deployStep->deployAction() == AndroidDeployStep::BundleLibraries; } return false; @@ -340,9 +339,10 @@ bool AndroidManager::updateDeploymentSettings(ProjectExplorer::Target *target) return false; AndroidDeployStep *deployStep = androidRunConfiguration->deployStep(); - bool useLocalLibs = deployStep->useLocalQtLibs(); - bool deployQtLibs = deployStep->deployAction() != AndroidDeployStep::NoDeploy; - bool bundleQtLibs = useLocalLibs && !deployQtLibs; + AndroidDeployStep::AndroidDeployAction deployAction = deployStep->deployAction(); + bool useLocalLibs = deployAction == AndroidDeployStep::DeployLocal + || deployAction == AndroidDeployStep::BundleLibraries; + bool bundleQtLibs = deployAction == AndroidDeployStep::BundleLibraries; QDomDocument doc; if (!openManifest(target, doc)) diff --git a/src/plugins/android/androidpackagecreationwidget.cpp b/src/plugins/android/androidpackagecreationwidget.cpp index ac667ee1660..5bb28769559 100644 --- a/src/plugins/android/androidpackagecreationwidget.cpp +++ b/src/plugins/android/androidpackagecreationwidget.cpp @@ -234,7 +234,8 @@ void AndroidPackageCreationWidget::setQtLibs(QModelIndex, QModelIndex) { AndroidManager::setQtLibs(m_step->target(), m_qtLibsModel->checkedItems()); AndroidDeployStep * const deployStep = AndroidGlobal::buildStep(m_step->target()->activeDeployConfiguration()); - if (deployStep->useLocalQtLibs()) + if (deployStep->deployAction() == AndroidDeployStep::DeployLocal + || deployStep->deployAction() == AndroidDeployStep::BundleLibraries) AndroidManager::updateDeploymentSettings(m_step->target()); } @@ -242,7 +243,8 @@ void AndroidPackageCreationWidget::setPrebundledLibs(QModelIndex, QModelIndex) { AndroidManager::setPrebundledLibs(m_step->target(), m_prebundledLibs->checkedItems()); AndroidDeployStep * const deployStep = AndroidGlobal::buildStep(m_step->target()->activeDeployConfiguration()); - if (deployStep->useLocalQtLibs()) + if (deployStep->deployAction() == AndroidDeployStep::DeployLocal + || deployStep->deployAction() == AndroidDeployStep::BundleLibraries) AndroidManager::updateDeploymentSettings(m_step->target()); } diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 471c380f3bc..a005e10fde6 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -74,7 +74,9 @@ AndroidRunner::AndroidRunner(QObject *parent, } ProjectExplorer::Target *target = runConfig->target(); AndroidDeployStep *ds = runConfig->deployStep(); - if ((m_useLocalQtLibs = ds->useLocalQtLibs())) { + m_useLocalQtLibs = ds->deployAction() == AndroidDeployStep::DeployLocal + || ds->deployAction() == AndroidDeployStep::BundleLibraries; + if (m_useLocalQtLibs) { m_localLibs = AndroidManager::loadLocalLibs(target, ds->deviceAPILevel()); m_localJars = AndroidManager::loadLocalJars(target, ds->deviceAPILevel()); m_localJarsInitClasses = AndroidManager::loadLocalJarsInitClasses(target, ds->deviceAPILevel());