From fa7b906c444012e84cfcdfd7046061c117fbcd7f Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 29 Oct 2019 22:18:36 +0300 Subject: [PATCH] allow dynamic plugins installation via advertiser GitOrigin-RevId: 6dcd1ef37b4e30915c2133c67a97b72fe5cf202c --- .../intellij/ide/plugins/PluginInstaller.java | 19 ++++++++++++++++++- .../ide/plugins/PluginManagerMain.java | 14 ++++++++++++-- .../PluginsAdvertiserDialog.java | 13 ++++++++++--- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.java index 25f05161e705..fc74f7cece47 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstaller.java @@ -4,6 +4,7 @@ package com.intellij.ide.plugins; import com.intellij.CommonBundle; import com.intellij.ide.startup.StartupActionScriptManager; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.ApplicationInfoEx; @@ -54,11 +55,27 @@ public class PluginInstaller { public static boolean prepareToInstall(List pluginsToInstall, List allPlugins, + boolean allowInstallWithoutRestart, PluginManagerMain.PluginEnabler pluginEnabler, + Runnable onSuccess, @NotNull ProgressIndicator indicator) { PluginInstallOperation operation = new PluginInstallOperation(pluginsToInstall, allPlugins, pluginEnabler, indicator); + operation.setAllowInstallWithoutRestart(allowInstallWithoutRestart); operation.run(); - return operation.isSuccess(); + boolean success = operation.isSuccess(); + if (success) { + ApplicationManager.getApplication().invokeLater(() -> { + if (allowInstallWithoutRestart) { + for (PendingDynamicPluginInstall install : operation.getPendingDynamicPluginInstalls()) { + installAndLoadDynamicPlugin(install.getFile(), null, install.getPluginDescriptor()); + } + } + if (onSuccess != null) { + onSuccess.run(); + } + }); + } + return success; } /** diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java index 0c0180ceb67c..9e9e27433d6e 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java @@ -27,6 +27,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.scale.JBUIScale; import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.XmlStringUtil; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -87,6 +88,7 @@ public abstract class PluginManagerMain { /** * @deprecated use {@link #downloadPlugins(List, List, Runnable, PluginEnabler, Runnable)} instead */ + @ApiStatus.ScheduledForRemoval(inVersion = "2020.2") @Deprecated public static boolean downloadPlugins(List plugins, List allPlugins, @@ -104,14 +106,22 @@ public abstract class PluginManagerMain { Runnable onSuccess, PluginEnabler pluginEnabler, @Nullable Runnable cleanup) throws IOException { + return downloadPlugins(plugins, allPlugins, false, onSuccess, pluginEnabler, cleanup); + } + + public static boolean downloadPlugins(List plugins, + List allPlugins, + boolean allowInstallWithoutRestart, + Runnable onSuccess, + PluginEnabler pluginEnabler, + @Nullable Runnable cleanup) throws IOException { boolean[] result = new boolean[1]; try { ProgressManager.getInstance().run(new Task.Backgroundable(null, IdeBundle.message("progress.download.plugins"), true, PluginManagerUISettings.getInstance()) { @Override public void run(@NotNull ProgressIndicator indicator) { try { - if (PluginInstaller.prepareToInstall(plugins, allPlugins, pluginEnabler, indicator)) { - ApplicationManager.getApplication().invokeLater(onSuccess); + if (PluginInstaller.prepareToInstall(plugins, allPlugins, allowInstallWithoutRestart, pluginEnabler, onSuccess, indicator)) { result[0] = true; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java index 1093bb4f904e..83bc15b4468c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java @@ -1,7 +1,10 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.updateSettings.impl.pluginsAdvertisement; -import com.intellij.ide.plugins.*; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManagerCore; +import com.intellij.ide.plugins.PluginManagerMain; +import com.intellij.ide.plugins.PluginNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; @@ -74,13 +77,17 @@ public class PluginsAdvertiserDialog extends DialogWrapper { PluginManagerMain.suggestToEnableInstalledDependantPlugins(pluginHelper, nodes); - final Runnable notifyRunnable = () -> PluginManagerMain.notifyPluginsUpdated(myProject); + Runnable notifyRunnable = () -> { + if (nodes.stream().anyMatch(o -> PluginManagerCore.getPlugin(o.getPluginId()) == null)) { + PluginManagerMain.notifyPluginsUpdated(myProject); + } + }; for (String pluginId : pluginsToEnable) { PluginManagerCore.enablePlugin(pluginId); } if (!nodes.isEmpty()) { try { - PluginManagerMain.downloadPlugins(nodes, myAllPlugins, notifyRunnable, pluginHelper, null); + PluginManagerMain.downloadPlugins(nodes, myAllPlugins, true, notifyRunnable, pluginHelper, null); } catch (IOException e) { LOG.error(e);