diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index 28837ca8d4e..c9512b464a9 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -24,13 +24,13 @@ ****************************************************************************/ #include "androidsdkdownloader.h" -#include "utils/filepath.h" -#include "utils/qtcprocess.h" + +#include +#include + #include #include -#include -#include #include #include @@ -61,22 +61,7 @@ void AndroidSdkDownloader::sslErrors(const QList &sslErrors) } #endif -static void setSdkFilesExecPermission( const FilePath &sdkExtractPath) -{ - const FilePath filePath = sdkExtractPath / "tools"; - - filePath.iterateDirectory( - [](const FilePath &filePath) { - if (!filePath.fileName().contains('.')) { - QFlags currentPermissions = filePath.permissions(); - filePath.setPermissions(currentPermissions | QFileDevice::ExeOwner); - } - return true; - }, - {{"*"}, QDir::Files, QDirIterator::Subdirectories}); -} - -void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) +void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &sdkExtractPath) { if (m_androidConfig.sdkToolsUrl().isEmpty()) { logError(tr("The SDK Tools download URL is empty.")); @@ -103,34 +88,16 @@ void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const connect(m_progressDialog, &QProgressDialog::canceled, this, &AndroidSdkDownloader::cancel); - connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, jdkPath, sdkExtractPath]() { - if (extractSdk(jdkPath, sdkExtractPath)) { - setSdkFilesExecPermission(sdkExtractPath); - emit sdkExtracted(); + connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, sdkExtractPath]() { + if (Archive *archive = Archive::unarchive(m_sdkFilename, sdkExtractPath)) { + connect(archive, &Archive::finished, [this, sdkExtractPath](bool success){ + if (success) + emit sdkExtracted(); + }); } }); } -bool AndroidSdkDownloader::extractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) -{ - QDir sdkDir = sdkExtractPath.toDir(); - if (!sdkDir.exists()) { - if (!sdkDir.mkpath(".")) { - logError(QString(tr("Could not create the SDK folder %1.")) - .arg(sdkExtractPath.toUserOutput())); - return false; - } - } - - QtcProcess jarExtractProc; - jarExtractProc.setWorkingDirectory(sdkExtractPath); - FilePath jarCmdPath(jdkPath / "/bin/jar"); - jarExtractProc.setCommand({jarCmdPath, {"xf", m_sdkFilename.path()}}); - jarExtractProc.runBlocking(); - - return jarExtractProc.exitCode() ? false : true; -} - bool AndroidSdkDownloader::verifyFileIntegrity() { QFile f(m_sdkFilename.toString()); @@ -170,7 +137,7 @@ void AndroidSdkDownloader::logError(const QString &error) emit sdkDownloaderError(error); } -QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) +FilePath AndroidSdkDownloader::getSaveFilename(const QUrl &url) { QString path = url.path(); QString basename = QFileInfo(path).fileName(); @@ -186,9 +153,8 @@ QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) basename += QString::number(i); } - QString fullPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) - + QDir::separator() + basename; - return fullPath; + return FilePath::fromString(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)) + / basename; } bool AndroidSdkDownloader::saveToDisk(const FilePath &filename, QIODevice *data) @@ -223,7 +189,7 @@ void AndroidSdkDownloader::downloadFinished(QNetworkReply *reply) if (isHttpRedirect(reply)) { cancelWithError(QString(tr("Download from %1 was redirected.")).arg(url.toString())); } else { - m_sdkFilename = FilePath::fromString(getSaveFilename(url)); + m_sdkFilename = getSaveFilename(url); if (saveToDisk(m_sdkFilename, reply) && verifyFileIntegrity()) emit sdkPackageWriteFinished(); else diff --git a/src/plugins/android/androidsdkdownloader.h b/src/plugins/android/androidsdkdownloader.h index a018d3d10cd..76375132397 100644 --- a/src/plugins/android/androidsdkdownloader.h +++ b/src/plugins/android/androidsdkdownloader.h @@ -43,7 +43,7 @@ class AndroidSdkDownloader : public QObject public: AndroidSdkDownloader(); - void downloadAndExtractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); + void downloadAndExtractSdk(const Utils::FilePath &sdkExtractPath); static QString dialogTitle(); void cancel(); @@ -54,11 +54,10 @@ signals: void sdkDownloaderError(const QString &error); private: - static QString getSaveFilename(const QUrl &url); + static Utils::FilePath getSaveFilename(const QUrl &url); bool saveToDisk(const Utils::FilePath &filename, QIODevice *data); static bool isHttpRedirect(QNetworkReply *m_reply); - bool extractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); bool verifyFileIntegrity(); void cancelWithError(const QString &error); void logError(const QString &error); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index abbbe2dd871..fda3366a95f 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -712,14 +712,8 @@ void AndroidSettingsWidget::downloadSdk() .arg(m_ui.SDKLocationPathChooser->filePath().cleanPath().toUserOutput()); auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), message, QMessageBox::Yes | QMessageBox::No); - if (userInput == QMessageBox::Yes) { - if (m_androidSummary->rowsOk({JavaPathExistsAndWritableRow})) { - auto javaPath = m_ui.OpenJDKLocationPathChooser->filePath(); - m_sdkDownloader.downloadAndExtractSdk( - javaPath, - m_ui.SDKLocationPathChooser->filePath().cleanPath()); - } - } + if (userInput == QMessageBox::Yes) + m_sdkDownloader.downloadAndExtractSdk(m_ui.SDKLocationPathChooser->filePath().cleanPath()); } // AndroidSettingsPage