From a4be1e8b669d115cc2032b6427e744b77df2da6b Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Mon, 23 Mar 2020 14:40:37 +0100 Subject: [PATCH] Android: Check for usable JDK version in settings sdkmanager only works with version 8 of JDK specifically. We should warn the user if a different version is used. Task-number: QTBUG-79664 Change-Id: I5be8d068e4ec119453654adda1a684dc65b4c631 Reviewed-by: Christian Stenger Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidsettingswidget.cpp | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index bc1548caa98..d7c136fd7b1 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -38,11 +38,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -155,7 +157,8 @@ private: enum JavaValidation { JavaPathExistsRow, - JavaJdkValidRow + JavaJdkValidRow, + JavaJdkValidVersionRow }; enum AndroidValidation { @@ -429,6 +432,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() QMap javaValidationPoints; javaValidationPoints[JavaPathExistsRow] = tr("JDK path exists."); javaValidationPoints[JavaJdkValidRow] = tr("JDK path is a valid JDK root folder."); + javaValidationPoints[JavaJdkValidVersionRow] = tr("Working JDK version (8) detected."); auto javaSummary = new SummaryWidget(javaValidationPoints, tr("Java Settings are OK."), tr("Java settings have errors."), m_ui->javaDetailsWidget); m_ui->javaDetailsWidget->setWidget(javaSummary); @@ -625,6 +629,25 @@ void AndroidSettingsWidget::validateJdk() const Utils::FilePath bin = m_androidConfig.openJDKLocation().pathAppended("bin/javac" QTC_HOST_EXE_SUFFIX); summaryWidget->setPointValid(JavaJdkValidRow, jdkPathExists && bin.exists()); + + bool jdkVersionCorrect = false; + Utils::SynchronousProcess javacProcess; + const int timeoutS = 5; + javacProcess.setTimeoutS(timeoutS); + const Utils::CommandLine cmd(bin, {"-version"}); + Utils::SynchronousProcessResponse response = javacProcess.runBlocking(cmd); + if (response.result == Utils::SynchronousProcessResponse::Finished) { + QString output = response.stdOut(); // JDK 14 uses stdOut for this output. + if (output.isEmpty()) + output = response.stdErr(); // JDK 8 uses stdErr for this output. + if (output.startsWith("javac ")) { + const QVersionNumber javacVersion = QVersionNumber::fromString(output.mid(6)); + if (QVersionNumber(1, 8).isPrefixOf(javacVersion)) + jdkVersionCorrect = true; + } + } + summaryWidget->setPointValid(JavaJdkValidVersionRow, jdkVersionCorrect); + updateUI(); }