Android: Transform AndroidConfig into namespace

Change-Id: I1926758f3dcaffb4de11a85c0873eec7bd2d223c
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-05-21 13:36:49 +02:00
parent 665387bc6d
commit c9fac8ca2e
24 changed files with 555 additions and 606 deletions

View File

@@ -45,7 +45,7 @@ static bool is32BitUserSpace()
bool startAvdAsync(const QString &avdName) bool startAvdAsync(const QString &avdName)
{ {
const FilePath emulator = androidConfig().emulatorToolPath(); const FilePath emulator = AndroidConfig::emulatorToolPath();
if (!emulator.exists()) { if (!emulator.exists()) {
QMetaObject::invokeMethod(Core::ICore::mainWindow(), [emulator] { QMetaObject::invokeMethod(Core::ICore::mainWindow(), [emulator] {
QMessageBox::critical(Core::ICore::dialogParent(), QMessageBox::critical(Core::ICore::dialogParent(),
@@ -75,11 +75,11 @@ bool startAvdAsync(const QString &avdName)
}); });
// start the emulator // start the emulator
CommandLine cmd(androidConfig().emulatorToolPath()); CommandLine cmd(emulator);
if (is32BitUserSpace()) if (is32BitUserSpace())
cmd.addArg("-force-32bit"); cmd.addArg("-force-32bit");
cmd.addArgs(androidConfig().emulatorArgs(), CommandLine::Raw); cmd.addArgs(AndroidConfig::emulatorArgs(), CommandLine::Raw);
cmd.addArgs({"-avd", avdName}); cmd.addArgs({"-avd", avdName});
qCDebug(avdManagerLog).noquote() << "Running command (startAvdAsync):" << cmd.toUserOutput(); qCDebug(avdManagerLog).noquote() << "Running command (startAvdAsync):" << cmd.toUserOutput();
avdProcess->setCommand(cmd); avdProcess->setCommand(cmd);
@@ -89,7 +89,7 @@ bool startAvdAsync(const QString &avdName)
QString findAvd(const QString &avdName) QString findAvd(const QString &avdName)
{ {
const QList<AndroidDeviceInfo> devices = androidConfig().connectedDevices(); const QList<AndroidDeviceInfo> devices = AndroidConfig::connectedDevices();
for (const AndroidDeviceInfo &device : devices) { for (const AndroidDeviceInfo &device : devices) {
if (device.type != ProjectExplorer::IDevice::Emulator) if (device.type != ProjectExplorer::IDevice::Emulator)
continue; continue;
@@ -108,7 +108,7 @@ static bool waitForBooted(const QString &serialNumber, const std::optional<QFutu
if (isAvdBooted(serialNumber)) if (isAvdBooted(serialNumber))
return true; return true;
QThread::sleep(2); QThread::sleep(2);
if (!androidConfig().isConnected(serialNumber)) // device was disconnected if (!AndroidConfig::isConnected(serialNumber)) // device was disconnected
return false; return false;
} }
return false; return false;
@@ -132,11 +132,11 @@ QString waitForAvd(const QString &avdName, const std::optional<QFuture<void>> &f
bool isAvdBooted(const QString &device) bool isAvdBooted(const QString &device)
{ {
const CommandLine command{androidConfig().adbToolPath(), AndroidDeviceInfo::adbSelector(device) const CommandLine cmd{AndroidConfig::adbToolPath(), {AndroidDeviceInfo::adbSelector(device),
+ QStringList{"shell", "getprop", "init.svc.bootanim"}}; "shell", "getprop", "init.svc.bootanim"}};
qCDebug(avdManagerLog).noquote() << "Running command (isAvdBooted):" << command.toUserOutput(); qCDebug(avdManagerLog).noquote() << "Running command (isAvdBooted):" << cmd.toUserOutput();
Process adbProc; Process adbProc;
adbProc.setCommand(command); adbProc.setCommand(cmd);
adbProc.runBlocking(); adbProc.runBlocking();
if (adbProc.result() != ProcessResult::FinishedWithSuccess) if (adbProc.result() != ProcessResult::FinishedWithSuccess)
return false; return false;

View File

@@ -415,7 +415,7 @@ bool AndroidBuildApkWidget::isOpenSslLibsIncluded()
QString AndroidBuildApkWidget::openSslIncludeFileContent(const FilePath &projectPath) QString AndroidBuildApkWidget::openSslIncludeFileContent(const FilePath &projectPath)
{ {
QString openSslPath = androidConfig().openSslLocation().toString(); QString openSslPath = AndroidConfig::openSslLocation().toString();
if (projectPath.endsWith(".pro")) if (projectPath.endsWith(".pro"))
return "android: include(" + openSslPath + "/openssl.pri)"; return "android: include(" + openSslPath + "/openssl.pri)";
if (projectPath.endsWith("CMakeLists.txt")) if (projectPath.endsWith("CMakeLists.txt"))
@@ -541,7 +541,7 @@ bool AndroidBuildApkStep::init()
QStringList arguments = {"--input", m_inputFile.path(), QStringList arguments = {"--input", m_inputFile.path(),
"--output", outputDir.path(), "--output", outputDir.path(),
"--android-platform", m_buildTargetSdk, "--android-platform", m_buildTargetSdk,
"--jdk", androidConfig().openJDKLocation().path()}; "--jdk", AndroidConfig::openJDKLocation().path()};
if (verboseOutput()) if (verboseOutput())
arguments << "--verbose"; arguments << "--verbose";
@@ -929,17 +929,16 @@ QVariant AndroidBuildApkStep::data(Utils::Id id) const
{ {
if (id == Constants::AndroidNdkPlatform) { if (id == Constants::AndroidNdkPlatform) {
if (auto qtVersion = QtKitAspect::qtVersion(kit())) if (auto qtVersion = QtKitAspect::qtVersion(kit()))
return androidConfig() return AndroidConfig::bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion);
.bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion);
return {}; return {};
} }
if (id == Constants::NdkLocation) { if (id == Constants::NdkLocation) {
if (auto qtVersion = QtKitAspect::qtVersion(kit())) if (auto qtVersion = QtKitAspect::qtVersion(kit()))
return QVariant::fromValue(androidConfig().ndkLocation(qtVersion)); return QVariant::fromValue(AndroidConfig::ndkLocation(qtVersion));
return {}; return {};
} }
if (id == Constants::SdkLocation) if (id == Constants::SdkLocation)
return QVariant::fromValue(androidConfig().sdkLocation()); return QVariant::fromValue(AndroidConfig::sdkLocation());
if (id == Constants::AndroidMkSpecAbis) if (id == Constants::AndroidMkSpecAbis)
return AndroidManager::applicationAbis(target()); return AndroidManager::applicationAbis(target());
@@ -1000,7 +999,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates()
"-storepass", m_keystorePasswd, "-J-Duser.language=en"}; "-storepass", m_keystorePasswd, "-J-Duser.language=en"};
Process keytoolProc; Process keytoolProc;
keytoolProc.setCommand({androidConfig().keytoolPath(), params}); keytoolProc.setCommand({AndroidConfig::keytoolPath(), params});
using namespace std::chrono_literals; using namespace std::chrono_literals;
keytoolProc.runBlocking(30s); keytoolProc.runBlocking(30s);
if (keytoolProc.result() > ProcessResult::FinishedWithError) if (keytoolProc.result() > ProcessResult::FinishedWithError)

File diff suppressed because it is too large Load Diff

View File

@@ -36,132 +36,87 @@ public:
int sdcardSize = 0; int sdcardSize = 0;
}; };
struct SdkForQtVersions namespace AndroidConfig {
{
QList<QVersionNumber> versions;
QStringList essentialPackages;
public: QStringList apiLevelNamesFor(const SdkPlatformList &platforms);
bool containsVersion(const QVersionNumber &qtVersion) const; QString apiLevelNameFor(const SdkPlatform *platform);
};
class AndroidConfig Utils::FilePath sdkLocation();
{ void setSdkLocation(const Utils::FilePath &sdkLocation);
public: QVersionNumber sdkToolsVersion();
void load(const Utils::QtcSettings &settings); QVersionNumber buildToolsVersion();
void save(Utils::QtcSettings &settings) const; QStringList sdkManagerToolArgs();
void setSdkManagerToolArgs(const QStringList &args);
static QStringList apiLevelNamesFor(const SdkPlatformList &platforms); Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion);
static QString apiLevelNameFor(const SdkPlatform *platform); QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion);
QVersionNumber ndkVersion(const Utils::FilePath &ndkPath);
Utils::FilePath sdkLocation() const; QUrl sdkToolsUrl();
void setSdkLocation(const Utils::FilePath &sdkLocation); QByteArray getSdkToolsSha256();
QVersionNumber sdkToolsVersion() const;
Utils::FilePath sdkToolsVersionPath() const;
QVersionNumber buildToolsVersion() const;
QStringList sdkManagerToolArgs() const;
void setSdkManagerToolArgs(const QStringList &args);
Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion) const; QStringList allEssentials();
QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion) const; bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager);
static QVersionNumber ndkVersion(const Utils::FilePath &ndkPath); bool sdkToolsOk();
QUrl sdkToolsUrl() const { return m_sdkToolsUrl; } Utils::FilePath openJDKLocation();
QByteArray getSdkToolsSha256() const { return m_sdkToolsSha256; } void setOpenJDKLocation(const Utils::FilePath &openJDKLocation);
QStringList defaultEssentials() const; QString toolchainHost(const QtSupport::QtVersion *qtVersion);
QStringList essentialsFromQtVersion(const QtSupport::QtVersion &version) const; QString toolchainHostFromNdk(const Utils::FilePath &ndkPath);
QStringList allEssentials() const;
bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager);
bool sdkToolsOk() const;
Utils::FilePath openJDKLocation() const; QString emulatorArgs();
void setOpenJDKLocation(const Utils::FilePath &openJDKLocation); void setEmulatorArgs(const QString &args);
QString toolchainHost(const QtSupport::QtVersion *qtVersion) const; bool automaticKitCreation();
static QString toolchainHostFromNdk(const Utils::FilePath &ndkPath); void setAutomaticKitCreation(bool b);
QString emulatorArgs() const; Utils::FilePath defaultSdkPath();
void setEmulatorArgs(const QString &args); Utils::FilePath adbToolPath();
Utils::FilePath emulatorToolPath();
Utils::FilePath sdkManagerToolPath();
Utils::FilePath avdManagerToolPath();
bool automaticKitCreation() const; void setTemporarySdkToolsPath(const Utils::FilePath &path);
void setAutomaticKitCreation(bool b);
static Utils::FilePath defaultSdkPath(); Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion);
Utils::FilePath adbToolPath() const; Utils::FilePath toolchainPathFromNdk(
Utils::FilePath emulatorToolPath() const; const Utils::FilePath &ndkLocation, Utils::OsType hostOs = Utils::HostOsInfo::hostOs());
Utils::FilePath sdkManagerToolPath() const; Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation);
Utils::FilePath avdManagerToolPath() const;
void setTemporarySdkToolsPath(const Utils::FilePath &path); Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation);
Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion) const; Utils::FilePath keytoolPath();
static Utils::FilePath toolchainPathFromNdk(const Utils::FilePath &ndkLocation,
Utils::OsType hostOs = Utils::HostOsInfo::hostOs());
static Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation);
static Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation); QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr);
Utils::FilePath keytoolPath() const; QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion);
QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr) const; QLatin1String displayName(const ProjectExplorer::Abi &abi);
QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion) const; QString getProductModel(const QString &device);
bool isConnected(const QString &serialNumber);
static QLatin1String displayName(const ProjectExplorer::Abi &abi); bool sdkFullyConfigured();
void setSdkFullyConfigured(bool allEssentialsInstalled);
QString getProductModel(const QString &device) const; bool isValidNdk(const QString &ndkLocation);
bool isConnected(const QString &serialNumber) const; QStringList getCustomNdkList();
void addCustomNdk(const QString &customNdk);
void removeCustomNdk(const QString &customNdk);
void setDefaultNdk(const Utils::FilePath &defaultNdk);
Utils::FilePath defaultNdk();
bool sdkFullyConfigured() const { return m_sdkFullyConfigured; } Utils::FilePath openSslLocation();
void setSdkFullyConfigured(bool allEssentialsInstalled) { m_sdkFullyConfigured = allEssentialsInstalled; } void setOpenSslLocation(const Utils::FilePath &openSslLocation);
static bool isValidNdk(const QString &ndkLocation); Utils::FilePath getJdkPath();
QStringList getCustomNdkList() const; QStringList getAbis(const QString &device);
void addCustomNdk(const QString &customNdk); int getSDKVersion(const QString &device);
void removeCustomNdk(const QString &customNdk);
void setDefaultNdk(const Utils::FilePath &defaultNdk);
Utils::FilePath defaultNdk() const;
Utils::FilePath openSslLocation() const; Utils::Environment toolsEnvironment();
void setOpenSslLocation(const Utils::FilePath &openSslLocation);
static Utils::FilePath getJdkPath(); } // namespace AndroidConfig
static QStringList getAbis(const QString &device);
static int getSDKVersion(const QString &device);
Utils::Environment toolsEnvironment() const;
private:
Utils::FilePath openJDKBinPath() const;
Utils::FilePath ndkSubPathFromQtVersion(const QtSupport::QtVersion &version) const; // relative!
void parseDependenciesJson();
QList<int> availableNdkPlatforms(const QtSupport::QtVersion *qtVersion) const;
Utils::FilePath m_sdkLocation;
Utils::FilePath m_temporarySdkToolsPath;
QStringList m_sdkManagerToolArgs;
Utils::FilePath m_openJDKLocation;
Utils::FilePath m_keystoreLocation;
Utils::FilePath m_openSslLocation;
QString m_emulatorArgs;
bool m_automaticKitCreation = true;
QUrl m_sdkToolsUrl;
QByteArray m_sdkToolsSha256;
QStringList m_commonEssentialPkgs;
SdkForQtVersions m_defaultSdkDepends;
QList<SdkForQtVersions> m_specificQtVersions;
QStringList m_customNdkList;
Utils::FilePath m_defaultNdk;
bool m_sdkFullyConfigured = false;
//caches
mutable QHash<QString, QString> m_serialNumberToDeviceName;
};
AndroidConfig &androidConfig();
class AndroidConfigurations : public QObject class AndroidConfigurations : public QObject
{ {

View File

@@ -262,8 +262,8 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted()
if (!m_stateNameLineEdit->text().isEmpty()) if (!m_stateNameLineEdit->text().isEmpty())
distinguishedNames += QLatin1String(", S=") + m_stateNameLineEdit->text().replace(',', QLatin1String("\\,")); distinguishedNames += QLatin1String(", S=") + m_stateNameLineEdit->text().replace(',', QLatin1String("\\,"));
const CommandLine command(androidConfig().keytoolPath(), const CommandLine command(AndroidConfig::keytoolPath(),
{ "-genkey", "-keyalg", "RSA", {"-genkey", "-keyalg", "RSA",
"-keystore", m_keystoreFilePath.toString(), "-keystore", m_keystoreFilePath.toString(),
"-storepass", keystorePassword(), "-storepass", keystorePassword(),
"-alias", certificateAlias(), "-alias", certificateAlias(),

View File

@@ -110,8 +110,7 @@ void AndroidDebugSupport::start()
QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(kit); QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(kit);
if (!HostOsInfo::isWindowsHost() if (!HostOsInfo::isWindowsHost()
&& (qtVersion && (qtVersion && AndroidConfig::ndkVersion(qtVersion) >= QVersionNumber(11, 0, 0))) {
&& androidConfig().ndkVersion(qtVersion) >= QVersionNumber(11, 0, 0))) {
qCDebug(androidDebugSupportLog) << "UseTargetAsync: " << true; qCDebug(androidDebugSupportLog) << "UseTargetAsync: " << true;
setUseTargetAsync(true); setUseTargetAsync(true);
} }
@@ -165,7 +164,7 @@ void AndroidDebugSupport::start()
int sdkVersion = qMax(AndroidManager::minimumSDK(kit), minimumNdk); int sdkVersion = qMax(AndroidManager::minimumSDK(kit), minimumNdk);
if (qtVersion) { if (qtVersion) {
const FilePath ndkLocation = androidConfig().ndkLocation(qtVersion); const FilePath ndkLocation = AndroidConfig::ndkLocation(qtVersion);
FilePath sysRoot = ndkLocation FilePath sysRoot = ndkLocation
/ "platforms" / "platforms"
/ QString("android-%1").arg(sdkVersion) / QString("android-%1").arg(sdkVersion)

View File

@@ -297,7 +297,7 @@ bool AndroidDeployQtStep::init()
m_apkPath = FilePath::fromString(node->data(Constants::AndroidApk).toString()); m_apkPath = FilePath::fromString(node->data(Constants::AndroidApk).toString());
if (!m_apkPath.isEmpty()) { if (!m_apkPath.isEmpty()) {
m_manifestName = FilePath::fromString(node->data(Constants::AndroidManifest).toString()); m_manifestName = FilePath::fromString(node->data(Constants::AndroidManifest).toString());
m_command = androidConfig().adbToolPath(); m_command = AndroidConfig::adbToolPath();
AndroidManager::setManifestPath(target(), m_manifestName); AndroidManager::setManifestPath(target(), m_manifestName);
} else { } else {
QString jsonFile = AndroidQtVersion::androidDeploymentSettings(target()).toString(); QString jsonFile = AndroidQtVersion::androidDeploymentSettings(target()).toString();
@@ -335,13 +335,13 @@ bool AndroidDeployQtStep::init()
} }
} else { } else {
m_uninstallPreviousPackageRun = true; m_uninstallPreviousPackageRun = true;
m_command = androidConfig().adbToolPath(); m_command = AndroidConfig::adbToolPath();
m_apkPath = AndroidManager::packagePath(target()); m_apkPath = AndroidManager::packagePath(target());
m_workingDirectory = bc ? AndroidManager::buildDirectory(target()): FilePath(); m_workingDirectory = bc ? AndroidManager::buildDirectory(target()): FilePath();
} }
m_environment = bc ? bc->environment() : Environment(); m_environment = bc ? bc->environment() : Environment();
m_adbPath = androidConfig().adbToolPath(); m_adbPath = AndroidConfig::adbToolPath();
// Start the AVD if not running. // Start the AVD if not running.
if (!m_avdName.isEmpty() && AndroidAvdManager::findAvd(m_avdName).isEmpty()) if (!m_avdName.isEmpty() && AndroidAvdManager::findAvd(m_avdName).isEmpty())

View File

@@ -53,7 +53,7 @@ static constexpr char wifiDevicePort[] = "5555";
static QString displayNameFromInfo(const AndroidDeviceInfo &info) static QString displayNameFromInfo(const AndroidDeviceInfo &info)
{ {
return info.type == IDevice::Hardware ? androidConfig().getProductModel(info.serialNumber) return info.type == IDevice::Hardware ? AndroidConfig::getProductModel(info.serialNumber)
: info.avdName; : info.avdName;
} }
@@ -415,7 +415,7 @@ void AndroidDevice::initAvdSettings()
void AndroidDeviceManager::updateAvdList() void AndroidDeviceManager::updateAvdList()
{ {
if (androidConfig().adbToolPath().exists()) if (AndroidConfig::adbToolPath().exists())
m_avdListRunner.start(m_avdListRecipe); m_avdListRunner.start(m_avdListRecipe);
} }
@@ -446,7 +446,7 @@ void AndroidDeviceManager::updateDeviceState(const ProjectExplorer::IDevice::Con
expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bool force) expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bool force)
{ {
CommandLine cmd(androidConfig().avdManagerToolPath(), {"create", "avd", "-n", info.name}); CommandLine cmd(AndroidConfig::avdManagerToolPath(), {"create", "avd", "-n", info.name});
cmd.addArgs({"-k", info.sdkStylePath}); cmd.addArgs({"-k", info.sdkStylePath});
if (info.sdcardSize > 0) if (info.sdcardSize > 0)
cmd.addArgs({"-c", QString("%1M").arg(info.sdcardSize)}); cmd.addArgs({"-c", QString("%1M").arg(info.sdcardSize)});
@@ -460,7 +460,7 @@ expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bo
Process process; Process process;
process.setProcessMode(ProcessMode::Writer); process.setProcessMode(ProcessMode::Writer);
process.setEnvironment(androidConfig().toolsEnvironment()); process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(cmd); process.setCommand(cmd);
process.setWriteData("yes\n"); // yes to "Do you wish to create a custom hardware profile" process.setWriteData("yes\n"); // yes to "Do you wish to create a custom hardware profile"
@@ -521,9 +521,9 @@ void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device, QWidget *parent)
qCDebug(androidDeviceLog) << QString("Erasing Android AVD \"%1\" from the system.").arg(name); qCDebug(androidDeviceLog) << QString("Erasing Android AVD \"%1\" from the system.").arg(name);
m_removeAvdProcess.reset(new Process); m_removeAvdProcess.reset(new Process);
const CommandLine command(androidConfig().avdManagerToolPath(), {"delete", "avd", "-n", name}); const CommandLine command(AndroidConfig::avdManagerToolPath(), {"delete", "avd", "-n", name});
qCDebug(androidDeviceLog).noquote() << "Running command (removeAvd):" << command.toUserOutput(); qCDebug(androidDeviceLog).noquote() << "Running command (removeAvd):" << command.toUserOutput();
m_removeAvdProcess->setEnvironment(androidConfig().toolsEnvironment()); m_removeAvdProcess->setEnvironment(AndroidConfig::toolsEnvironment());
m_removeAvdProcess->setCommand(command); m_removeAvdProcess->setCommand(command);
connect(m_removeAvdProcess.get(), &Process::done, this, [this, device] { connect(m_removeAvdProcess.get(), &Process::done, this, [this, device] {
const QString name = device->displayName(); const QString name = device->displayName();
@@ -618,7 +618,7 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent)
dialog.setLabelText(Tr::tr("Emulator command-line startup options " dialog.setLabelText(Tr::tr("Emulator command-line startup options "
"(<a href=\"%1\">Help Web Page</a>):") "(<a href=\"%1\">Help Web Page</a>):")
.arg(helpUrl)); .arg(helpUrl));
dialog.setTextValue(androidConfig().emulatorArgs()); dialog.setTextValue(AndroidConfig::emulatorArgs());
if (auto label = dialog.findChild<QLabel*>()) { if (auto label = dialog.findChild<QLabel*>()) {
label->setOpenExternalLinks(true); label->setOpenExternalLinks(true);
@@ -628,12 +628,12 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent)
if (dialog.exec() != QDialog::Accepted) if (dialog.exec() != QDialog::Accepted)
return; return;
androidConfig().setEmulatorArgs(dialog.textValue()); AndroidConfig::setEmulatorArgs(dialog.textValue());
} }
QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) const QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) const
{ {
for (const AndroidDeviceInfo &dev : androidConfig().connectedDevices()) { for (const AndroidDeviceInfo &dev : AndroidConfig::connectedDevices()) {
if (!dev.serialNumber.startsWith("emulator")) if (!dev.serialNumber.startsWith("emulator"))
continue; continue;
const QString stdOut = emulatorName(dev.serialNumber); const QString stdOut = emulatorName(dev.serialNumber);
@@ -661,7 +661,7 @@ static FilePath avdFilePath()
void AndroidDeviceManager::setupDevicesWatcher() void AndroidDeviceManager::setupDevicesWatcher()
{ {
if (!androidConfig().adbToolPath().exists()) { if (!AndroidConfig::adbToolPath().exists()) {
qCDebug(androidDeviceLog) << "Cannot start ADB device watcher" qCDebug(androidDeviceLog) << "Cannot start ADB device watcher"
<< "because adb path does not exist."; << "because adb path does not exist.";
return; return;
@@ -693,10 +693,10 @@ void AndroidDeviceManager::setupDevicesWatcher()
handleDevicesListChange(output); handleDevicesListChange(output);
}); });
const CommandLine command{androidConfig().adbToolPath(), {"track-devices"}}; const CommandLine command{AndroidConfig::adbToolPath(), {"track-devices"}};
m_adbDeviceWatcherProcess->setCommand(command); m_adbDeviceWatcherProcess->setCommand(command);
m_adbDeviceWatcherProcess->setWorkingDirectory(command.executable().parentDir()); m_adbDeviceWatcherProcess->setWorkingDirectory(command.executable().parentDir());
m_adbDeviceWatcherProcess->setEnvironment(androidConfig().toolsEnvironment()); m_adbDeviceWatcherProcess->setEnvironment(AndroidConfig::toolsEnvironment());
m_adbDeviceWatcherProcess->start(); m_adbDeviceWatcherProcess->start();
// Setup AVD filesystem watcher to listen for changes when an avd is created/deleted, // Setup AVD filesystem watcher to listen for changes when an avd is created/deleted,
@@ -838,7 +838,7 @@ void AndroidDeviceManager::handleDevicesListChange(const QString &serialNumber)
devMgr->setDeviceState(avdId, state); devMgr->setDeviceState(avdId, state);
} else { } else {
const Id id = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + serial); const Id id = Id(Constants::ANDROID_DEVICE_ID).withSuffix(':' + serial);
QString displayName = androidConfig().getProductModel(serial); QString displayName = AndroidConfig::getProductModel(serial);
// Check if the device is connected via WiFi. A sample serial of such devices can be // Check if the device is connected via WiFi. A sample serial of such devices can be
// like: "192.168.1.190:5555" // like: "192.168.1.190:5555"
static const auto ipRegex = QRegularExpression(ipRegexStr + QStringLiteral(":(\\d{1,5})")); static const auto ipRegex = QRegularExpression(ipRegexStr + QStringLiteral(":(\\d{1,5})"));
@@ -921,16 +921,16 @@ AndroidDeviceManager::AndroidDeviceManager(QObject *parent)
}); });
const auto onProcessSetup = [](Process &process) { const auto onProcessSetup = [](Process &process) {
const CommandLine cmd(androidConfig().avdManagerToolPath(), {"list", "avd"}); const CommandLine cmd(AndroidConfig::avdManagerToolPath(), {"list", "avd"});
qCDebug(androidDeviceLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput(); qCDebug(androidDeviceLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput();
process.setEnvironment(androidConfig().toolsEnvironment()); process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(cmd); process.setCommand(cmd);
}; };
const auto onProcessDone = [this, storage](const Process &process, DoneWith result) { const auto onProcessDone = [this, storage](const Process &process, DoneWith result) {
const QString output = process.allOutput(); const QString output = process.allOutput();
if (result != DoneWith::Success) { if (result != DoneWith::Success) {
qCDebug(androidDeviceLog) qCDebug(androidDeviceLog)
<< "Avd list command failed" << output << androidConfig().sdkToolsVersion(); << "Avd list command failed" << output << AndroidConfig::sdkToolsVersion();
return DoneResult::Error; return DoneResult::Error;
} }
@@ -981,7 +981,7 @@ public:
":/android/images/androiddevice.png"); ":/android/images/androiddevice.png");
setConstructionFunction(&AndroidDevice::create); setConstructionFunction(&AndroidDevice::create);
setCreator([] { setCreator([] {
if (!androidConfig().sdkToolsOk()) { if (!AndroidConfig::sdkToolsOk()) {
AndroidDeviceWidget::infoDialog(Tr::tr("Android support is not yet configured.")); AndroidDeviceWidget::infoDialog(Tr::tr("Android support is not yet configured."));
return IDevice::Ptr(); return IDevice::Ptr();
} }

View File

@@ -202,25 +202,23 @@ QJsonObject deploymentSettings(const Target *target)
QJsonObject settings; QJsonObject settings;
settings["_description"] = qtcSignature; settings["_description"] = qtcSignature;
settings["qt"] = qt->prefix().toString(); settings["qt"] = qt->prefix().toString();
settings["ndk"] = androidConfig().ndkLocation(qt).toString(); settings["ndk"] = AndroidConfig::ndkLocation(qt).toString();
settings["sdk"] = androidConfig().sdkLocation().toString(); settings["sdk"] = AndroidConfig::sdkLocation().toString();
if (!qt->supportsMultipleQtAbis()) { if (!qt->supportsMultipleQtAbis()) {
const QStringList abis = applicationAbis(target); const QStringList abis = applicationAbis(target);
QTC_ASSERT(abis.size() == 1, return {}); QTC_ASSERT(abis.size() == 1, return {});
settings["stdcpp-path"] = (androidConfig().toolchainPath(qt) settings["stdcpp-path"] = (AndroidConfig::toolchainPath(qt)
/ "sysroot/usr/lib" / "sysroot/usr/lib"
/ archTriplet(abis.first()) / archTriplet(abis.first())
/ "libc++_shared.so").toString(); / "libc++_shared.so").toString();
} else { } else {
settings["stdcpp-path"] = androidConfig() settings["stdcpp-path"]
.toolchainPath(qt) = AndroidConfig::toolchainPath(qt).pathAppended("sysroot/usr/lib").toString();
.pathAppended("sysroot/usr/lib")
.toString();
} }
settings["toolchain-prefix"] = "llvm"; settings["toolchain-prefix"] = "llvm";
settings["tool-prefix"] = "llvm"; settings["tool-prefix"] = "llvm";
settings["useLLVM"] = true; settings["useLLVM"] = true;
settings["ndk-host"] = androidConfig().toolchainHost(qt); settings["ndk-host"] = AndroidConfig::toolchainHost(qt);
return settings; return settings;
} }
@@ -584,7 +582,7 @@ bool checkKeystorePassword(const FilePath &keystorePath, const QString &keystore
{ {
if (keystorePasswd.isEmpty()) if (keystorePasswd.isEmpty())
return false; return false;
const CommandLine cmd(androidConfig().keytoolPath(), const CommandLine cmd(AndroidConfig::keytoolPath(),
{"-list", "-keystore", keystorePath.toUserOutput(), {"-list", "-keystore", keystorePath.toUserOutput(),
"--storepass", keystorePasswd}); "--storepass", keystorePasswd});
Process proc; Process proc;
@@ -605,7 +603,7 @@ bool checkCertificatePassword(const FilePath &keystorePath, const QString &keyst
arguments << certificatePasswd; arguments << certificatePasswd;
Process proc; Process proc;
proc.setCommand({androidConfig().keytoolPath(), arguments}); proc.setCommand({AndroidConfig::keytoolPath(), arguments});
proc.runBlocking(10s); proc.runBlocking(10s);
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }
@@ -618,7 +616,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor
"--storepass", keystorePasswd, "-alias", alias}; "--storepass", keystorePasswd, "-alias", alias};
Process proc; Process proc;
proc.setCommand({androidConfig().keytoolPath(), arguments}); proc.setCommand({AndroidConfig::keytoolPath(), arguments});
proc.runBlocking(10s); proc.runBlocking(10s);
return proc.result() == ProcessResult::FinishedWithSuccess; return proc.result() == ProcessResult::FinishedWithSuccess;
} }
@@ -626,7 +624,7 @@ bool checkCertificateExists(const FilePath &keystorePath, const QString &keystor
Process *startAdbProcess(const QStringList &args, QString *err) Process *startAdbProcess(const QStringList &args, QString *err)
{ {
std::unique_ptr<Process> process(new Process); std::unique_ptr<Process> process(new Process);
const FilePath adb = androidConfig().adbToolPath(); const FilePath adb = AndroidConfig::adbToolPath();
const CommandLine command{adb, args}; const CommandLine command{adb, args};
qCDebug(androidManagerLog).noquote() << "Running command (async):" << command.toUserOutput(); qCDebug(androidManagerLog).noquote() << "Running command (async):" << command.toUserOutput();
process->setCommand(command); process->setCommand(command);
@@ -664,7 +662,7 @@ static SdkToolResult runCommand(const CommandLine &command, const QByteArray &wr
SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData, int timeoutS) SdkToolResult runAdbCommand(const QStringList &args, const QByteArray &writeData, int timeoutS)
{ {
return runCommand({androidConfig().adbToolPath(), args}, writeData, timeoutS); return runCommand({AndroidConfig::adbToolPath(), args}, writeData, timeoutS);
} }
} // namespace Android::AndroidManager } // namespace Android::AndroidManager

View File

@@ -592,7 +592,7 @@ void AndroidManifestEditorWidget::postSave()
const FilePath docPath = m_textEditorWidget->textDocument()->filePath(); const FilePath docPath = m_textEditorWidget->textDocument()->filePath();
if (Target *target = androidTarget(docPath)) { if (Target *target = androidTarget(docPath)) {
if (BuildConfiguration *bc = target->activeBuildConfiguration()) { if (BuildConfiguration *bc = target->activeBuildConfiguration()) {
QString androidNdkPlatform = androidConfig().bestNdkPlatformMatch( QString androidNdkPlatform = AndroidConfig::bestNdkPlatformMatch(
AndroidManager::minimumSDK(target), AndroidManager::minimumSDK(target),
QtSupport::QtKitAspect::qtVersion( QtSupport::QtKitAspect::qtVersion(
androidTarget(m_textEditorWidget->textDocument()->filePath())->kit())); androidTarget(m_textEditorWidget->textDocument()->filePath())->kit()));

View File

@@ -135,7 +135,7 @@ class AndroidPlugin final : public ExtensionSystem::IPlugin
return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE); return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE);
}).isEmpty(); }).isEmpty();
if (!androidConfig().sdkFullyConfigured() && qtForAndroidInstalled) if (!AndroidConfig::sdkFullyConfigured() && qtForAndroidInstalled)
askUserAboutAndroidSetup(); askUserAboutAndroidSetup();
AndroidConfigurations::registerNewToolchains(); AndroidConfigurations::registerNewToolchains();

View File

@@ -128,7 +128,7 @@ FilePath AndroidQmlPreviewWorker::designViewerApkPath(const QString &abi) const
CommandLine AndroidQmlPreviewWorker::adbCommand(const QStringList &arguments) const CommandLine AndroidQmlPreviewWorker::adbCommand(const QStringList &arguments) const
{ {
CommandLine cmd{androidConfig().adbToolPath()}; CommandLine cmd{AndroidConfig::adbToolPath()};
if (!m_serialNumber.isEmpty()) if (!m_serialNumber.isEmpty())
cmd.addArgs(AndroidDeviceInfo::adbSelector(m_serialNumber)); cmd.addArgs(AndroidDeviceInfo::adbSelector(m_serialNumber));
cmd.addArg("shell"); cmd.addArg("shell");
@@ -200,7 +200,7 @@ void AndroidQmlPreviewWorker::startLogcat()
QString args = QString("logcat --pid=%1").arg(m_viewerPid); QString args = QString("logcat --pid=%1").arg(m_viewerPid);
if (!m_logcatStartTimeStamp.isEmpty()) if (!m_logcatStartTimeStamp.isEmpty())
args += QString(" -T '%1'").arg(m_logcatStartTimeStamp); args += QString(" -T '%1'").arg(m_logcatStartTimeStamp);
CommandLine cmd(androidConfig().adbToolPath()); CommandLine cmd(AndroidConfig::adbToolPath());
cmd.setArguments(args); cmd.setArguments(args);
m_logcatProcess.setCommand(cmd); m_logcatProcess.setCommand(cmd);
m_logcatProcess.setUseCtrlCStub(true); m_logcatProcess.setUseCtrlCStub(true);

View File

@@ -61,9 +61,9 @@ QString AndroidQtVersion::invalidReason() const
{ {
QString tmp = QtVersion::invalidReason(); QString tmp = QtVersion::invalidReason();
if (tmp.isEmpty()) { if (tmp.isEmpty()) {
if (androidConfig().ndkLocation(this).isEmpty()) if (AndroidConfig::ndkLocation(this).isEmpty())
return Tr::tr("NDK is not configured in Devices > Android."); return Tr::tr("NDK is not configured in Devices > Android.");
if (androidConfig().sdkLocation().isEmpty()) if (AndroidConfig::sdkLocation().isEmpty())
return Tr::tr("SDK is not configured in Devices > Android."); return Tr::tr("SDK is not configured in Devices > Android.");
if (qtAbis().isEmpty()) if (qtAbis().isEmpty())
return Tr::tr("Failed to detect the ABIs used by the Qt version. Check the settings in " return Tr::tr("Failed to detect the ABIs used by the Qt version. Check the settings in "
@@ -79,7 +79,7 @@ bool AndroidQtVersion::supportsMultipleQtAbis() const
Abis AndroidQtVersion::detectQtAbis() const Abis AndroidQtVersion::detectQtAbis() const
{ {
const bool conf = androidConfig().sdkFullyConfigured(); const bool conf = AndroidConfig::sdkFullyConfigured();
return conf ? Utils::transform<Abis>(androidAbis(), &AndroidManager::androidAbi2Abi) : Abis(); return conf ? Utils::transform<Abis>(androidAbis(), &AndroidManager::androidAbi2Abi) : Abis();
} }
@@ -87,18 +87,17 @@ void AndroidQtVersion::addToEnvironment(const Kit *k, Utils::Environment &env) c
{ {
QtVersion::addToEnvironment(k, env); QtVersion::addToEnvironment(k, env);
const AndroidConfig &config = androidConfig();
// this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info) // 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"), config.toolchainHost(this)); env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHost(this));
env.set(QLatin1String("ANDROID_NDK_ROOT"), config.ndkLocation(this).toUserOutput()); env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfig::ndkLocation(this).toUserOutput());
env.set(QLatin1String("ANDROID_NDK_PLATFORM"), env.set(QLatin1String("ANDROID_NDK_PLATFORM"),
config.bestNdkPlatformMatch(qMax(minimumNDK(), AndroidManager::minimumSDK(k)), this)); AndroidConfig::bestNdkPlatformMatch(qMax(minimumNDK(), AndroidManager::minimumSDK(k)), this));
} }
void AndroidQtVersion::setupQmakeRunEnvironment(Utils::Environment &env) const void AndroidQtVersion::setupQmakeRunEnvironment(Utils::Environment &env) const
{ {
env.set(QLatin1String("ANDROID_NDK_ROOT"), env.set(QLatin1String("ANDROID_NDK_ROOT"),
androidConfig().ndkLocation(this).toUserOutput()); AndroidConfig::ndkLocation(this).toUserOutput());
} }
QString AndroidQtVersion::description() const QString AndroidQtVersion::description() const

View File

@@ -184,7 +184,7 @@ void AndroidRunner::checkAVD()
m_checkAVDTimer.stop(); m_checkAVDTimer.stop();
AndroidManager::setDeviceSerialNumber(m_target, serialNumber); AndroidManager::setDeviceSerialNumber(m_target, serialNumber);
emit asyncStart(); emit asyncStart();
} else if (!androidConfig().isConnected(serialNumber)) { } else if (!AndroidConfig::isConnected(serialNumber)) {
// device was disconnected // device was disconnected
m_checkAVDTimer.stop(); m_checkAVDTimer.stop();
} }

View File

@@ -93,11 +93,9 @@ static FilePath debugServer(bool useLldb, const Target *target)
QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(target->kit()); QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(target->kit());
QString preferredAbi = AndroidManager::apkDevicePreferredAbi(target); QString preferredAbi = AndroidManager::apkDevicePreferredAbi(target);
const AndroidConfig &config = androidConfig();
if (useLldb) { if (useLldb) {
// Search suitable lldb-server binary. // Search suitable lldb-server binary.
const FilePath prebuilt = config.ndkLocation(qtVersion) / "toolchains/llvm/prebuilt"; const FilePath prebuilt = AndroidConfig::ndkLocation(qtVersion) / "toolchains/llvm/prebuilt";
const QString abiNeedle = lldbServerArch2(preferredAbi); const QString abiNeedle = lldbServerArch2(preferredAbi);
// The new, built-in LLDB. // The new, built-in LLDB.
@@ -117,7 +115,7 @@ static FilePath debugServer(bool useLldb, const Target *target)
return lldbServer; return lldbServer;
} else { } else {
// Search suitable gdbserver binary. // Search suitable gdbserver binary.
const FilePath path = config.ndkLocation(qtVersion) const FilePath path = AndroidConfig::ndkLocation(qtVersion)
.pathAppended(QString("prebuilt/android-%1/gdbserver/gdbserver") .pathAppended(QString("prebuilt/android-%1/gdbserver/gdbserver")
.arg(gdbServerArch(preferredAbi))); .arg(gdbServerArch(preferredAbi)));
if (path.exists()) if (path.exists())
@@ -429,7 +427,7 @@ void Android::Internal::AndroidRunnerWorker::asyncStartLogcat()
} }
const QStringList logcatArgs = selector() << "logcat" << timeArg; const QStringList logcatArgs = selector() << "logcat" << timeArg;
const FilePath adb = androidConfig().adbToolPath(); const FilePath adb = AndroidConfig::adbToolPath();
qCDebug(androidRunWorkerLog).noquote() << "Running logcat command (async):" qCDebug(androidRunWorkerLog).noquote() << "Running logcat command (async):"
<< CommandLine(adb, logcatArgs).toUserOutput(); << CommandLine(adb, logcatArgs).toUserOutput();
m_adbLogcatProcess->setCommand({adb, logcatArgs}); m_adbLogcatProcess->setCommand({adb, logcatArgs});
@@ -632,7 +630,7 @@ void AndroidRunnerWorker::asyncStart()
const Storage<PidUserPair> pidStorage; const Storage<PidUserPair> pidStorage;
const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; }); const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; });
const FilePath adbPath = androidConfig().adbToolPath(); const FilePath adbPath = AndroidConfig::adbToolPath();
const QStringList args = selector(); const QStringList args = selector();
const auto onPidSetup = [adbPath, args, packageName = m_packageName, const auto onPidSetup = [adbPath, args, packageName = m_packageName,
@@ -710,7 +708,7 @@ void AndroidRunnerWorker::handleJdbWaiting()
} }
m_afterFinishAdbCommands.push_back(removeForward.join(' ')); m_afterFinishAdbCommands.push_back(removeForward.join(' '));
const FilePath jdbPath = androidConfig().openJDKLocation() const FilePath jdbPath = AndroidConfig::openJDKLocation()
.pathAppended("bin/jdb").withExecutableSuffix(); .pathAppended("bin/jdb").withExecutableSuffix();
QStringList jdbArgs("-connect"); QStringList jdbArgs("-connect");

View File

@@ -106,7 +106,7 @@ GroupItem downloadSdkRecipe()
Storage<StorageStruct> storage; Storage<StorageStruct> storage;
const auto onSetup = [] { const auto onSetup = [] {
if (androidConfig().sdkToolsUrl().isEmpty()) { if (AndroidConfig::sdkToolsUrl().isEmpty()) {
logError(Tr::tr("The SDK Tools download URL is empty.")); logError(Tr::tr("The SDK Tools download URL is empty."));
return SetupResult::StopWithError; return SetupResult::StopWithError;
} }
@@ -114,7 +114,7 @@ GroupItem downloadSdkRecipe()
}; };
const auto onQuerySetup = [storage](NetworkQuery &query) { const auto onQuerySetup = [storage](NetworkQuery &query) {
query.setRequest(QNetworkRequest(androidConfig().sdkToolsUrl())); query.setRequest(QNetworkRequest(AndroidConfig::sdkToolsUrl()));
query.setNetworkAccessManager(NetworkAccessManager::instance()); query.setNetworkAccessManager(NetworkAccessManager::instance());
NetworkQuery *queryPtr = &query; NetworkQuery *queryPtr = &query;
QProgressDialog *progressDialog = storage->progressDialog.get(); QProgressDialog *progressDialog = storage->progressDialog.get();
@@ -166,7 +166,7 @@ GroupItem downloadSdkRecipe()
if (!storage->sdkFileName) if (!storage->sdkFileName)
return SetupResult::StopWithError; return SetupResult::StopWithError;
async.setConcurrentCallData(validateFileIntegrity, *storage->sdkFileName, async.setConcurrentCallData(validateFileIntegrity, *storage->sdkFileName,
androidConfig().getSdkToolsSha256()); AndroidConfig::getSdkToolsSha256());
storage->progressDialog->setRange(0, 0); storage->progressDialog->setRange(0, 0);
storage->progressDialog->setLabelText(Tr::tr("Verifying package integrity...")); storage->progressDialog->setLabelText(Tr::tr("Verifying package integrity..."));
return SetupResult::Continue; return SetupResult::Continue;
@@ -197,7 +197,7 @@ GroupItem downloadSdkRecipe()
logError(Tr::tr("Unarchiving error.")); logError(Tr::tr("Unarchiving error."));
return; return;
} }
androidConfig().setTemporarySdkToolsPath( AndroidConfig::setTemporarySdkToolsPath(
storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName)); storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName));
}; };
const auto onCancelSetup = [storage] { return std::make_pair(storage->progressDialog.get(), const auto onCancelSetup = [storage] { return std::make_pair(storage->progressDialog.get(),

View File

@@ -113,9 +113,9 @@ private:
OutputFormatter *m_formatter = nullptr; OutputFormatter *m_formatter = nullptr;
}; };
static QString sdkRootArg(const AndroidConfig &config) static QString sdkRootArg()
{ {
return "--sdk_root=" + config.sdkLocation().toString(); return "--sdk_root=" + AndroidConfig::sdkLocation().toString();
} }
const QRegularExpression &assertionRegExp() const QRegularExpression &assertionRegExp()
@@ -172,9 +172,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage)
"respective licenses are not accepted.") + "\n\n", "respective licenses are not accepted.") + "\n\n",
LogMessageFormat); LogMessageFormat);
process.setProcessMode(ProcessMode::Writer); process.setProcessMode(ProcessMode::Writer);
process.setEnvironment(androidConfig().toolsEnvironment()); process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(CommandLine(androidConfig().sdkManagerToolPath(), process.setCommand(CommandLine(AndroidConfig::sdkManagerToolPath(),
{"--licenses", sdkRootArg(androidConfig())})); {"--licenses", sdkRootArg()}));
process.setUseCtrlCStub(true); process.setUseCtrlCStub(true);
Process *processPtr = &process; Process *processPtr = &process;
@@ -227,9 +227,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage)
static void setupSdkProcess(const QStringList &args, Process *process, static void setupSdkProcess(const QStringList &args, Process *process,
QuestionProgressDialog *dialog, int current, int total) QuestionProgressDialog *dialog, int current, int total)
{ {
process->setEnvironment(androidConfig().toolsEnvironment()); process->setEnvironment(AndroidConfig::toolsEnvironment());
process->setCommand({androidConfig().sdkManagerToolPath(), process->setCommand({AndroidConfig::sdkManagerToolPath(),
args + androidConfig().sdkManagerToolArgs()}); args + AndroidConfig::sdkManagerToolArgs()});
QObject::connect(process, &Process::readyReadStandardOutput, dialog, QObject::connect(process, &Process::readyReadStandardOutput, dialog,
[process, dialog, current, total] { [process, dialog, current, total] {
QTextCodec *codec = QTextCodec::codecForLocale(); QTextCodec *codec = QTextCodec::codecForLocale();
@@ -269,7 +269,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage,
const int total = change.count(); const int total = change.count();
const LoopList uninstallIterator(change.toUninstall); const LoopList uninstallIterator(change.toUninstall);
const auto onUninstallSetup = [dialogStorage, uninstallIterator, total](Process &process) { const auto onUninstallSetup = [dialogStorage, uninstallIterator, total](Process &process) {
const QStringList args = {"--uninstall", *uninstallIterator, sdkRootArg(androidConfig())}; const QStringList args = {"--uninstall", *uninstallIterator, sdkRootArg()};
QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
setupSdkProcess(args, &process, dialog, uninstallIterator.iteration(), total); setupSdkProcess(args, &process, dialog, uninstallIterator.iteration(), total);
dialog->appendMessage(Tr::tr("Uninstalling %1...").arg(*uninstallIterator) + '\n', dialog->appendMessage(Tr::tr("Uninstalling %1...").arg(*uninstallIterator) + '\n',
@@ -280,7 +280,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage,
const LoopList installIterator(change.toInstall); const LoopList installIterator(change.toInstall);
const int offset = change.toUninstall.count(); const int offset = change.toUninstall.count();
const auto onInstallSetup = [dialogStorage, installIterator, offset, total](Process &process) { const auto onInstallSetup = [dialogStorage, installIterator, offset, total](Process &process) {
const QStringList args = {*installIterator, sdkRootArg(androidConfig())}; const QStringList args = {*installIterator, sdkRootArg()};
QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
setupSdkProcess(args, &process, dialog, offset + installIterator.iteration(), total); setupSdkProcess(args, &process, dialog, offset + installIterator.iteration(), total);
dialog->appendMessage(Tr::tr("Installing %1...").arg(*installIterator) + '\n', dialog->appendMessage(Tr::tr("Installing %1...").arg(*installIterator) + '\n',
@@ -310,7 +310,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage,
static GroupItem updateRecipe(const Storage<DialogStorage> &dialogStorage) static GroupItem updateRecipe(const Storage<DialogStorage> &dialogStorage)
{ {
const auto onUpdateSetup = [dialogStorage](Process &process) { const auto onUpdateSetup = [dialogStorage](Process &process) {
const QStringList args = {"--update", sdkRootArg(androidConfig())}; const QStringList args = {"--update", sdkRootArg()};
QuestionProgressDialog *dialog = dialogStorage->m_dialog.get(); QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
setupSdkProcess(args, &process, dialog, 0, 1); setupSdkProcess(args, &process, dialog, 0, 1);
dialog->appendMessage(Tr::tr("Updating installed packages....") + '\n', NormalMessageFormat); dialog->appendMessage(Tr::tr("Updating installed packages....") + '\n', NormalMessageFormat);
@@ -369,7 +369,7 @@ const AndroidSdkPackageList &AndroidSdkManager::allSdkPackages()
QStringList AndroidSdkManager::notFoundEssentialSdkPackages() QStringList AndroidSdkManager::notFoundEssentialSdkPackages()
{ {
QStringList essentials = androidConfig().allEssentials(); QStringList essentials = AndroidConfig::allEssentials();
const AndroidSdkPackageList &packages = allSdkPackages(); const AndroidSdkPackageList &packages = allSdkPackages();
for (AndroidSdkPackage *package : packages) { for (AndroidSdkPackage *package : packages) {
essentials.removeOne(package->sdkStylePath()); essentials.removeOne(package->sdkStylePath());
@@ -381,7 +381,7 @@ QStringList AndroidSdkManager::notFoundEssentialSdkPackages()
QStringList AndroidSdkManager::missingEssentialSdkPackages() QStringList AndroidSdkManager::missingEssentialSdkPackages()
{ {
const QStringList essentials = androidConfig().allEssentials(); const QStringList essentials = AndroidConfig::allEssentials();
const AndroidSdkPackageList &packages = allSdkPackages(); const AndroidSdkPackageList &packages = allSdkPackages();
QStringList missingPackages; QStringList missingPackages;
for (AndroidSdkPackage *package : packages) { for (AndroidSdkPackage *package : packages) {
@@ -461,7 +461,7 @@ BuildToolsList AndroidSdkManager::filteredBuildTools(int minApiLevel,
void AndroidSdkManager::refreshPackages() void AndroidSdkManager::refreshPackages()
{ {
if (androidConfig().sdkManagerToolPath() != m_d->lastSdkManagerPath) if (AndroidConfig::sdkManagerToolPath() != m_d->lastSdkManagerPath)
reloadPackages(); reloadPackages();
} }
@@ -479,14 +479,14 @@ bool AndroidSdkManager::packageListingSuccessful() const
Runs the \c sdkmanger tool with arguments \a args. Returns \c true if the command is Runs the \c sdkmanger tool with arguments \a args. Returns \c true if the command is
successfully executed. Output is copied into \a output. The function blocks the calling thread. successfully executed. Output is copied into \a output. The function blocks the calling thread.
*/ */
static bool sdkManagerCommand(const AndroidConfig &config, const QStringList &args, QString *output) static bool sdkManagerCommand(const QStringList &args, QString *output)
{ {
QStringList newArgs = args; QStringList newArgs = args;
newArgs.append(sdkRootArg(config)); newArgs.append(sdkRootArg());
Process proc; Process proc;
proc.setEnvironment(config.toolsEnvironment()); proc.setEnvironment(AndroidConfig::toolsEnvironment());
proc.setTimeOutMessageBoxEnabled(true); proc.setTimeOutMessageBoxEnabled(true);
proc.setCommand({config.sdkManagerToolPath(), newArgs}); proc.setCommand({AndroidConfig::sdkManagerToolPath(), newArgs});
qCDebug(sdkManagerLog).noquote() << "Running SDK Manager command (sync):" qCDebug(sdkManagerLog).noquote() << "Running SDK Manager command (sync):"
<< proc.commandLine().toUserOutput(); << proc.commandLine().toUserOutput();
proc.runBlocking(60s, EventLoopMode::On); proc.runBlocking(60s, EventLoopMode::On);
@@ -516,10 +516,10 @@ void AndroidSdkManagerPrivate::reloadSdkPackages()
qDeleteAll(m_allPackages); qDeleteAll(m_allPackages);
m_allPackages.clear(); m_allPackages.clear();
lastSdkManagerPath = androidConfig().sdkManagerToolPath(); lastSdkManagerPath = AndroidConfig::sdkManagerToolPath();
m_packageListingSuccessful = false; m_packageListingSuccessful = false;
if (androidConfig().sdkToolsVersion().isNull()) { if (AndroidConfig::sdkToolsVersion().isNull()) {
// Configuration has invalid sdk path or corrupt installation. // Configuration has invalid sdk path or corrupt installation.
emit m_sdkManager.packageReloadFinished(); emit m_sdkManager.packageReloadFinished();
return; return;
@@ -527,8 +527,8 @@ void AndroidSdkManagerPrivate::reloadSdkPackages()
QString packageListing; QString packageListing;
QStringList args({"--list", "--verbose"}); QStringList args({"--list", "--verbose"});
args << androidConfig().sdkManagerToolArgs(); args << AndroidConfig::sdkManagerToolArgs();
m_packageListingSuccessful = sdkManagerCommand(androidConfig(), args, &packageListing); m_packageListingSuccessful = sdkManagerCommand(args, &packageListing);
if (m_packageListingSuccessful) { if (m_packageListingSuccessful) {
SdkManagerOutputParser parser(m_allPackages); SdkManagerOutputParser parser(m_allPackages);
parser.parsePackageListing(packageListing); parser.parsePackageListing(packageListing);

View File

@@ -40,9 +40,9 @@ public:
m_argumentDetailsEdit = new QPlainTextEdit; m_argumentDetailsEdit = new QPlainTextEdit;
m_argumentDetailsEdit->setReadOnly(true); m_argumentDetailsEdit->setReadOnly(true);
m_process.setEnvironment(androidConfig().toolsEnvironment()); m_process.setEnvironment(AndroidConfig::toolsEnvironment());
m_process.setCommand({androidConfig().sdkManagerToolPath(), m_process.setCommand({AndroidConfig::sdkManagerToolPath(),
{"--help", "--sdk_root=" + androidConfig().sdkLocation().toString()}}); {"--help", "--sdk_root=" + AndroidConfig::sdkLocation().toString()}});
connect(&m_process, &Process::done, this, [this] { connect(&m_process, &Process::done, this, [this] {
const QString output = m_process.allOutput(); const QString output = m_process.allOutput();
QString argumentDetails; QString argumentDetails;
@@ -64,7 +64,7 @@ public:
connect(dialogButtons, &QDialogButtonBox::rejected, this, &OptionsDialog::reject); connect(dialogButtons, &QDialogButtonBox::rejected, this, &OptionsDialog::reject);
m_argumentsEdit = new QLineEdit; m_argumentsEdit = new QLineEdit;
m_argumentsEdit->setText(androidConfig().sdkManagerToolArgs().join(" ")); m_argumentsEdit->setText(AndroidConfig::sdkManagerToolArgs().join(" "));
using namespace Layouting; using namespace Layouting;
@@ -235,8 +235,8 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager,
OptionsDialog dlg(m_sdkManager, this); OptionsDialog dlg(m_sdkManager, this);
if (dlg.exec() == QDialog::Accepted) { if (dlg.exec() == QDialog::Accepted) {
QStringList arguments = dlg.sdkManagerArguments(); QStringList arguments = dlg.sdkManagerArguments();
if (arguments != androidConfig().sdkManagerToolArgs()) { if (arguments != AndroidConfig::sdkManagerToolArgs()) {
androidConfig().setSdkManagerToolArgs(arguments); AndroidConfig::setSdkManagerToolArgs(arguments);
m_sdkManager->reloadPackages(); m_sdkManager->reloadPackages();
} }
} }
@@ -244,19 +244,19 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager,
connect(obsoleteCheckBox, &QCheckBox::stateChanged, this, [this](int state) { connect(obsoleteCheckBox, &QCheckBox::stateChanged, this, [this](int state) {
const QString obsoleteArg = "--include_obsolete"; const QString obsoleteArg = "--include_obsolete";
QStringList args = androidConfig().sdkManagerToolArgs(); QStringList args = AndroidConfig::sdkManagerToolArgs();
if (state == Qt::Checked && !args.contains(obsoleteArg)) { if (state == Qt::Checked && !args.contains(obsoleteArg)) {
args.append(obsoleteArg); args.append(obsoleteArg);
androidConfig().setSdkManagerToolArgs(args); AndroidConfig::setSdkManagerToolArgs(args);
} else if (state == Qt::Unchecked && args.contains(obsoleteArg)) { } else if (state == Qt::Unchecked && args.contains(obsoleteArg)) {
args.removeAll(obsoleteArg); args.removeAll(obsoleteArg);
androidConfig().setSdkManagerToolArgs(args); AndroidConfig::setSdkManagerToolArgs(args);
} }
m_sdkManager->reloadPackages(); m_sdkManager->reloadPackages();
}); });
connect(channelCheckbox, &QComboBox::currentIndexChanged, this, [this](int index) { connect(channelCheckbox, &QComboBox::currentIndexChanged, this, [this](int index) {
QStringList args = androidConfig().sdkManagerToolArgs(); QStringList args = AndroidConfig::sdkManagerToolArgs();
QString existingArg; QString existingArg;
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
const QString arg = "--channel=" + QString::number(i); const QString arg = "--channel=" + QString::number(i);
@@ -268,17 +268,17 @@ AndroidSdkManagerDialog::AndroidSdkManagerDialog(AndroidSdkManager *sdkManager,
if (index == 0 && !existingArg.isEmpty()) { if (index == 0 && !existingArg.isEmpty()) {
args.removeAll(existingArg); args.removeAll(existingArg);
androidConfig().setSdkManagerToolArgs(args); AndroidConfig::setSdkManagerToolArgs(args);
} else if (index > 0) { } else if (index > 0) {
// Add 1 to account for Stable (second item) being channel 0 // Add 1 to account for Stable (second item) being channel 0
const QString channelArg = "--channel=" + QString::number(index - 1); const QString channelArg = "--channel=" + QString::number(index - 1);
if (existingArg != channelArg) { if (existingArg != channelArg) {
if (!existingArg.isEmpty()) { if (!existingArg.isEmpty()) {
args.removeAll(existingArg); args.removeAll(existingArg);
androidConfig().setSdkManagerToolArgs(args); AndroidConfig::setSdkManagerToolArgs(args);
} }
args.append(channelArg); args.append(channelArg);
androidConfig().setSdkManagerToolArgs(args); AndroidConfig::setSdkManagerToolArgs(args);
} }
} }
m_sdkManager->reloadPackages(); m_sdkManager->reloadPackages();

View File

@@ -314,7 +314,7 @@ AndroidSettingsWidget::AndroidSettingsWidget()
"and extracted to the selected path.\n" "and extracted to the selected path.\n"
"After the SDK Tools are properly set up, you are prompted to install any essential\n" "After the SDK Tools are properly set up, you are prompted to install any essential\n"
"packages required for Qt to build for Android.") "packages required for Qt to build for Android.")
.arg(androidConfig().sdkToolsUrl().toString())); .arg(AndroidConfig::sdkToolsUrl().toString()));
auto sdkManagerToolButton = new QPushButton(Tr::tr("SDK Manager")); auto sdkManagerToolButton = new QPushButton(Tr::tr("SDK Manager"));
@@ -380,22 +380,22 @@ AndroidSettingsWidget::AndroidSettingsWidget()
connect(m_openJdkLocationPathChooser, &PathChooser::rawPathChanged, connect(m_openJdkLocationPathChooser, &PathChooser::rawPathChanged,
this, &AndroidSettingsWidget::validateJdk); this, &AndroidSettingsWidget::validateJdk);
if (androidConfig().openJDKLocation().isEmpty()) if (AndroidConfig::openJDKLocation().isEmpty())
androidConfig().setOpenJDKLocation(AndroidConfig::getJdkPath()); AndroidConfig::setOpenJDKLocation(AndroidConfig::getJdkPath());
m_openJdkLocationPathChooser->setFilePath(androidConfig().openJDKLocation()); m_openJdkLocationPathChooser->setFilePath(AndroidConfig::openJDKLocation());
m_openJdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select JDK Path")); m_openJdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select JDK Path"));
if (androidConfig().sdkLocation().isEmpty()) if (AndroidConfig::sdkLocation().isEmpty())
androidConfig().setSdkLocation(AndroidConfig::defaultSdkPath()); AndroidConfig::setSdkLocation(AndroidConfig::defaultSdkPath());
m_sdkLocationPathChooser->setFilePath(androidConfig().sdkLocation()); m_sdkLocationPathChooser->setFilePath(AndroidConfig::sdkLocation());
m_sdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select Android SDK Folder")); m_sdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select Android SDK Folder"));
m_openSslPathChooser->setPromptDialogTitle(Tr::tr("Select OpenSSL Include Project File")); m_openSslPathChooser->setPromptDialogTitle(Tr::tr("Select OpenSSL Include Project File"));
if (androidConfig().openSslLocation().isEmpty()) if (AndroidConfig::openSslLocation().isEmpty())
androidConfig().setOpenSslLocation(androidConfig().sdkLocation() / ("android_openssl")); AndroidConfig::setOpenSslLocation(AndroidConfig::sdkLocation() / ("android_openssl"));
m_openSslPathChooser->setFilePath(androidConfig().openSslLocation()); m_openSslPathChooser->setFilePath(AndroidConfig::openSslLocation());
m_createKitCheckBox->setChecked(androidConfig().automaticKitCreation()); m_createKitCheckBox->setChecked(AndroidConfig::automaticKitCreation());
downloadNdkToolButton->setIcon(downloadIcon); downloadNdkToolButton->setIcon(downloadIcon);
@@ -454,21 +454,21 @@ AndroidSettingsWidget::AndroidSettingsWidget()
connect(m_ndkListWidget, &QListWidget::currentTextChanged, connect(m_ndkListWidget, &QListWidget::currentTextChanged,
this, [this, removeCustomNdkButton](const QString &ndk) { this, [this, removeCustomNdkButton](const QString &ndk) {
updateUI(); updateUI();
removeCustomNdkButton->setEnabled(androidConfig().getCustomNdkList().contains(ndk)); removeCustomNdkButton->setEnabled(AndroidConfig::getCustomNdkList().contains(ndk));
}); });
connect(addCustomNdkButton, &QPushButton::clicked, this, connect(addCustomNdkButton, &QPushButton::clicked, this,
&AndroidSettingsWidget::addCustomNdkItem); &AndroidSettingsWidget::addCustomNdkItem);
connect(removeCustomNdkButton, &QPushButton::clicked, this, [this] { connect(removeCustomNdkButton, &QPushButton::clicked, this, [this] {
if (isDefaultNdkSelected()) if (isDefaultNdkSelected())
androidConfig().setDefaultNdk({}); AndroidConfig::setDefaultNdk({});
androidConfig().removeCustomNdk(m_ndkListWidget->currentItem()->text()); AndroidConfig::removeCustomNdk(m_ndkListWidget->currentItem()->text());
m_ndkListWidget->takeItem(m_ndkListWidget->currentRow()); m_ndkListWidget->takeItem(m_ndkListWidget->currentRow());
}); });
connect(m_makeDefaultNdkButton, &QPushButton::clicked, this, [this] { connect(m_makeDefaultNdkButton, &QPushButton::clicked, this, [this] {
const FilePath defaultNdk = isDefaultNdkSelected() const FilePath defaultNdk = isDefaultNdkSelected()
? FilePath() ? FilePath()
: FilePath::fromUserInput(m_ndkListWidget->currentItem()->text()); : FilePath::fromUserInput(m_ndkListWidget->currentItem()->text());
androidConfig().setDefaultNdk(defaultNdk); AndroidConfig::setDefaultNdk(defaultNdk);
updateUI(); updateUI();
}); });
@@ -503,7 +503,7 @@ AndroidSettingsWidget::AndroidSettingsWidget()
if (result != Tasking::DoneWith::Success) if (result != Tasking::DoneWith::Success)
return; return;
// Make sure the sdk path is created before installing packages // Make sure the sdk path is created before installing packages
const FilePath sdkPath = androidConfig().sdkLocation(); const FilePath sdkPath = AndroidConfig::sdkLocation();
if (!sdkPath.createDir()) { if (!sdkPath.createDir()) {
QMessageBox::warning(this, Android::Internal::dialogTitle(), QMessageBox::warning(this, Android::Internal::dialogTitle(),
Tr::tr("Failed to create the SDK Tools path %1.") Tr::tr("Failed to create the SDK Tools path %1.")
@@ -543,12 +543,12 @@ void AndroidSettingsWidget::updateNdkList()
ndk->installedLocation().toUserOutput())); ndk->installedLocation().toUserOutput()));
} }
const auto customNdks = androidConfig().getCustomNdkList(); const auto customNdks = AndroidConfig::getCustomNdkList();
for (const QString &ndk : customNdks) { for (const QString &ndk : customNdks) {
if (AndroidConfig::isValidNdk(ndk)) { if (AndroidConfig::isValidNdk(ndk)) {
m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndk)); m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndk));
} else { } else {
androidConfig().removeCustomNdk(ndk); AndroidConfig::removeCustomNdk(ndk);
} }
} }
@@ -564,7 +564,7 @@ void AndroidSettingsWidget::addCustomNdkItem()
const QString ndkPath = QFileDialog::getExistingDirectory(this, Tr::tr("Select an NDK"), homePath); const QString ndkPath = QFileDialog::getExistingDirectory(this, Tr::tr("Select an NDK"), homePath);
if (AndroidConfig::isValidNdk(ndkPath)) { if (AndroidConfig::isValidNdk(ndkPath)) {
androidConfig().addCustomNdk(ndkPath); AndroidConfig::addCustomNdk(ndkPath);
if (m_ndkListWidget->findItems(ndkPath, Qt::MatchExactly).size() == 0) { if (m_ndkListWidget->findItems(ndkPath, Qt::MatchExactly).size() == 0) {
m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndkPath)); m_ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndkPath));
} }
@@ -582,9 +582,9 @@ void AndroidSettingsWidget::addCustomNdkItem()
bool AndroidSettingsWidget::isDefaultNdkSelected() const bool AndroidSettingsWidget::isDefaultNdkSelected() const
{ {
if (!androidConfig().defaultNdk().isEmpty()) { if (!AndroidConfig::defaultNdk().isEmpty()) {
if (const QListWidgetItem *item = m_ndkListWidget->currentItem()) { if (const QListWidgetItem *item = m_ndkListWidget->currentItem()) {
return FilePath::fromUserInput(item->text()) == androidConfig().defaultNdk(); return FilePath::fromUserInput(item->text()) == AndroidConfig::defaultNdk();
} }
} }
return false; return false;
@@ -592,8 +592,8 @@ bool AndroidSettingsWidget::isDefaultNdkSelected() const
void AndroidSettingsWidget::validateJdk() void AndroidSettingsWidget::validateJdk()
{ {
androidConfig().setOpenJDKLocation(m_openJdkLocationPathChooser->filePath()); AndroidConfig::setOpenJDKLocation(m_openJdkLocationPathChooser->filePath());
expected_str<void> test = testJavaC(androidConfig().openJDKLocation()); expected_str<void> test = testJavaC(AndroidConfig::openJDKLocation());
m_androidSummary->setPointValid(JavaPathExistsAndWritableRow, test); m_androidSummary->setPointValid(JavaPathExistsAndWritableRow, test);
@@ -605,14 +605,14 @@ void AndroidSettingsWidget::validateJdk()
void AndroidSettingsWidget::validateOpenSsl() void AndroidSettingsWidget::validateOpenSsl()
{ {
androidConfig().setOpenSslLocation(m_openSslPathChooser->filePath()); AndroidConfig::setOpenSslLocation(m_openSslPathChooser->filePath());
m_openSslSummary->setPointValid(OpenSslPathExistsRow, androidConfig().openSslLocation().exists()); m_openSslSummary->setPointValid(OpenSslPathExistsRow, AndroidConfig::openSslLocation().exists());
const bool priFileExists = androidConfig().openSslLocation().pathAppended("openssl.pri").exists(); const bool priFileExists = AndroidConfig::openSslLocation().pathAppended("openssl.pri").exists();
m_openSslSummary->setPointValid(OpenSslPriPathExists, priFileExists); m_openSslSummary->setPointValid(OpenSslPriPathExists, priFileExists);
const bool cmakeListsExists const bool cmakeListsExists
= androidConfig().openSslLocation().pathAppended("CMakeLists.txt").exists(); = AndroidConfig::openSslLocation().pathAppended("CMakeLists.txt").exists();
m_openSslSummary->setPointValid(OpenSslCmakeListsPathExists, cmakeListsExists); m_openSslSummary->setPointValid(OpenSslCmakeListsPathExists, cmakeListsExists);
updateUI(); updateUI();
@@ -621,8 +621,8 @@ void AndroidSettingsWidget::validateOpenSsl()
void AndroidSettingsWidget::onSdkPathChanged() void AndroidSettingsWidget::onSdkPathChanged()
{ {
const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath(); const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath();
androidConfig().setSdkLocation(sdkPath); AndroidConfig::setSdkLocation(sdkPath);
FilePath currentOpenSslPath = androidConfig().openSslLocation(); FilePath currentOpenSslPath = AndroidConfig::openSslLocation();
if (currentOpenSslPath.isEmpty() || !currentOpenSslPath.exists()) if (currentOpenSslPath.isEmpty() || !currentOpenSslPath.exists())
currentOpenSslPath = sdkPath.pathAppended("android_openssl"); currentOpenSslPath = sdkPath.pathAppended("android_openssl");
m_openSslPathChooser->setFilePath(currentOpenSslPath); m_openSslPathChooser->setFilePath(currentOpenSslPath);
@@ -633,24 +633,24 @@ void AndroidSettingsWidget::onSdkPathChanged()
void AndroidSettingsWidget::validateSdk() void AndroidSettingsWidget::validateSdk()
{ {
const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath(); const FilePath sdkPath = m_sdkLocationPathChooser->filePath().cleanPath();
androidConfig().setSdkLocation(sdkPath); AndroidConfig::setSdkLocation(sdkPath);
const FilePath path = androidConfig().sdkLocation(); const FilePath path = AndroidConfig::sdkLocation();
m_androidSummary->setPointValid(SdkPathExistsAndWritableRow, m_androidSummary->setPointValid(SdkPathExistsAndWritableRow,
path.exists() && path.isWritableDir()); path.exists() && path.isWritableDir());
m_androidSummary->setPointValid(SdkToolsInstalledRow, m_androidSummary->setPointValid(SdkToolsInstalledRow,
!androidConfig().sdkToolsVersion().isNull()); !AndroidConfig::sdkToolsVersion().isNull());
m_androidSummary->setPointValid(PlatformToolsInstalledRow, m_androidSummary->setPointValid(PlatformToolsInstalledRow,
androidConfig().adbToolPath().exists()); AndroidConfig::adbToolPath().exists());
m_androidSummary->setPointValid(BuildToolsInstalledRow, m_androidSummary->setPointValid(BuildToolsInstalledRow,
!androidConfig().buildToolsVersion().isNull()); !AndroidConfig::buildToolsVersion().isNull());
m_androidSummary->setPointValid(SdkManagerSuccessfulRow, m_sdkManager.packageListingSuccessful()); m_androidSummary->setPointValid(SdkManagerSuccessfulRow, m_sdkManager.packageListingSuccessful());
// installedSdkPlatforms should not trigger a package reload as validate SDK is only called // installedSdkPlatforms should not trigger a package reload as validate SDK is only called
// after AndroidSdkManager::packageReloadFinished. // after AndroidSdkManager::packageReloadFinished.
m_androidSummary->setPointValid(PlatformSdkInstalledRow, m_androidSummary->setPointValid(PlatformSdkInstalledRow,
!m_sdkManager.installedSdkPlatforms().isEmpty()); !m_sdkManager.installedSdkPlatforms().isEmpty());
m_androidSummary->setPointValid(AllEssentialsInstalledRow, m_androidSummary->setPointValid(AllEssentialsInstalledRow,
androidConfig().allEssentialsInstalled(&m_sdkManager)); AndroidConfig::allEssentialsInstalled(&m_sdkManager));
const bool sdkToolsOk = m_androidSummary->rowsOk({SdkPathExistsAndWritableRow, const bool sdkToolsOk = m_androidSummary->rowsOk({SdkPathExistsAndWritableRow,
SdkToolsInstalledRow, SdkToolsInstalledRow,
@@ -659,7 +659,7 @@ void AndroidSettingsWidget::validateSdk()
BuildToolsInstalledRow, BuildToolsInstalledRow,
PlatformSdkInstalledRow, PlatformSdkInstalledRow,
AllEssentialsInstalledRow}); AllEssentialsInstalledRow});
androidConfig().setSdkFullyConfigured(sdkToolsOk && componentsOk); AndroidConfig::setSdkFullyConfigured(sdkToolsOk && componentsOk);
if (sdkToolsOk && !componentsOk) { if (sdkToolsOk && !componentsOk) {
const QStringList notFoundEssentials = m_sdkManager.notFoundEssentialSdkPackages(); const QStringList notFoundEssentials = m_sdkManager.notFoundEssentialSdkPackages();
if (!notFoundEssentials.isEmpty()) { if (!notFoundEssentials.isEmpty()) {
@@ -783,7 +783,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent)
void AndroidSettingsWidget::createKitToggled() void AndroidSettingsWidget::createKitToggled()
{ {
androidConfig().setAutomaticKitCreation(m_createKitCheckBox->isChecked()); AndroidConfig::setAutomaticKitCreation(m_createKitCheckBox->isChecked());
} }
void AndroidSettingsWidget::updateUI() void AndroidSettingsWidget::updateUI()
@@ -794,7 +794,7 @@ void AndroidSettingsWidget::updateUI()
const QListWidgetItem *currentItem = m_ndkListWidget->currentItem(); const QListWidgetItem *currentItem = m_ndkListWidget->currentItem();
const FilePath currentNdk = FilePath::fromUserInput(currentItem ? currentItem->text() : ""); const FilePath currentNdk = FilePath::fromUserInput(currentItem ? currentItem->text() : "");
const QString infoText = Tr::tr("(SDK Version: %1, NDK Version: %2)") const QString infoText = Tr::tr("(SDK Version: %1, NDK Version: %2)")
.arg(androidConfig().sdkToolsVersion().toString()) .arg(AndroidConfig::sdkToolsVersion().toString())
.arg(currentNdk.isEmpty() ? "" : AndroidConfig::ndkVersion(currentNdk).toString()); .arg(currentNdk.isEmpty() ? "" : AndroidConfig::ndkVersion(currentNdk).toString());
m_androidSummary->setInfoText(androidSetupOk ? infoText : ""); m_androidSummary->setInfoText(androidSetupOk ? infoText : "");
@@ -809,7 +809,7 @@ void AndroidSettingsWidget::updateUI()
for (int row = 0; row < m_ndkListWidget->count(); ++row) { for (int row = 0; row < m_ndkListWidget->count(); ++row) {
QListWidgetItem *item = m_ndkListWidget->item(row); QListWidgetItem *item = m_ndkListWidget->item(row);
const bool isDefaultNdk = const bool isDefaultNdk =
FilePath::fromUserInput(item->text()) == androidConfig().defaultNdk(); FilePath::fromUserInput(item->text()) == AndroidConfig::defaultNdk();
item->setFont(isDefaultNdk ? markedFont : font); item->setFont(isDefaultNdk ? markedFont : font);
} }
} }
@@ -821,7 +821,7 @@ void AndroidSettingsWidget::updateUI()
void AndroidSettingsWidget::downloadSdk() void AndroidSettingsWidget::downloadSdk()
{ {
if (androidConfig().sdkToolsOk()) { if (AndroidConfig::sdkToolsOk()) {
QMessageBox::warning(this, Android::Internal::dialogTitle(), QMessageBox::warning(this, Android::Internal::dialogTitle(),
Tr::tr("The selected path already has a valid SDK Tools package.")); Tr::tr("The selected path already has a valid SDK Tools package."));
validateSdk(); validateSdk();

View File

@@ -13,7 +13,7 @@ namespace Android {
namespace Internal { namespace Internal {
AndroidSignalOperation::AndroidSignalOperation() AndroidSignalOperation::AndroidSignalOperation()
: m_adbPath(androidConfig().adbToolPath()) : m_adbPath(AndroidConfig::adbToolPath())
, m_timeout(new QTimer(this)) , m_timeout(new QTimer(this))
{ {
m_timeout->setInterval(5000); m_timeout->setInterval(5000);

View File

@@ -77,7 +77,7 @@ bool AndroidToolchain::isValid() const
} }
const bool isChildofNdk = compilerCommand().isChildOf(m_ndkLocation); const bool isChildofNdk = compilerCommand().isChildOf(m_ndkLocation);
const bool isChildofSdk = compilerCommand().isChildOf(androidConfig().sdkLocation()); const bool isChildofSdk = compilerCommand().isChildOf(AndroidConfig::sdkLocation());
return GccToolchain::isValid() && typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID return GccToolchain::isValid() && typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID
&& targetAbi().isValid() && (isChildofNdk || isChildofSdk) && targetAbi().isValid() && (isChildofNdk || isChildofSdk)
@@ -86,9 +86,8 @@ bool AndroidToolchain::isValid() const
void AndroidToolchain::addToEnvironment(Environment &env) const void AndroidToolchain::addToEnvironment(Environment &env) const
{ {
const AndroidConfig &config = androidConfig();
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHostFromNdk(m_ndkLocation)); env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHostFromNdk(m_ndkLocation));
const FilePath javaHome = config.openJDKLocation(); const FilePath javaHome = AndroidConfig::openJDKLocation();
if (javaHome.exists()) { if (javaHome.exists()) {
env.set(Constants::JAVA_HOME_ENV_VAR, javaHome.toUserOutput()); env.set(Constants::JAVA_HOME_ENV_VAR, javaHome.toUserOutput());
const FilePath javaBin = javaHome.pathAppended("bin"); const FilePath javaBin = javaHome.pathAppended("bin");
@@ -97,8 +96,8 @@ void AndroidToolchain::addToEnvironment(Environment &env) const
if (!currentJavaFilePath.isChildOf(javaBin)) if (!currentJavaFilePath.isChildOf(javaBin))
env.prependOrSetPath(javaBin); env.prependOrSetPath(javaBin);
} }
env.set(QLatin1String("ANDROID_HOME"), config.sdkLocation().toUserOutput()); env.set(QLatin1String("ANDROID_HOME"), AndroidConfig::sdkLocation().toUserOutput());
env.set(QLatin1String("ANDROID_SDK_ROOT"), config.sdkLocation().toUserOutput()); env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfig::sdkLocation().toUserOutput());
} }
void AndroidToolchain::fromMap(const Store &data) void AndroidToolchain::fromMap(const Store &data)
@@ -147,7 +146,7 @@ static FilePaths uniqueNdksForCurrentQtVersions()
FilePaths uniqueNdks; FilePaths uniqueNdks;
for (const QtSupport::QtVersion *version : androidQtVersions) { for (const QtSupport::QtVersion *version : androidQtVersions) {
FilePath ndk = androidConfig().ndkLocation(version); FilePath ndk = AndroidConfig::ndkLocation(version);
if (!uniqueNdks.contains(ndk)) if (!uniqueNdks.contains(ndk))
uniqueNdks.append(ndk); uniqueNdks.append(ndk);
} }
@@ -161,8 +160,6 @@ ToolchainList autodetectToolchainsFromNdks(
const bool isCustom) const bool isCustom)
{ {
QList<Toolchain *> result; QList<Toolchain *> result;
const AndroidConfig config = androidConfig();
const Id LanguageIds[] { const Id LanguageIds[] {
ProjectExplorer::Constants::CXX_LANGUAGE_ID, ProjectExplorer::Constants::CXX_LANGUAGE_ID,
ProjectExplorer::Constants::C_LANGUAGE_ID ProjectExplorer::Constants::C_LANGUAGE_ID

View File

@@ -169,9 +169,9 @@ AvdDialog::DeviceType AvdDialog::tagToDeviceType(const QString &type_tag)
static bool avdManagerCommand(const QStringList &args, QString *output) static bool avdManagerCommand(const QStringList &args, QString *output)
{ {
CommandLine cmd(androidConfig().avdManagerToolPath(), args); CommandLine cmd(AndroidConfig::avdManagerToolPath(), args);
Process proc; Process proc;
proc.setEnvironment(androidConfig().toolsEnvironment()); proc.setEnvironment(AndroidConfig::toolsEnvironment());
qCDebug(avdDialogLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput(); qCDebug(avdDialogLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput();
proc.setCommand(cmd); proc.setCommand(cmd);
proc.runBlocking(); proc.runBlocking();
@@ -189,7 +189,7 @@ void AvdDialog::parseDeviceDefinitionsList()
if (!avdManagerCommand({"list", "device"}, &output)) { if (!avdManagerCommand({"list", "device"}, &output)) {
qCDebug(avdDialogLog) << "Avd list command failed" << output qCDebug(avdDialogLog) << "Avd list command failed" << output
<< androidConfig().sdkToolsVersion(); << AndroidConfig::sdkToolsVersion();
return; return;
} }

View File

@@ -20,7 +20,6 @@ QT_END_NAMESPACE
namespace Utils { class InfoLabel; } namespace Utils { class InfoLabel; }
namespace Android { namespace Android {
class AndroidConfig;
class SdkPlatform; class SdkPlatform;
namespace Internal { namespace Internal {

View File

@@ -305,7 +305,7 @@ void JLSClient::updateProjectFiles()
const QStringList classPaths = node->data(Constants::AndroidClassPaths).toStringList(); const QStringList classPaths = node->data(Constants::AndroidClassPaths).toStringList();
const FilePath &sdkLocation = androidConfig().sdkLocation(); const FilePath &sdkLocation = AndroidConfig::sdkLocation();
const QString &targetSDK = AndroidManager::buildTargetSDK(m_currentTarget); const QString &targetSDK = AndroidManager::buildTargetSDK(m_currentTarget);
const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar") const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar")
.arg(targetSDK); .arg(targetSDK);