diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 2edcf420bbc..50ff572580a 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -768,6 +768,13 @@ bool FilePath::exists() const return !isEmpty() && QFileInfo::exists(m_data); } +/// \returns a bool indicating whether a path is writable. +bool FilePath::isWritablePath() const +{ + const QFileInfo fi{m_data}; + return exists() && fi.isDir() && fi.isWritable(); +} + /// Find the parent directory of a given directory. /// Returns an empty FilePath if the current directory is already diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index a4693ddf752..ae691fe4c32 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -82,6 +82,7 @@ public: QString fileName(int pathComponents = 0) const; bool exists() const; + bool isWritablePath() const; FilePath parentDir() const; diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 494af3065fb..d6bb4bfa96c 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -72,6 +72,7 @@ enum JavaValidation { enum AndroidValidation { SdkPathExistsRow, + SdkPathWritableRow, SdkToolsInstalledRow, PlatformToolsInstalledRow, BuildToolsInstalledRow, @@ -255,6 +256,7 @@ AndroidSettingsWidget::AndroidSettingsWidget(QWidget *parent) QMap androidValidationPoints; androidValidationPoints[SdkPathExistsRow] = tr("Android SDK path exists."); + androidValidationPoints[SdkPathWritableRow] = tr("Android SDK path writable."); androidValidationPoints[SdkToolsInstalledRow] = tr("SDK tools installed."); androidValidationPoints[PlatformToolsInstalledRow] = tr("Platform tools installed."); androidValidationPoints[BuildToolsInstalledRow] = tr("Build tools installed."); @@ -415,6 +417,7 @@ void AndroidSettingsWidget::validateSdk() { auto summaryWidget = static_cast(m_ui->androidDetailsWidget->widget()); summaryWidget->setPointValid(SdkPathExistsRow, m_androidConfig.sdkLocation().exists()); + summaryWidget->setPointValid(SdkPathWritableRow, m_androidConfig.sdkLocation().isWritablePath()); summaryWidget->setPointValid(SdkToolsInstalledRow, !m_androidConfig.sdkToolsVersion().isNull()); summaryWidget->setPointValid(PlatformToolsInstalledRow, @@ -427,7 +430,7 @@ void AndroidSettingsWidget::validateSdk() summaryWidget->setPointValid(PlatformSdkInstalledRow, !m_sdkManager->installedSdkPlatforms().isEmpty()); updateUI(); - bool sdkToolsOk = summaryWidget->rowsOk({SdkPathExistsRow, SdkToolsInstalledRow}); + bool sdkToolsOk = summaryWidget->rowsOk({SdkPathExistsRow, SdkPathWritableRow, SdkToolsInstalledRow}); bool componentsOk = summaryWidget->rowsOk({PlatformToolsInstalledRow, BuildToolsInstalledRow, PlatformSdkInstalledRow}); @@ -528,7 +531,7 @@ void AndroidSettingsWidget::updateUI() auto javaSummaryWidget = static_cast(m_ui->javaDetailsWidget->widget()); auto androidSummaryWidget = static_cast(m_ui->androidDetailsWidget->widget()); bool javaSetupOk = javaSummaryWidget->allRowsOk(); - bool sdkToolsOk = androidSummaryWidget->rowsOk({SdkPathExistsRow, SdkToolsInstalledRow}); + bool sdkToolsOk = androidSummaryWidget->rowsOk({SdkPathExistsRow, SdkPathWritableRow, SdkToolsInstalledRow}); bool androidSetupOk = androidSummaryWidget->allRowsOk(); m_ui->avdManagerTab->setEnabled(javaSetupOk && androidSetupOk);