aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/android/androidsdkmanager.cpp
diff options
context:
space:
mode:
authorJarek Kobus <[email protected]>2024-04-30 18:27:12 +0200
committerJarek Kobus <[email protected]>2024-05-03 12:07:40 +0000
commit5984e0f073f20c45628f0224cf11f8e638364b4c (patch)
tree75b12fd53c6f117700b756b14f600ff9b98bfe01 /src/plugins/android/androidsdkmanager.cpp
parent15e3d26c86f1708d2bbf2972cde5697ca0792a20 (diff)
Android: Add installationRecipe
Change-Id: Icfbb4feadd62aa922e2e1956a64485e9f7139aa9 Reviewed-by: Alessandro Portale <[email protected]>
Diffstat (limited to 'src/plugins/android/androidsdkmanager.cpp')
-rw-r--r--src/plugins/android/androidsdkmanager.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp
index bccc0ad1454..13cc38a01cc 100644
--- a/src/plugins/android/androidsdkmanager.cpp
+++ b/src/plugins/android/androidsdkmanager.cpp
@@ -229,6 +229,82 @@ static GroupItem licensesRecipe(const Storage<DialogStorage> &dialogStorage)
return Group { outputStorage, ProcessTask(onLicenseSetup) };
}
+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()});
+ QObject::connect(process, &Process::readyReadStandardOutput, dialog,
+ [process, dialog, current, total] {
+ QTextCodec *codec = QTextCodec::codecForLocale();
+ const auto progress = parseProgress(codec->toUnicode(process->readAllRawStandardOutput()));
+ if (!progress)
+ return;
+ dialog->setProgress((current * 100.0 + *progress) / total);
+ });
+};
+
+static GroupItem installationRecipe(const Storage<DialogStorage> &dialogStorage,
+ const InstallationChange &change)
+{
+ const auto onSetup = [dialogStorage] {
+ dialogStorage->m_dialog->appendMessage(
+ Tr::tr("Installing / Uninstalling selected packages...") + '\n', NormalMessageFormat);
+ const QString optionsMessage = HostOsInfo::isMacHost()
+ ? Tr::tr("Closing the preferences dialog will cancel the running and scheduled SDK "
+ "operations.")
+ : Tr::tr("Closing the options dialog will cancel the running and scheduled SDK "
+ "operations.");
+ dialogStorage->m_dialog->appendMessage(optionsMessage + '\n', LogMessageFormat);
+ };
+
+ 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())};
+ QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
+ setupSdkProcess(args, &process, dialog, uninstallIterator.iteration(), total);
+ dialog->appendMessage(Tr::tr("Uninstalling %1...").arg(*uninstallIterator) + '\n',
+ StdOutFormat);
+ dialog->setProgress(uninstallIterator.iteration() * 100.0 / total);
+ };
+
+ 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())};
+ QuestionProgressDialog *dialog = dialogStorage->m_dialog.get();
+ setupSdkProcess(args, &process, dialog, offset + installIterator.iteration(), total);
+ dialog->appendMessage(Tr::tr("Installing %1...").arg(*installIterator) + '\n',
+ StdOutFormat);
+ dialog->setProgress((offset + installIterator.iteration()) * 100.0 / total);
+ };
+
+ const auto onDone = [dialogStorage](DoneWith result) {
+ if (result == DoneWith::Success) {
+ dialogStorage->m_dialog->appendMessage(Tr::tr("Finished successfully") + "\n\n",
+ StdOutFormat);
+ } else {
+ dialogStorage->m_dialog->appendMessage(Tr::tr("Failed") + "\n\n", StdErrFormat);
+ }
+ };
+
+ return Group {
+ onGroupSetup(onSetup),
+ Group {
+ finishAllAndSuccess,
+ uninstallIterator,
+ ProcessTask(onUninstallSetup, onDone)
+ },
+ Group {
+ finishAllAndSuccess,
+ installIterator,
+ ProcessTask(onInstallSetup, onDone)
+ }
+ };
+}
+
const int sdkManagerCmdTimeoutS = 60;
const int sdkManagerOperationTimeoutS = 600;