Android: Fix multiple clang clazy warnings

Change-Id: I2ea6cebd16c09a8a4502f4719d99a9d85e5e7d02
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Assam Boudjelthia
2021-05-28 18:22:44 +03:00
parent 41240ed706
commit 1372dfdf7f
17 changed files with 235 additions and 191 deletions

View File

@@ -378,7 +378,5 @@ bool AndroidAvdManager::waitForBooted(const QString &serialNumber,
return false; return false;
} }
static QStringList avdErrorPaths;
} // namespace Internal } // namespace Internal
} // namespace Android } // namespace Android

View File

@@ -93,7 +93,6 @@ namespace Internal {
static Q_LOGGING_CATEGORY(buildapkstepLog, "qtc.android.build.androidbuildapkstep", QtWarningMsg) static Q_LOGGING_CATEGORY(buildapkstepLog, "qtc.android.build.androidbuildapkstep", QtWarningMsg)
const QVersionNumber gradleScriptRevokedSdkVersion(25, 3, 0);
const char KeystoreLocationKey[] = "KeystoreLocation"; const char KeystoreLocationKey[] = "KeystoreLocation";
const char BuildTargetSdkKey[] = "BuildTargetSdk"; const char BuildTargetSdkKey[] = "BuildTargetSdk";
const char VerboseOutputKey[] = "VerboseOutput"; const char VerboseOutputKey[] = "VerboseOutput";
@@ -518,7 +517,7 @@ bool AndroidBuildApkStep::init()
return false; return false;
const QVersionNumber sdkToolsVersion = AndroidConfigurations::currentConfig().sdkToolsVersion(); const QVersionNumber sdkToolsVersion = AndroidConfigurations::currentConfig().sdkToolsVersion();
if (sdkToolsVersion >= gradleScriptRevokedSdkVersion if (sdkToolsVersion >= QVersionNumber(25, 3, 0)
|| AndroidConfigurations::currentConfig().isCmdlineSdkToolsInstalled()) { || AndroidConfigurations::currentConfig().isCmdlineSdkToolsInstalled()) {
if (!version->sourcePath().pathAppended("src/3rdparty/gradle").exists()) { if (!version->sourcePath().pathAppended("src/3rdparty/gradle").exists()) {
const QString error const QString error

View File

@@ -342,15 +342,16 @@ void AndroidConfig::parseDependenciesJson()
}; };
if (jsonObject.contains(SpecificQtVersionsKey) && jsonObject[SpecificQtVersionsKey].isArray()) { if (jsonObject.contains(SpecificQtVersionsKey) && jsonObject[SpecificQtVersionsKey].isArray()) {
QJsonArray versionsArray = jsonObject[SpecificQtVersionsKey].toArray(); const QJsonArray versionsArray = jsonObject[SpecificQtVersionsKey].toArray();
for (const QJsonValueRef &item : versionsArray) { for (const QJsonValue &item : versionsArray) {
QJsonObject itemObj = item.toObject(); QJsonObject itemObj = item.toObject();
SdkForQtVersions specificVersion; SdkForQtVersions specificVersion;
specificVersion.ndkPath = itemObj[NdkPathKey].toString(); specificVersion.ndkPath = itemObj[NdkPathKey].toString();
for (const QJsonValueRef &pkg : itemObj[SdkEssentialPkgsKey].toArray()) const auto pkgs = itemObj[SdkEssentialPkgsKey].toArray();
for (const QJsonValue &pkg : pkgs)
specificVersion.essentialPackages.append(pkg.toString()); specificVersion.essentialPackages.append(pkg.toString());
for (const QJsonValueRef &pkg : itemObj[VersionsKey].toArray()) const auto versions = itemObj[VersionsKey].toArray();
for (const QJsonValue &pkg : versions)
specificVersion.versions.append(fillQtVersionsRange(pkg.toString())); specificVersion.versions.append(fillQtVersionsRange(pkg.toString()));
if (itemObj[VersionsKey].toArray().first().toString() == DefaultVersionKey) if (itemObj[VersionsKey].toArray().first().toString() == DefaultVersionKey)
@@ -816,7 +817,8 @@ QVersionNumber AndroidConfig::buildToolsVersion() const
//TODO: return version according to qt version //TODO: return version according to qt version
QVersionNumber maxVersion; QVersionNumber maxVersion;
QDir buildToolsDir(m_sdkLocation.pathAppended("build-tools").toString()); QDir buildToolsDir(m_sdkLocation.pathAppended("build-tools").toString());
for (const QFileInfo &file: buildToolsDir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot)) const auto files = buildToolsDir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot);
for (const QFileInfo &file: files)
maxVersion = qMax(maxVersion, QVersionNumber::fromString(file.fileName())); maxVersion = qMax(maxVersion, QVersionNumber::fromString(file.fileName()));
return maxVersion; return maxVersion;
} }
@@ -904,7 +906,8 @@ QStringList AndroidConfig::allEssentials() const
bool AndroidConfig::allEssentialsInstalled(AndroidSdkManager *sdkManager) bool AndroidConfig::allEssentialsInstalled(AndroidSdkManager *sdkManager)
{ {
QStringList essentialPkgs(allEssentials()); QStringList essentialPkgs(allEssentials());
for (const AndroidSdkPackage *pkg : sdkManager->installedSdkPackages()) { const auto installedPkgs = sdkManager->installedSdkPackages();
for (const AndroidSdkPackage *pkg : installedPkgs) {
if (essentialPkgs.contains(pkg->sdkStylePath())) if (essentialPkgs.contains(pkg->sdkStylePath()))
essentialPkgs.removeOne(pkg->sdkStylePath()); essentialPkgs.removeOne(pkg->sdkStylePath());
if (essentialPkgs.isEmpty()) if (essentialPkgs.isEmpty())
@@ -1175,7 +1178,7 @@ void AndroidConfigurations::removeOldToolChains()
void AndroidConfigurations::removeUnusedDebuggers() void AndroidConfigurations::removeUnusedDebuggers()
{ {
QList<FilePath> uniqueNdks; QVector<FilePath> uniqueNdks;
const QList<QtSupport::BaseQtVersion *> qtVersions const QList<QtSupport::BaseQtVersion *> qtVersions
= QtSupport::QtVersionManager::versions([](const QtSupport::BaseQtVersion *v) { = QtSupport::QtVersionManager::versions([](const QtSupport::BaseQtVersion *v) {
return v->type() == Constants::ANDROIDQT; return v->type() == Constants::ANDROIDQT;
@@ -1187,7 +1190,9 @@ void AndroidConfigurations::removeUnusedDebuggers()
uniqueNdks.append(ndkLocation); uniqueNdks.append(ndkLocation);
} }
uniqueNdks.append(Utils::transform(currentConfig().getCustomNdkList(), FilePath::fromString));
uniqueNdks.append(Utils::transform(currentConfig().getCustomNdkList(),
FilePath::fromString).toVector());
const QList<Debugger::DebuggerItem> allDebuggers = Debugger::DebuggerItemManager::debuggers(); const QList<Debugger::DebuggerItem> allDebuggers = Debugger::DebuggerItemManager::debuggers();
for (const Debugger::DebuggerItem &debugger : allDebuggers) { for (const Debugger::DebuggerItem &debugger : allDebuggers) {

View File

@@ -80,11 +80,8 @@ const QLatin1String AndroidManifestName("AndroidManifest.xml");
const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber"); const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber");
const QLatin1String AndroidDeviceAbis("AndroidDeviceAbis"); const QLatin1String AndroidDeviceAbis("AndroidDeviceAbis");
const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel"); const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel");
const QString packageNameRegEx("(?<token>package: )(.*?)(name=)'(?<target>.*?)'"); const char qtcSignature[] = "This file is generated by QtCreator to be read by androiddeployqt "
const QString activityRegEx("(?<token>launchable-activity: )(.*?)(name=)'(?<target>.*?)'"); "and should not be modified by hand.";
const QString apkVersionRegEx("(?<token>package: )(.*?)(versionCode=)'(?<target>.*?)'");
const QString versionCodeRegEx("(?<token>versionCode=)(?<version>\\d*)");
const QString qtcSignature("This file is generated by QtCreator to be read by androiddeployqt and should not be modified by hand.");
static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg) static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg)
@@ -378,7 +375,8 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
target); target);
} }
QStringList apkAbis; QStringList apkAbis;
for (const auto &abi : QDir{libsPath.toString()}.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) const auto libsPaths = QDir{libsPath.toString()}.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const auto &abi : libsPaths)
if (!QDir{libsPath.pathAppended(abi).toString()}.entryList(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) if (!QDir{libsPath.pathAppended(abi).toString()}.entryList(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty())
apkAbis << abi; apkAbis << abi;
return preferredAbi(apkAbis, target); return preferredAbi(apkAbis, target);

View File

@@ -35,13 +35,13 @@ namespace Android {
namespace Internal { namespace Internal {
namespace { namespace {
const QString extraExtraExtraHighDpiIconPath = QLatin1String("/res/drawable-xxxhdpi/"); const char extraExtraExtraHighDpiIconPath[] = "/res/drawable-xxxhdpi/";
const QString extraExtraHighDpiIconPath = QLatin1String("/res/drawable-xxhdpi/"); const char extraExtraHighDpiIconPath[] = "/res/drawable-xxhdpi/";
const QString extraHighDpiIconPath = QLatin1String("/res/drawable-xhdpi/"); const char extraHighDpiIconPath[] = "/res/drawable-xhdpi/";
const QString highDpiIconPath = QLatin1String("/res/drawable-hdpi/"); const char highDpiIconPath[] = "/res/drawable-hdpi/";
const QString mediumDpiIconPath = QLatin1String("/res/drawable-mdpi/"); const char mediumDpiIconPath[] = "/res/drawable-mdpi/";
const QString lowDpiIconPath = QLatin1String("/res/drawable-ldpi/"); const char lowDpiIconPath[] = "/res/drawable-ldpi/";
const QString imageSuffix = QLatin1String(".png"); const char imageSuffix[] = ".png";
const QSize lowDpiIconSize{32, 32}; const QSize lowDpiIconSize{32, 32};
const QSize mediumDpiIconSize{48, 48}; const QSize mediumDpiIconSize{48, 48};
const QSize highDpiIconSize{72, 72}; const QSize highDpiIconSize{72, 72};
@@ -73,67 +73,73 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg
QString iconFileName = m_iconFileName + imageSuffix; QString iconFileName = m_iconFileName + imageSuffix;
auto lIconButton = new AndroidManifestEditorIconWidget(this, auto lIconButton = new AndroidManifestEditorIconWidget(this,
lowDpiIconSize, lowDpiIconSize,
lowDpiIconSize, lowDpiIconSize,
tr("LDPI icon"), tr("Select an icon suitable for low-density (ldpi) screens (~120dpi)."), tr("LDPI icon"),
textEditorWidget, tr("Select an icon suitable for low-density (ldpi) screens (~120dpi)."),
lowDpiIconPath, textEditorWidget,
iconFileName); lowDpiIconPath,
iconFileName);
iconLayout->addWidget(lIconButton); iconLayout->addWidget(lIconButton);
m_iconButtons.push_back(lIconButton); m_iconButtons.push_back(lIconButton);
iconLayout->addStretch(1); iconLayout->addStretch(1);
auto mIconButton = new AndroidManifestEditorIconWidget(this, auto mIconButton = new AndroidManifestEditorIconWidget(this,
mediumDpiIconSize, mediumDpiIconSize,
mediumDpiIconSize, mediumDpiIconSize,
tr("MDPI icon"), tr("Select an icon for medium-density (mdpi) screens (~160dpi)."), tr("MDPI icon"),
textEditorWidget, tr("Select an icon for medium-density (mdpi) screens (~160dpi)."),
mediumDpiIconPath, textEditorWidget,
iconFileName); mediumDpiIconPath,
iconFileName);
iconLayout->addWidget(mIconButton); iconLayout->addWidget(mIconButton);
m_iconButtons.push_back(mIconButton); m_iconButtons.push_back(mIconButton);
iconLayout->addStretch(1); iconLayout->addStretch(1);
auto hIconButton = new AndroidManifestEditorIconWidget(this, auto hIconButton = new AndroidManifestEditorIconWidget(this,
highDpiIconSize, highDpiIconSize,
highDpiIconSize, highDpiIconSize,
tr("HDPI icon"), tr("Select an icon for high-density (hdpi) screens (~240dpi)."), tr("HDPI icon"),
textEditorWidget, tr("Select an icon for high-density (hdpi) screens (~240dpi)."),
highDpiIconPath, textEditorWidget,
iconFileName); highDpiIconPath,
iconFileName);
iconLayout->addWidget(hIconButton); iconLayout->addWidget(hIconButton);
m_iconButtons.push_back(hIconButton); m_iconButtons.push_back(hIconButton);
iconLayout->addStretch(1); iconLayout->addStretch(1);
auto xhIconButton = new AndroidManifestEditorIconWidget(this, auto xhIconButton = new AndroidManifestEditorIconWidget(this,
extraHighDpiIconSize, extraHighDpiIconSize,
extraHighDpiIconSize, extraHighDpiIconSize,
tr("XHDPI icon"), tr("Select an icon for extra-high-density (xhdpi) screens (~320dpi)."), tr("XHDPI icon"),
textEditorWidget, tr("Select an icon for extra-high-density (xhdpi) screens (~320dpi)."),
extraHighDpiIconPath, textEditorWidget,
iconFileName); extraHighDpiIconPath,
iconFileName);
iconLayout->addWidget(xhIconButton); iconLayout->addWidget(xhIconButton);
m_iconButtons.push_back(xhIconButton); m_iconButtons.push_back(xhIconButton);
iconLayout->addStretch(1); iconLayout->addStretch(1);
auto xxhIconButton = new AndroidManifestEditorIconWidget(this, auto xxhIconButton = new AndroidManifestEditorIconWidget(this,
extraExtraHighDpiIconSize, extraExtraHighDpiIconSize,
extraExtraHighDpiIconSize, extraExtraHighDpiIconSize,
tr("XXHDPI icon"), tr("Select an icon for extra-extra-high-density (xxhdpi) screens (~480dpi)."), tr("XXHDPI icon"),
textEditorWidget, tr("Select an icon for extra-extra-high-density (xxhdpi) screens (~480dpi)."),
extraExtraHighDpiIconPath, textEditorWidget,
iconFileName); extraExtraHighDpiIconPath,
iconFileName);
iconLayout->addWidget(xxhIconButton); iconLayout->addWidget(xxhIconButton);
m_iconButtons.push_back(xxhIconButton); m_iconButtons.push_back(xxhIconButton);
iconLayout->addStretch(1); iconLayout->addStretch(1);
auto xxxhIconButton = new AndroidManifestEditorIconWidget(this, auto xxxhIconButton = new AndroidManifestEditorIconWidget(this,
extraExtraExtraHighDpiIconSize, extraExtraExtraHighDpiIconSize,
extraExtraExtraHighDpiIconSize, extraExtraExtraHighDpiIconSize,
tr("XXXHDPI icon"), tr("Select an icon for extra-extra-extra-high-density (xxxhdpi) screens (~640dpi)."), tr("XXXHDPI icon"),
textEditorWidget, tr("Select an icon for extra-extra-extra-high-density (xxxhdpi) screens (~640dpi)."),
extraExtraExtraHighDpiIconPath, textEditorWidget,
iconFileName); extraExtraExtraHighDpiIconPath,
iconFileName);
iconLayout->addWidget(xxxhIconButton); iconLayout->addWidget(xxxhIconButton);
m_iconButtons.push_back(xxxhIconButton); m_iconButtons.push_back(xxxhIconButton);
iconLayout->addStretch(3); iconLayout->addStretch(3);
@@ -141,7 +147,7 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg
auto handleIconModification = [this] { auto handleIconModification = [this] {
bool iconsMaybeChanged = hasIcons(); bool iconsMaybeChanged = hasIcons();
if (m_hasIcons != iconsMaybeChanged) if (m_hasIcons != iconsMaybeChanged)
iconsModified(); emit iconsModified();
m_hasIcons = iconsMaybeChanged; m_hasIcons = iconsMaybeChanged;
}; };
for (auto &&iconButton : m_iconButtons) { for (auto &&iconButton : m_iconButtons) {

View File

@@ -127,7 +127,7 @@ void AndroidManifestEditorIconWidget::setIcon(const QIcon &icon)
void AndroidManifestEditorIconWidget::clearIcon() void AndroidManifestEditorIconWidget::clearIcon()
{ {
removeIcon(); removeIcon();
iconRemoved(); emit iconRemoved();
} }
void AndroidManifestEditorIconWidget::loadIcon() void AndroidManifestEditorIconWidget::loadIcon()
@@ -170,7 +170,7 @@ void AndroidManifestEditorIconWidget::selectIcon()
if (file.isEmpty()) if (file.isEmpty())
return; return;
setIconFromPath(file); setIconFromPath(file);
iconSelected(file, this); emit iconSelected(file, this);
} }
void AndroidManifestEditorIconWidget::removeIcon() void AndroidManifestEditorIconWidget::removeIcon()

View File

@@ -160,10 +160,14 @@ void AndroidPackageInstallationStep::doRun()
dir.mkpath(assetsDebugDir); dir.mkpath(assetsDebugDir);
QFile file(assetsDebugDir + "debugger.command"); QFile file(assetsDebugDir + "debugger.command");
if (file.open(QIODevice::WriteOnly)) if (file.open(QIODevice::WriteOnly)) {
qCDebug(packageInstallationStepLog, "Successful added %s to the package.", qPrintable(file.fileName())); qCDebug(packageInstallationStepLog, "Successful added %s to the package.",
else qPrintable(file.fileName()));
qCDebug(packageInstallationStepLog, "Cound't add %s to the package. The QML debugger might not work properly.", qPrintable(file.fileName())); } else {
qCDebug(packageInstallationStepLog,
"Cound't add %s to the package. The QML debugger might not work properly.",
qPrintable(file.fileName()));
}
} }
} }
} }

View File

@@ -75,26 +75,9 @@ using namespace Utils;
namespace Android { namespace Android {
namespace Internal { namespace Internal {
static const QString pidScript = "pidof -s '%1'";
static const QString pidScriptPreNougat = QStringLiteral("for p in /proc/[0-9]*; "
"do cat <$p/cmdline && echo :${p##*/}; done");
static const QString pidPollingScript = QStringLiteral("while [ -d /proc/%1 ]; do sleep 1; done"); static const QString pidPollingScript = QStringLiteral("while [ -d /proc/%1 ]; do sleep 1; done");
static const QRegularExpression regExpLogcat{"^[0-9\\-]*" // date
"\\s+"
"[0-9\\-:.]*"// time
"\\s*"
"(\\d*)" // pid 1. capture
"\\s+"
"\\d*" // unknown
"\\s+"
"(\\w)" // message type 2. capture
"\\s+"
"(.*): " // source 3. capture
"(.*)" // message 4. capture
"[\\n\\r]*$"};
static int APP_START_TIMEOUT = 45000; static int APP_START_TIMEOUT = 45000;
static bool isTimedOut(const chrono::high_resolution_clock::time_point &start, static bool isTimedOut(const chrono::high_resolution_clock::time_point &start,
int msecs = APP_START_TIMEOUT) int msecs = APP_START_TIMEOUT)
{ {
@@ -128,6 +111,9 @@ static void findProcessPID(QFutureInterface<qint64> &fi, QStringList selector,
if (packageName.isEmpty()) if (packageName.isEmpty())
return; return;
static const QString pidScript = "pidof -s '%1'";
static const QString pidScriptPreNougat = QStringLiteral("for p in /proc/[0-9]*; "
"do cat <$p/cmdline && echo :${p##*/}; done");
QStringList args = {selector}; QStringList args = {selector};
FilePath adbPath = AndroidConfigurations::currentConfig().adbToolPath(); FilePath adbPath = AndroidConfigurations::currentConfig().adbToolPath();
args.append("shell"); args.append("shell");
@@ -305,7 +291,8 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa
for (const QString &shellCmd : commands) for (const QString &shellCmd : commands)
m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd)); m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd));
} }
for (const QString &shellCmd : runner->recordedData(Constants::ANDROID_PRESTARTSHELLCMDLIST).toStringList()) const auto data = runner->recordedData(Constants::ANDROID_PRESTARTSHELLCMDLIST).toStringList();
for (const QString &shellCmd : data)
m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd)); m_beforeStartAdbCommands.append(QString("shell %1").arg(shellCmd));
if (auto aspect = runControl->aspect(Constants::ANDROID_POSTFINISHSHELLCMDLIST)) { if (auto aspect = runControl->aspect(Constants::ANDROID_POSTFINISHSHELLCMDLIST)) {
@@ -314,7 +301,8 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa
for (const QString &shellCmd : commands) for (const QString &shellCmd : commands)
m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd)); m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd));
} }
for (const QString &shellCmd : runner->recordedData(Constants::ANDROID_POSTFINISHSHELLCMDLIST).toStringList()) const auto data2 = runner->recordedData(Constants::ANDROID_POSTFINISHSHELLCMDLIST).toStringList();
for (const QString &shellCmd : data)
m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd)); m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd));
m_debugServerPath = debugServer(m_useLldb, target).toString(); m_debugServerPath = debugServer(m_useLldb, target).toString();
@@ -472,6 +460,21 @@ void AndroidRunnerWorker::logcatProcess(const QByteArray &text, QByteArray &buff
break; break;
} }
} }
static const QRegularExpression regExpLogcat{"^[0-9\\-]*" // date
"\\s+"
"[0-9\\-:.]*"// time
"\\s*"
"(\\d*)" // pid 1. capture
"\\s+"
"\\d*" // unknown
"\\s+"
"(\\w)" // message type 2. capture
"\\s+"
"(.*): " // source 3. capture
"(.*)" // message 4. capture
"[\\n\\r]*$"};
const QRegularExpressionMatch match = regExpLogcat.match(line); const QRegularExpressionMatch match = regExpLogcat.match(line);
if (match.hasMatch()) { if (match.hasMatch()) {
// Android M // Android M
@@ -767,7 +770,8 @@ void AndroidRunnerWorker::handleJdbSettled()
for (int i= 0; i < 5 && m_jdbProcess->state() == QProcess::Running; ++i) { for (int i= 0; i < 5 && m_jdbProcess->state() == QProcess::Running; ++i) {
m_jdbProcess->waitForReadyRead(500); m_jdbProcess->waitForReadyRead(500);
QByteArray lines = m_jdbProcess->readAll(); QByteArray lines = m_jdbProcess->readAll();
for (const auto &line: lines.split('\n')) { const auto linesList = lines.split('\n');
for (const auto &line : linesList) {
auto msg = line.trimmed(); auto msg = line.trimmed();
if (msg.startsWith(">")) if (msg.startsWith(">"))
return true; return true;
@@ -802,7 +806,8 @@ void AndroidRunnerWorker::removeForwardPort(const QString &port)
SdkToolResult result = AndroidManager::runAdbCommand({"forward", "--list"}); SdkToolResult result = AndroidManager::runAdbCommand({"forward", "--list"});
QString string = result.stdOut(); QString string = result.stdOut();
for (const QString &line : string.split('\n')) { const auto lines = string.split('\n');
for (const QString &line : lines) {
if (line.contains(port)) { if (line.contains(port)) {
found = true; found = true;
break; break;

View File

@@ -61,9 +61,10 @@ const char commonArgsKey[] = "Common Arguments:";
const int sdkManagerCmdTimeoutS = 60; const int sdkManagerCmdTimeoutS = 60;
const int sdkManagerOperationTimeoutS = 600; const int sdkManagerOperationTimeoutS = 600;
const QRegularExpression assertionReg("(\\(\\s*y\\s*[\\/\\\\]\\s*n\\s*\\)\\s*)(?<mark>[\\:\\?])", Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, assertionReg,
QRegularExpression::CaseInsensitiveOption | ("(\\(\\s*y\\s*[\\/\\\\]\\s*n\\s*\\)\\s*)(?<mark>[\\:\\?])",
QRegularExpression::MultilineOption); QRegularExpression::CaseInsensitiveOption
| QRegularExpression::MultilineOption))
using namespace Utils; using namespace Utils;
using SdkCmdFutureInterface = QFutureInterface<AndroidSdkManager::OperationOutput>; using SdkCmdFutureInterface = QFutureInterface<AndroidSdkManager::OperationOutput>;
@@ -118,7 +119,7 @@ int parseProgress(const QString &out, bool &foundAssertion)
progress = -1; progress = -1;
} }
if (!foundAssertion) if (!foundAssertion)
foundAssertion = assertionReg.match(line).hasMatch(); foundAssertion = assertionReg->match(line).hasMatch();
} }
return progress; return progress;
} }
@@ -320,20 +321,21 @@ private:
QHash<AndroidSdkPackage *, int> m_systemImages; QHash<AndroidSdkPackage *, int> m_systemImages;
}; };
const std::map<SdkManagerOutputParser::MarkerTag, const char *> markerTags { using MarkerTagsType = std::map<SdkManagerOutputParser::MarkerTag, const char *>;
{SdkManagerOutputParser::MarkerTag::InstalledPackagesMarker, "Installed packages:"}, Q_GLOBAL_STATIC_WITH_ARGS(MarkerTagsType, markerTags, ({
{SdkManagerOutputParser::MarkerTag::AvailablePackagesMarkers, "Available Packages:"}, {SdkManagerOutputParser::MarkerTag::InstalledPackagesMarker, "Installed packages:"},
{SdkManagerOutputParser::MarkerTag::AvailableUpdatesMarker, "Available Updates:"}, {SdkManagerOutputParser::MarkerTag::AvailablePackagesMarkers, "Available Packages:"},
{SdkManagerOutputParser::MarkerTag::PlatformMarker, "platforms"}, {SdkManagerOutputParser::MarkerTag::AvailableUpdatesMarker, "Available Updates:"},
{SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"}, {SdkManagerOutputParser::MarkerTag::PlatformMarker, "platforms"},
{SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"}, {SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"},
{SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"}, {SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"},
{SdkManagerOutputParser::MarkerTag::CmdlineSdkToolsMarker, "cmdline-tools"}, {SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"},
{SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"}, {SdkManagerOutputParser::MarkerTag::CmdlineSdkToolsMarker, "cmdline-tools"},
{SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"}, {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"},
{SdkManagerOutputParser::MarkerTag::NdkMarker, "ndk"}, {SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"},
{SdkManagerOutputParser::MarkerTag::ExtrasMarker, "extras"} {SdkManagerOutputParser::MarkerTag::NdkMarker, "ndk"},
}; {SdkManagerOutputParser::MarkerTag::ExtrasMarker, "extras"}
}));
AndroidSdkManager::AndroidSdkManager(const AndroidConfig &config): AndroidSdkManager::AndroidSdkManager(const AndroidConfig &config):
m_d(new AndroidSdkManagerPrivate(*this, config)) m_d(new AndroidSdkManagerPrivate(*this, config))
@@ -496,7 +498,8 @@ void SdkManagerOutputParser::parsePackageListing(const QString &output)
}; };
QRegularExpression delimiters("[\\n\\r]"); QRegularExpression delimiters("[\\n\\r]");
for (const QString &outputLine : output.split(delimiters)) { const auto lines = output.split(delimiters);
for (const QString &outputLine : lines) {
// NOTE: we don't want to parse Dependencies part as it does not add value // NOTE: we don't want to parse Dependencies part as it does not add value
if (outputLine.startsWith(" ")) if (outputLine.startsWith(" "))
@@ -646,7 +649,7 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt
break; break;
default: default:
qCDebug(sdkManagerLog) << "Unhandled package: " << markerTags.at(packageMarker); qCDebug(sdkManagerLog) << "Unhandled package: " << markerTags->at(packageMarker);
break; break;
} }
@@ -660,7 +663,7 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt
package->setState(AndroidSdkPackage::Available); package->setState(AndroidSdkPackage::Available);
break; break;
default: default:
qCDebug(sdkManagerLog) << "Invalid section marker: " << markerTags.at(m_currentSection); qCDebug(sdkManagerLog) << "Invalid section marker: " << markerTags->at(m_currentSection);
break; break;
} }
} }
@@ -864,7 +867,7 @@ SdkManagerOutputParser::MarkerTag SdkManagerOutputParser::parseMarkers(const QSt
if (line.isEmpty()) if (line.isEmpty())
return EmptyMarker; return EmptyMarker;
for (auto pair: markerTags) { for (auto pair : *markerTags) {
if (line.startsWith(QLatin1String(pair.second))) if (line.startsWith(QLatin1String(pair.second)))
return pair.first; return pair.first;
} }
@@ -1115,7 +1118,7 @@ bool AndroidSdkManagerPrivate::onLicenseStdOut(const QString &output, bool notif
SdkCmdFutureInterface &fi) SdkCmdFutureInterface &fi)
{ {
m_licenseTextCache.append(output); m_licenseTextCache.append(output);
QRegularExpressionMatch assertionMatch = assertionReg.match(m_licenseTextCache); QRegularExpressionMatch assertionMatch = assertionReg->match(m_licenseTextCache);
if (assertionMatch.hasMatch()) { if (assertionMatch.hasMatch()) {
if (notify) { if (notify) {
result.stdOutput = m_licenseTextCache; result.stdOutput = m_licenseTextCache;
@@ -1143,7 +1146,8 @@ void AndroidSdkManagerPrivate::parseCommonArguments(QFutureInterface<QString> &f
QString output; QString output;
sdkManagerCommand(m_config, QStringList("--help"), &output); sdkManagerCommand(m_config, QStringList("--help"), &output);
bool foundTag = false; bool foundTag = false;
for (const QString& line : output.split('\n')) { const auto lines = output.split('\n');
for (const QString& line : lines) {
if (fi.isCanceled()) if (fi.isCanceled())
break; break;
if (foundTag) if (foundTag)

View File

@@ -28,7 +28,7 @@
namespace Android { namespace Android {
AndroidSdkPackage::AndroidSdkPackage(QVersionNumber version, QString sdkStylePathStr, AndroidSdkPackage::AndroidSdkPackage(const QVersionNumber &version, const QString &sdkStylePathStr,
QObject *parent) : QObject *parent) :
QObject(parent), QObject(parent),
m_revision(version), m_revision(version),
@@ -101,8 +101,8 @@ void AndroidSdkPackage::updatePackageDetails()
} }
SystemImage::SystemImage(QVersionNumber version, QString sdkStylePathStr, QString abi, SystemImage::SystemImage(const QVersionNumber &version, const QString &sdkStylePathStr,
SdkPlatform *platform): const QString &abi, SdkPlatform *platform):
AndroidSdkPackage(version, sdkStylePathStr, platform), AndroidSdkPackage(version, sdkStylePathStr, platform),
m_platform(platform), m_platform(platform),
m_abiName(abi) m_abiName(abi)
@@ -144,7 +144,8 @@ void SystemImage::setApiLevel(const int apiLevel)
m_apiLevel = apiLevel; m_apiLevel = apiLevel;
} }
SdkPlatform::SdkPlatform(QVersionNumber version, QString sdkStylePathStr, int api, QObject *parent) : SdkPlatform::SdkPlatform(const QVersionNumber &version, const QString &sdkStylePathStr,
int api, QObject *parent) :
AndroidSdkPackage(version, sdkStylePathStr, parent), AndroidSdkPackage(version, sdkStylePathStr, parent),
m_apiLevel(api) m_apiLevel(api)
{ {
@@ -216,8 +217,9 @@ SystemImageList SdkPlatform::systemImages(PackageState state) const
}); });
} }
BuildTools::BuildTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent): BuildTools::BuildTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
AndroidSdkPackage(revision, sdkStylePathStr, parent) QObject *parent)
: AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -231,8 +233,8 @@ AndroidSdkPackage::PackageType BuildTools::type() const
return AndroidSdkPackage::BuildToolsPackage; return AndroidSdkPackage::BuildToolsPackage;
} }
SdkTools::SdkTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent): SdkTools::SdkTools(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent)
AndroidSdkPackage(revision, sdkStylePathStr, parent) : AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -247,8 +249,9 @@ AndroidSdkPackage::PackageType SdkTools::type() const
return AndroidSdkPackage::SdkToolsPackage; return AndroidSdkPackage::SdkToolsPackage;
} }
PlatformTools::PlatformTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent): PlatformTools::PlatformTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
AndroidSdkPackage(revision, sdkStylePathStr, parent) QObject *parent)
: AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -263,8 +266,9 @@ AndroidSdkPackage::PackageType PlatformTools::type() const
return AndroidSdkPackage::PlatformToolsPackage; return AndroidSdkPackage::PlatformToolsPackage;
} }
EmulatorTools::EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent): EmulatorTools::EmulatorTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
AndroidSdkPackage(revision, sdkStylePathStr, parent) QObject *parent)
: AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -279,8 +283,9 @@ AndroidSdkPackage::PackageType EmulatorTools::type() const
return AndroidSdkPackage::EmulatorToolsPackage; return AndroidSdkPackage::EmulatorToolsPackage;
} }
ExtraTools::ExtraTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent) : ExtraTools::ExtraTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
AndroidSdkPackage(revision, sdkStylePathStr, parent) QObject *parent)
: AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -294,8 +299,8 @@ AndroidSdkPackage::PackageType ExtraTools::type() const
return AndroidSdkPackage::ExtraToolsPackage; return AndroidSdkPackage::ExtraToolsPackage;
} }
Ndk::Ndk(QVersionNumber revision, QString sdkStylePathStr, QObject *parent) : Ndk::Ndk(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent)
AndroidSdkPackage(revision, sdkStylePathStr, parent) : AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }
@@ -309,8 +314,9 @@ AndroidSdkPackage::PackageType Ndk::type() const
return AndroidSdkPackage::NDKPackage; return AndroidSdkPackage::NDKPackage;
} }
GenericSdkPackage::GenericSdkPackage(QVersionNumber revision, QString sdkStylePathStr, QObject *parent) : GenericSdkPackage::GenericSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
AndroidSdkPackage(revision, sdkStylePathStr, parent) QObject *parent)
: AndroidSdkPackage(revision, sdkStylePathStr, parent)
{ {
} }

