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

View File

@@ -415,7 +415,7 @@ bool AndroidBuildApkWidget::isOpenSslLibsIncluded()
QString AndroidBuildApkWidget::openSslIncludeFileContent(const FilePath &projectPath)
{
QString openSslPath = androidConfig().openSslLocation().toString();
QString openSslPath = AndroidConfig::openSslLocation().toString();
if (projectPath.endsWith(".pro"))
return "android: include(" + openSslPath + "/openssl.pri)";
if (projectPath.endsWith("CMakeLists.txt"))
@@ -541,7 +541,7 @@ bool AndroidBuildApkStep::init()
QStringList arguments = {"--input", m_inputFile.path(),
"--output", outputDir.path(),
"--android-platform", m_buildTargetSdk,
"--jdk", androidConfig().openJDKLocation().path()};
"--jdk", AndroidConfig::openJDKLocation().path()};
if (verboseOutput())
arguments << "--verbose";
@@ -929,17 +929,16 @@ QVariant AndroidBuildApkStep::data(Utils::Id id) const
{
if (id == Constants::AndroidNdkPlatform) {
if (auto qtVersion = QtKitAspect::qtVersion(kit()))
return androidConfig()
.bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion);
return AndroidConfig::bestNdkPlatformMatch(AndroidManager::minimumSDK(target()), qtVersion);
return {};
}
if (id == Constants::NdkLocation) {
if (auto qtVersion = QtKitAspect::qtVersion(kit()))
return QVariant::fromValue(androidConfig().ndkLocation(qtVersion));
return QVariant::fromValue(AndroidConfig::ndkLocation(qtVersion));
return {};
}
if (id == Constants::SdkLocation)
return QVariant::fromValue(androidConfig().sdkLocation());
return QVariant::fromValue(AndroidConfig::sdkLocation());
if (id == Constants::AndroidMkSpecAbis)
return AndroidManager::applicationAbis(target());
@@ -1000,7 +999,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates()
"-storepass", m_keystorePasswd, "-J-Duser.language=en"};
Process keytoolProc;
keytoolProc.setCommand({androidConfig().keytoolPath(), params});
keytoolProc.setCommand({AndroidConfig::keytoolPath(), params});
using namespace std::chrono_literals;
keytoolProc.runBlocking(30s);
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;
};
struct SdkForQtVersions
{
QList<QVersionNumber> versions;
QStringList essentialPackages;
namespace AndroidConfig {
public:
bool containsVersion(const QVersionNumber &qtVersion) const;
};
QStringList apiLevelNamesFor(const SdkPlatformList &platforms);
QString apiLevelNameFor(const SdkPlatform *platform);
class AndroidConfig
{
public:
void load(const Utils::QtcSettings &settings);
void save(Utils::QtcSettings &settings) const;
static QStringList apiLevelNamesFor(const SdkPlatformList &platforms);
static QString apiLevelNameFor(const SdkPlatform *platform);
Utils::FilePath sdkLocation() const;
Utils::FilePath sdkLocation();
void setSdkLocation(const Utils::FilePath &sdkLocation);
QVersionNumber sdkToolsVersion() const;
Utils::FilePath sdkToolsVersionPath() const;
QVersionNumber buildToolsVersion() const;
QStringList sdkManagerToolArgs() const;
QVersionNumber sdkToolsVersion();
QVersionNumber buildToolsVersion();
QStringList sdkManagerToolArgs();
void setSdkManagerToolArgs(const QStringList &args);
Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion) const;
QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion) const;
static QVersionNumber ndkVersion(const Utils::FilePath &ndkPath);
Utils::FilePath ndkLocation(const QtSupport::QtVersion *qtVersion);
QVersionNumber ndkVersion(const QtSupport::QtVersion *qtVersion);
QVersionNumber ndkVersion(const Utils::FilePath &ndkPath);
QUrl sdkToolsUrl() const { return m_sdkToolsUrl; }
QByteArray getSdkToolsSha256() const { return m_sdkToolsSha256; }
QUrl sdkToolsUrl();
QByteArray getSdkToolsSha256();
QStringList defaultEssentials() const;
QStringList essentialsFromQtVersion(const QtSupport::QtVersion &version) const;
QStringList allEssentials() const;
QStringList allEssentials();
bool allEssentialsInstalled(Internal::AndroidSdkManager *sdkManager);
bool sdkToolsOk() const;
bool sdkToolsOk();
Utils::FilePath openJDKLocation() const;
Utils::FilePath openJDKLocation();
void setOpenJDKLocation(const Utils::FilePath &openJDKLocation);
QString toolchainHost(const QtSupport::QtVersion *qtVersion) const;
static QString toolchainHostFromNdk(const Utils::FilePath &ndkPath);
QString toolchainHost(const QtSupport::QtVersion *qtVersion);
QString toolchainHostFromNdk(const Utils::FilePath &ndkPath);
QString emulatorArgs() const;
QString emulatorArgs();
void setEmulatorArgs(const QString &args);
bool automaticKitCreation() const;
bool automaticKitCreation();
void setAutomaticKitCreation(bool b);
static Utils::FilePath defaultSdkPath();
Utils::FilePath adbToolPath() const;
Utils::FilePath emulatorToolPath() const;
Utils::FilePath sdkManagerToolPath() const;
Utils::FilePath avdManagerToolPath() const;
Utils::FilePath defaultSdkPath();
Utils::FilePath adbToolPath();
Utils::FilePath emulatorToolPath();
Utils::FilePath sdkManagerToolPath();
Utils::FilePath avdManagerToolPath();
void setTemporarySdkToolsPath(const Utils::FilePath &path);
Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion) const;
static Utils::FilePath toolchainPathFromNdk(const Utils::FilePath &ndkLocation,
Utils::OsType hostOs = Utils::HostOsInfo::hostOs());
static Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation);
Utils::FilePath toolchainPath(const QtSupport::QtVersion *qtVersion);
Utils::FilePath toolchainPathFromNdk(
const Utils::FilePath &ndkLocation, Utils::OsType hostOs = Utils::HostOsInfo::hostOs());
Utils::FilePath clangPathFromNdk(const Utils::FilePath &ndkLocation);
static Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation);
Utils::FilePath makePathFromNdk(const Utils::FilePath &ndkLocation);
Utils::FilePath keytoolPath() const;
Utils::FilePath keytoolPath();
QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr) const;
QList<AndroidDeviceInfo> connectedDevices(QString *error = nullptr);
QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion) const;
QString bestNdkPlatformMatch(int target, const QtSupport::QtVersion *qtVersion);
static QLatin1String displayName(const ProjectExplorer::Abi &abi);
QLatin1String displayName(const ProjectExplorer::Abi &abi);
QString getProductModel(const QString &device) const;
bool isConnected(const QString &serialNumber) const;
QString getProductModel(const QString &device);
bool isConnected(const QString &serialNumber);
bool sdkFullyConfigured() const { return m_sdkFullyConfigured; }
void setSdkFullyConfigured(bool allEssentialsInstalled) { m_sdkFullyConfigured = allEssentialsInstalled; }
bool sdkFullyConfigured();
void setSdkFullyConfigured(bool allEssentialsInstalled);
static bool isValidNdk(const QString &ndkLocation);
QStringList getCustomNdkList() const;
bool isValidNdk(const QString &ndkLocation);
QStringList getCustomNdkList();
void addCustomNdk(const QString &customNdk);
void removeCustomNdk(const QString &customNdk);
void setDefaultNdk(const Utils::FilePath &defaultNdk);
Utils::FilePath defaultNdk() const;
Utils::FilePath defaultNdk();
Utils::FilePath openSslLocation() const;
Utils::FilePath openSslLocation();
void setOpenSslLocation(const Utils::FilePath &openSslLocation);
static Utils::FilePath getJdkPath();
static QStringList getAbis(const QString &device);
static int getSDKVersion(const QString &device);
Utils::FilePath getJdkPath();
QStringList getAbis(const QString &device);
int getSDKVersion(const QString &device);
Utils::Environment toolsEnvironment() const;
Utils::Environment toolsEnvironment();
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();
} // namespace AndroidConfig
class AndroidConfigurations : public QObject
{

View File

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

View File

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

View File

@@ -297,7 +297,7 @@ bool AndroidDeployQtStep::init()
m_apkPath = FilePath::fromString(node->data(Constants::AndroidApk).toString());
if (!m_apkPath.isEmpty()) {
m_manifestName = FilePath::fromString(node->data(Constants::AndroidManifest).toString());
m_command = androidConfig().adbToolPath();
m_command = AndroidConfig::adbToolPath();
AndroidManager::setManifestPath(target(), m_manifestName);
} else {
QString jsonFile = AndroidQtVersion::androidDeploymentSettings(target()).toString();
@@ -335,13 +335,13 @@ bool AndroidDeployQtStep::init()
}
} else {
m_uninstallPreviousPackageRun = true;
m_command = androidConfig().adbToolPath();
m_command = AndroidConfig::adbToolPath();
m_apkPath = AndroidManager::packagePath(target());
m_workingDirectory = bc ? AndroidManager::buildDirectory(target()): FilePath();
}
m_environment = bc ? bc->environment() : Environment();
m_adbPath = androidConfig().adbToolPath();
m_adbPath = AndroidConfig::adbToolPath();
// Start the AVD if not running.
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)
{
return info.type == IDevice::Hardware ? androidConfig().getProductModel(info.serialNumber)
return info.type == IDevice::Hardware ? AndroidConfig::getProductModel(info.serialNumber)
: info.avdName;
}
@@ -415,7 +415,7 @@ void AndroidDevice::initAvdSettings()
void AndroidDeviceManager::updateAvdList()
{
if (androidConfig().adbToolPath().exists())
if (AndroidConfig::adbToolPath().exists())
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)
{
CommandLine cmd(androidConfig().avdManagerToolPath(), {"create", "avd", "-n", info.name});
CommandLine cmd(AndroidConfig::avdManagerToolPath(), {"create", "avd", "-n", info.name});
cmd.addArgs({"-k", info.sdkStylePath});
if (info.sdcardSize > 0)
cmd.addArgs({"-c", QString("%1M").arg(info.sdcardSize)});
@@ -460,7 +460,7 @@ expected_str<void> AndroidDeviceManager::createAvd(const CreateAvdInfo &info, bo
Process process;
process.setProcessMode(ProcessMode::Writer);
process.setEnvironment(androidConfig().toolsEnvironment());
process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(cmd);
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);
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();
m_removeAvdProcess->setEnvironment(androidConfig().toolsEnvironment());
m_removeAvdProcess->setEnvironment(AndroidConfig::toolsEnvironment());
m_removeAvdProcess->setCommand(command);
connect(m_removeAvdProcess.get(), &Process::done, this, [this, device] {
const QString name = device->displayName();
@@ -618,7 +618,7 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent)
dialog.setLabelText(Tr::tr("Emulator command-line startup options "
"(<a href=\"%1\">Help Web Page</a>):")
.arg(helpUrl));
dialog.setTextValue(androidConfig().emulatorArgs());
dialog.setTextValue(AndroidConfig::emulatorArgs());
if (auto label = dialog.findChild<QLabel*>()) {
label->setOpenExternalLinks(true);
@@ -628,12 +628,12 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent)
if (dialog.exec() != QDialog::Accepted)
return;
androidConfig().setEmulatorArgs(dialog.textValue());
AndroidConfig::setEmulatorArgs(dialog.textValue());
}
QString AndroidDeviceManager::getRunningAvdsSerialNumber(const QString &name) const
{
for (const AndroidDeviceInfo &dev : androidConfig().connectedDevices()) {
for (const AndroidDeviceInfo &dev : AndroidConfig::connectedDevices()) {
if (!dev.serialNumber.startsWith("emulator"))
continue;
const QString stdOut = emulatorName(dev.serialNumber);
@@ -661,7 +661,7 @@ static FilePath avdFilePath()
void AndroidDeviceManager::setupDevicesWatcher()
{
if (!androidConfig().adbToolPath().exists()) {
if (!AndroidConfig::adbToolPath().exists()) {
qCDebug(androidDeviceLog) << "Cannot start ADB device watcher"
<< "because adb path does not exist.";
return;
@@ -693,10 +693,10 @@ void AndroidDeviceManager::setupDevicesWatcher()
handleDevicesListChange(output);
});
const CommandLine command{androidConfig().adbToolPath(), {"track-devices"}};
const CommandLine command{AndroidConfig::adbToolPath(), {"track-devices"}};
m_adbDeviceWatcherProcess->setCommand(command);
m_adbDeviceWatcherProcess->setWorkingDirectory(command.executable().parentDir());
m_adbDeviceWatcherProcess->setEnvironment(androidConfig().toolsEnvironment());
m_adbDeviceWatcherProcess->setEnvironment(AndroidConfig::toolsEnvironment());
m_adbDeviceWatcherProcess->start();
// 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);
} else {
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
// like: "192.168.1.190:5555"
static const auto ipRegex = QRegularExpression(ipRegexStr + QStringLiteral(":(\\d{1,5})"));
@@ -921,16 +921,16 @@ AndroidDeviceManager::AndroidDeviceManager(QObject *parent)
});
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();
process.setEnvironment(androidConfig().toolsEnvironment());
process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(cmd);
};
const auto onProcessDone = [this, storage](const Process &process, DoneWith result) {
const QString output = process.allOutput();
if (result != DoneWith::Success) {
qCDebug(androidDeviceLog)
<< "Avd list command failed" << output << androidConfig().sdkToolsVersion();
<< "Avd list command failed" << output << AndroidConfig::sdkToolsVersion();
return DoneResult::Error;
}
@@ -981,7 +981,7 @@ public:
":/android/images/androiddevice.png");
setConstructionFunction(&AndroidDevice::create);
setCreator([] {
if (!androidConfig().sdkToolsOk()) {
if (!AndroidConfig::sdkToolsOk()) {
AndroidDeviceWidget::infoDialog(Tr::tr("Android support is not yet configured."));
return IDevice::Ptr();
}

View File

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

View File

@@ -592,7 +592,7 @@ void AndroidManifestEditorWidget::postSave()
const FilePath docPath = m_textEditorWidget->textDocument()->filePath();
if (Target *target = androidTarget(docPath)) {
if (BuildConfiguration *bc = target->activeBuildConfiguration()) {
QString androidNdkPlatform = androidConfig().bestNdkPlatformMatch(
QString androidNdkPlatform = AndroidConfig::bestNdkPlatformMatch(
AndroidManager::minimumSDK(target),
QtSupport::QtKitAspect::qtVersion(
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);
}).isEmpty();
if (!androidConfig().sdkFullyConfigured() && qtForAndroidInstalled)
if (!AndroidConfig::sdkFullyConfigured() && qtForAndroidInstalled)
askUserAboutAndroidSetup();
AndroidConfigurations::registerNewToolchains();

View File

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

View File

@@ -61,9 +61,9 @@ QString AndroidQtVersion::invalidReason() const
{
QString tmp = QtVersion::invalidReason();
if (tmp.isEmpty()) {
if (androidConfig().ndkLocation(this).isEmpty())
if (AndroidConfig::ndkLocation(this).isEmpty())
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.");
if (qtAbis().isEmpty())
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
{
const bool conf = androidConfig().sdkFullyConfigured();
const bool conf = AndroidConfig::sdkFullyConfigured();
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);
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)
env.set(QLatin1String("ANDROID_NDK_HOST"), config.toolchainHost(this));
env.set(QLatin1String("ANDROID_NDK_ROOT"), config.ndkLocation(this).toUserOutput());
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHost(this));
env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfig::ndkLocation(this).toUserOutput());
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
{
env.set(QLatin1String("ANDROID_NDK_ROOT"),
androidConfig().ndkLocation(this).toUserOutput());
AndroidConfig::ndkLocation(this).toUserOutput());
}
QString AndroidQtVersion::description() const

View File

@@ -184,7 +184,7 @@ void AndroidRunner::checkAVD()
m_checkAVDTimer.stop();
AndroidManager::setDeviceSerialNumber(m_target, serialNumber);
emit asyncStart();
} else if (!androidConfig().isConnected(serialNumber)) {
} else if (!AndroidConfig::isConnected(serialNumber)) {
// device was disconnected
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());
QString preferredAbi = AndroidManager::apkDevicePreferredAbi(target);
const AndroidConfig &config = androidConfig();
if (useLldb) {
// 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);
// The new, built-in LLDB.
@@ -117,7 +115,7 @@ static FilePath debugServer(bool useLldb, const Target *target)
return lldbServer;
} else {
// Search suitable gdbserver binary.
const FilePath path = config.ndkLocation(qtVersion)
const FilePath path = AndroidConfig::ndkLocation(qtVersion)
.pathAppended(QString("prebuilt/android-%1/gdbserver/gdbserver")
.arg(gdbServerArch(preferredAbi)));
if (path.exists())
@@ -429,7 +427,7 @@ void Android::Internal::AndroidRunnerWorker::asyncStartLogcat()
}
const QStringList logcatArgs = selector() << "logcat" << timeArg;
const FilePath adb = androidConfig().adbToolPath();
const FilePath adb = AndroidConfig::adbToolPath();
qCDebug(androidRunWorkerLog).noquote() << "Running logcat command (async):"
<< CommandLine(adb, logcatArgs).toUserOutput();
m_adbLogcatProcess->setCommand({adb, logcatArgs});
@@ -632,7 +630,7 @@ void AndroidRunnerWorker::asyncStart()
const Storage<PidUserPair> pidStorage;
const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; });
const FilePath adbPath = androidConfig().adbToolPath();
const FilePath adbPath = AndroidConfig::adbToolPath();
const QStringList args = selector();
const auto onPidSetup = [adbPath, args, packageName = m_packageName,
@@ -710,7 +708,7 @@ void AndroidRunnerWorker::handleJdbWaiting()
}
m_afterFinishAdbCommands.push_back(removeForward.join(' '));
const FilePath jdbPath = androidConfig().openJDKLocation()
const FilePath jdbPath = AndroidConfig::openJDKLocation()
.pathAppended("bin/jdb").withExecutableSuffix();
QStringList jdbArgs("-connect");

View File

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

View File

@@ -113,9 +113,9 @@ private:
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()
@@ -172,9 +172,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage)
"respective licenses are not accepted.") + "\n\n",
LogMessageFormat);
process.setProcessMode(ProcessMode::Writer);
process.setEnvironment(androidConfig().toolsEnvironment());
process.setCommand(CommandLine(androidConfig().sdkManagerToolPath(),
{"--licenses", sdkRootArg(androidConfig())}));
process.setEnvironment(AndroidConfig::toolsEnvironment());
process.setCommand(CommandLine(AndroidConfig::sdkManagerToolPath(),
{"--licenses", sdkRootArg()}));
process.setUseCtrlCStub(true);
Process *processPtr = &process;
@@ -227,9 +227,9 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage)
static void setupSdkProcess(const QStringList &args, Process *process,
QuestionProgressDialog *dialog, int current, int total)
{
process->setEnvironment(androidConfig().toolsEnvironment());
process->setCommand({androidConfig().sdkManagerToolPath(),
args + androidConfig().sdkManagerToolArgs()});
process->setEnvironment(AndroidConfig::toolsEnvironment());
process->setCommand({AndroidConfig::sdkManagerToolPath(),
args + AndroidConfig::sdkManagerToolArgs()});
QObject::connect(process, &Process::readyReadStandardOutput, dialog,
[process, dialog, current, total] {
QTextCodec *codec = QTextCodec::codecForLocale();
@@ -269,7 +269,7 @@ static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage,
const int total = change.count();
const LoopList uninstallIterator(change.toUninstall);
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();
setupSdkProcess(args, &process, dialog, uninstallIterator.iteration(), total);
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 int offset = change.toUninstall.count();
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();
setupSdkProcess(args, &process, dialog, offset + installIterator.iteration(), total);
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)
{
const auto onUpdateSetup = [dialogStorage](Process &process) {
const QStringList args = {"--update", sdkRootArg(androidConfig())};
const QStringList args = {"--update", sdkRootArg()};
QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
setupSdkProcess(args, &process, dialog, 0, 1);
dialog->appendMessage(Tr::tr("Updating installed packages....") + '\n', NormalMessageFormat);
@@ -369,7 +369,7 @@ const AndroidSdkPackageList &AndroidSdkManager::allSdkPackages()
QStringList AndroidSdkManager::notFoundEssentialSdkPackages()
{
QStringList essentials = androidConfig().allEssentials();
QStringList essentials = AndroidConfig::allEssentials();
const AndroidSdkPackageList &packages = allSdkPackages();
for (AndroidSdkPackage *package : packages) {
essentials.removeOne(package->sdkStylePath());
@@ -381,7 +381,7 @@ QStringList AndroidSdkManager::notFoundEssentialSdkPackages()
QStringList AndroidSdkManager::missingEssentialSdkPackages()
{
const QStringList essentials = androidConfig().allEssentials();
const QStringList essentials = AndroidConfig::allEssentials();
const AndroidSdkPackageList &packages = allSdkPackages();
QStringList missingPackages;
for (AndroidSdkPackage *package : packages) {
@@ -461,7 +461,7 @@ BuildToolsList AndroidSdkManager::filteredBuildTools(int minApiLevel,
void AndroidSdkManager::refreshPackages()
{
if (androidConfig().sdkManagerToolPath() != m_d->lastSdkManagerPath)
if (AndroidConfig::sdkManagerToolPath() != m_d->lastSdkManagerPath)
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
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;
newArgs.append(sdkRootArg(config));
newArgs.append(sdkRootArg());
Process proc;
proc.setEnvironment(config.toolsEnvironment());
proc.setEnvironment(AndroidConfig::toolsEnvironment());
proc.setTimeOutMessageBoxEnabled(true);
proc.setCommand({config.sdkManagerToolPath(), newArgs});
proc.setCommand({AndroidConfig::sdkManagerToolPath(), newArgs});
qCDebug(sdkManagerLog).noquote() << "Running SDK Manager command (sync):"
<< proc.commandLine().toUserOutput();
proc.runBlocking(60s, EventLoopMode::On);
@@ -516,10 +516,10 @@ void AndroidSdkManagerPrivate::reloadSdkPackages()
qDeleteAll(m_allPackages);
m_allPackages.clear();
lastSdkManagerPath = androidConfig().sdkManagerToolPath();
lastSdkManagerPath = AndroidConfig::sdkManagerToolPath();
m_packageListingSuccessful = false;
if (androidConfig().sdkToolsVersion().isNull()) {
if (AndroidConfig::sdkToolsVersion().isNull()) {
// Configuration has invalid sdk path or corrupt installation.
emit m_sdkManager.packageReloadFinished();
return;
@@ -527,8 +527,8 @@ void AndroidSdkManagerPrivate::reloadSdkPackages()
QString packageListing;
QStringList args({"--list", "--verbose"});
args << androidConfig().sdkManagerToolArgs();
m_packageListingSuccessful = sdkManagerCommand(androidConfig(), args, &packageListing);
args << AndroidConfig::sdkManagerToolArgs();
m_packageListingSuccessful = sdkManagerCommand(args, &packageListing);
if (m_packageListingSuccessful) {
SdkManagerOutputParser parser(m_allPackages);
parser.parsePackageListing(packageListing);

View File

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

View File

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

View File

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

View File

@@ -77,7 +77,7 @@ bool AndroidToolchain::isValid() const
}
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
&& targetAbi().isValid() && (isChildofNdk || isChildofSdk)
@@ -86,9 +86,8 @@ bool AndroidToolchain::isValid() const
void AndroidToolchain::addToEnvironment(Environment &env) const
{
const AndroidConfig &config = androidConfig();
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfig::toolchainHostFromNdk(m_ndkLocation));
const FilePath javaHome = config.openJDKLocation();
const FilePath javaHome = AndroidConfig::openJDKLocation();
if (javaHome.exists()) {
env.set(Constants::JAVA_HOME_ENV_VAR, javaHome.toUserOutput());
const FilePath javaBin = javaHome.pathAppended("bin");
@@ -97,8 +96,8 @@ void AndroidToolchain::addToEnvironment(Environment &env) const
if (!currentJavaFilePath.isChildOf(javaBin))
env.prependOrSetPath(javaBin);
}
env.set(QLatin1String("ANDROID_HOME"), config.sdkLocation().toUserOutput());
env.set(QLatin1String("ANDROID_SDK_ROOT"), config.sdkLocation().toUserOutput());
env.set(QLatin1String("ANDROID_HOME"), AndroidConfig::sdkLocation().toUserOutput());
env.set(QLatin1String("ANDROID_SDK_ROOT"), AndroidConfig::sdkLocation().toUserOutput());
}
void AndroidToolchain::fromMap(const Store &data)
@@ -147,7 +146,7 @@ static FilePaths uniqueNdksForCurrentQtVersions()
FilePaths uniqueNdks;
for (const QtSupport::QtVersion *version : androidQtVersions) {
FilePath ndk = androidConfig().ndkLocation(version);
FilePath ndk = AndroidConfig::ndkLocation(version);
if (!uniqueNdks.contains(ndk))
uniqueNdks.append(ndk);
}
@@ -161,8 +160,6 @@ ToolchainList autodetectToolchainsFromNdks(
const bool isCustom)
{
QList<Toolchain *> result;
const AndroidConfig config = androidConfig();
const Id LanguageIds[] {
ProjectExplorer::Constants::CXX_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)
{
CommandLine cmd(androidConfig().avdManagerToolPath(), args);
CommandLine cmd(AndroidConfig::avdManagerToolPath(), args);
Process proc;
proc.setEnvironment(androidConfig().toolsEnvironment());
proc.setEnvironment(AndroidConfig::toolsEnvironment());
qCDebug(avdDialogLog).noquote() << "Running AVD Manager command:" << cmd.toUserOutput();
proc.setCommand(cmd);
proc.runBlocking();
@@ -189,7 +189,7 @@ void AvdDialog::parseDeviceDefinitionsList()
if (!avdManagerCommand({"list", "device"}, &output)) {
qCDebug(avdDialogLog) << "Avd list command failed" << output
<< androidConfig().sdkToolsVersion();
<< AndroidConfig::sdkToolsVersion();
return;
}

View File

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

View File

@@ -305,7 +305,7 @@ void JLSClient::updateProjectFiles()
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 FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar")
.arg(targetSDK);