forked from qt-creator/qt-creator
Android: Rework settings dialog
Make it possible to create multiple AndroidConfigs so that we can have a different one in the settings dialog from the global one. Move pretty much every method from AndroidConfigurations to AndroidConfig, so that the settings dialog can work with its copy. Also add some additional logic to the settings page around the java setting. To start the avd manager we need both a sdk path and a java path. Also do some basic additional checking of the java path. Task-number: QTCREATORBUG-7724 Task-number: QTCREATORBUG-10936 Task-number: QTCREATORBUG-10937 Task-number: QTCREATORBUG-11059 Task-number: QTCREATORBUG-11218 Change-Id: I148c69b9c98a8a070d17d9b0e223d01db1750e69 Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
@@ -113,7 +113,11 @@ namespace {
|
||||
}
|
||||
}
|
||||
|
||||
Abi::Architecture AndroidConfigurations::architectureForToolChainPrefix(const QString& toolchainprefix)
|
||||
//////////////////////////////////
|
||||
// AndroidConfig
|
||||
//////////////////////////////////
|
||||
|
||||
Abi::Architecture AndroidConfig::architectureForToolChainPrefix(const QString& toolchainprefix)
|
||||
{
|
||||
if (toolchainprefix == ArmToolchainPrefix)
|
||||
return Abi::ArmArchitecture;
|
||||
@@ -124,7 +128,7 @@ Abi::Architecture AndroidConfigurations::architectureForToolChainPrefix(const QS
|
||||
return Abi::UnknownArchitecture;
|
||||
}
|
||||
|
||||
QLatin1String AndroidConfigurations::toolchainPrefix(Abi::Architecture architecture)
|
||||
QLatin1String AndroidConfig::toolchainPrefix(Abi::Architecture architecture)
|
||||
{
|
||||
switch (architecture) {
|
||||
case Abi::ArmArchitecture:
|
||||
@@ -138,7 +142,7 @@ QLatin1String AndroidConfigurations::toolchainPrefix(Abi::Architecture architect
|
||||
}
|
||||
}
|
||||
|
||||
QLatin1String AndroidConfigurations::toolsPrefix(Abi::Architecture architecture)
|
||||
QLatin1String AndroidConfig::toolsPrefix(Abi::Architecture architecture)
|
||||
{
|
||||
switch (architecture) {
|
||||
case Abi::ArmArchitecture:
|
||||
@@ -152,47 +156,50 @@ QLatin1String AndroidConfigurations::toolsPrefix(Abi::Architecture architecture)
|
||||
}
|
||||
}
|
||||
|
||||
AndroidConfig::AndroidConfig(const QSettings &settings)
|
||||
void AndroidConfig::load(const QSettings &settings)
|
||||
{
|
||||
// user settings
|
||||
partitionSize = settings.value(PartitionSizeKey, 1024).toInt();
|
||||
sdkLocation = FileName::fromString(settings.value(SDKLocationKey).toString());
|
||||
ndkLocation = FileName::fromString(settings.value(NDKLocationKey).toString());
|
||||
antLocation = FileName::fromString(settings.value(AntLocationKey).toString());
|
||||
openJDKLocation = FileName::fromString(settings.value(OpenJDKLocationKey).toString());
|
||||
keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString());
|
||||
toolchainHost = settings.value(ToolchainHostKey).toString();
|
||||
automaticKitCreation = settings.value(AutomaticKitCreationKey, true).toBool();
|
||||
m_partitionSize = settings.value(PartitionSizeKey, 1024).toInt();
|
||||
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_openJDKLocation = FileName::fromString(settings.value(OpenJDKLocationKey).toString());
|
||||
m_keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString());
|
||||
m_toolchainHost = settings.value(ToolchainHostKey).toString();
|
||||
m_automaticKitCreation = settings.value(AutomaticKitCreationKey, true).toBool();
|
||||
QString extraDirectory = settings.value(MakeExtraSearchDirectory).toString();
|
||||
makeExtraSearchDirectories.clear();
|
||||
m_makeExtraSearchDirectories.clear();
|
||||
if (!extraDirectory.isEmpty())
|
||||
makeExtraSearchDirectories << extraDirectory;
|
||||
m_makeExtraSearchDirectories << extraDirectory;
|
||||
|
||||
PersistentSettingsReader reader;
|
||||
if (reader.load(FileName::fromString(sdkSettingsFileName()))
|
||||
&& settings.value(changeTimeStamp).toInt() != QFileInfo(sdkSettingsFileName()).lastModified().toMSecsSinceEpoch() / 1000) {
|
||||
// persisten settings
|
||||
sdkLocation = FileName::fromString(reader.restoreValue(SDKLocationKey).toString());
|
||||
ndkLocation = FileName::fromString(reader.restoreValue(NDKLocationKey).toString());
|
||||
antLocation = FileName::fromString(reader.restoreValue(AntLocationKey).toString());
|
||||
openJDKLocation = FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString());
|
||||
keystoreLocation = FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString());
|
||||
toolchainHost = reader.restoreValue(ToolchainHostKey).toString();
|
||||
m_sdkLocation = FileName::fromString(reader.restoreValue(SDKLocationKey).toString());
|
||||
m_ndkLocation = FileName::fromString(reader.restoreValue(NDKLocationKey).toString());
|
||||
m_antLocation = FileName::fromString(reader.restoreValue(AntLocationKey).toString());
|
||||
m_openJDKLocation = FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString());
|
||||
m_keystoreLocation = FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString());
|
||||
m_toolchainHost = reader.restoreValue(ToolchainHostKey).toString();
|
||||
QVariant v = reader.restoreValue(AutomaticKitCreationKey);
|
||||
if (v.isValid())
|
||||
automaticKitCreation = v.toBool();
|
||||
m_automaticKitCreation = v.toBool();
|
||||
QString extraDirectory = reader.restoreValue(MakeExtraSearchDirectory).toString();
|
||||
makeExtraSearchDirectories.clear();
|
||||
m_makeExtraSearchDirectories.clear();
|
||||
if (!extraDirectory.isEmpty())
|
||||
makeExtraSearchDirectories << extraDirectory;
|
||||
m_makeExtraSearchDirectories << extraDirectory;
|
||||
// persistent settings
|
||||
}
|
||||
|
||||
m_availableSdkPlatformsUpToDate = false;
|
||||
m_NdkInformationUpToDate = false;
|
||||
}
|
||||
|
||||
AndroidConfig::AndroidConfig()
|
||||
: m_availableSdkPlatformsUpToDate(false),
|
||||
m_NdkInformationUpToDate(false)
|
||||
{
|
||||
partitionSize = 1024;
|
||||
|
||||
}
|
||||
|
||||
void AndroidConfig::save(QSettings &settings) const
|
||||
@@ -202,48 +209,60 @@ void AndroidConfig::save(QSettings &settings) const
|
||||
settings.setValue(changeTimeStamp, fileInfo.lastModified().toMSecsSinceEpoch() / 1000);
|
||||
|
||||
// user settings
|
||||
settings.setValue(SDKLocationKey, sdkLocation.toString());
|
||||
settings.setValue(NDKLocationKey, ndkLocation.toString());
|
||||
settings.setValue(AntLocationKey, antLocation.toString());
|
||||
settings.setValue(OpenJDKLocationKey, openJDKLocation.toString());
|
||||
settings.setValue(KeystoreLocationKey, keystoreLocation.toString());
|
||||
settings.setValue(PartitionSizeKey, partitionSize);
|
||||
settings.setValue(AutomaticKitCreationKey, automaticKitCreation);
|
||||
settings.setValue(ToolchainHostKey, toolchainHost);
|
||||
settings.setValue(SDKLocationKey, m_sdkLocation.toString());
|
||||
settings.setValue(NDKLocationKey, m_ndkLocation.toString());
|
||||
settings.setValue(AntLocationKey, m_antLocation.toString());
|
||||
settings.setValue(OpenJDKLocationKey, m_openJDKLocation.toString());
|
||||
settings.setValue(KeystoreLocationKey, m_keystoreLocation.toString());
|
||||
settings.setValue(PartitionSizeKey, m_partitionSize);
|
||||
settings.setValue(AutomaticKitCreationKey, m_automaticKitCreation);
|
||||
settings.setValue(ToolchainHostKey, m_toolchainHost);
|
||||
settings.setValue(MakeExtraSearchDirectory,
|
||||
makeExtraSearchDirectories.isEmpty() ? QString()
|
||||
: makeExtraSearchDirectories.at(0));
|
||||
m_makeExtraSearchDirectories.isEmpty() ? QString()
|
||||
: m_makeExtraSearchDirectories.at(0));
|
||||
}
|
||||
|
||||
void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
|
||||
{
|
||||
m_config = devConfigs;
|
||||
|
||||
if (m_config.toolchainHost.isEmpty())
|
||||
detectToolchainHost();
|
||||
|
||||
save();
|
||||
updateAvailableNdkPlatforms();
|
||||
updateAvailableSdkPlatforms();
|
||||
updateAutomaticKitList();
|
||||
updateAndroidDevice();
|
||||
emit updated();
|
||||
}
|
||||
|
||||
void AndroidConfigurations::updateAvailableNdkPlatforms()
|
||||
void AndroidConfig::updateNdkInformation() const
|
||||
{
|
||||
if (m_NdkInformationUpToDate)
|
||||
return;
|
||||
m_availableNdkPlatforms.clear();
|
||||
FileName path = m_config.ndkLocation;
|
||||
FileName path = ndkLocation();
|
||||
QDirIterator it(path.appendPath(QLatin1String("platforms")).toString(), QStringList() << QLatin1String("android-*"), QDir::Dirs);
|
||||
while (it.hasNext()) {
|
||||
const QString &fileName = it.next();
|
||||
m_availableNdkPlatforms.push_back(fileName.mid(fileName.lastIndexOf(QLatin1Char('-')) + 1).toInt());
|
||||
}
|
||||
qSort(m_availableNdkPlatforms.begin(), m_availableNdkPlatforms.end(), qGreater<int>());
|
||||
|
||||
// detect toolchain host
|
||||
QStringList hostPatterns;
|
||||
switch (HostOsInfo::hostOs()) {
|
||||
case OsTypeLinux:
|
||||
hostPatterns << QLatin1String("linux*");
|
||||
break;
|
||||
case OsTypeWindows:
|
||||
hostPatterns << QLatin1String("windows*");
|
||||
break;
|
||||
case OsTypeMac:
|
||||
hostPatterns << QLatin1String("darwin*");
|
||||
break;
|
||||
default: /* unknown host */ return;
|
||||
}
|
||||
|
||||
QDirIterator jt(path.appendPath(QLatin1String("prebuilt")).toString(), hostPatterns, QDir::Dirs);
|
||||
if (jt.hasNext()) {
|
||||
jt.next();
|
||||
m_toolchainHost = jt.fileName();
|
||||
}
|
||||
|
||||
m_NdkInformationUpToDate = true;
|
||||
}
|
||||
|
||||
void AndroidConfigurations::updateAvailableSdkPlatforms()
|
||||
void AndroidConfig::updateAvailableSdkPlatforms() const
|
||||
{
|
||||
if (m_availableSdkPlatformsUpToDate)
|
||||
return;
|
||||
m_availableSdkPlatforms.clear();
|
||||
|
||||
QProcess proc;
|
||||
@@ -263,10 +282,12 @@ void AndroidConfigurations::updateAvailableSdkPlatforms()
|
||||
QVector<int>::iterator it = qLowerBound(m_availableSdkPlatforms.begin(), m_availableSdkPlatforms.end(), apiLevel, qGreater<int>());
|
||||
m_availableSdkPlatforms.insert(it, apiLevel);
|
||||
}
|
||||
m_availableSdkPlatformsUpToDate = true;
|
||||
}
|
||||
|
||||
QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const
|
||||
QStringList AndroidConfig::sdkTargets(int minApiLevel) const
|
||||
{
|
||||
updateAvailableSdkPlatforms();
|
||||
QStringList result;
|
||||
for (int i = 0; i < m_availableSdkPlatforms.size(); ++i) {
|
||||
if (m_availableSdkPlatforms.at(i) >= minApiLevel)
|
||||
@@ -277,184 +298,106 @@ QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const
|
||||
return result;
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::adbToolPath() const
|
||||
FileName AndroidConfig::adbToolPath() const
|
||||
{
|
||||
FileName path = m_config.sdkLocation;
|
||||
Utils::FileName path = m_sdkLocation;
|
||||
return path.appendPath(QLatin1String("platform-tools/adb" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
Utils::Environment AndroidConfigurations::androidToolEnvironment() const
|
||||
Utils::Environment AndroidConfig::androidToolEnvironment() const
|
||||
{
|
||||
Utils::Environment env = Utils::Environment::systemEnvironment();
|
||||
if (!m_config.openJDKLocation.isEmpty())
|
||||
env.set(QLatin1String("JAVA_HOME"), m_config.openJDKLocation.toUserOutput());
|
||||
if (!m_openJDKLocation.isEmpty())
|
||||
env.set(QLatin1String("JAVA_HOME"), m_openJDKLocation.toUserOutput());
|
||||
return env;
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::androidToolPath() const
|
||||
FileName AndroidConfig::androidToolPath() const
|
||||
{
|
||||
if (HostOsInfo::isWindowsHost()) {
|
||||
// I want to switch from using android.bat to using an executable. All it really does is call
|
||||
// Java and I've made some progress on it. So if android.exe exists, return that instead.
|
||||
FileName path = m_config.sdkLocation;
|
||||
FileName path = m_sdkLocation;
|
||||
path.appendPath(QLatin1String("tools/android" QTC_HOST_EXE_SUFFIX));
|
||||
if (path.toFileInfo().exists())
|
||||
return path;
|
||||
path = m_config.sdkLocation;
|
||||
path = m_sdkLocation;
|
||||
return path.appendPath(QLatin1String("tools/android" ANDROID_BAT_SUFFIX));
|
||||
} else {
|
||||
FileName path = m_config.sdkLocation;
|
||||
FileName path = m_sdkLocation;
|
||||
return path.appendPath(QLatin1String("tools/android"));
|
||||
}
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::antToolPath() const
|
||||
FileName AndroidConfig::antToolPath() const
|
||||
{
|
||||
if (!m_config.antLocation.isEmpty())
|
||||
return m_config.antLocation;
|
||||
if (!m_antLocation.isEmpty())
|
||||
return m_antLocation;
|
||||
else
|
||||
return FileName::fromString(QLatin1String("ant"));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::emulatorToolPath() const
|
||||
FileName AndroidConfig::emulatorToolPath() const
|
||||
{
|
||||
FileName path = m_config.sdkLocation;
|
||||
FileName path = m_sdkLocation;
|
||||
return path.appendPath(QLatin1String("tools/emulator" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::toolPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
FileName AndroidConfig::toolPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
{
|
||||
FileName path = m_config.ndkLocation;
|
||||
FileName path = m_ndkLocation;
|
||||
return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/%3/bin/%4")
|
||||
.arg(toolchainPrefix(architecture))
|
||||
.arg(ndkToolChainVersion)
|
||||
.arg(m_config.toolchainHost)
|
||||
.arg(toolchainHost())
|
||||
.arg(toolsPrefix(architecture)));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::stripPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
FileName AndroidConfig::stripPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
{
|
||||
return toolPath(architecture, ndkToolChainVersion).appendString(QLatin1String("-strip" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::readelfPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
FileName AndroidConfig::readelfPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
{
|
||||
return toolPath(architecture, ndkToolChainVersion).appendString(QLatin1String("-readelf" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::gccPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
FileName AndroidConfig::gccPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
{
|
||||
return toolPath(architecture, ndkToolChainVersion).appendString(QLatin1String("-gcc" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::gdbPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
FileName AndroidConfig::gdbPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||
{
|
||||
return toolPath(architecture, ndkToolChainVersion).appendString(QLatin1String("-gdb" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::openJDKPath() const
|
||||
FileName AndroidConfig::openJDKBinPath() const
|
||||
{
|
||||
return m_config.openJDKLocation;
|
||||
}
|
||||
|
||||
void AndroidConfigurations::detectToolchainHost()
|
||||
{
|
||||
QStringList hostPatterns;
|
||||
switch (HostOsInfo::hostOs()) {
|
||||
case OsTypeLinux:
|
||||
hostPatterns << QLatin1String("linux*");
|
||||
break;
|
||||
case OsTypeWindows:
|
||||
hostPatterns << QLatin1String("windows*");
|
||||
break;
|
||||
case OsTypeMac:
|
||||
hostPatterns << QLatin1String("darwin*");
|
||||
break;
|
||||
default: /* unknown host */ return;
|
||||
}
|
||||
|
||||
FileName path = m_config.ndkLocation;
|
||||
QDirIterator it(path.appendPath(QLatin1String("prebuilt")).toString(), hostPatterns, QDir::Dirs);
|
||||
if (it.hasNext()) {
|
||||
it.next();
|
||||
m_config.toolchainHost = it.fileName();
|
||||
}
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::openJDKBinPath() const
|
||||
{
|
||||
FileName path = m_config.openJDKLocation;
|
||||
FileName path = m_openJDKLocation;
|
||||
if (!path.isEmpty())
|
||||
return path.appendPath(QLatin1String("bin"));
|
||||
return path;
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::keytoolPath() const
|
||||
FileName AndroidConfig::keytoolPath() const
|
||||
{
|
||||
return openJDKBinPath().appendPath(keytoolName);
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::jarsignerPath() const
|
||||
FileName AndroidConfig::jarsignerPath() const
|
||||
{
|
||||
return openJDKBinPath().appendPath(jarsignerName);
|
||||
}
|
||||
|
||||
FileName AndroidConfigurations::zipalignPath() const
|
||||
FileName AndroidConfig::zipalignPath() const
|
||||
{
|
||||
FileName path = m_config.sdkLocation;
|
||||
FileName path = m_sdkLocation;
|
||||
return path.appendPath(QLatin1String("tools/zipalign" QTC_HOST_EXE_SUFFIX));
|
||||
}
|
||||
|
||||
AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi)
|
||||
{
|
||||
QString serialNumber = defaultDevice(project, abi);
|
||||
if (!serialNumber.isEmpty()) {
|
||||
// search for that device
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::instance().connectedDevices())
|
||||
if (info.serialNumber == serialNumber
|
||||
&& info.sdk >= apiLevel)
|
||||
return info;
|
||||
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::instance().androidVirtualDevices())
|
||||
if (info.serialNumber == serialNumber
|
||||
&& info.sdk >= apiLevel)
|
||||
return info;
|
||||
}
|
||||
|
||||
AndroidDeviceDialog dialog(apiLevel, abi, Core::ICore::mainWindow());
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
AndroidDeviceInfo info = dialog.device();
|
||||
if (dialog.saveDeviceSelection()) {
|
||||
if (!info.serialNumber.isEmpty())
|
||||
AndroidConfigurations::instance().setDefaultDevice(project, abi, info.serialNumber);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
return AndroidDeviceInfo();
|
||||
}
|
||||
|
||||
void AndroidConfigurations::clearDefaultDevices(ProjectExplorer::Project *project)
|
||||
{
|
||||
if (m_defaultDeviceForAbi.contains(project))
|
||||
m_defaultDeviceForAbi.remove(project);
|
||||
}
|
||||
|
||||
void AndroidConfigurations::setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber)
|
||||
{
|
||||
m_defaultDeviceForAbi[project][abi] = serialNumber;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::defaultDevice(Project *project, const QString &abi) const
|
||||
{
|
||||
if (!m_defaultDeviceForAbi.contains(project))
|
||||
return QString();
|
||||
const QMap<QString, QString> &map = m_defaultDeviceForAbi.value(project);
|
||||
if (!map.contains(abi))
|
||||
return QString();
|
||||
return map.value(abi);
|
||||
}
|
||||
|
||||
QVector<AndroidDeviceInfo> AndroidConfigurations::connectedDevices(QString *error) const
|
||||
QVector<AndroidDeviceInfo> AndroidConfig::connectedDevices(QString *error) const
|
||||
{
|
||||
QVector<AndroidDeviceInfo> devices;
|
||||
QProcess adbProc;
|
||||
@@ -462,7 +405,9 @@ QVector<AndroidDeviceInfo> AndroidConfigurations::connectedDevices(QString *erro
|
||||
if (!adbProc.waitForFinished(5000)) {
|
||||
adbProc.kill();
|
||||
if (error)
|
||||
*error = tr("Could not run: %1").arg(adbToolPath().toString() + QLatin1String(" devices"));
|
||||
*error = QApplication::translate("AndroidConfiguration",
|
||||
"Could not run: %1")
|
||||
.arg(adbToolPath().toString() + QLatin1String(" devices"));
|
||||
return devices;
|
||||
}
|
||||
QList<QByteArray> adbDevs = adbProc.readAll().trimmed().split('\n');
|
||||
@@ -491,11 +436,13 @@ QVector<AndroidDeviceInfo> AndroidConfigurations::connectedDevices(QString *erro
|
||||
|
||||
qSort(devices.begin(), devices.end(), androidDevicesLessThan);
|
||||
if (devices.isEmpty() && error)
|
||||
*error = tr("No devices found in output of: %1").arg(adbToolPath().toString() + QLatin1String(" devices"));
|
||||
*error = QApplication::translate("AndroidConfiguration",
|
||||
"No devices found in output of: %1")
|
||||
.arg(adbToolPath().toString() + QLatin1String(" devices"));
|
||||
return devices;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::createAVD(QWidget *parent, int minApiLevel, QString targetArch) const
|
||||
QString AndroidConfig::createAVD(QWidget *parent, int minApiLevel, QString targetArch) const
|
||||
{
|
||||
QDialog d(parent);
|
||||
Ui::AddNewAVDDialog avdDialog;
|
||||
@@ -514,9 +461,9 @@ QString AndroidConfigurations::createAVD(QWidget *parent, int minApiLevel, QStri
|
||||
avdDialog.abiComboBox->addItems(QStringList(targetArch));
|
||||
|
||||
if (!avdDialog.targetComboBox->count()) {
|
||||
QMessageBox::critical(0, tr("Error Creating AVD"),
|
||||
tr("Cannot create a new AVD. No sufficiently recent Android SDK available.\n"
|
||||
"Please install an SDK of at least API version %1.").
|
||||
QMessageBox::critical(0, QApplication::translate("AndroidConfig", "Error Creating AVD"),
|
||||
QApplication::translate("AndroidConfig", "Cannot create a new AVD. No sufficiently recent Android SDK available.\n"
|
||||
"Please install an SDK of at least API version %1.").
|
||||
arg(minApiLevel));
|
||||
return QString();
|
||||
}
|
||||
@@ -526,10 +473,11 @@ QString AndroidConfigurations::createAVD(QWidget *parent, int minApiLevel, QStri
|
||||
avdDialog.nameLineEdit->setValidator(&v);
|
||||
if (d.exec() != QDialog::Accepted)
|
||||
return QString();
|
||||
return createAVD(avdDialog.targetComboBox->currentText(), avdDialog.nameLineEdit->text(), avdDialog.abiComboBox->currentText(), avdDialog.sizeSpinBox->value());
|
||||
return createAVD(avdDialog.targetComboBox->currentText(), avdDialog.nameLineEdit->text(),
|
||||
avdDialog.abiComboBox->currentText(), avdDialog.sizeSpinBox->value());
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::createAVD(const QString &target, const QString &name, const QString &abi, int sdcardSize ) const
|
||||
QString AndroidConfig::createAVD(const QString &target, const QString &name, const QString &abi, int sdcardSize) const
|
||||
{
|
||||
QProcess proc;
|
||||
proc.setProcessEnvironment(androidToolEnvironment().toProcessEnvironment());
|
||||
@@ -573,7 +521,7 @@ QString AndroidConfigurations::createAVD(const QString &target, const QString &n
|
||||
return name;
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::removeAVD(const QString &name) const
|
||||
bool AndroidConfig::removeAVD(const QString &name) const
|
||||
{
|
||||
QProcess proc;
|
||||
proc.setProcessEnvironment(androidToolEnvironment().toProcessEnvironment());
|
||||
@@ -587,7 +535,7 @@ bool AndroidConfigurations::removeAVD(const QString &name) const
|
||||
return !proc.exitCode();
|
||||
}
|
||||
|
||||
QVector<AndroidDeviceInfo> AndroidConfigurations::androidVirtualDevices() const
|
||||
QVector<AndroidDeviceInfo> AndroidConfig::androidVirtualDevices() const
|
||||
{
|
||||
QVector<AndroidDeviceInfo> devices;
|
||||
QProcess proc;
|
||||
@@ -635,22 +583,21 @@ QVector<AndroidDeviceInfo> AndroidConfigurations::androidVirtualDevices() const
|
||||
return devices;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::startAVD(const QString &name, int apiLevel, QString cpuAbi) const
|
||||
QString AndroidConfig::startAVD(const QString &name, int apiLevel, QString cpuAbi) const
|
||||
{
|
||||
if (!findAvd(apiLevel, cpuAbi).isEmpty() || startAVDAsync(name))
|
||||
return waitForAvd(apiLevel, cpuAbi);
|
||||
return QString();
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::startAVDAsync(const QString &avdName) const
|
||||
bool AndroidConfig::startAVDAsync(const QString &avdName) const
|
||||
{
|
||||
QProcess *avdProcess = new QProcess();
|
||||
connect(this, SIGNAL(destroyed()), avdProcess, SLOT(deleteLater()));
|
||||
connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater()));
|
||||
avdProcess->connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater()));
|
||||
|
||||
// start the emulator
|
||||
avdProcess->start(emulatorToolPath().toString(),
|
||||
QStringList() << QLatin1String("-partition-size") << QString::number(config().partitionSize)
|
||||
QStringList() << QLatin1String("-partition-size") << QString::number(partitionSize())
|
||||
<< QLatin1String("-avd") << avdName);
|
||||
if (!avdProcess->waitForStarted(-1)) {
|
||||
delete avdProcess;
|
||||
@@ -659,7 +606,7 @@ bool AndroidConfigurations::startAVDAsync(const QString &avdName) const
|
||||
return true;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::findAvd(int apiLevel, const QString &cpuAbi) const
|
||||
QString AndroidConfig::findAvd(int apiLevel, const QString &cpuAbi) const
|
||||
{
|
||||
QVector<AndroidDeviceInfo> devices = connectedDevices();
|
||||
foreach (AndroidDeviceInfo device, devices) {
|
||||
@@ -674,7 +621,7 @@ QString AndroidConfigurations::findAvd(int apiLevel, const QString &cpuAbi) cons
|
||||
return QString();
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::isConnected(const QString &serialNumber) const
|
||||
bool AndroidConfig::isConnected(const QString &serialNumber) const
|
||||
{
|
||||
QVector<AndroidDeviceInfo> devices = connectedDevices();
|
||||
foreach (AndroidDeviceInfo device, devices) {
|
||||
@@ -684,7 +631,7 @@ bool AndroidConfigurations::isConnected(const QString &serialNumber) const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::waitForBooted(const QString &serialNumber, const QFutureInterface<bool> &fi) const
|
||||
bool AndroidConfig::waitForBooted(const QString &serialNumber, const QFutureInterface<bool> &fi) const
|
||||
{
|
||||
// found a serial number, now wait until it's done booting...
|
||||
for (int i = 0; i < 60; ++i) {
|
||||
@@ -701,7 +648,7 @@ bool AndroidConfigurations::waitForBooted(const QString &serialNumber, const QFu
|
||||
return false;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::waitForAvd(int apiLevel, const QString &cpuAbi, const QFutureInterface<bool> &fi) const
|
||||
QString AndroidConfig::waitForAvd(int apiLevel, const QString &cpuAbi, const QFutureInterface<bool> &fi) const
|
||||
{
|
||||
// we cannot use adb -e wait-for-device, since that doesn't work if a emulator is already running
|
||||
// 60 rounds of 2s sleeping, two minutes for the avd to start
|
||||
@@ -717,7 +664,7 @@ QString AndroidConfigurations::waitForAvd(int apiLevel, const QString &cpuAbi, c
|
||||
return QString();
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::isBootToQt(const QString &device) const
|
||||
bool AndroidConfig::isBootToQt(const QString &device) const
|
||||
{
|
||||
// workaround for '????????????' serial numbers
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(device);
|
||||
@@ -733,7 +680,7 @@ bool AndroidConfigurations::isBootToQt(const QString &device) const
|
||||
return adbProc.readAll().contains("Boot2Qt");
|
||||
}
|
||||
|
||||
int AndroidConfigurations::getSDKVersion(const QString &device) const
|
||||
int AndroidConfig::getSDKVersion(const QString &device) const
|
||||
{
|
||||
// workaround for '????????????' serial numbers
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(device);
|
||||
@@ -754,7 +701,7 @@ int AndroidConfigurations::getSDKVersion(const QString &device) const
|
||||
//! \param device serial number
|
||||
//! \return the produce model of the device or if that cannot be read the serial number
|
||||
//!
|
||||
QString AndroidConfigurations::getProductModel(const QString &device) const
|
||||
QString AndroidConfig::getProductModel(const QString &device) const
|
||||
{
|
||||
if (m_serialNumberToDeviceName.contains(device))
|
||||
return m_serialNumberToDeviceName.value(device);
|
||||
@@ -777,7 +724,7 @@ QString AndroidConfigurations::getProductModel(const QString &device) const
|
||||
return model;
|
||||
}
|
||||
|
||||
bool AndroidConfigurations::hasFinishedBooting(const QString &device) const
|
||||
bool AndroidConfig::hasFinishedBooting(const QString &device) const
|
||||
{
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(device);
|
||||
arguments << QLatin1String("shell") << QLatin1String("getprop")
|
||||
@@ -795,7 +742,7 @@ bool AndroidConfigurations::hasFinishedBooting(const QString &device) const
|
||||
return false;
|
||||
}
|
||||
|
||||
QStringList AndroidConfigurations::getAbis(const QString &device) const
|
||||
QStringList AndroidConfig::getAbis(const QString &device) const
|
||||
{
|
||||
QStringList result;
|
||||
for (int i = 1; i < 6; ++i) {
|
||||
@@ -820,15 +767,17 @@ QStringList AndroidConfigurations::getAbis(const QString &device) const
|
||||
return result;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::highestAndroidSdk() const
|
||||
QString AndroidConfig::highestAndroidSdk() const
|
||||
{
|
||||
updateAvailableSdkPlatforms();
|
||||
if (m_availableSdkPlatforms.isEmpty())
|
||||
return QString();
|
||||
return QLatin1String("android-") + QString::number(m_availableSdkPlatforms.first());
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::bestNdkPlatformMatch(const QString &targetAPI) const
|
||||
QString AndroidConfig::bestNdkPlatformMatch(const QString &targetAPI) const
|
||||
{
|
||||
updateNdkInformation();
|
||||
int target = targetAPI.mid(targetAPI.lastIndexOf(QLatin1Char('-')) + 1).toInt();
|
||||
foreach (int apiLevel, m_availableNdkPlatforms) {
|
||||
if (apiLevel <= target)
|
||||
@@ -837,9 +786,150 @@ QString AndroidConfigurations::bestNdkPlatformMatch(const QString &targetAPI) co
|
||||
return QLatin1String("android-8");
|
||||
}
|
||||
|
||||
QStringList AndroidConfigurations::makeExtraSearchDirectories() const
|
||||
FileName AndroidConfig::sdkLocation() const
|
||||
{
|
||||
return m_config.makeExtraSearchDirectories;
|
||||
return m_sdkLocation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setSdkLocation(const FileName &sdkLocation)
|
||||
{
|
||||
m_sdkLocation = sdkLocation;
|
||||
m_availableSdkPlatformsUpToDate = false;
|
||||
}
|
||||
|
||||
FileName AndroidConfig::ndkLocation() const
|
||||
{
|
||||
return m_ndkLocation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setNdkLocation(const FileName &ndkLocation)
|
||||
{
|
||||
m_ndkLocation = ndkLocation;
|
||||
m_NdkInformationUpToDate = false;
|
||||
}
|
||||
|
||||
FileName AndroidConfig::antLocation() const
|
||||
{
|
||||
return m_antLocation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setAntLocation(const FileName &antLocation)
|
||||
{
|
||||
m_antLocation = antLocation;
|
||||
}
|
||||
|
||||
FileName AndroidConfig::openJDKLocation() const
|
||||
{
|
||||
return m_openJDKLocation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setOpenJDKLocation(const FileName &openJDKLocation)
|
||||
{
|
||||
m_openJDKLocation = openJDKLocation;
|
||||
m_availableSdkPlatformsUpToDate = false;
|
||||
}
|
||||
|
||||
FileName AndroidConfig::keystoreLocation() const
|
||||
{
|
||||
return m_keystoreLocation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setKeystoreLocation(const FileName &keystoreLocation)
|
||||
{
|
||||
m_keystoreLocation = keystoreLocation;
|
||||
}
|
||||
|
||||
QString AndroidConfig::toolchainHost() const
|
||||
{
|
||||
updateNdkInformation();
|
||||
return m_toolchainHost;
|
||||
}
|
||||
|
||||
QStringList AndroidConfig::makeExtraSearchDirectories() const
|
||||
{
|
||||
return m_makeExtraSearchDirectories;
|
||||
}
|
||||
|
||||
unsigned AndroidConfig::partitionSize() const
|
||||
{
|
||||
return m_partitionSize;
|
||||
}
|
||||
|
||||
void AndroidConfig::setPartitionSize(unsigned partitionSize)
|
||||
{
|
||||
m_partitionSize = partitionSize;
|
||||
}
|
||||
|
||||
bool AndroidConfig::automaticKitCreation() const
|
||||
{
|
||||
return m_automaticKitCreation;
|
||||
}
|
||||
|
||||
void AndroidConfig::setAutomaticKitCreation(bool b)
|
||||
{
|
||||
m_automaticKitCreation = b;
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// AndroidConfigurations
|
||||
///////////////////////////////////
|
||||
void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
|
||||
{
|
||||
m_instance->m_config = devConfigs;
|
||||
|
||||
m_instance->save();
|
||||
m_instance->updateAutomaticKitList();
|
||||
m_instance->updateAndroidDevice();
|
||||
emit m_instance->updated();
|
||||
}
|
||||
|
||||
AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi)
|
||||
{
|
||||
QString serialNumber = defaultDevice(project, abi);
|
||||
if (!serialNumber.isEmpty()) {
|
||||
// search for that device
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::currentConfig().connectedDevices())
|
||||
if (info.serialNumber == serialNumber
|
||||
&& info.sdk >= apiLevel)
|
||||
return info;
|
||||
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::currentConfig().androidVirtualDevices())
|
||||
if (info.serialNumber == serialNumber
|
||||
&& info.sdk >= apiLevel)
|
||||
return info;
|
||||
}
|
||||
|
||||
AndroidDeviceDialog dialog(apiLevel, abi, Core::ICore::mainWindow());
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
AndroidDeviceInfo info = dialog.device();
|
||||
if (dialog.saveDeviceSelection()) {
|
||||
if (!info.serialNumber.isEmpty())
|
||||
AndroidConfigurations::setDefaultDevice(project, abi, info.serialNumber);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
return AndroidDeviceInfo();
|
||||
}
|
||||
|
||||
void AndroidConfigurations::clearDefaultDevices(ProjectExplorer::Project *project)
|
||||
{
|
||||
if (m_instance->m_defaultDeviceForAbi.contains(project))
|
||||
m_instance->m_defaultDeviceForAbi.remove(project);
|
||||
}
|
||||
|
||||
void AndroidConfigurations::setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber)
|
||||
{
|
||||
m_instance->m_defaultDeviceForAbi[project][abi] = serialNumber;
|
||||
}
|
||||
|
||||
QString AndroidConfigurations::defaultDevice(Project *project, const QString &abi)
|
||||
{
|
||||
if (!m_instance->m_defaultDeviceForAbi.contains(project))
|
||||
return QString();
|
||||
const QMap<QString, QString> &map = m_instance->m_defaultDeviceForAbi.value(project);
|
||||
if (!map.contains(abi))
|
||||
return QString();
|
||||
return map.value(abi);
|
||||
}
|
||||
|
||||
static bool equalKits(Kit *a, Kit *b)
|
||||
@@ -851,7 +941,7 @@ static bool equalKits(Kit *a, Kit *b)
|
||||
void AndroidConfigurations::updateAutomaticKitList()
|
||||
{
|
||||
QList<AndroidToolChain *> toolchains;
|
||||
if (AndroidConfigurations::instance().config().automaticKitCreation) {
|
||||
if (AndroidConfigurations::currentConfig().automaticKitCreation()) {
|
||||
// having a empty toolchains list will remove all autodetected kits for android
|
||||
// exactly what we want in that case
|
||||
foreach (ToolChain *tc, ToolChainManager::toolChains()) {
|
||||
@@ -986,11 +1076,14 @@ QStringList AndroidDeviceInfo::adbSelector(const QString &serialNumber)
|
||||
return QStringList() << QLatin1String("-s") << serialNumber;
|
||||
}
|
||||
|
||||
AndroidConfigurations &AndroidConfigurations::instance(QObject *parent)
|
||||
AndroidConfig AndroidConfigurations::currentConfig()
|
||||
{
|
||||
if (m_instance == 0)
|
||||
m_instance = new AndroidConfigurations(parent);
|
||||
return *m_instance;
|
||||
return m_instance->m_config; // ensure that m_instance is initialized
|
||||
}
|
||||
|
||||
AndroidConfigurations *AndroidConfigurations::instance()
|
||||
{
|
||||
return m_instance;
|
||||
}
|
||||
|
||||
void AndroidConfigurations::save()
|
||||
@@ -1005,11 +1098,11 @@ AndroidConfigurations::AndroidConfigurations(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
load();
|
||||
updateAvailableNdkPlatforms();
|
||||
updateAvailableSdkPlatforms();
|
||||
|
||||
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)),
|
||||
this, SLOT(clearDefaultDevices(ProjectExplorer::Project*)));
|
||||
|
||||
m_instance = this;
|
||||
}
|
||||
|
||||
Utils::FileName javaHomeForJavac(const QString &location)
|
||||
@@ -1035,31 +1128,31 @@ void AndroidConfigurations::load()
|
||||
bool saveSettings = false;
|
||||
QSettings *settings = Core::ICore::settings();
|
||||
settings->beginGroup(SettingsGroup);
|
||||
m_config = AndroidConfig(*settings);
|
||||
m_config.load(*settings);
|
||||
|
||||
if (m_config.antLocation.isEmpty()) {
|
||||
if (m_config.antLocation().isEmpty()) {
|
||||
Environment env = Environment::systemEnvironment();
|
||||
QString location = env.searchInPath(QLatin1String("ant"));
|
||||
QFileInfo fi(location);
|
||||
if (fi.exists() && fi.isExecutable() && !fi.isDir()) {
|
||||
m_config.antLocation = FileName::fromString(location);
|
||||
m_config.setAntLocation(FileName::fromString(location));
|
||||
saveSettings = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_config.openJDKLocation.isEmpty()) {
|
||||
if (m_config.openJDKLocation().isEmpty()) {
|
||||
if (HostOsInfo::isLinuxHost()) {
|
||||
Environment env = Environment::systemEnvironment();
|
||||
QString location = env.searchInPath(QLatin1String("javac"));
|
||||
QFileInfo fi(location);
|
||||
if (fi.exists() && fi.isExecutable() && !fi.isDir()) {
|
||||
m_config.openJDKLocation = javaHomeForJavac(location);
|
||||
m_config.setOpenJDKLocation(javaHomeForJavac(location));
|
||||
saveSettings = true;
|
||||
}
|
||||
} else if (HostOsInfo::isMacHost()) {
|
||||
QString javaHome = QLatin1String("/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home");
|
||||
if (QFileInfo(javaHome).exists())
|
||||
m_config.openJDKLocation = Utils::FileName::fromString(javaHome);
|
||||
m_config.setOpenJDKLocation(Utils::FileName::fromString(javaHome));
|
||||
} else if (HostOsInfo::isWindowsHost()) {
|
||||
QSettings settings(QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Javasoft\\Java Development Kit"), QSettings::NativeFormat);
|
||||
QStringList allVersions = settings.childGroups();
|
||||
@@ -1090,7 +1183,7 @@ void AndroidConfigurations::load()
|
||||
}
|
||||
}
|
||||
if (!javaHome.isEmpty()) {
|
||||
m_config.openJDKLocation = FileName::fromString(javaHome);
|
||||
m_config.setOpenJDKLocation(FileName::fromString(javaHome));
|
||||
saveSettings = true;
|
||||
}
|
||||
}
|
||||
@@ -1105,7 +1198,7 @@ void AndroidConfigurations::load()
|
||||
void AndroidConfigurations::updateAndroidDevice()
|
||||
{
|
||||
DeviceManager * const devMgr = DeviceManager::instance();
|
||||
if (adbToolPath().toFileInfo().exists())
|
||||
if (m_instance->m_config.adbToolPath().toFileInfo().exists())
|
||||
devMgr->addDevice(IDevice::Ptr(new Internal::AndroidDevice));
|
||||
else if (devMgr->find(Constants::ANDROID_DEVICE_ID))
|
||||
devMgr->removeDevice(Core::Id(Constants::ANDROID_DEVICE_ID));
|
||||
|
||||
@@ -48,26 +48,9 @@ QT_END_NAMESPACE
|
||||
namespace ProjectExplorer { class Project; }
|
||||
|
||||
namespace Android {
|
||||
class AndroidPlugin;
|
||||
namespace Internal {
|
||||
|
||||
class AndroidConfig
|
||||
{
|
||||
public:
|
||||
AndroidConfig();
|
||||
AndroidConfig(const QSettings &settings);
|
||||
void save(QSettings &settings) const;
|
||||
|
||||
Utils::FileName sdkLocation;
|
||||
Utils::FileName ndkLocation;
|
||||
Utils::FileName antLocation;
|
||||
Utils::FileName openJDKLocation;
|
||||
Utils::FileName keystoreLocation;
|
||||
QString toolchainHost;
|
||||
QStringList makeExtraSearchDirectories;
|
||||
unsigned partitionSize;
|
||||
bool automaticKitCreation;
|
||||
};
|
||||
|
||||
struct AndroidDeviceInfo
|
||||
{
|
||||
QString serialNumber;
|
||||
@@ -80,89 +63,138 @@ struct AndroidDeviceInfo
|
||||
static QStringList adbSelector(const QString &serialNumber);
|
||||
};
|
||||
|
||||
class AndroidConfigurations : public QObject
|
||||
class AndroidConfig
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static AndroidConfigurations &instance(QObject *parent = 0);
|
||||
AndroidConfig config() const { return m_config; }
|
||||
void setConfig(const AndroidConfig &config);
|
||||
AndroidConfig();
|
||||
|
||||
void load(const QSettings &settings);
|
||||
void save(QSettings &settings) const;
|
||||
|
||||
QStringList sdkTargets(int minApiLevel = 0) const;
|
||||
|
||||
Utils::FileName sdkLocation() const;
|
||||
void setSdkLocation(const Utils::FileName &sdkLocation);
|
||||
|
||||
Utils::FileName ndkLocation() const;
|
||||
void setNdkLocation(const Utils::FileName &ndkLocation);
|
||||
|
||||
Utils::FileName antLocation() const;
|
||||
void setAntLocation(const Utils::FileName &antLocation);
|
||||
|
||||
Utils::FileName openJDKLocation() const;
|
||||
void setOpenJDKLocation(const Utils::FileName &openJDKLocation);
|
||||
|
||||
Utils::FileName keystoreLocation() const;
|
||||
void setKeystoreLocation(const Utils::FileName &keystoreLocation);
|
||||
|
||||
QString toolchainHost() const;
|
||||
QStringList makeExtraSearchDirectories() const;
|
||||
|
||||
unsigned partitionSize() const;
|
||||
void setPartitionSize(unsigned partitionSize);
|
||||
|
||||
bool automaticKitCreation() const;
|
||||
void setAutomaticKitCreation(bool b);
|
||||
|
||||
Utils::FileName adbToolPath() const;
|
||||
Utils::FileName androidToolPath() const;
|
||||
Utils::Environment androidToolEnvironment() const;
|
||||
Utils::FileName antToolPath() const;
|
||||
Utils::FileName emulatorToolPath() const;
|
||||
|
||||
|
||||
Utils::FileName gccPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||
Utils::FileName gdbPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||
Utils::FileName openJDKPath() const;
|
||||
|
||||
Utils::FileName keytoolPath() const;
|
||||
Utils::FileName jarsignerPath() const;
|
||||
Utils::FileName zipalignPath() const;
|
||||
Utils::FileName stripPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||
Utils::FileName readelfPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||
|
||||
|
||||
QString createAVD(QWidget *parent, int minApiLevel = 0, QString targetArch = QString()) const;
|
||||
QString createAVD(const QString &target, const QString &name, const QString &abi, int sdcardSize) const;
|
||||
bool removeAVD(const QString &name) const;
|
||||
|
||||
QVector<AndroidDeviceInfo> connectedDevices(QString *error = 0) const;
|
||||
QVector<AndroidDeviceInfo> androidVirtualDevices() const;
|
||||
QString startAVD(const QString &name, int apiLevel, QString cpuAbi) const;
|
||||
bool startAVDAsync(const QString &avdName) const;
|
||||
QString findAvd(int apiLevel, const QString &cpuAbi) const;
|
||||
QString waitForAvd(int apiLevel, const QString &cpuAbi, const QFutureInterface<bool> &fi = QFutureInterface<bool>()) const;
|
||||
// special version for AndroidDeployQt::run
|
||||
QString bestNdkPlatformMatch(const QString &targetAPI) const;
|
||||
|
||||
QStringList makeExtraSearchDirectories() const;
|
||||
|
||||
static ProjectExplorer::Abi::Architecture architectureForToolChainPrefix(const QString &toolchainprefix);
|
||||
static QLatin1String toolchainPrefix(ProjectExplorer::Abi::Architecture architecture);
|
||||
static QLatin1String toolsPrefix(ProjectExplorer::Abi::Architecture architecture);
|
||||
|
||||
// called from AndroidPlugin
|
||||
void updateAndroidDevice();
|
||||
|
||||
QString getProductModel(const QString &device) const;
|
||||
bool hasFinishedBooting(const QString &device) const;
|
||||
bool waitForBooted(const QString &serialNumber, const QFutureInterface<bool> &fi) const;
|
||||
bool isConnected(const QString &serialNumber) const;
|
||||
|
||||
AndroidDeviceInfo showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi);
|
||||
void setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber); // serial number or avd name
|
||||
QString defaultDevice(ProjectExplorer::Project *project, const QString &abi) const; // serial number or avd name
|
||||
QString highestAndroidSdk() const;
|
||||
public slots:
|
||||
void clearDefaultDevices(ProjectExplorer::Project *project);
|
||||
|
||||
signals:
|
||||
void updated();
|
||||
|
||||
public slots:
|
||||
void updateAutomaticKitList();
|
||||
|
||||
private:
|
||||
Utils::FileName toolPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||
Utils::FileName openJDKBinPath() const;
|
||||
void detectToolchainHost();
|
||||
int getSDKVersion(const QString &device) const;
|
||||
QStringList getAbis(const QString &device) const;
|
||||
bool isBootToQt(const QString &device) const;
|
||||
|
||||
void updateAvailableSdkPlatforms() const;
|
||||
void updateNdkInformation() const;
|
||||
|
||||
Utils::FileName m_sdkLocation;
|
||||
Utils::FileName m_ndkLocation;
|
||||
Utils::FileName m_antLocation;
|
||||
Utils::FileName m_openJDKLocation;
|
||||
Utils::FileName m_keystoreLocation;
|
||||
QStringList m_makeExtraSearchDirectories;
|
||||
unsigned m_partitionSize;
|
||||
bool m_automaticKitCreation;
|
||||
|
||||
//caches
|
||||
mutable bool m_availableSdkPlatformsUpToDate;
|
||||
mutable QVector<int> m_availableSdkPlatforms;
|
||||
|
||||
mutable bool m_NdkInformationUpToDate;
|
||||
mutable QString m_toolchainHost;
|
||||
mutable QVector<int> m_availableNdkPlatforms;
|
||||
|
||||
mutable QHash<QString, QString> m_serialNumberToDeviceName;
|
||||
};
|
||||
|
||||
class AndroidConfigurations : public QObject
|
||||
{
|
||||
friend class Android::AndroidPlugin;
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static AndroidConfig currentConfig();
|
||||
static void setConfig(const AndroidConfig &config);
|
||||
static AndroidConfigurations *instance();
|
||||
|
||||
static void updateAndroidDevice();
|
||||
static AndroidDeviceInfo showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi);
|
||||
static void setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber); // serial number or avd name
|
||||
static QString defaultDevice(ProjectExplorer::Project *project, const QString &abi); // serial number or avd name
|
||||
public slots:
|
||||
static void clearDefaultDevices(ProjectExplorer::Project *project);
|
||||
static void updateAutomaticKitList();
|
||||
|
||||
signals:
|
||||
void updated();
|
||||
|
||||
private:
|
||||
AndroidConfigurations(QObject *parent);
|
||||
void load();
|
||||
void save();
|
||||
|
||||
int getSDKVersion(const QString &device) const;
|
||||
QStringList getAbis(const QString &device) const;
|
||||
bool isBootToQt(const QString &device) const;
|
||||
void updateAvailableNdkPlatforms();
|
||||
void updateAvailableSdkPlatforms();
|
||||
|
||||
|
||||
static AndroidConfigurations *m_instance;
|
||||
AndroidConfig m_config;
|
||||
QVector<int> m_availableNdkPlatforms;
|
||||
QVector<int> m_availableSdkPlatforms;
|
||||
|
||||
mutable QHash<QString, QString> m_serialNumberToDeviceName;
|
||||
|
||||
QMap<ProjectExplorer::Project *, QMap<QString, QString> > m_defaultDeviceForAbi;
|
||||
};
|
||||
|
||||
@@ -177,7 +177,7 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
|
||||
<< QLatin1String("-dname") << distinguishedNames;
|
||||
|
||||
QProcess genKeyCertProc;
|
||||
genKeyCertProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params );
|
||||
genKeyCertProc.start(AndroidConfigurations::currentConfig().keytoolPath().toString(), params );
|
||||
|
||||
if (!genKeyCertProc.waitForStarted() || !genKeyCertProc.waitForFinished())
|
||||
return;
|
||||
|
||||
@@ -160,7 +160,7 @@ void AndroidDeployQtStep::ctor()
|
||||
m_verbose = false;
|
||||
|
||||
// will be overwriten by settings if the user choose something different
|
||||
m_buildTargetSdk = AndroidConfigurations::instance().highestAndroidSdk();
|
||||
m_buildTargetSdk = AndroidConfigurations::currentConfig().highestAndroidSdk();
|
||||
|
||||
connect(project(), SIGNAL(proFilesEvaluated()),
|
||||
this, SLOT(updateInputFile()));
|
||||
@@ -177,7 +177,7 @@ bool AndroidDeployQtStep::init()
|
||||
return false;
|
||||
}
|
||||
m_deviceAPILevel = AndroidManager::minimumSDK(target());
|
||||
AndroidDeviceInfo info = AndroidConfigurations::instance().showDeviceDialog(project(), m_deviceAPILevel, m_targetArch);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch);
|
||||
if (info.serialNumber.isEmpty()) // aborted
|
||||
return false;
|
||||
|
||||
@@ -256,11 +256,11 @@ bool AndroidDeployQtStep::init()
|
||||
<< deploymentMethod
|
||||
<< QLatin1String("--install")
|
||||
<< QLatin1String("--ant")
|
||||
<< AndroidConfigurations::instance().antToolPath().toString()
|
||||
<< AndroidConfigurations::currentConfig().antToolPath().toString()
|
||||
<< QLatin1String("--android-platform")
|
||||
<< m_buildTargetSdk
|
||||
<< QLatin1String("--jdk")
|
||||
<< AndroidConfigurations::instance().openJDKPath().toString();
|
||||
<< AndroidConfigurations::currentConfig().openJDKLocation().toString();
|
||||
|
||||
parser->setSourceDirectory(Utils::FileName::fromString(node->singleVariableValue(QmakeProjectManager::AndroidPackageSourceDir)));
|
||||
parser->setBuildDirectory(Utils::FileName::fromString(outputDir));
|
||||
@@ -300,15 +300,15 @@ bool AndroidDeployQtStep::init()
|
||||
if (!result)
|
||||
return false;
|
||||
|
||||
if (AndroidConfigurations::instance().findAvd(m_deviceAPILevel, m_targetArch).isEmpty())
|
||||
AndroidConfigurations::instance().startAVDAsync(m_avdName);
|
||||
if (AndroidConfigurations::currentConfig().findAvd(m_deviceAPILevel, m_targetArch).isEmpty())
|
||||
AndroidConfigurations::currentConfig().startAVDAsync(m_avdName);
|
||||
return true;
|
||||
}
|
||||
|
||||
void AndroidDeployQtStep::run(QFutureInterface<bool> &fi)
|
||||
{
|
||||
if (!m_avdName.isEmpty()) {
|
||||
QString serialNumber = AndroidConfigurations::instance().waitForAvd(m_deviceAPILevel, m_targetArch, fi);
|
||||
QString serialNumber = AndroidConfigurations::currentConfig().waitForAvd(m_deviceAPILevel, m_targetArch, fi);
|
||||
if (serialNumber.isEmpty()) {
|
||||
fi.reportResult(false);
|
||||
emit finished();
|
||||
@@ -324,11 +324,11 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi)
|
||||
AbstractProcessStep::run(fi);
|
||||
|
||||
emit addOutput(tr("Pulling files necessary for debugging."), MessageOutput);
|
||||
runCommand(AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_serialNumber)
|
||||
<< QLatin1String("pull") << QLatin1String("/system/bin/app_process")
|
||||
<< QString::fromLatin1("%1/app_process").arg(m_buildDirectory));
|
||||
runCommand(AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_serialNumber) << QLatin1String("pull")
|
||||
<< QLatin1String("/system/lib/libc.so")
|
||||
<< QString::fromLatin1("%1/libc.so").arg(m_buildDirectory));
|
||||
@@ -530,7 +530,7 @@ QAbstractItemModel *AndroidDeployQtStep::keystoreCertificates()
|
||||
Utils::Environment env = Utils::Environment::systemEnvironment();
|
||||
env.set(QLatin1String("LANG"), QLatin1String("C"));
|
||||
keytoolProc.setProcessEnvironment(env.toProcessEnvironment());
|
||||
keytoolProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params);
|
||||
keytoolProc.start(AndroidConfigurations::currentConfig().keytoolPath().toString(), params);
|
||||
if (!keytoolProc.waitForStarted() || !keytoolProc.waitForFinished()) {
|
||||
QMessageBox::critical(0, tr("Error"),
|
||||
tr("Failed to run keytool."));
|
||||
|
||||
@@ -61,7 +61,7 @@ AndroidDeployQtWidget::AndroidDeployQtWidget(AndroidDeployQtStep *step)
|
||||
|
||||
// Target sdk combobox
|
||||
int minApiLevel = 9;
|
||||
QStringList targets = AndroidConfigurations::instance().sdkTargets(minApiLevel);
|
||||
QStringList targets = AndroidConfigurations::currentConfig().sdkTargets(minApiLevel);
|
||||
m_ui->targetSDKComboBox->addItems(targets);
|
||||
m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(step->buildTargetSdk()));
|
||||
|
||||
@@ -250,7 +250,7 @@ void AndroidDeployQtWidget::cleanLibsOnDevice()
|
||||
|
||||
void AndroidDeployQtWidget::resetDefaultDevices()
|
||||
{
|
||||
AndroidConfigurations::instance().clearDefaultDevices(m_step->project());
|
||||
AndroidConfigurations::clearDefaultDevices(m_step->project());
|
||||
}
|
||||
|
||||
void AndroidDeployQtWidget::signPackageCheckBoxToggled(bool checked)
|
||||
|
||||
@@ -103,7 +103,7 @@ bool AndroidDeployStep::init()
|
||||
m_deviceAPILevel = AndroidManager::minimumSDK(target());
|
||||
m_targetArch = AndroidManager::targetArch(target());
|
||||
|
||||
AndroidDeviceInfo info = AndroidConfigurations::instance().showDeviceDialog(project(), m_deviceAPILevel, m_targetArch);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch);
|
||||
if (info.serialNumber.isEmpty()) // aborted
|
||||
return false;
|
||||
|
||||
@@ -280,7 +280,7 @@ unsigned int AndroidDeployStep::remoteModificationTime(const QString &fullDestin
|
||||
return *it;
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(m_deviceSerialNumber);
|
||||
arguments << QLatin1String("ls") << destination;
|
||||
process.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments);
|
||||
process.start(AndroidConfigurations::currentConfig().adbToolPath().toString(), arguments);
|
||||
if (!process.waitForFinished(5000)
|
||||
|| process.exitCode() != 0)
|
||||
return 0;
|
||||
@@ -367,7 +367,7 @@ void AndroidDeployStep::stripFiles(const QList<DeployItem> &deployList, Abi::Arc
|
||||
{
|
||||
QProcess stripProcess;
|
||||
foreach (const DeployItem &item, deployList) {
|
||||
stripProcess.start(AndroidConfigurations::instance().stripPath(architecture, ndkToolchainVersion).toString(),
|
||||
stripProcess.start(AndroidConfigurations::currentConfig().stripPath(architecture, ndkToolchainVersion).toString(),
|
||||
QStringList()<<QLatin1String("--strip-unneeded") << item.localFileName);
|
||||
stripProcess.waitForStarted();
|
||||
if (!stripProcess.waitForFinished())
|
||||
@@ -378,7 +378,7 @@ void AndroidDeployStep::stripFiles(const QList<DeployItem> &deployList, Abi::Arc
|
||||
void AndroidDeployStep::deployFiles(QProcess *process, const QList<DeployItem> &deployList)
|
||||
{
|
||||
foreach (const DeployItem &item, deployList) {
|
||||
runCommand(process, AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(process, AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_deviceSerialNumber)
|
||||
<< QLatin1String("push") << item.localFileName
|
||||
<< item.remoteFileName);
|
||||
@@ -388,10 +388,10 @@ void AndroidDeployStep::deployFiles(QProcess *process, const QList<DeployItem> &
|
||||
bool AndroidDeployStep::deployPackage()
|
||||
{
|
||||
if (!m_avdName.isEmpty()) {
|
||||
if (AndroidConfigurations::instance().findAvd(m_deviceAPILevel, m_targetArch).isEmpty()
|
||||
&& !AndroidConfigurations::instance().startAVDAsync(m_avdName))
|
||||
if (AndroidConfigurations::currentConfig().findAvd(m_deviceAPILevel, m_targetArch).isEmpty()
|
||||
&& !AndroidConfigurations::currentConfig().startAVDAsync(m_avdName))
|
||||
return false;
|
||||
m_deviceSerialNumber = AndroidConfigurations::instance().waitForAvd(m_deviceAPILevel, m_targetArch);
|
||||
m_deviceSerialNumber = AndroidConfigurations::currentConfig().waitForAvd(m_deviceAPILevel, m_targetArch);
|
||||
}
|
||||
|
||||
QProcess *const deployProc = new QProcess;
|
||||
@@ -457,14 +457,14 @@ bool AndroidDeployStep::deployPackage()
|
||||
deployProc->setWorkingDirectory(m_androidDirPath.toString());
|
||||
|
||||
writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber));
|
||||
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(deployProc, AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_deviceSerialNumber) << QLatin1String("uninstall") << m_packageName);
|
||||
QString package = m_apkPathDebug;
|
||||
|
||||
if (m_signPackage && QFile::exists(m_apkPathRelease))
|
||||
package = m_apkPathRelease;
|
||||
|
||||
if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
if (!runCommand(deployProc, AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_deviceSerialNumber) << QLatin1String("install") << package)) {
|
||||
raiseError(tr("Package installation failed."));
|
||||
disconnect(deployProc, 0, this, 0);
|
||||
@@ -473,11 +473,11 @@ bool AndroidDeployStep::deployPackage()
|
||||
}
|
||||
|
||||
writeOutput(tr("Pulling files necessary for debugging."));
|
||||
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(deployProc, AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_deviceSerialNumber)
|
||||
<< QLatin1String("pull") << QLatin1String("/system/bin/app_process")
|
||||
<< QString::fromLatin1("%1/app_process").arg(m_buildDirectory));
|
||||
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
|
||||
runCommand(deployProc, AndroidConfigurations::currentConfig().adbToolPath().toString(),
|
||||
AndroidDeviceInfo::adbSelector(m_deviceSerialNumber) << QLatin1String("pull")
|
||||
<< QLatin1String("/system/lib/libc.so")
|
||||
<< QString::fromLatin1("%1/libc.so").arg(m_buildDirectory));
|
||||
|
||||
@@ -129,7 +129,7 @@ void AndroidDeployStepWidget::cleanLibsOnDevice()
|
||||
|
||||
void AndroidDeployStepWidget::resetDefaultDevices()
|
||||
{
|
||||
AndroidConfigurations::instance().clearDefaultDevices(m_step->project());
|
||||
AndroidConfigurations::clearDefaultDevices(m_step->project());
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -162,7 +162,7 @@ public:
|
||||
// TopLeft
|
||||
QString topLeft = device.serialNumber;
|
||||
if (device.type == AndroidDeviceInfo::Hardware)
|
||||
topLeft = AndroidConfigurations::instance().getProductModel(device.serialNumber);
|
||||
topLeft = AndroidConfigurations::currentConfig().getProductModel(device.serialNumber);
|
||||
painter->drawText(size + 12, 2 + opt.rect.top() + fm.ascent(), topLeft);
|
||||
|
||||
QString topRight = device.serialNumber;
|
||||
@@ -422,11 +422,11 @@ void AndroidDeviceDialog::refreshDeviceList()
|
||||
serialNumber = m_model->device(currentIndex).serialNumber;
|
||||
|
||||
QVector<AndroidDeviceInfo> devices;
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::instance().connectedDevices())
|
||||
foreach (const AndroidDeviceInfo &info, AndroidConfigurations::currentConfig().connectedDevices())
|
||||
if (info.type == AndroidDeviceInfo::Hardware)
|
||||
devices << info;
|
||||
|
||||
devices += AndroidConfigurations::instance().androidVirtualDevices();
|
||||
devices += AndroidConfigurations::currentConfig().androidVirtualDevices();
|
||||
m_model->setDevices(devices);
|
||||
|
||||
m_ui->deviceView->expand(m_model->index(0, 0));
|
||||
@@ -446,7 +446,7 @@ void AndroidDeviceDialog::refreshDeviceList()
|
||||
|
||||
void AndroidDeviceDialog::createAvd()
|
||||
{
|
||||
QString avd = AndroidConfigurations::instance().createAVD(this, m_apiLevel, m_abi);
|
||||
QString avd = AndroidConfigurations::currentConfig().createAVD(this, m_apiLevel, m_abi);
|
||||
if (avd.isEmpty())
|
||||
return;
|
||||
refreshDeviceList();
|
||||
|
||||
@@ -612,7 +612,7 @@ bool AndroidManager::createAndroidTemplatesIfNecessary(ProjectExplorer::Target *
|
||||
if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
|
||||
minApiLevel = 9;
|
||||
|
||||
QStringList sdks = AndroidConfigurations::instance().sdkTargets(minApiLevel);
|
||||
QStringList sdks = AndroidConfigurations::currentConfig().sdkTargets(minApiLevel);
|
||||
if (sdks.isEmpty()) {
|
||||
raiseError(tr("No Qt for Android SDKs were found.\nPlease install at least one SDK."));
|
||||
return false;
|
||||
@@ -645,14 +645,14 @@ void AndroidManager::updateTarget(ProjectExplorer::Target *target, const QString
|
||||
QString androidDir = dirPath(target).toString();
|
||||
|
||||
Utils::Environment env = Utils::Environment::systemEnvironment();
|
||||
QString javaHome = AndroidConfigurations::instance().config().openJDKLocation.toString();
|
||||
QString javaHome = AndroidConfigurations::currentConfig().openJDKLocation().toString();
|
||||
if (!javaHome.isEmpty())
|
||||
env.set(QLatin1String("JAVA_HOME"), javaHome);
|
||||
// clean previous build
|
||||
QProcess androidProc;
|
||||
androidProc.setWorkingDirectory(androidDir);
|
||||
androidProc.setProcessEnvironment(env.toProcessEnvironment());
|
||||
androidProc.start(AndroidConfigurations::instance().antToolPath().toString(),
|
||||
androidProc.start(AndroidConfigurations::currentConfig().antToolPath().toString(),
|
||||
QStringList() << QLatin1String("clean"));
|
||||
if (!androidProc.waitForFinished(-1))
|
||||
androidProc.terminate();
|
||||
@@ -706,8 +706,8 @@ void AndroidManager::updateTarget(ProjectExplorer::Target *target, const QString
|
||||
params << QLatin1String("-t") << targetSDK;
|
||||
if (!name.isEmpty())
|
||||
params << QLatin1String("-n") << name;
|
||||
androidProc.setProcessEnvironment(AndroidConfigurations::instance().androidToolEnvironment().toProcessEnvironment());
|
||||
androidProc.start(AndroidConfigurations::instance().androidToolPath().toString(), params);
|
||||
androidProc.setProcessEnvironment(AndroidConfigurations::currentConfig().androidToolEnvironment().toProcessEnvironment());
|
||||
androidProc.start(AndroidConfigurations::currentConfig().androidToolPath().toString(), params);
|
||||
if (!androidProc.waitForFinished(-1))
|
||||
androidProc.terminate();
|
||||
}
|
||||
@@ -811,7 +811,7 @@ QVector<AndroidManager::Library> AndroidManager::availableQtLibsWithDependencies
|
||||
AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc);
|
||||
QString libgnustl = libGnuStl(arch, atc->ndkToolChainVersion());
|
||||
|
||||
Utils::FileName readelfPath = AndroidConfigurations::instance().readelfPath(target->activeRunConfiguration()->abi().architecture(),
|
||||
Utils::FileName readelfPath = AndroidConfigurations::currentConfig().readelfPath(target->activeRunConfiguration()->abi().architecture(),
|
||||
atc->ndkToolChainVersion());
|
||||
const QmakeProjectManager::QmakeProject *const qmakeProject
|
||||
= qobject_cast<const QmakeProjectManager::QmakeProject *>(target->project());
|
||||
@@ -1178,7 +1178,7 @@ bool AndroidManager::qtLibrariesLessThan(const Library &a, const Library &b)
|
||||
|
||||
QString AndroidManager::libGnuStl(const QString &arch, const QString &ndkToolChainVersion)
|
||||
{
|
||||
return AndroidConfigurations::instance().config().ndkLocation.toString()
|
||||
return AndroidConfigurations::currentConfig().ndkLocation().toString()
|
||||
+ QLatin1String("/sources/cxx-stl/gnu-libstdc++/")
|
||||
+ ndkToolChainVersion + QLatin1String("/libs/")
|
||||
+ arch
|
||||
@@ -1197,7 +1197,7 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
|
||||
if (targetArch.isEmpty())
|
||||
return;
|
||||
int deviceAPILevel = AndroidManager::minimumSDK(target);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::instance().showDeviceDialog(target->project(), deviceAPILevel, targetArch);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch);
|
||||
if (info.serialNumber.isEmpty()) // aborted
|
||||
return;
|
||||
|
||||
@@ -1205,7 +1205,7 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
|
||||
QString deviceSerialNumber = info.serialNumber;
|
||||
|
||||
if (info.type == AndroidDeviceInfo::Emulator) {
|
||||
deviceSerialNumber = AndroidConfigurations::instance().startAVD(deviceSerialNumber, deviceAPILevel, targetArch);
|
||||
deviceSerialNumber = AndroidConfigurations::currentConfig().startAVD(deviceSerialNumber, deviceAPILevel, targetArch);
|
||||
if (deviceSerialNumber.isEmpty())
|
||||
Core::MessageManager::write(tr("Starting Android virtual device failed."));
|
||||
}
|
||||
@@ -1214,7 +1214,7 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
|
||||
QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber);
|
||||
arguments << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/tmp/qt");
|
||||
process->connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater()));
|
||||
const QString adb = AndroidConfigurations::instance().adbToolPath().toString();
|
||||
const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
|
||||
Core::MessageManager::write(adb + QLatin1Char(' ') + arguments.join(QLatin1String(" ")));
|
||||
process->start(adb, arguments);
|
||||
if (!process->waitForStarted(500))
|
||||
@@ -1227,14 +1227,14 @@ void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const Q
|
||||
if (targetArch.isEmpty())
|
||||
return;
|
||||
int deviceAPILevel = AndroidManager::minimumSDK(target);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::instance().showDeviceDialog(target->project(), deviceAPILevel, targetArch);
|
||||
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch);
|
||||
if (info.serialNumber.isEmpty()) // aborted
|
||||
return;
|
||||
|
||||
deviceAPILevel = info.sdk;
|
||||
QString deviceSerialNumber = info.serialNumber;
|
||||
if (info.type == AndroidDeviceInfo::Emulator) {
|
||||
deviceSerialNumber = AndroidConfigurations::instance().startAVD(deviceSerialNumber, deviceAPILevel, targetArch);
|
||||
deviceSerialNumber = AndroidConfigurations::currentConfig().startAVD(deviceSerialNumber, deviceAPILevel, targetArch);
|
||||
if (deviceSerialNumber.isEmpty())
|
||||
Core::MessageManager::write(tr("Starting Android virtual device failed."));
|
||||
}
|
||||
@@ -1244,7 +1244,7 @@ void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const Q
|
||||
arguments << QLatin1String("install") << QLatin1String("-r ") << packagePath;
|
||||
|
||||
process->connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater()));
|
||||
const QString adb = AndroidConfigurations::instance().adbToolPath().toString();
|
||||
const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
|
||||
Core::MessageManager::write(adb + QLatin1Char(' ') + arguments.join(QLatin1String(" ")));
|
||||
process->start(adb, arguments);
|
||||
if (!process->waitForFinished(500))
|
||||
@@ -1263,7 +1263,7 @@ bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QS
|
||||
<< QLatin1String("--storepass")
|
||||
<< keystorePasswd;
|
||||
QProcess proc;
|
||||
proc.start(AndroidConfigurations::instance().keytoolPath().toString(), arguments);
|
||||
proc.start(AndroidConfigurations::currentConfig().keytoolPath().toString(), arguments);
|
||||
if (!proc.waitForStarted(4000))
|
||||
return false;
|
||||
if (!proc.waitForFinished(4000)) {
|
||||
@@ -1292,7 +1292,7 @@ bool AndroidManager::checkCertificatePassword(const QString &keystorePath, const
|
||||
arguments << certificatePasswd;
|
||||
|
||||
QProcess proc;
|
||||
proc.start(AndroidConfigurations::instance().keytoolPath().toString(), arguments);
|
||||
proc.start(AndroidConfigurations::currentConfig().keytoolPath().toString(), arguments);
|
||||
if (!proc.waitForStarted(4000))
|
||||
return false;
|
||||
if (!proc.waitForFinished(4000)) {
|
||||
|
||||
@@ -123,14 +123,14 @@ bool AndroidPackageCreationStep::init()
|
||||
return false;
|
||||
|
||||
AndroidManager::updateTarget(target(), AndroidManager::buildTargetSDK(target()), AndroidManager::applicationName(target()));
|
||||
m_antToolPath = AndroidConfigurations::instance().antToolPath();
|
||||
m_antToolPath = AndroidConfigurations::currentConfig().antToolPath();
|
||||
m_apkPathUnsigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildUnsigned);
|
||||
m_apkPathSigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned);
|
||||
m_signPackageForRun = m_signPackage;
|
||||
m_keystorePathForRun = m_keystorePath;
|
||||
m_certificatePasswdForRun = m_certificatePasswd;
|
||||
m_jarSigner = AndroidConfigurations::instance().jarsignerPath();
|
||||
m_zipAligner = AndroidConfigurations::instance().zipalignPath();
|
||||
m_jarSigner = AndroidConfigurations::currentConfig().jarsignerPath();
|
||||
m_zipAligner = AndroidConfigurations::currentConfig().zipalignPath();
|
||||
m_environment = bc->environment();
|
||||
|
||||
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit());
|
||||
@@ -247,7 +247,7 @@ void AndroidPackageCreationStep::checkRequiredLibraries()
|
||||
return;
|
||||
AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc);
|
||||
|
||||
readelfProc.start(AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture(), atc->ndkToolChainVersion()).toString(),
|
||||
readelfProc.start(AndroidConfigurations::currentConfig().readelfPath(target()->activeRunConfiguration()->abi().architecture(), atc->ndkToolChainVersion()).toString(),
|
||||
QStringList() << QLatin1String("-d") << QLatin1String("-W") << appPath);
|
||||
if (!readelfProc.waitForFinished(-1)) {
|
||||
readelfProc.kill();
|
||||
@@ -268,7 +268,7 @@ void AndroidPackageCreationStep::initCheckRequiredLibrariesForRun()
|
||||
AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc);
|
||||
|
||||
m_appPath = Utils::FileName::fromString(AndroidManager::targetApplicationPath(target()));
|
||||
m_readElf = AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture(),
|
||||
m_readElf = AndroidConfigurations::currentConfig().readelfPath(target()->activeRunConfiguration()->abi().architecture(),
|
||||
atc->ndkToolChainVersion());
|
||||
m_qtLibs = AndroidManager::qtLibs(target());
|
||||
m_availableQtLibs = AndroidManager::availableQtLibsWithDependencies(target());
|
||||
@@ -367,7 +367,7 @@ QAbstractItemModel *AndroidPackageCreationStep::keystoreCertificates()
|
||||
Utils::Environment env = Utils::Environment::systemEnvironment();
|
||||
env.set(QLatin1String("LANG"), QLatin1String("C"));
|
||||
keytoolProc.setProcessEnvironment(env.toProcessEnvironment());
|
||||
keytoolProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params);
|
||||
keytoolProc.start(AndroidConfigurations::currentConfig().keytoolPath().toString(), params);
|
||||
if (!keytoolProc.waitForStarted() || !keytoolProc.waitForFinished()) {
|
||||
QMessageBox::critical(0, tr("Error"),
|
||||
tr("Failed to run keytool"));
|
||||
@@ -751,7 +751,7 @@ void AndroidPackageCreationStep::stripAndroidLibs(const QStringList & files, Abi
|
||||
{
|
||||
QProcess stripProcess;
|
||||
foreach (const QString &file, files) {
|
||||
stripProcess.start(AndroidConfigurations::instance().stripPath(architecture, ndkToolchainVersion).toString(),
|
||||
stripProcess.start(AndroidConfigurations::currentConfig().stripPath(architecture, ndkToolchainVersion).toString(),
|
||||
QStringList()<<QLatin1String("--strip-unneeded") << file);
|
||||
stripProcess.waitForStarted();
|
||||
if (!stripProcess.waitForFinished())
|
||||
|
||||
@@ -230,7 +230,7 @@ void AndroidPackageCreationWidget::updateAndroidProjectInfo()
|
||||
if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
|
||||
minApiLevel = 9;
|
||||
|
||||
QStringList targets = AndroidConfigurations::instance().sdkTargets(minApiLevel);
|
||||
QStringList targets = AndroidConfigurations::currentConfig().sdkTargets(minApiLevel);
|
||||
m_ui->targetSDKComboBox->addItems(targets);
|
||||
m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(AndroidManager::buildTargetSDK(target)));
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa
|
||||
Q_UNUSED(arguments);
|
||||
Q_UNUSED(errorMessage);
|
||||
|
||||
Internal::AndroidConfigurations::instance(this);
|
||||
new Internal::AndroidConfigurations(this);
|
||||
|
||||
addAutoReleasedObject(new Internal::AndroidRunControlFactory);
|
||||
addAutoReleasedObject(new Internal::AndroidRunConfigurationFactory);
|
||||
@@ -109,16 +109,16 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa
|
||||
|
||||
void AndroidPlugin::kitsRestored()
|
||||
{
|
||||
Internal::AndroidConfigurations::instance().updateAutomaticKitList();
|
||||
Internal::AndroidConfigurations::updateAutomaticKitList();
|
||||
connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
|
||||
&Internal::AndroidConfigurations::instance(), SLOT(updateAutomaticKitList()));
|
||||
Internal::AndroidConfigurations::instance(), SLOT(updateAutomaticKitList()));
|
||||
disconnect(ProjectExplorer::KitManager::instance(), SIGNAL(kitsChanged()),
|
||||
this, SLOT(kitsRestored()));
|
||||
}
|
||||
|
||||
void AndroidPlugin::updateDevice()
|
||||
{
|
||||
Internal::AndroidConfigurations::instance().updateAndroidDevice();
|
||||
Internal::AndroidConfigurations::updateAndroidDevice();
|
||||
}
|
||||
|
||||
} // namespace Android
|
||||
|
||||
@@ -97,7 +97,7 @@ AndroidPotentialKitWidget::AndroidPotentialKitWidget(QWidget *parent)
|
||||
connect(openOptions, SIGNAL(clicked()),
|
||||
this, SLOT(openOptions()));
|
||||
|
||||
connect(&AndroidConfigurations::instance(), SIGNAL(updated()),
|
||||
connect(AndroidConfigurations::instance(), SIGNAL(updated()),
|
||||
this, SLOT(recheck()));
|
||||
}
|
||||
|
||||
|
||||
@@ -106,8 +106,8 @@ QList<ProjectExplorer::Abi> AndroidQtVersion::detectQtAbis() const
|
||||
void AndroidQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const
|
||||
{
|
||||
// this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info)
|
||||
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::instance().config().toolchainHost);
|
||||
env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::instance().config().ndkLocation.toUserOutput());
|
||||
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::currentConfig().toolchainHost());
|
||||
env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::currentConfig().ndkLocation().toUserOutput());
|
||||
|
||||
QmakeProject *qmakeProject = qobject_cast<QmakeProjectManager::QmakeProject *>(ProjectExplorerPlugin::instance()->currentProject());
|
||||
if (!qmakeProject || !qmakeProject->activeTarget()
|
||||
@@ -117,12 +117,12 @@ void AndroidQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::En
|
||||
Target *target = qmakeProject->activeTarget();
|
||||
if (DeviceTypeKitInformation::deviceTypeId(target->kit()) != Constants::ANDROID_DEVICE_TYPE)
|
||||
return;
|
||||
if (AndroidConfigurations::instance().config().ndkLocation.isEmpty()
|
||||
|| AndroidConfigurations::instance().config().sdkLocation.isEmpty())
|
||||
if (AndroidConfigurations::currentConfig().ndkLocation().isEmpty()
|
||||
|| AndroidConfigurations::currentConfig().sdkLocation().isEmpty())
|
||||
return;
|
||||
|
||||
env.set(QLatin1String("ANDROID_NDK_PLATFORM"),
|
||||
AndroidConfigurations::instance().bestNdkPlatformMatch(AndroidManager::buildTargetSDK(target)));
|
||||
AndroidConfigurations::currentConfig().bestNdkPlatformMatch(AndroidManager::buildTargetSDK(target)));
|
||||
}
|
||||
|
||||
QString AndroidQtVersion::description() const
|
||||
|
||||
@@ -140,11 +140,6 @@ QString AndroidRunConfiguration::defaultDisplayName()
|
||||
return tr("Run on Android device");
|
||||
}
|
||||
|
||||
AndroidConfig AndroidRunConfiguration::config() const
|
||||
{
|
||||
return AndroidConfigurations::instance().config();
|
||||
}
|
||||
|
||||
const QString AndroidRunConfiguration::remoteChannel() const
|
||||
{
|
||||
return QLatin1String(":5039");
|
||||
|
||||
@@ -55,7 +55,6 @@ public:
|
||||
Utils::OutputFormatter *createOutputFormatter() const;
|
||||
|
||||
void setArguments(const QString &args);
|
||||
AndroidConfig config() const;
|
||||
QString proFilePath() const;
|
||||
|
||||
const QString remoteChannel() const;
|
||||
|
||||
@@ -86,7 +86,7 @@ AndroidRunner::AndroidRunner(QObject *parent,
|
||||
|
||||
m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target);
|
||||
m_processPID = -1;
|
||||
m_adb = AndroidConfigurations::instance().adbToolPath().toString();
|
||||
m_adb = AndroidConfigurations::currentConfig().adbToolPath().toString();
|
||||
m_selector = AndroidDeviceInfo::adbSelector(m_deviceSerialNumber);
|
||||
|
||||
QString packageDir = _("/data/data/") + m_packageName;
|
||||
|
||||
@@ -64,7 +64,7 @@ void AndroidSettingsPage::apply()
|
||||
m_widget->saveSettings();
|
||||
|
||||
QList<ToolChain *> existingToolChains = ToolChainManager::toolChains();
|
||||
QList<ToolChain *> toolchains = AndroidToolChainFactory::createToolChainsForNdk(AndroidConfigurations::instance().config().ndkLocation);
|
||||
QList<ToolChain *> toolchains = AndroidToolChainFactory::createToolChainsForNdk(AndroidConfigurations::currentConfig().ndkLocation());
|
||||
foreach (ToolChain *tc, toolchains) {
|
||||
bool found = false;
|
||||
for (int i = 0; i < existingToolChains.count(); ++i) {
|
||||
@@ -86,7 +86,7 @@ void AndroidSettingsPage::apply()
|
||||
}
|
||||
}
|
||||
|
||||
AndroidConfigurations::instance().updateAutomaticKitList();
|
||||
AndroidConfigurations::updateAutomaticKitList();
|
||||
}
|
||||
|
||||
void AndroidSettingsPage::finish()
|
||||
|
||||
@@ -112,82 +112,195 @@ int AvdModel::columnCount(const QModelIndex &/*parent*/) const
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent)
|
||||
: QWidget(parent),
|
||||
m_sdkState(NotSet),
|
||||
m_ndkState(NotSet),
|
||||
m_javaState(NotSet),
|
||||
m_ui(new Ui_AndroidSettingsWidget),
|
||||
m_androidConfig(AndroidConfigurations::instance().config()),
|
||||
m_saveSettingsRequested(false)
|
||||
m_androidConfig(AndroidConfigurations::currentConfig())
|
||||
{
|
||||
initGui();
|
||||
m_ui->setupUi(this);
|
||||
|
||||
m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation().toUserOutput());
|
||||
m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation().toUserOutput());
|
||||
|
||||
m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation().toUserOutput());
|
||||
m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation().toUserOutput());
|
||||
m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize());
|
||||
m_ui->CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation());
|
||||
m_ui->AVDTableView->setModel(&m_AVDModel);
|
||||
m_AVDModel.setAvdList(m_androidConfig.androidVirtualDevices());
|
||||
m_ui->AVDTableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
|
||||
m_ui->AVDTableView->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
|
||||
|
||||
|
||||
check(All);
|
||||
applyToUi(All);
|
||||
}
|
||||
|
||||
AndroidSettingsWidget::~AndroidSettingsWidget()
|
||||
{
|
||||
if (m_saveSettingsRequested)
|
||||
AndroidConfigurations::instance().setConfig(m_androidConfig);
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::initGui()
|
||||
void AndroidSettingsWidget::check(AndroidSettingsWidget::Mode mode)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
if (checkSDK(m_androidConfig.sdkLocation)) {
|
||||
m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation.toUserOutput());
|
||||
} else {
|
||||
m_androidConfig.sdkLocation.clear();
|
||||
m_ui->AVDManagerFrame->setEnabled(false);
|
||||
if (mode & Sdk) {
|
||||
m_sdkState = Okay;
|
||||
if (m_androidConfig.sdkLocation().isEmpty()) {
|
||||
m_sdkState = NotSet;
|
||||
} else {
|
||||
Utils::FileName adb = m_androidConfig.sdkLocation();
|
||||
Utils::FileName androidExe = m_androidConfig.sdkLocation();
|
||||
Utils::FileName androidBat = m_androidConfig.sdkLocation();
|
||||
Utils::FileName emulator = m_androidConfig.sdkLocation();
|
||||
if (!adb.appendPath(QLatin1String("platform-tools/adb" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()
|
||||
|| (!androidExe.appendPath(QLatin1String("/tools/android" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()
|
||||
&& !androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).toFileInfo().exists())
|
||||
|| !emulator.appendPath(QLatin1String("/tools/emulator" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()) {
|
||||
m_sdkState = Error;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (checkNDK(m_androidConfig.ndkLocation))
|
||||
m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation.toUserOutput());
|
||||
else
|
||||
m_androidConfig.ndkLocation.clear();
|
||||
m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation.toUserOutput());
|
||||
m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation.toUserOutput());
|
||||
m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize);
|
||||
m_ui->CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation);
|
||||
m_ui->AVDTableView->setModel(&m_AVDModel);
|
||||
m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
|
||||
m_ui->AVDTableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
|
||||
m_ui->AVDTableView->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::saveSettings(bool saveNow)
|
||||
{
|
||||
// We must defer this step because of a stupid bug on MacOS. See QTCREATORBUG-1675.
|
||||
if (saveNow) {
|
||||
AndroidConfigurations::instance().setConfig(m_androidConfig);
|
||||
m_saveSettingsRequested = false;
|
||||
} else {
|
||||
m_saveSettingsRequested = true;
|
||||
if (mode & Ndk) {
|
||||
m_ndkState = Okay;
|
||||
Utils::FileName platformPath = m_androidConfig.ndkLocation();
|
||||
Utils::FileName toolChainPath = m_androidConfig.ndkLocation();
|
||||
Utils::FileName sourcesPath = m_androidConfig.ndkLocation();
|
||||
if (m_androidConfig.ndkLocation().isEmpty()) {
|
||||
m_ndkState = NotSet;
|
||||
} else if (!platformPath.appendPath(QLatin1String("platforms")).toFileInfo().exists()
|
||||
|| !toolChainPath.appendPath(QLatin1String("toolchains")).toFileInfo().exists()
|
||||
|| !sourcesPath.appendPath(QLatin1String("sources/cxx-stl")).toFileInfo().exists()) {
|
||||
m_ndkState = Error;
|
||||
} else {
|
||||
QList<AndroidToolChainFactory::AndroidToolChainInformation> compilerPaths
|
||||
= AndroidToolChainFactory::toolchainPathsForNdk(m_androidConfig.ndkLocation());
|
||||
m_ndkCompilerCount = compilerPaths.count();
|
||||
|
||||
|
||||
// See if we have qt versions for those toolchains
|
||||
QSet<ProjectExplorer::Abi::Architecture> toolchainsForArch;
|
||||
foreach (const AndroidToolChainFactory::AndroidToolChainInformation &ati, compilerPaths)
|
||||
toolchainsForArch.insert(ati.architecture);
|
||||
|
||||
QSet<ProjectExplorer::Abi::Architecture> qtVersionsForArch;
|
||||
foreach (QtSupport::BaseQtVersion *qtVersion, QtSupport::QtVersionManager::versions()) {
|
||||
if (qtVersion->type() != QLatin1String(Constants::ANDROIDQT) || qtVersion->qtAbis().isEmpty())
|
||||
continue;
|
||||
qtVersionsForArch.insert(qtVersion->qtAbis().first().architecture());
|
||||
}
|
||||
|
||||
QSet<ProjectExplorer::Abi::Architecture> missingQtArchs = toolchainsForArch.subtract(qtVersionsForArch);
|
||||
if (missingQtArchs.isEmpty()) {
|
||||
m_ndkMissingQtArchs.clear();
|
||||
} else {
|
||||
if (missingQtArchs.count() == 1) {
|
||||
m_ndkMissingQtArchs = tr("Qt version for architecture %1 is missing.\n"
|
||||
"To add the Qt version, select Options > Build & Run > Qt Versions.")
|
||||
.arg(ProjectExplorer::Abi::toString((*missingQtArchs.constBegin())));
|
||||
} else {
|
||||
QStringList missingArchs;
|
||||
foreach (ProjectExplorer::Abi::Architecture arch, missingQtArchs)
|
||||
missingArchs.append(ProjectExplorer::Abi::toString(arch));
|
||||
m_ndkMissingQtArchs = tr("Qt versions for architectures %1 are missing.\n"
|
||||
"To add the Qt versions, select Options > Build & Run > Qt Versions.")
|
||||
.arg(missingArchs.join(QLatin1String(", ")));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode & Java) {
|
||||
m_javaState = Okay;
|
||||
if (m_androidConfig.openJDKLocation().isEmpty()) {
|
||||
m_javaState = NotSet;
|
||||
} else {
|
||||
Utils::FileName bin = m_androidConfig.openJDKLocation();
|
||||
bin.appendPath(QLatin1String("bin"));
|
||||
if (!m_androidConfig.openJDKLocation().toFileInfo().exists()
|
||||
|| !bin.toFileInfo().exists())
|
||||
m_javaState = Error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool AndroidSettingsWidget::checkSDK(const Utils::FileName &location)
|
||||
void AndroidSettingsWidget::applyToUi(AndroidSettingsWidget::Mode mode)
|
||||
{
|
||||
if (location.isEmpty()) {
|
||||
m_ui->sdkWarningIconLabel->setVisible(false);
|
||||
m_ui->sdkWarningLabel->setVisible(false);
|
||||
return false;
|
||||
if (mode & Sdk) {
|
||||
if (m_sdkState == Error) {
|
||||
m_ui->sdkWarningIconLabel->setVisible(true);
|
||||
m_ui->sdkWarningLabel->setVisible(true);
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->SDKLocationLineEdit->text());
|
||||
m_ui->sdkWarningLabel->setText(tr("\"%1\" does not seem to be an Android SDK top folder.").arg(location.toUserOutput()));
|
||||
} else {
|
||||
m_ui->sdkWarningIconLabel->setVisible(false);
|
||||
m_ui->sdkWarningLabel->setVisible(false);
|
||||
}
|
||||
}
|
||||
Utils::FileName adb = location;
|
||||
Utils::FileName androidExe = location;
|
||||
Utils::FileName androidBat = location;
|
||||
Utils::FileName emulator = location;
|
||||
if (!adb.appendPath(QLatin1String("platform-tools/adb" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()
|
||||
|| (!androidExe.appendPath(QLatin1String("/tools/android" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()
|
||||
&& !androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).toFileInfo().exists())
|
||||
|| !emulator.appendPath(QLatin1String("/tools/emulator" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()) {
|
||||
m_ui->sdkWarningIconLabel->setVisible(true);
|
||||
m_ui->sdkWarningLabel->setVisible(true);
|
||||
m_ui->sdkWarningLabel->setText(tr("\"%1\" does not seem to be an Android SDK top folder.").arg(location.toUserOutput()));
|
||||
return false;
|
||||
} else {
|
||||
m_ui->sdkWarningIconLabel->setVisible(false);
|
||||
m_ui->sdkWarningLabel->setVisible(false);
|
||||
|
||||
if (mode & Ndk) {
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text());
|
||||
if (m_ndkState == NotSet) {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setVisible(false);
|
||||
m_ui->kitWarningIconLabel->setVisible(false);
|
||||
m_ui->kitWarningLabel->setVisible(false);
|
||||
} else if (m_ndkState == Error) {
|
||||
m_ui->toolchainFoundLabel->setText(tr("\"%1\" does not seem to be an Android NDK top folder.").arg(location.toUserOutput()));
|
||||
m_ui->toolchainFoundLabel->setVisible(true);
|
||||
m_ui->ndkWarningIconLabel->setVisible(true);
|
||||
} else {
|
||||
if (m_ndkCompilerCount > 0) {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setText(tr("Found %n toolchains for this NDK.", 0, m_ndkCompilerCount));
|
||||
m_ui->toolchainFoundLabel->setVisible(true);
|
||||
} else {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setVisible(false);
|
||||
}
|
||||
|
||||
if (m_ndkMissingQtArchs.isEmpty()) {
|
||||
m_ui->kitWarningIconLabel->setVisible(false);
|
||||
m_ui->kitWarningLabel->setVisible(false);
|
||||
} else {
|
||||
m_ui->kitWarningIconLabel->setVisible(true);
|
||||
m_ui->kitWarningLabel->setVisible(true);
|
||||
m_ui->kitWarningLabel->setText(m_ndkMissingQtArchs);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
if (mode & Java) {
|
||||
Utils::FileName location = m_androidConfig.openJDKLocation();
|
||||
bool error = m_javaState == Error;
|
||||
m_ui->jdkWarningIconLabel->setVisible(error);
|
||||
m_ui->jdkWarningLabel->setVisible(error);
|
||||
if (error)
|
||||
m_ui->jdkWarningLabel->setText(tr("\"%1\" does not seem to be a JDK folder.").arg(location.toUserOutput()));
|
||||
}
|
||||
|
||||
if (mode & Sdk || mode & Java) {
|
||||
if (m_sdkState == Okay && m_javaState == Okay) {
|
||||
m_ui->AVDManagerFrame->setEnabled(true);
|
||||
} else {
|
||||
m_ui->AVDManagerFrame->setEnabled(false);
|
||||
}
|
||||
|
||||
m_AVDModel.setAvdList(m_androidConfig.androidVirtualDevices());
|
||||
}
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::saveSettings()
|
||||
{
|
||||
sdkLocationEditingFinished();
|
||||
ndkLocationEditingFinished();
|
||||
antLocationEditingFinished();
|
||||
openJDKLocationEditingFinished();
|
||||
dataPartitionSizeEditingFinished();
|
||||
AndroidConfigurations::setConfig(m_androidConfig);
|
||||
}
|
||||
|
||||
int indexOf(const QList<AndroidToolChainFactory::AndroidToolChainInformation> &list, const Utils::FileName &f)
|
||||
@@ -200,105 +313,37 @@ int indexOf(const QList<AndroidToolChainFactory::AndroidToolChainInformation> &l
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool AndroidSettingsWidget::checkNDK(const Utils::FileName &location)
|
||||
{
|
||||
if (location.isEmpty()) {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setVisible(false);
|
||||
m_ui->kitWarningIconLabel->setVisible(false);
|
||||
m_ui->kitWarningLabel->setVisible(false);
|
||||
return false;
|
||||
}
|
||||
Utils::FileName platformPath = location;
|
||||
Utils::FileName toolChainPath = location;
|
||||
Utils::FileName sourcesPath = location;
|
||||
if (!platformPath.appendPath(QLatin1String("platforms")).toFileInfo().exists()
|
||||
|| !toolChainPath.appendPath(QLatin1String("toolchains")).toFileInfo().exists()
|
||||
|| !sourcesPath.appendPath(QLatin1String("sources/cxx-stl")).toFileInfo().exists()) {
|
||||
m_ui->toolchainFoundLabel->setText(tr("\"%1\" does not seem to be an Android NDK top folder.").arg(location.toUserOutput()));
|
||||
m_ui->toolchainFoundLabel->setVisible(true);
|
||||
m_ui->ndkWarningIconLabel->setVisible(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check how many toolchains we could add...
|
||||
QList<AndroidToolChainFactory::AndroidToolChainInformation> compilerPaths = AndroidToolChainFactory::toolchainPathsForNdk(location);
|
||||
if (compilerPaths.isEmpty()) {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setVisible(false);
|
||||
} else {
|
||||
m_ui->ndkWarningIconLabel->setVisible(false);
|
||||
m_ui->toolchainFoundLabel->setText(tr("Found %n toolchains for this NDK.", 0, compilerPaths.count()));
|
||||
m_ui->toolchainFoundLabel->setVisible(true);
|
||||
}
|
||||
|
||||
// See if we have qt versions for those toolchains
|
||||
QSet<ProjectExplorer::Abi::Architecture> toolchainsForArch;
|
||||
foreach (const AndroidToolChainFactory::AndroidToolChainInformation &ati, compilerPaths)
|
||||
toolchainsForArch.insert(ati.architecture);
|
||||
|
||||
QSet<ProjectExplorer::Abi::Architecture> qtVersionsForArch;
|
||||
foreach (QtSupport::BaseQtVersion *qtVersion, QtSupport::QtVersionManager::versions()) {
|
||||
if (qtVersion->type() != QLatin1String(Constants::ANDROIDQT) || qtVersion->qtAbis().isEmpty())
|
||||
continue;
|
||||
qtVersionsForArch.insert(qtVersion->qtAbis().first().architecture());
|
||||
}
|
||||
|
||||
QSet<ProjectExplorer::Abi::Architecture> missingQtArchs = toolchainsForArch.subtract(qtVersionsForArch);
|
||||
if (missingQtArchs.isEmpty()) {
|
||||
m_ui->kitWarningIconLabel->setVisible(false);
|
||||
m_ui->kitWarningLabel->setVisible(false);
|
||||
} else {
|
||||
m_ui->kitWarningIconLabel->setVisible(true);
|
||||
m_ui->kitWarningLabel->setVisible(true);
|
||||
if (missingQtArchs.count() == 1) {
|
||||
m_ui->kitWarningLabel->setText(tr("Qt version for architecture %1 is missing.\n To add the Qt version, select Options > Build & Run > Qt Versions.")
|
||||
.arg(ProjectExplorer::Abi::toString((*missingQtArchs.constBegin()))));
|
||||
} else {
|
||||
QStringList missingArchs;
|
||||
foreach (ProjectExplorer::Abi::Architecture arch, missingQtArchs)
|
||||
missingArchs.append(ProjectExplorer::Abi::toString(arch));
|
||||
m_ui->kitWarningLabel->setText(tr("Qt versions for architectures %1 are missing.\n To add the Qt versions, select Options > Build & Run > Qt Versions.")
|
||||
.arg(missingArchs.join(QLatin1String(", "))));
|
||||
}
|
||||
}
|
||||
|
||||
m_androidConfig.ndkLocation = location;
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::sdkLocationEditingFinished()
|
||||
{
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->SDKLocationLineEdit->text());
|
||||
if (!checkSDK(location)) {
|
||||
m_ui->AVDManagerFrame->setEnabled(false);
|
||||
return;
|
||||
}
|
||||
m_androidConfig.sdkLocation = location;
|
||||
searchForAnt(location.toString());
|
||||
saveSettings(true);
|
||||
m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
|
||||
m_ui->AVDManagerFrame->setEnabled(true);
|
||||
m_androidConfig.setSdkLocation(Utils::FileName::fromUserInput(m_ui->SDKLocationLineEdit->text()));
|
||||
|
||||
check(Sdk);
|
||||
|
||||
if (m_sdkState == Okay)
|
||||
searchForAnt(m_androidConfig.sdkLocation());
|
||||
|
||||
applyToUi(Sdk);
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::ndkLocationEditingFinished()
|
||||
{
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text());
|
||||
m_androidConfig.toolchainHost.clear(); // force toolchain host detection
|
||||
if (!checkNDK(location))
|
||||
return;
|
||||
searchForAnt(location.toString());
|
||||
saveSettings(true);
|
||||
m_androidConfig.setNdkLocation(Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text()));
|
||||
|
||||
check(Ndk);
|
||||
|
||||
if (m_ndkState == Okay)
|
||||
searchForAnt(m_androidConfig.ndkLocation());
|
||||
|
||||
applyToUi(Ndk);
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::searchForAnt(const QString &location)
|
||||
void AndroidSettingsWidget::searchForAnt(const Utils::FileName &location)
|
||||
{
|
||||
if (!m_androidConfig.antLocation.isEmpty())
|
||||
if (!m_androidConfig.antLocation().isEmpty())
|
||||
return;
|
||||
if (location.isEmpty())
|
||||
return;
|
||||
QDir parentFolder = QFileInfo(location).absoluteDir();
|
||||
QDir parentFolder = location.toFileInfo().absoluteDir();
|
||||
foreach (const QString &file, parentFolder.entryList()) {
|
||||
if (file.startsWith(QLatin1String("apache-ant"))) {
|
||||
Utils::FileName ant = Utils::FileName::fromString(parentFolder.absolutePath());
|
||||
@@ -308,7 +353,7 @@ void AndroidSettingsWidget::searchForAnt(const QString &location)
|
||||
else
|
||||
ant.appendPath(QLatin1String("ant"));
|
||||
if (ant.toFileInfo().exists()) {
|
||||
m_androidConfig.antLocation = ant;
|
||||
m_androidConfig.setAntLocation(ant);
|
||||
m_ui->AntLocationLineEdit->setText(ant.toUserOutput());
|
||||
}
|
||||
}
|
||||
@@ -317,18 +362,15 @@ void AndroidSettingsWidget::searchForAnt(const QString &location)
|
||||
|
||||
void AndroidSettingsWidget::antLocationEditingFinished()
|
||||
{
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->AntLocationLineEdit->text());
|
||||
if (location.isEmpty() || !location.toFileInfo().exists())
|
||||
return;
|
||||
m_androidConfig.antLocation = location;
|
||||
m_androidConfig.setAntLocation(Utils::FileName::fromUserInput(m_ui->AntLocationLineEdit->text()));
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::openJDKLocationEditingFinished()
|
||||
{
|
||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->OpenJDKLocationLineEdit->text());
|
||||
if (location.isEmpty() || !location.toFileInfo().exists())
|
||||
return;
|
||||
m_androidConfig.openJDKLocation = location;
|
||||
m_androidConfig.setOpenJDKLocation(Utils::FileName::fromUserInput(m_ui->OpenJDKLocationLineEdit->text()));
|
||||
|
||||
check(Java);
|
||||
applyToUi(Java);
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::browseSDKLocation()
|
||||
@@ -336,8 +378,6 @@ void AndroidSettingsWidget::browseSDKLocation()
|
||||
Utils::FileName dir = Utils::FileName::fromString(
|
||||
QFileDialog::getExistingDirectory(this, tr("Select Android SDK folder"),
|
||||
m_ui->SDKLocationLineEdit->text()));
|
||||
if (!checkSDK(dir))
|
||||
return;
|
||||
m_ui->SDKLocationLineEdit->setText(dir.toUserOutput());
|
||||
sdkLocationEditingFinished();
|
||||
}
|
||||
@@ -347,8 +387,6 @@ void AndroidSettingsWidget::browseNDKLocation()
|
||||
Utils::FileName dir = Utils::FileName::fromString(
|
||||
QFileDialog::getExistingDirectory(this, tr("Select Android NDK folder"),
|
||||
m_ui->NDKLocationLineEdit->text()));
|
||||
if (!checkNDK(dir))
|
||||
return;
|
||||
m_ui->NDKLocationLineEdit->setText(dir.toUserOutput());
|
||||
ndkLocationEditingFinished();
|
||||
}
|
||||
@@ -374,7 +412,7 @@ void AndroidSettingsWidget::browseAntLocation()
|
||||
|
||||
void AndroidSettingsWidget::browseOpenJDKLocation()
|
||||
{
|
||||
Utils::FileName openJDKPath = AndroidConfigurations::instance().openJDKPath();
|
||||
Utils::FileName openJDKPath = m_androidConfig.openJDKLocation();
|
||||
Utils::FileName file = Utils::FileName::fromString(QFileDialog::getExistingDirectory(this, tr("Select OpenJDK Path"), openJDKPath.toString()));
|
||||
if (file.isEmpty())
|
||||
return;
|
||||
@@ -384,21 +422,21 @@ void AndroidSettingsWidget::browseOpenJDKLocation()
|
||||
|
||||
void AndroidSettingsWidget::addAVD()
|
||||
{
|
||||
AndroidConfigurations::instance().createAVD(this);
|
||||
m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
|
||||
m_androidConfig.createAVD(this);
|
||||
m_AVDModel.setAvdList(m_androidConfig.androidVirtualDevices());
|
||||
avdActivated(m_ui->AVDTableView->currentIndex());
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::removeAVD()
|
||||
{
|
||||
AndroidConfigurations::instance().removeAVD(m_AVDModel.avdName(m_ui->AVDTableView->currentIndex()));
|
||||
m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
|
||||
m_androidConfig.removeAVD(m_AVDModel.avdName(m_ui->AVDTableView->currentIndex()));
|
||||
m_AVDModel.setAvdList(m_androidConfig.androidVirtualDevices());
|
||||
avdActivated(m_ui->AVDTableView->currentIndex());
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::startAVD()
|
||||
{
|
||||
AndroidConfigurations::instance().startAVDAsync(m_AVDModel.avdName(m_ui->AVDTableView->currentIndex()));
|
||||
m_androidConfig.startAVDAsync(m_AVDModel.avdName(m_ui->AVDTableView->currentIndex()));
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::avdActivated(QModelIndex index)
|
||||
@@ -409,12 +447,12 @@ void AndroidSettingsWidget::avdActivated(QModelIndex index)
|
||||
|
||||
void AndroidSettingsWidget::dataPartitionSizeEditingFinished()
|
||||
{
|
||||
m_androidConfig.partitionSize = m_ui->DataPartitionSizeSpinBox->value();
|
||||
m_androidConfig.setPartitionSize(m_ui->DataPartitionSizeSpinBox->value());
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::createKitToggled()
|
||||
{
|
||||
m_androidConfig.automaticKitCreation = m_ui->CreateKitCheckBox->isChecked();
|
||||
m_androidConfig.setAutomaticKitCreation(m_ui->CreateKitCheckBox->isChecked());
|
||||
}
|
||||
|
||||
void AndroidSettingsWidget::manageAVD()
|
||||
@@ -423,8 +461,8 @@ void AndroidSettingsWidget::manageAVD()
|
||||
connect(this, SIGNAL(destroyed()), avdProcess, SLOT(deleteLater()));
|
||||
connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater()));
|
||||
|
||||
avdProcess->setProcessEnvironment(AndroidConfigurations::instance().androidToolEnvironment().toProcessEnvironment());
|
||||
QString executable = AndroidConfigurations::instance().androidToolPath().toString();
|
||||
avdProcess->setProcessEnvironment(m_androidConfig.androidToolEnvironment().toProcessEnvironment());
|
||||
QString executable = m_androidConfig.androidToolPath().toString();
|
||||
QStringList arguments = QStringList() << QLatin1String("avd");
|
||||
|
||||
avdProcess->start(executable, arguments);
|
||||
|
||||
@@ -69,12 +69,12 @@ public:
|
||||
AndroidSettingsWidget(QWidget *parent = 0);
|
||||
~AndroidSettingsWidget();
|
||||
|
||||
void saveSettings(bool saveNow = false);
|
||||
void saveSettings();
|
||||
|
||||
private slots:
|
||||
void sdkLocationEditingFinished();
|
||||
void ndkLocationEditingFinished();
|
||||
void searchForAnt(const QString &location);
|
||||
void searchForAnt(const Utils::FileName &location);
|
||||
void antLocationEditingFinished();
|
||||
void openJDKLocationEditingFinished();
|
||||
void browseSDKLocation();
|
||||
@@ -90,14 +90,20 @@ private slots:
|
||||
void createKitToggled();
|
||||
|
||||
private:
|
||||
void initGui();
|
||||
bool checkSDK(const Utils::FileName &location);
|
||||
bool checkNDK(const Utils::FileName &location);
|
||||
enum Mode { Sdk = 1, Ndk = 2, Java = 4, All = Sdk | Ndk | Java };
|
||||
enum State { NotSet = 0, Okay = 1, Error = 2 };
|
||||
void check(Mode mode);
|
||||
void applyToUi(Mode mode);
|
||||
|
||||
State m_sdkState;
|
||||
State m_ndkState;
|
||||
int m_ndkCompilerCount;
|
||||
QString m_ndkMissingQtArchs;
|
||||
State m_javaState;
|
||||
|
||||
Ui_AndroidSettingsWidget *m_ui;
|
||||
AndroidConfig m_androidConfig;
|
||||
AvdModel m_AVDModel;
|
||||
bool m_saveSettingsRequested;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -6,41 +6,54 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>679</width>
|
||||
<height>441</height>
|
||||
<width>573</width>
|
||||
<height>429</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Android Configuration</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="SDKLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Android SDK location:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="SDKLocationLineEdit">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="SDKLocationPushButton">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="SDKLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Android SDK location:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="SDKLocationLineEdit">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="SDKLocationPushButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="sdkWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
@@ -48,48 +61,15 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="sdkWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="sdkWarningLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="NDKLocationLabel">
|
||||
<item>
|
||||
<widget class="QLabel" name="sdkWarningLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
@@ -97,169 +77,221 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Android NDK location:</string>
|
||||
<string/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="NDKLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QPushButton" name="NDKLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="ndkWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_error.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="toolchainFoundLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QCheckBox" name="CreateKitCheckBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Automatically create kits for Android tool chains</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="kitWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="kitWarningLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="AntLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ant executable:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLineEdit" name="AntLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="6" column="2">
|
||||
<widget class="QPushButton" name="AntLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="OpenJDKLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>JDK location:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<widget class="QLineEdit" name="OpenJDKLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="7" column="2">
|
||||
<widget class="QPushButton" name="OpenJDKLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="NDKLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Android NDK location:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="NDKLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QPushButton" name="NDKLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="ndkWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_error.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="toolchainFoundLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QCheckBox" name="CreateKitCheckBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Automatically create kits for Android tool chains</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="kitWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="kitWarningLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="AntLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ant executable:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLineEdit" name="AntLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="6" column="2">
|
||||
<widget class="QPushButton" name="AntLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="OpenJDKLocationLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>JDK location:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<widget class="QLineEdit" name="OpenJDKLocationLineEdit"/>
|
||||
</item>
|
||||
<item row="7" column="2">
|
||||
<widget class="QPushButton" name="OpenJDKLocationPushButton">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QLabel" name="jdkWarningIconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../projectexplorer/projectexplorer.qrc">:/projectexplorer/images/compile_warning.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="jdkWarningLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="3">
|
||||
<widget class="QFrame" name="AVDManagerFrame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include <QProcess>
|
||||
|
||||
Android::Internal::AndroidSignalOperation::AndroidSignalOperation()
|
||||
: m_adbPath(AndroidConfigurations::instance().adbToolPath().toString())
|
||||
: m_adbPath(AndroidConfigurations::currentConfig().adbToolPath().toString())
|
||||
, m_adbProcess(new QProcess(this))
|
||||
, m_timeout(new QTimer(this))
|
||||
, m_state(Idle)
|
||||
|
||||
@@ -107,7 +107,7 @@ QString AndroidToolChain::typeDisplayName() const
|
||||
bool AndroidToolChain::isValid() const
|
||||
{
|
||||
return GccToolChain::isValid() && targetAbi().isValid() && !m_ndkToolChainVersion.isEmpty()
|
||||
&& compilerCommand().isChildOf(AndroidConfigurations::instance().config().ndkLocation);
|
||||
&& compilerCommand().isChildOf(AndroidConfigurations::currentConfig().ndkLocation());
|
||||
}
|
||||
|
||||
void AndroidToolChain::addToEnvironment(Environment &env) const
|
||||
@@ -116,15 +116,15 @@ void AndroidToolChain::addToEnvironment(Environment &env) const
|
||||
// TODO this vars should be configurable in projects -> build tab
|
||||
// TODO invalidate all .pro files !!!
|
||||
|
||||
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::instance().config().toolchainHost);
|
||||
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture()));
|
||||
env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture()));
|
||||
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::currentConfig().toolchainHost());
|
||||
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfig::toolchainPrefix(targetAbi().architecture()));
|
||||
env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfig::toolsPrefix(targetAbi().architecture()));
|
||||
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), m_ndkToolChainVersion);
|
||||
QString javaHome = AndroidConfigurations::instance().openJDKPath().toString();
|
||||
QString javaHome = AndroidConfigurations::currentConfig().openJDKLocation().toString();
|
||||
if (!javaHome.isEmpty() && QFileInfo(javaHome).exists())
|
||||
env.set(QLatin1String("JAVA_HOME"), javaHome);
|
||||
env.set(QLatin1String("ANDROID_HOME"), AndroidConfigurations::instance().config().sdkLocation.toString());
|
||||
env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfigurations::instance().config().sdkLocation.toString());
|
||||
env.set(QLatin1String("ANDROID_HOME"), AndroidConfigurations::currentConfig().sdkLocation().toString());
|
||||
env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfigurations::currentConfig().sdkLocation().toString());
|
||||
}
|
||||
|
||||
bool AndroidToolChain::operator ==(const ToolChain &tc) const
|
||||
@@ -142,19 +142,19 @@ ToolChainConfigWidget *AndroidToolChain::configurationWidget()
|
||||
|
||||
FileName AndroidToolChain::suggestedDebugger() const
|
||||
{
|
||||
return AndroidConfigurations::instance().gdbPath(targetAbi().architecture(), m_ndkToolChainVersion);
|
||||
return AndroidConfigurations::currentConfig().gdbPath(targetAbi().architecture(), m_ndkToolChainVersion);
|
||||
}
|
||||
|
||||
FileName AndroidToolChain::suggestedGdbServer() const
|
||||
{
|
||||
Utils::FileName path = AndroidConfigurations::instance().config().ndkLocation;
|
||||
Utils::FileName path = AndroidConfigurations::currentConfig().ndkLocation();
|
||||
path.appendPath(QString::fromLatin1("prebuilt/android-%1/gdbserver/gdbserver")
|
||||
.arg(Abi::toString(targetAbi().architecture())));
|
||||
if (path.toFileInfo().exists())
|
||||
return path;
|
||||
path = AndroidConfigurations::instance().config().ndkLocation;
|
||||
path = AndroidConfigurations::currentConfig().ndkLocation();
|
||||
path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/gdbserver")
|
||||
.arg(AndroidConfigurations::toolchainPrefix(targetAbi().architecture()))
|
||||
.arg(AndroidConfig::toolchainPrefix(targetAbi().architecture()))
|
||||
.arg(m_ndkToolChainVersion));
|
||||
if (path.toFileInfo().exists())
|
||||
return path;
|
||||
@@ -176,7 +176,7 @@ bool AndroidToolChain::fromMap(const QVariantMap &data)
|
||||
|
||||
if (data.contains(QLatin1String(ANDROID_QT_VERSION_KEY))) {
|
||||
QString command = compilerCommand().toString();
|
||||
QString ndkPath = AndroidConfigurations::instance().config().ndkLocation.toString();
|
||||
QString ndkPath = AndroidConfigurations::currentConfig().ndkLocation().toString();
|
||||
if (!command.startsWith(ndkPath))
|
||||
return false;
|
||||
command = command.mid(ndkPath.length());
|
||||
@@ -193,7 +193,7 @@ bool AndroidToolChain::fromMap(const QVariantMap &data)
|
||||
return false;
|
||||
m_ndkToolChainVersion = command.mid(index + 1);
|
||||
QString platform = command.left(index);
|
||||
Abi::Architecture arch = AndroidConfigurations::architectureForToolChainPrefix(platform);
|
||||
Abi::Architecture arch = AndroidConfig::architectureForToolChainPrefix(platform);
|
||||
ProjectExplorer::Abi abi = ProjectExplorer::Abi(arch, ProjectExplorer::Abi::LinuxOS,
|
||||
ProjectExplorer::Abi::AndroidLinuxFlavor, ProjectExplorer::Abi::ElfFormat,
|
||||
32);
|
||||
@@ -215,7 +215,7 @@ QList<FileName> AndroidToolChain::suggestedMkspecList() const
|
||||
|
||||
QString AndroidToolChain::makeCommand(const Utils::Environment &env) const
|
||||
{
|
||||
QStringList extraDirectories = AndroidConfigurations::instance().makeExtraSearchDirectories();
|
||||
QStringList extraDirectories = AndroidConfigurations::currentConfig().makeExtraSearchDirectories();
|
||||
if (HostOsInfo::isWindowsHost()) {
|
||||
QString tmp = env.searchInPath(QLatin1String("ma-make.exe"), extraDirectories);
|
||||
if (!tmp.isEmpty())
|
||||
@@ -256,7 +256,7 @@ QList<Abi> AndroidToolChain::detectSupportedAbis() const
|
||||
AndroidToolChainConfigWidget::AndroidToolChainConfigWidget(AndroidToolChain *tc) :
|
||||
ToolChainConfigWidget(tc)
|
||||
{
|
||||
QLabel *label = new QLabel(AndroidConfigurations::instance().config().ndkLocation.toUserOutput());
|
||||
QLabel *label = new QLabel(AndroidConfigurations::currentConfig().ndkLocation().toUserOutput());
|
||||
m_mainLayout->addRow(tr("NDK Root:"), label);
|
||||
}
|
||||
|
||||
@@ -272,7 +272,7 @@ AndroidToolChainFactory::AndroidToolChainFactory()
|
||||
|
||||
QList<ToolChain *> AndroidToolChainFactory::autoDetect()
|
||||
{
|
||||
return createToolChainsForNdk(AndroidConfigurations::instance().config().ndkLocation);
|
||||
return createToolChainsForNdk(AndroidConfigurations::currentConfig().ndkLocation());
|
||||
}
|
||||
|
||||
bool AndroidToolChainFactory::canRestore(const QVariantMap &data)
|
||||
@@ -307,11 +307,11 @@ QList<AndroidToolChainFactory::AndroidToolChainInformation> AndroidToolChainFact
|
||||
AndroidToolChainInformation ati;
|
||||
ati.version = fileName.mid(idx + 1);
|
||||
QString platform = fileName.left(idx);
|
||||
ati.architecture = AndroidConfigurations::architectureForToolChainPrefix(platform);
|
||||
ati.architecture = AndroidConfig::architectureForToolChainPrefix(platform);
|
||||
if (ati.architecture == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
||||
continue;
|
||||
// AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
|
||||
ati.compilerCommand = AndroidConfigurations::instance().gccPath(ati.architecture, ati.version);
|
||||
ati.compilerCommand = AndroidConfigurations::currentConfig().gccPath(ati.architecture, ati.version);
|
||||
// tc->setCompilerCommand(compilerPath);
|
||||
result.append(ati);
|
||||
}
|
||||
@@ -381,11 +381,11 @@ QList<ToolChain *> AndroidToolChainFactory::createToolChainsForNdk(const Utils::
|
||||
continue;
|
||||
QString version = fileName.mid(idx + 1);
|
||||
QString platform = fileName.left(idx);
|
||||
Abi::Architecture arch = AndroidConfigurations::architectureForToolChainPrefix(platform);
|
||||
Abi::Architecture arch = AndroidConfig::architectureForToolChainPrefix(platform);
|
||||
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
||||
continue;
|
||||
AndroidToolChain *tc = new AndroidToolChain(arch, version, ToolChain::AutoDetection);
|
||||
FileName compilerPath = AndroidConfigurations::instance().gccPath(arch, version);
|
||||
FileName compilerPath = AndroidConfigurations::currentConfig().gccPath(arch, version);
|
||||
tc->setCompilerCommand(compilerPath);
|
||||
result.append(tc);
|
||||
|
||||
@@ -409,9 +409,9 @@ QList<ToolChain *> AndroidToolChainFactory::createToolChainsForNdk(const Utils::
|
||||
QList<int> AndroidToolChainFactory::newestToolChainVersionForArch(Abi::Architecture arch)
|
||||
{
|
||||
if (m_newestVersionForArch.isEmpty()
|
||||
|| m_ndkLocation != AndroidConfigurations::instance().config().ndkLocation) {
|
||||
|| m_ndkLocation != AndroidConfigurations::currentConfig().ndkLocation()) {
|
||||
QRegExp versionRegExp(NDKGccVersionRegExp);
|
||||
m_ndkLocation = AndroidConfigurations::instance().config().ndkLocation;
|
||||
m_ndkLocation = AndroidConfigurations::currentConfig().ndkLocation();
|
||||
FileName path = m_ndkLocation;
|
||||
QDirIterator it(path.appendPath(QLatin1String("toolchains")).toString(),
|
||||
QStringList() << QLatin1String("*"), QDir::Dirs);
|
||||
@@ -422,7 +422,7 @@ QList<int> AndroidToolChainFactory::newestToolChainVersionForArch(Abi::Architect
|
||||
continue;
|
||||
QList<int> version = versionNumberFromString(fileName.mid(idx + 1));
|
||||
QString platform = fileName.left(idx);
|
||||
Abi::Architecture arch = AndroidConfigurations::architectureForToolChainPrefix(platform);
|
||||
Abi::Architecture arch = AndroidConfig::architectureForToolChainPrefix(platform);
|
||||
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
||||
continue;
|
||||
QMap<Abi::Architecture, QList<int> >::const_iterator it
|
||||
|
||||
Reference in New Issue
Block a user