View File

@@ -68,7 +68,8 @@ public:
AnyValidState = Installed | Available AnyValidState = Installed | Available
}; };
AndroidSdkPackage(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); AndroidSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
~AndroidSdkPackage() override = default; ~AndroidSdkPackage() override = default;
virtual bool isValid() const = 0; virtual bool isValid() const = 0;
@@ -107,7 +108,7 @@ class SystemImage : public AndroidSdkPackage
{ {
Q_OBJECT Q_OBJECT
public: public:
SystemImage(QVersionNumber revision, QString sdkStylePathStr, QString abi, SystemImage(const QVersionNumber &revision, const QString &sdkStylePathStr, const QString &abi,
SdkPlatform *platform = nullptr); SdkPlatform *platform = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
@@ -132,7 +133,7 @@ class SdkPlatform : public AndroidSdkPackage
{ {
Q_OBJECT Q_OBJECT
public: public:
SdkPlatform(QVersionNumber revision, QString sdkStylePathStr, int api, SdkPlatform(const QVersionNumber &revision, const QString &sdkStylePathStr, int api,
QObject *parent = nullptr); QObject *parent = nullptr);
~SdkPlatform() override; ~SdkPlatform() override;
@@ -158,7 +159,8 @@ using SdkPlatformList = QList<SdkPlatform*>;
class BuildTools : public AndroidSdkPackage class BuildTools : public AndroidSdkPackage
{ {
public: public:
BuildTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); BuildTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:
@@ -169,7 +171,8 @@ public:
class PlatformTools : public AndroidSdkPackage class PlatformTools : public AndroidSdkPackage
{ {
public: public:
PlatformTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); PlatformTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:
@@ -180,7 +183,8 @@ public:
class EmulatorTools : public AndroidSdkPackage class EmulatorTools : public AndroidSdkPackage
{ {
public: public:
EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); EmulatorTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:
@@ -191,7 +195,8 @@ public:
class SdkTools : public AndroidSdkPackage class SdkTools : public AndroidSdkPackage
{ {
public: public:
SdkTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); SdkTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:
@@ -202,7 +207,7 @@ public:
class Ndk : public AndroidSdkPackage class Ndk : public AndroidSdkPackage
{ {
public: public:
Ndk(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); Ndk(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
bool isValid() const override; bool isValid() const override;
@@ -213,7 +218,8 @@ using NdkList = QList<Ndk *>;
class ExtraTools : public AndroidSdkPackage class ExtraTools : public AndroidSdkPackage
{ {
public: public:
ExtraTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); ExtraTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:
@@ -224,7 +230,8 @@ public:
class GenericSdkPackage : public AndroidSdkPackage class GenericSdkPackage : public AndroidSdkPackage
{ {
public: public:
GenericSdkPackage(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); GenericSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
QObject *parent = nullptr);
// AndroidSdkPackage Overrides // AndroidSdkPackage Overrides
public: public:

View File

@@ -148,7 +148,7 @@ void AndroidServiceWidget::AndroidServiceModel::addService()
service.setNewService(true); service.setNewService(true);
m_services.push_back(service); m_services.push_back(service);
endInsertRows(); endInsertRows();
invalidDataChanged(); emit invalidDataChanged();
} }
void AndroidServiceWidget::AndroidServiceModel::removeService(int row) void AndroidServiceWidget::AndroidServiceModel::removeService(int row)
@@ -298,11 +298,11 @@ bool AndroidServiceWidget::AndroidServiceModel::setData(const QModelIndex &index
m_services[index.row()].setRunInExternalProcess((value == Qt::Checked) ? true : false); m_services[index.row()].setRunInExternalProcess((value == Qt::Checked) ? true : false);
else if (index.column() == 3) else if (index.column() == 3)
m_services[index.row()].setRunInExternalLibrary((value == Qt::Checked) ? true : false); m_services[index.row()].setRunInExternalLibrary((value == Qt::Checked) ? true : false);
dataChanged(createIndex(index.row(), 0), createIndex(index.row(), 5)); emit dataChanged(createIndex(index.row(), 0), createIndex(index.row(), 5));
if (m_services[index.row()].isValid()) if (m_services[index.row()].isValid())
validDataChanged(); emit validDataChanged();
else else
invalidDataChanged(); emit invalidDataChanged();
} else if (role == Qt::EditRole) { } else if (role == Qt::EditRole) {
if (index.column() == 0) { if (index.column() == 0) {
QString className = value.toString(); QString className = value.toString();
@@ -317,11 +317,11 @@ bool AndroidServiceWidget::AndroidServiceModel::setData(const QModelIndex &index
} else if (index.column() == 5) { } else if (index.column() == 5) {
m_services[index.row()].setServiceArguments(value.toString()); m_services[index.row()].setServiceArguments(value.toString());
} }
dataChanged(index, index); emit dataChanged(index, index);
if (m_services[index.row()].isValid()) if (m_services[index.row()].isValid())
validDataChanged(); emit validDataChanged();
else else
invalidDataChanged(); emit invalidDataChanged();
} }
return true; return true;
} }
@@ -357,9 +357,9 @@ AndroidServiceWidget::AndroidServiceWidget(QWidget *parent) : QWidget(parent),
m_removeButton->setEnabled(true); m_removeButton->setEnabled(true);
}); });
connect(m_model.data(), &AndroidServiceWidget::AndroidServiceModel::validDataChanged, connect(m_model.data(), &AndroidServiceWidget::AndroidServiceModel::validDataChanged,
[this] {servicesModified();}); [this] { emit servicesModified(); });
connect(m_model.data(), &AndroidServiceWidget::AndroidServiceModel::invalidDataChanged, connect(m_model.data(), &AndroidServiceWidget::AndroidServiceModel::invalidDataChanged,
[this] {servicesInvalid();}); [this] { emit servicesInvalid(); });
} }
AndroidServiceWidget::~AndroidServiceWidget() AndroidServiceWidget::~AndroidServiceWidget()
@@ -394,7 +394,7 @@ void AndroidServiceWidget::removeService()
for (const auto &x : selections) { for (const auto &x : selections) {
m_model->removeService(x.row()); m_model->removeService(x.row());
m_removeButton->setEnabled(false); m_removeButton->setEnabled(false);
servicesModified(); emit servicesModified();
break; break;
} }
} }

View File

@@ -298,8 +298,8 @@ void AndroidSettingsWidget::showEvent(QShowEvent *event)
validateJdk(); validateJdk();
// Reloading SDK packages (force) is still synchronous. Use zero timer // Reloading SDK packages (force) is still synchronous. Use zero timer
// to let settings dialog open first. // to let settings dialog open first.
QTimer::singleShot(0, std::bind(&AndroidSdkManager::reloadPackages, QTimer::singleShot(0, &m_sdkManager, std::bind(&AndroidSdkManager::reloadPackages,
&m_sdkManager, false)); &m_sdkManager, false));
validateOpenSsl(); validateOpenSsl();
m_isInitialReloadDone = true; m_isInitialReloadDone = true;
} }
@@ -308,12 +308,14 @@ void AndroidSettingsWidget::showEvent(QShowEvent *event)
void AndroidSettingsWidget::updateNdkList() void AndroidSettingsWidget::updateNdkList()
{ {
m_ui.ndkListWidget->clear(); m_ui.ndkListWidget->clear();
for (const Ndk *ndk : m_sdkManager.installedNdkPackages()) { const auto installedPkgs = m_sdkManager.installedNdkPackages();
for (const Ndk *ndk : installedPkgs) {
m_ui.ndkListWidget->addItem(new QListWidgetItem(Icons::LOCKED.icon(), m_ui.ndkListWidget->addItem(new QListWidgetItem(Icons::LOCKED.icon(),
ndk->installedLocation().toString())); ndk->installedLocation().toString()));
} }
for (const QString &ndk : m_androidConfig.getCustomNdkList()) { const auto customNdks = m_androidConfig.getCustomNdkList();
for (const QString &ndk : customNdks) {
if (m_androidConfig.isValidNdk(ndk)) { if (m_androidConfig.isValidNdk(ndk)) {
m_ui.ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndk)); m_ui.ndkListWidget->addItem(new QListWidgetItem(Icons::UNLOCKED.icon(), ndk));
} else { } else {
@@ -730,6 +732,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent)
connect(gitCloner, connect(gitCloner,
QOverload<int, QtcProcess::ExitStatus>::of(&QtcProcess::finished), QOverload<int, QtcProcess::ExitStatus>::of(&QtcProcess::finished),
m_ui.openSslPathChooser,
[=](int exitCode, QProcess::ExitStatus exitStatus) { [=](int exitCode, QProcess::ExitStatus exitStatus) {
openSslProgressDialog->close(); openSslProgressDialog->close();
validateOpenSsl(); validateOpenSsl();

View File

@@ -47,18 +47,21 @@ namespace Internal {
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
static const QHash<QString, Abi> ClangTargets = { using ClangTargetsType = QHash<QString, Abi>;
{"arm-linux-androideabi", Q_GLOBAL_STATIC_WITH_ARGS(ClangTargetsType, ClangTargets, ({
Abi(Abi::ArmArchitecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 32)}, {"arm-linux-androideabi",
{"i686-linux-android", Abi(Abi::ArmArchitecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 32)},
Abi(Abi::X86Architecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 32)}, {"i686-linux-android",
{"x86_64-linux-android", Abi(Abi::X86Architecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 32)},
Abi(Abi::X86Architecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 64)}, {"x86_64-linux-android",
{"aarch64-linux-android", Abi(Abi::X86Architecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 64)},
Abi(Abi::ArmArchitecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 64)}}; {"aarch64-linux-android",
Abi(Abi::ArmArchitecture, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, 64)}}
));
static const QList<Utils::Id> LanguageIds = {ProjectExplorer::Constants::CXX_LANGUAGE_ID, Q_GLOBAL_STATIC_WITH_ARGS(QList<Utils::Id>, LanguageIds, (
ProjectExplorer::Constants::C_LANGUAGE_ID}; {ProjectExplorer::Constants::CXX_LANGUAGE_ID,
ProjectExplorer::Constants::C_LANGUAGE_ID}))
static ToolChain *findToolChain(Utils::FilePath &compilerPath, Utils::Id lang, const QString &target, static ToolChain *findToolChain(Utils::FilePath &compilerPath, Utils::Id lang, const QString &target,
const ToolChainList &alreadyKnown) const ToolChainList &alreadyKnown)
@@ -66,7 +69,7 @@ static ToolChain *findToolChain(Utils::FilePath &compilerPath, Utils::Id lang, c
ToolChain * tc = Utils::findOrDefault(alreadyKnown, [target, compilerPath, lang](ToolChain *tc) { ToolChain * tc = Utils::findOrDefault(alreadyKnown, [target, compilerPath, lang](ToolChain *tc) {
return tc->typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID return tc->typeId() == Constants::ANDROID_TOOLCHAIN_TYPEID
&& tc->language() == lang && tc->language() == lang
&& tc->targetAbi() == ClangTargets[target] && tc->targetAbi() == ClangTargets->value(target)
&& tc->compilerCommand() == compilerPath; && tc->compilerCommand() == compilerPath;
}); });
return tc; return tc;
@@ -148,7 +151,7 @@ FilePath AndroidToolChain::makeCommand(const Environment &env) const
GccToolChain::DetectedAbisResult AndroidToolChain::detectSupportedAbis() const GccToolChain::DetectedAbisResult AndroidToolChain::detectSupportedAbis() const
{ {
for (auto itr = ClangTargets.constBegin();itr != ClangTargets.constEnd(); ++itr) { for (auto itr = ClangTargets->constBegin(); itr != ClangTargets->constEnd(); ++itr) {
if (itr.value() == targetAbi()) if (itr.value() == targetAbi())
return GccToolChain::DetectedAbisResult({targetAbi()}, itr.key()); return GccToolChain::DetectedAbisResult({targetAbi()}, itr.key());
} }
@@ -216,7 +219,7 @@ ToolChainList AndroidToolChainFactory::autodetectToolChainsFromNdks(
continue; continue;
} }
for (const Utils::Id &lang : LanguageIds) { for (const Utils::Id &lang : *LanguageIds) {
FilePath compilerCommand = clangPath; FilePath compilerCommand = clangPath;
if (lang == ProjectExplorer::Constants::CXX_LANGUAGE_ID) if (lang == ProjectExplorer::Constants::CXX_LANGUAGE_ID)
compilerCommand = clangPlusPlusPath(clangPath); compilerCommand = clangPlusPlusPath(clangPath);
@@ -227,8 +230,8 @@ ToolChainList AndroidToolChainFactory::autodetectToolChainsFromNdks(
continue; continue;
} }
auto targetItr = ClangTargets.constBegin(); auto targetItr = ClangTargets->constBegin();
while (targetItr != ClangTargets.constEnd()) { while (targetItr != ClangTargets->constEnd()) {
const Abi &abi = targetItr.value(); const Abi &abi = targetItr.value();
const QString target = targetItr.key(); const QString target = targetItr.key();
ToolChain *tc = findToolChain(compilerCommand, lang, target, alreadyKnown); ToolChain *tc = findToolChain(compilerCommand, lang, target, alreadyKnown);
@@ -249,7 +252,7 @@ ToolChainList AndroidToolChainFactory::autodetectToolChainsFromNdks(
atc->setNdkLocation(ndkLocation); atc->setNdkLocation(ndkLocation);
atc->setOriginalTargetTriple(target); atc->setOriginalTargetTriple(target);
atc->setLanguage(lang); atc->setLanguage(lang);
atc->setTargetAbi(ClangTargets[target]); atc->setTargetAbi(ClangTargets->value(target));
atc->setPlatformCodeGenFlags({"-target", target}); atc->setPlatformCodeGenFlags({"-target", target});
atc->setPlatformLinkerFlags({"-target", target}); atc->setPlatformLinkerFlags({"-target", target});
atc->setDisplayName(displayName); atc->setDisplayName(displayName);

View File

@@ -142,7 +142,8 @@ void AvdDialog::parseDeviceDefinitionsList()
QStringList avdDeviceInfo; QStringList avdDeviceInfo;
for (const QString &line : output.split('\n')) { const auto lines = output.split('\n');
for (const QString &line : lines) {
if (line.startsWith("---------") || line.isEmpty()) { if (line.startsWith("---------") || line.isEmpty()) {
DeviceDefinitionStruct deviceDefinition; DeviceDefinitionStruct deviceDefinition;
for (const QString &line : avdDeviceInfo) { for (const QString &line : avdDeviceInfo) {

View File

@@ -144,7 +144,8 @@ AndroidDeviceInfoList parseAvdList(const QString &output, QStringList *avdErrorP
return AvdResult(); return AvdResult();
}; };
for (const QString &line : output.split('\n')) { const auto lines = output.split('\n');
for (const QString &line : lines) {
if (line.startsWith("---------") || line.isEmpty()) { if (line.startsWith("---------") || line.isEmpty()) {
const AvdResult result = parseAvdInfo(avdInfo); const AvdResult result = parseAvdInfo(avdInfo);
if (auto info = Utils::get_if<AndroidDeviceInfo>(&result)) if (auto info = Utils::get_if<AndroidDeviceInfo>(&result))

View File

@@ -46,19 +46,19 @@ namespace Android {
namespace Internal { namespace Internal {
namespace { namespace {
const QString extraExtraExtraHighDpiImagePath = QLatin1String("/res/drawable-xxxhdpi/"); const char extraExtraExtraHighDpiImagePath[] = "/res/drawable-xxxhdpi/";
const QString extraExtraHighDpiImagePath = QLatin1String("/res/drawable-xxhdpi/"); const char extraExtraHighDpiImagePath[] = "/res/drawable-xxhdpi/";
const QString extraHighDpiImagePath = QLatin1String("/res/drawable-xhdpi/"); const char extraHighDpiImagePath[] = "/res/drawable-xhdpi/";
const QString highDpiImagePath = QLatin1String("/res/drawable-hdpi/"); const char highDpiImagePath[] = "/res/drawable-hdpi/";
const QString mediumDpiImagePath = QLatin1String("/res/drawable-mdpi/"); const char mediumDpiImagePath[] = "/res/drawable-mdpi/";
const QString lowDpiImagePath = QLatin1String("/res/drawable-ldpi/"); const char lowDpiImagePath[] = "/res/drawable-ldpi/";
const QString splashscreenName = QLatin1String("splashscreen"); const char splashscreenName[] = "splashscreen";
const QString splashscreenPortraitName = QLatin1String("splashscreen_port"); const char splashscreenPortraitName[] = "splashscreen_port";
const QString splashscreenLandscapeName = QLatin1String("splashscreen_land"); const char splashscreenLandscapeName[] = "splashscreen_land";
const QString splashscreenFileName = QLatin1String("logo"); const char splashscreenFileName[] = "logo";
const QString splashscreenPortraitFileName = QLatin1String("logo_port"); const char splashscreenPortraitFileName[] = "logo_port";
const QString splashscreenLandscapeFileName = QLatin1String("logo_land"); const char splashscreenLandscapeFileName[] = "logo_land";
const QString imageSuffix = QLatin1String(".png"); const char imageSuffix[] = ".png";
const QString fileDialogImageFiles = QString(QWidget::tr("Images (*.png *.jpg)")); const QString fileDialogImageFiles = QString(QWidget::tr("Images (*.png *.jpg)"));
const QSize lowDpiImageSize{200, 320}; const QSize lowDpiImageSize{200, 320};
const QSize mediumDpiImageSize{320, 480}; const QSize mediumDpiImageSize{320, 480};
@@ -295,12 +295,16 @@ SplashScreenContainerWidget::SplashScreenContainerWidget(
noSplashscreenWidget->setLayout(noSplashscreenLayout); noSplashscreenWidget->setLayout(noSplashscreenLayout);
addWidget(noSplashscreenWidget); addWidget(noSplashscreenWidget);
const auto splashFileName = QString(splashscreenFileName).append(imageSuffix);
const auto portraitSplashFileName = QString(splashscreenPortraitFileName).append(imageSuffix);
const auto landscapeSplashFileName = QString(splashscreenLandscapeFileName).append(imageSuffix);
for (auto &&imageWidget : m_imageWidgets) for (auto &&imageWidget : m_imageWidgets)
imageWidget->setImageFileName(splashscreenFileName + imageSuffix); imageWidget->setImageFileName(splashFileName);
for (auto &&imageWidget : m_portraitImageWidgets) for (auto &&imageWidget : m_portraitImageWidgets)
imageWidget->setImageFileName(splashscreenPortraitFileName + imageSuffix); imageWidget->setImageFileName(portraitSplashFileName);
for (auto &&imageWidget : m_landscapeImageWidgets) for (auto &&imageWidget : m_landscapeImageWidgets)
imageWidget->setImageFileName(splashscreenLandscapeFileName + imageSuffix); imageWidget->setImageFileName(landscapeSplashFileName);
for (auto &&imageWidget : m_imageWidgets) { for (auto &&imageWidget : m_imageWidgets) {
connect(imageWidget, &SplashScreenWidget::imageChanged, [this]() { connect(imageWidget, &SplashScreenWidget::imageChanged, [this]() {