mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IJPL-180572 Plugin state propagation improvements
GitOrigin-RevId: 26e82ef69b82af0ad2d9a29395ede41db6057414
This commit is contained in:
committed by
intellij-monorepo-bot
parent
bdd92d86cd
commit
0f067ec876
@@ -3198,7 +3198,6 @@ c:com.intellij.ide.plugins.InstalledPluginsTableModel
|
||||
- pf:sessionId:java.util.UUID
|
||||
- pf:view:java.util.List
|
||||
- <init>(com.intellij.openapi.project.Project):V
|
||||
- <init>(com.intellij.openapi.project.Project,java.util.Collection,java.util.Collection):V
|
||||
- pf:getEnabledMap():java.util.Map
|
||||
- pf:getProject():com.intellij.openapi.project.Project
|
||||
- p:handleBeforeChangeEnableState(com.intellij.ide.plugins.IdeaPluginDescriptor,com.intellij.openapi.util.Pair):V
|
||||
|
||||
@@ -214,6 +214,8 @@ com.intellij.ide.navigationToolbar.NavBarModelExtension
|
||||
- normalizeChildren():Z
|
||||
- processChildren(java.lang.Object,java.lang.Object,com.intellij.util.Processor):Z
|
||||
- uiDataSnapshot(com.intellij.openapi.actionSystem.DataSink,com.intellij.openapi.actionSystem.DataSnapshot):V
|
||||
f:com.intellij.ide.plugins.InstalledPluginsState
|
||||
- getInstalledWithoutRestartPlugins():java.util.Collection
|
||||
com.intellij.ide.plugins.PluginEnableStateChangedListener
|
||||
- a:stateChanged(java.util.Collection,Z):V
|
||||
com.intellij.ide.plugins.PluginManagerMain$PluginEnabler
|
||||
|
||||
@@ -69,6 +69,12 @@ public final class InstalledPluginsState {
|
||||
}
|
||||
}
|
||||
|
||||
public @NotNull Collection<PluginId> getInstalledWithoutRestartPlugins() {
|
||||
synchronized (myLock) {
|
||||
return Collections.unmodifiableCollection(myInstalledWithoutRestartPlugins);
|
||||
}
|
||||
}
|
||||
|
||||
public @NotNull Collection<PluginId> getUpdatedPlugins() {
|
||||
synchronized (myLock) {
|
||||
return Collections.unmodifiableCollection(myUpdatedPlugins);
|
||||
|
||||
+10
-26
@@ -2,6 +2,7 @@
|
||||
package com.intellij.ide.plugins;
|
||||
|
||||
import com.intellij.ide.IdeBundle;
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult;
|
||||
import com.intellij.ide.plugins.newui.PluginManagerSession;
|
||||
import com.intellij.ide.plugins.newui.PluginManagerSessionService;
|
||||
import com.intellij.ide.plugins.newui.PluginUiModel;
|
||||
@@ -32,28 +33,12 @@ public class InstalledPluginsTableModel {
|
||||
protected final PluginManagerSession mySession = initializeAndGetSession();
|
||||
|
||||
public InstalledPluginsTableModel(@Nullable Project project) {
|
||||
this(project, new ArrayList<>(UiPluginManager.getInstance().getPlugins()), UiPluginManager.getInstance().getInstalledPlugins());
|
||||
}
|
||||
|
||||
public InstalledPluginsTableModel(@Nullable Project project,
|
||||
@NotNull Collection<PluginUiModel> allPlugins,
|
||||
@NotNull Collection<PluginUiModel> installedPlugins) {
|
||||
myProject = project;
|
||||
ApplicationInfo appInfo = ApplicationInfo.getInstance();
|
||||
for (PluginUiModel plugin : allPlugins) {
|
||||
PluginId pluginId = plugin.getPluginId();
|
||||
if (appInfo.isEssentialPlugin(pluginId)) {
|
||||
setEnabled(pluginId, PluginEnabledState.ENABLED);
|
||||
}
|
||||
else {
|
||||
view.add(plugin);
|
||||
}
|
||||
}
|
||||
view.addAll(installedPlugins);
|
||||
|
||||
for (PluginUiModel descriptor : view) {
|
||||
setEnabled(descriptor);
|
||||
}
|
||||
InitSessionResult initSessionResult = UiPluginManager.getInstance().initSession(sessionId);
|
||||
view.addAll(initSessionResult.getVisiblePluginsList());
|
||||
initSessionResult.getPluginStates().forEach((pluginId, pluginState) -> {
|
||||
myEnabled.put(pluginId, pluginState ? PluginEnabledState.ENABLED : PluginEnabledState.DISABLED);
|
||||
});
|
||||
}
|
||||
|
||||
protected final @Nullable Project getProject() {
|
||||
@@ -64,7 +49,7 @@ public class InstalledPluginsTableModel {
|
||||
return isLoaded(pluginId, getEnabledMap());
|
||||
}
|
||||
|
||||
private PluginManagerSession initializeAndGetSession(){
|
||||
private PluginManagerSession initializeAndGetSession() {
|
||||
UiPluginManager.getInstance().createSession(sessionId);
|
||||
PluginManagerSession session = PluginManagerSessionService.getInstance().getSession(sessionId);
|
||||
if (session == null) {
|
||||
@@ -86,7 +71,7 @@ public class InstalledPluginsTableModel {
|
||||
|
||||
@ApiStatus.NonExtendable
|
||||
protected void setEnabled(@NotNull PluginId pluginId,
|
||||
@Nullable PluginEnabledState enabled) {
|
||||
@Nullable PluginEnabledState enabled) {
|
||||
myEnabled.put(pluginId, enabled);
|
||||
}
|
||||
|
||||
@@ -122,7 +107,6 @@ public class InstalledPluginsTableModel {
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected void handleBeforeChangeEnableState(@NotNull IdeaPluginDescriptor descriptor,
|
||||
@NotNull Pair<PluginEnableDisableAction, PluginEnabledState> pair) {
|
||||
}
|
||||
@@ -135,7 +119,7 @@ public class InstalledPluginsTableModel {
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static boolean isDisabled(@NotNull PluginId pluginId,
|
||||
@NotNull Map<PluginId, PluginEnabledState> enabledMap) {
|
||||
@NotNull Map<PluginId, PluginEnabledState> enabledMap) {
|
||||
PluginEnabledState state = enabledMap.get(pluginId);
|
||||
return state == null || state.isDisabled();
|
||||
}
|
||||
@@ -162,7 +146,7 @@ public class InstalledPluginsTableModel {
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static @NotNull @NonNls String getPluginNameOrId(@NotNull PluginId pluginId,
|
||||
@Nullable IdeaPluginDescriptor descriptor) {
|
||||
@Nullable IdeaPluginDescriptor descriptor) {
|
||||
return descriptor != null ? descriptor.getName() : pluginId.getIdString();
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,7 @@ object PluginManagerPanelFactory {
|
||||
)
|
||||
|
||||
val errorCheckResults = pluginManager.loadErrors(myPluginModel.sessionId.toString())
|
||||
val errors = myPluginModel.getErrors(errorCheckResults)
|
||||
val errors = MyPluginModel.getErrors(errorCheckResults)
|
||||
try {
|
||||
for (query in queries) {
|
||||
val result = pluginManager.executeMarketplaceQuery(query, 18, false)
|
||||
@@ -63,19 +63,19 @@ object PluginManagerPanelFactory {
|
||||
@ApiStatus.Internal
|
||||
fun createInstalledPanel(cs: CoroutineScope, myPluginModel: MyPluginModel, callback: (CreateInstalledPanelModel) -> Unit) {
|
||||
cs.launch {
|
||||
try {
|
||||
PluginLogo.startBatchMode()
|
||||
|
||||
val pluginManager = UiPluginManager.getInstance()
|
||||
val installedPlugins = pluginManager.getInstalledPlugins()
|
||||
val visiblePlugins = pluginManager.getVisiblePlugins(Registry.`is`("plugins.show.implementation.details"))
|
||||
val errorCheckResults = pluginManager.loadErrors(myPluginModel.sessionId.toString())
|
||||
val errors = myPluginModel.getErrors(errorCheckResults)
|
||||
withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) {
|
||||
val pluginManager = UiPluginManager.getInstance()
|
||||
val installedPlugins = pluginManager.getInstalledPlugins()
|
||||
val visiblePlugins = pluginManager.getVisiblePlugins(Registry.`is`("plugins.show.implementation.details"))
|
||||
val errorCheckResults = pluginManager.loadErrors(myPluginModel.sessionId.toString())
|
||||
val errors = MyPluginModel.getErrors(errorCheckResults)
|
||||
withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) {
|
||||
try {
|
||||
PluginLogo.startBatchMode()
|
||||
callback(CreateInstalledPanelModel(installedPlugins, visiblePlugins, errors))
|
||||
}
|
||||
} finally {
|
||||
PluginLogo.endBatchMode()
|
||||
finally {
|
||||
PluginLogo.endBatchMode()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -2,6 +2,7 @@
|
||||
package com.intellij.ide.plugins.marketplace
|
||||
|
||||
import com.intellij.openapi.extensions.PluginId
|
||||
import com.intellij.openapi.util.NlsSafe
|
||||
import kotlinx.serialization.Serializable
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
|
||||
@@ -9,5 +10,6 @@ import org.jetbrains.annotations.ApiStatus
|
||||
@Serializable
|
||||
data class ApplyPluginsStateResult(
|
||||
val pluginsToEnable: Set<PluginId> = emptySet(),
|
||||
var needRestart: Boolean = false
|
||||
var needRestart: Boolean = false,
|
||||
@get:NlsSafe var error: String? = null,
|
||||
)
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.plugins.marketplace
|
||||
|
||||
import com.intellij.ide.plugins.api.PluginDto
|
||||
import com.intellij.ide.plugins.newui.PluginUiModel
|
||||
import com.intellij.openapi.extensions.PluginId
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.Transient
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import kotlin.collections.ifEmpty
|
||||
|
||||
@Serializable
|
||||
@ApiStatus.Internal
|
||||
data class InitSessionResult(
|
||||
@Transient val visiblePlugins: List<PluginUiModel> = emptyList(),
|
||||
val pluginStates: Map<PluginId, Boolean> = emptyMap(),
|
||||
val visiblePluginDtos: List<PluginDto> = visiblePlugins.map(PluginDto::fromModel),
|
||||
) {
|
||||
fun getVisiblePluginsList(): List<PluginUiModel> = visiblePlugins.ifEmpty { visiblePluginDtos }
|
||||
}
|
||||
+1
-1
@@ -17,5 +17,5 @@ class InstallPluginResult {
|
||||
var restartRequired: Boolean = true
|
||||
var dynamicRestartRequired = false
|
||||
var pluginsToDisable: Set<PluginId> = emptySet()
|
||||
var errors: CheckErrorsResult? = null
|
||||
var errors: Map<PluginId, CheckErrorsResult> = emptyMap()
|
||||
}
|
||||
+39
-11
@@ -14,6 +14,7 @@ import com.intellij.ide.plugins.PluginManagerCore.looksLikePlatformPluginAlias
|
||||
import com.intellij.ide.plugins.PluginUtils.toPluginDescriptors
|
||||
import com.intellij.ide.plugins.api.PluginDto
|
||||
import com.intellij.ide.plugins.marketplace.*
|
||||
import com.intellij.openapi.application.ApplicationInfo
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.application.ModalityState
|
||||
import com.intellij.openapi.application.PathManager
|
||||
@@ -31,8 +32,8 @@ import com.intellij.openapi.util.Pair
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
|
||||
import com.intellij.util.concurrency.annotations.RequiresReadLockAbsence
|
||||
import com.intellij.xml.util.XmlStringUtil
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import org.jetbrains.annotations.Nls
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.nio.file.FileVisitResult
|
||||
@@ -49,6 +50,24 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
return PluginManagerCore.plugins.map { PluginUiModelAdapter(it).withSource() }
|
||||
}
|
||||
|
||||
override fun initSession(sessionId: String): InitSessionResult {
|
||||
val session = findSession(sessionId) ?: return InitSessionResult(emptyList(), emptyMap())
|
||||
val applicationInfo = ApplicationInfo.getInstance()
|
||||
val visiblePlugins = mutableListOf<PluginUiModel>()
|
||||
for (plugin in getInstalledAndPendingPlugins()) {
|
||||
val pluginId: PluginId = plugin.pluginId
|
||||
if (applicationInfo.isEssentialPlugin(pluginId)) {
|
||||
session.pluginStates[pluginId] = PluginEnabledState.ENABLED
|
||||
}
|
||||
else {
|
||||
val state = if (PluginManagerCore.isLoaded(pluginId)) PluginEnabledState.ENABLED else PluginEnabledState.DISABLED
|
||||
session.pluginStates[pluginId] = state
|
||||
visiblePlugins.add(PluginUiModelAdapter(plugin))
|
||||
}
|
||||
}
|
||||
return InitSessionResult(visiblePlugins, session.pluginStates.mapValues { it.value.isEnabled })
|
||||
}
|
||||
|
||||
override fun getVisiblePlugins(showImplementationDetails: Boolean): List<PluginUiModel> {
|
||||
return PluginManager.getVisiblePlugins(showImplementationDetails).map { PluginUiModelAdapter(it) }.toList().withSource()
|
||||
}
|
||||
@@ -127,7 +146,10 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
val pluginIdMap = buildPluginIdMap()
|
||||
val contentModuleIdMap = getPluginSet().buildContentModuleIdMap()
|
||||
val pluginsToEnable = updatePluginDependencies(session, pluginIdMap, contentModuleIdMap)
|
||||
assertCanApply(session, pluginIdMap)
|
||||
val errorMessage = getApplyError(session, pluginIdMap)
|
||||
if (errorMessage != null) {
|
||||
return ApplyPluginsStateResult(error = errorMessage)
|
||||
}
|
||||
|
||||
val pluginEnabler = PluginEnabler.getInstance()
|
||||
val uninstallsRequiringRestart: MutableSet<PluginId> = mutableSetOf()
|
||||
@@ -242,8 +264,8 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
return PluginInstallationState(plugin != null, status)
|
||||
}
|
||||
|
||||
override fun getPluginInstallationStates(pluginIds: List<PluginId>): Map<PluginId, PluginInstallationState> {
|
||||
return pluginIds.associateWith { pluginId ->
|
||||
override fun getPluginInstallationStates(): Map<PluginId, PluginInstallationState> {
|
||||
return getAllInstalledPlugins().associateWith { pluginId ->
|
||||
return@associateWith getPluginInstallationState(pluginId)
|
||||
}
|
||||
}
|
||||
@@ -380,7 +402,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
setNewEnabled(descriptors, tempEnabled, action)
|
||||
|
||||
val pluginIdMap: Map<PluginId, IdeaPluginDescriptorImpl> = buildPluginIdMap()
|
||||
val contentModuleIdMap = getPluginSet().buildContentModuleIdMap()
|
||||
val contentModuleIdMap = getPluginSet().buildContentModuleIdMap()
|
||||
val descriptorsToUpdate = if (action.isEnable) {
|
||||
getDependenciesToEnable(descriptors, tempEnabled, pluginIdMap, contentModuleIdMap)
|
||||
}
|
||||
@@ -432,7 +454,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
requiredPlugins.add(result)
|
||||
}
|
||||
}
|
||||
return enableDependencies(session, requiredPlugins.toList(), PluginEnableDisableAction.ENABLE_GLOBALLY,
|
||||
return enableDependencies(session, requiredPlugins.toList(), PluginEnableDisableAction.ENABLE_GLOBALLY,
|
||||
buildPluginIdMap(), getPluginSet().buildContentModuleIdMap()).pluginsIdsToSwitch
|
||||
}
|
||||
|
||||
@@ -740,15 +762,15 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
LOG.warn("pending dynamic plugins probably won't finish their installation: " + session.dynamicPluginsToInstall + " " + session.dynamicPluginsToUninstall)
|
||||
}
|
||||
}
|
||||
result.errors = getErrors(session, request.pluginId)
|
||||
result.errors = getPlugins().map { it.pluginId }.associateWith { getErrors(session, it) }
|
||||
installCallback(result)
|
||||
}
|
||||
|
||||
@Throws(ConfigurationException::class)
|
||||
private fun assertCanApply(
|
||||
private fun getApplyError(
|
||||
session: PluginManagerSession,
|
||||
pluginIdMap: Map<PluginId, IdeaPluginDescriptorImpl>,
|
||||
) {
|
||||
): @Nls String? {
|
||||
val descriptors = mutableListOf<IdeaPluginDescriptorImpl>()
|
||||
for (entry in session.dependentToRequiredListMap.entries) {
|
||||
val pluginId: PluginId = entry.key
|
||||
@@ -772,15 +794,21 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
|
||||
|
||||
if (!descriptors.isEmpty()) {
|
||||
val pluginNames = MyPluginModel.getPluginNames(descriptors)
|
||||
val message = IdeBundle.message("dialog.message.unable.to.apply.changes", pluginNames.size, MyPluginModel.joinPluginNamesOrIds(pluginNames))
|
||||
throw ConfigurationException(XmlStringUtil.wrapInHtml(message)).withHtmlMessage()
|
||||
return IdeBundle.message("dialog.message.unable.to.apply.changes", pluginNames.size, MyPluginModel.joinPluginNamesOrIds(pluginNames))
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun getInstalledAndPendingPlugins(): List<IdeaPluginDescriptor> {
|
||||
return InstalledPluginsState.getInstance().installedPlugins + PluginManagerCore.plugins
|
||||
}
|
||||
|
||||
private fun getAllInstalledPlugins(): Set<PluginId> {
|
||||
val installedPluginsState = InstalledPluginsState.getInstance()
|
||||
val ids = installedPluginsState.installedPlugins.map { it.pluginId } + installedPluginsState.installedWithoutRestartPlugins + PluginManagerCore.plugins.map { it.pluginId }
|
||||
return ids.toSet()
|
||||
}
|
||||
|
||||
private fun isBundledUpdate(descriptor: IdeaPluginDescriptor?): Boolean {
|
||||
if (descriptor == null || descriptor.isBundled) {
|
||||
return false
|
||||
|
||||
@@ -4,6 +4,7 @@ package com.intellij.ide.plugins.newui;
|
||||
import com.intellij.ide.IdeBundle;
|
||||
import com.intellij.ide.plugins.PluginManagerConfigurable;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.extensions.PluginId;
|
||||
import com.intellij.openapi.progress.TaskInfo;
|
||||
import com.intellij.openapi.util.text.HtmlChunk;
|
||||
import com.intellij.openapi.wm.ex.StatusBarEx;
|
||||
@@ -11,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Alexander Lobas
|
||||
@@ -64,7 +66,7 @@ final class InstallPluginInfo {
|
||||
}
|
||||
|
||||
public synchronized void finish(boolean success, boolean cancel, boolean showErrors, boolean restartRequired,
|
||||
List<HtmlChunk> errors) {
|
||||
@NotNull Map<PluginId, List<HtmlChunk>> errors) {
|
||||
if (myClosed) {
|
||||
return;
|
||||
}
|
||||
@@ -80,7 +82,7 @@ final class InstallPluginInfo {
|
||||
}
|
||||
}
|
||||
else if (!cancel) {
|
||||
myPluginModel.finishInstall(myDescriptor, myInstalledDescriptor, success, showErrors, restartRequired, errors);
|
||||
myPluginModel.finishInstall(myDescriptor, myInstalledDescriptor, errors, success, showErrors, restartRequired);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ import com.intellij.platform.util.coroutines.CoroutineScopeKt;
|
||||
import com.intellij.util.SystemProperties;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.ui.accessibility.AccessibleAnnouncerUtil;
|
||||
import com.intellij.xml.util.XmlStringUtil;
|
||||
import kotlinx.coroutines.CoroutineScope;
|
||||
import kotlinx.coroutines.Dispatchers;
|
||||
import org.jetbrains.annotations.*;
|
||||
@@ -124,6 +125,10 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
*/
|
||||
public boolean apply(@Nullable JComponent parent) throws ConfigurationException {
|
||||
ApplyPluginsStateResult applyResult = UiPluginManager.getInstance().applySession(sessionId.toString(), parent, getProject());
|
||||
String error = applyResult.getError();
|
||||
if (error != null) {
|
||||
throw new ConfigurationException(XmlStringUtil.wrapInHtml(error)).withHtmlMessage();
|
||||
}
|
||||
applyResult.getPluginsToEnable().forEach(id -> setEnabled(id, PluginEnabledState.ENABLED));
|
||||
myUninstalled.clear();
|
||||
updateButtons();
|
||||
@@ -335,13 +340,12 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
indicator,
|
||||
MyPluginModel.this,
|
||||
result -> {
|
||||
applyInstallResult(result, info);
|
||||
callback.accept(result.getSuccess());
|
||||
applyInstallResult(result, info, callback);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
private void applyInstallResult(InstallPluginResult result, InstallPluginInfo info) {
|
||||
private void applyInstallResult(InstallPluginResult result, InstallPluginInfo info, Consumer<Boolean> callback) {
|
||||
PluginDto installedDescriptor = result.getInstalledDescriptor();
|
||||
if (result.getSuccess()) {
|
||||
PluginUiModelKt.addInstalledSource(descriptor, controller.getTarget());
|
||||
@@ -355,16 +359,17 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
myPluginManagerCustomizer.updateAfterModification(() -> {
|
||||
|
||||
info.finish(result.getSuccess(), result.getCancel(), result.getShowErrors(), result.getRestartRequired(), getErrors(result));
|
||||
callback.accept(result.getSuccess());
|
||||
return null;
|
||||
});
|
||||
}
|
||||
else {
|
||||
info.finish(result.getSuccess(), result.getCancel(), result.getShowErrors(), result.getRestartRequired(), getErrors(result));
|
||||
callback.accept(result.getSuccess());
|
||||
}
|
||||
}
|
||||
|
||||
private static @NotNull List<HtmlChunk> getErrors(InstallPluginResult result) {
|
||||
if (result.getErrors() == null) return Collections.emptyList();
|
||||
private static @NotNull Map<PluginId, List<HtmlChunk>> getErrors(InstallPluginResult result) {
|
||||
return MyPluginModel.getErrors(result.getErrors());
|
||||
}
|
||||
|
||||
@@ -463,10 +468,9 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
*/
|
||||
void finishInstall(@NotNull PluginUiModel descriptor,
|
||||
@Nullable PluginUiModel installedDescriptor,
|
||||
boolean success,
|
||||
@NotNull Map<PluginId, List<HtmlChunk>> errors, boolean success,
|
||||
boolean showErrors,
|
||||
boolean restartRequired,
|
||||
List<HtmlChunk> errors) {
|
||||
boolean restartRequired) {
|
||||
InstallPluginInfo info = finishInstall(descriptor);
|
||||
|
||||
if (myInstallingWithUpdatesPlugins.isEmpty()) {
|
||||
@@ -475,6 +479,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
|
||||
PluginId pluginId = descriptor.getPluginId();
|
||||
List<ListPluginComponent> marketplaceComponents = myMarketplacePluginComponentMap.get(pluginId);
|
||||
List<HtmlChunk> errorList = errors.getOrDefault(pluginId, Collections.emptyList());
|
||||
if (marketplaceComponents != null) {
|
||||
for (ListPluginComponent gridComponent : marketplaceComponents) {
|
||||
if (installedDescriptor != null) {
|
||||
@@ -482,7 +487,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
}
|
||||
gridComponent.hideProgress(success, restartRequired);
|
||||
if (gridComponent.myInstalledDescriptorForMarketplace != null) {
|
||||
gridComponent.updateErrors(errors);
|
||||
gridComponent.updateErrors(errorList);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -493,7 +498,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
listComponent.setPluginModel(installedDescriptor);
|
||||
}
|
||||
listComponent.hideProgress(success, restartRequired);
|
||||
listComponent.updateErrors(errors);
|
||||
listComponent.updateErrors(errorList);
|
||||
}
|
||||
}
|
||||
for (PluginDetailsPageComponent panel : myDetailPanels) {
|
||||
@@ -516,8 +521,8 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
myInstalledPanel.doLayout();
|
||||
}
|
||||
if (success) {
|
||||
appendOrUpdateDescriptor(installedDescriptor != null ? installedDescriptor : descriptor, restartRequired, errors);
|
||||
appendDependsAfterInstall(success, restartRequired);
|
||||
appendOrUpdateDescriptor(installedDescriptor != null ? installedDescriptor : descriptor, restartRequired, errorList);
|
||||
appendDependsAfterInstall(success, restartRequired, errors);
|
||||
if (installedDescriptor == null && descriptor.isFromMarketplace() && myDownloaded != null && myDownloaded.ui != null) {
|
||||
ListPluginComponent component = myDownloaded.ui.findComponent(descriptor.getPluginId());
|
||||
if (component != null) {
|
||||
@@ -587,7 +592,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
|
||||
static void addProgress(@NotNull IdeaPluginDescriptor descriptor, @NotNull ProgressIndicatorEx indicator) {
|
||||
InstallPluginInfo info = myInstallingInfos.get(descriptor.getPluginId());
|
||||
if(info == null) return;
|
||||
if (info == null) return;
|
||||
info.indicator.addStateDelegate(indicator);
|
||||
}
|
||||
|
||||
@@ -609,18 +614,17 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
myInstalling = installing;
|
||||
}
|
||||
|
||||
private void appendDependsAfterInstall(boolean success, boolean restartRequired) {
|
||||
private void appendDependsAfterInstall(boolean success, boolean restartRequired, Map<PluginId, List<HtmlChunk>> errors) {
|
||||
if (myDownloaded == null || myDownloaded.ui == null) {
|
||||
return;
|
||||
}
|
||||
Map<PluginId, CheckErrorsResult> errorCheckResult = UiPluginManager.getInstance().loadErrorsBlocking(sessionId.toString());
|
||||
for (IdeaPluginDescriptor descriptor : InstalledPluginsState.getInstance().getInstalledPlugins()) {
|
||||
PluginId pluginId = descriptor.getPluginId();
|
||||
if (myDownloaded.ui.findComponent(pluginId) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
appendOrUpdateDescriptor(new PluginUiModelAdapter(descriptor), restartRequired, getErrors(errorCheckResult.get(pluginId)));
|
||||
appendOrUpdateDescriptor(new PluginUiModelAdapter(descriptor), restartRequired, errors.get(pluginId));
|
||||
|
||||
String id = pluginId.getIdString();
|
||||
|
||||
@@ -964,7 +968,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
uninstallAndUpdateUi(descriptor, UiPluginManager.getInstance().getController());
|
||||
}
|
||||
|
||||
public Map<PluginId, List<HtmlChunk>> getErrors(Map<PluginId, CheckErrorsResult> errorCheckResults) {
|
||||
public static Map<PluginId, List<HtmlChunk>> getErrors(Map<PluginId, CheckErrorsResult> errorCheckResults) {
|
||||
return errorCheckResults.entrySet().stream()
|
||||
.collect(Collectors.toMap(
|
||||
Map.Entry::getKey,
|
||||
@@ -997,7 +1001,8 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
}
|
||||
return null;
|
||||
});
|
||||
} finally {
|
||||
}
|
||||
finally {
|
||||
for (PluginDetailsPageComponent panel : myDetailPanels) {
|
||||
if (panel.getDescriptorForActions() == descriptor) {
|
||||
panel.hideProgress();
|
||||
@@ -1026,7 +1031,7 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
|
||||
}
|
||||
}
|
||||
for (ListPluginComponent component : myInstalledPluginComponents) {
|
||||
component.updateErrors(errors.get(component.getPluginModel().getPluginId()));
|
||||
component.updateErrors(errors.getOrDefault(component.getPluginModel().getPluginId(), Collections.emptyList()));
|
||||
}
|
||||
for (List<ListPluginComponent> plugins : myMarketplacePluginComponentMap.values()) {
|
||||
for (ListPluginComponent plugin : plugins) {
|
||||
|
||||
+2
-1
@@ -545,6 +545,7 @@ class PluginDetailsPageComponent @JvmOverloads constructor(
|
||||
updateModel,
|
||||
modalityState) ?: return
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun updateAdditionalText() {
|
||||
@@ -1403,7 +1404,7 @@ class PluginDetailsPageComponent @JvmOverloads constructor(
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
Collections.emptyList())
|
||||
Collections.emptyMap())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ interface PluginManagerCustomizer {
|
||||
@JvmStatic
|
||||
fun getInstance(): PluginManagerCustomizer? {
|
||||
if (Registry.`is`("reworked.plugin.manager.enabled")) {
|
||||
return EP_NAME.extensionList.first()
|
||||
return EP_NAME.extensionList.firstOrNull()
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -66,8 +66,8 @@ open class PluginModelFacade(private val pluginModel: MyPluginModel) {
|
||||
return pluginModel.isEnabled(model.getDescriptor())
|
||||
}
|
||||
|
||||
fun finishInstall(model: PluginUiModel, installedModel: PluginUiModel?, success: Boolean, showErrors: Boolean, restartRequired: Boolean, errors: List<HtmlChunk>) {
|
||||
pluginModel.finishInstall(model, installedModel, success, showErrors, restartRequired, errors)
|
||||
fun finishInstall(model: PluginUiModel, installedModel: PluginUiModel?, success: Boolean, showErrors: Boolean, restartRequired: Boolean, errors: Map<PluginId, List<HtmlChunk>>) {
|
||||
pluginModel.finishInstall(model, installedModel, errors, success, showErrors, restartRequired)
|
||||
}
|
||||
|
||||
fun isPluginRequiredForProject(model: PluginUiModel): Boolean {
|
||||
|
||||
@@ -4,6 +4,7 @@ package com.intellij.ide.plugins.newui
|
||||
import com.intellij.ide.plugins.marketplace.ApplyPluginsStateResult
|
||||
import com.intellij.ide.plugins.marketplace.CheckErrorsResult
|
||||
import com.intellij.ide.plugins.marketplace.IdeCompatibleUpdate
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult
|
||||
import com.intellij.ide.plugins.marketplace.IntellijPluginMetadata
|
||||
import com.intellij.ide.plugins.marketplace.PluginReviewComment
|
||||
import com.intellij.ide.plugins.marketplace.PluginSearchResult
|
||||
@@ -41,6 +42,10 @@ class UiPluginManager {
|
||||
getController().closeSession(uuid.toString())
|
||||
}
|
||||
|
||||
fun initSession(uuid: UUID): InitSessionResult {
|
||||
return getController().initSession(uuid.toString())
|
||||
}
|
||||
|
||||
fun executeMarketplaceQuery(query: String, count: Int, includeUpgradeToCommercialIde: Boolean): PluginSearchResult {
|
||||
return getController().executePluginsSearch(query, count, includeUpgradeToCommercialIde)
|
||||
}
|
||||
|
||||
+5
-2
@@ -6,6 +6,7 @@ import com.intellij.ide.plugins.PluginEnabler
|
||||
import com.intellij.ide.plugins.marketplace.ApplyPluginsStateResult
|
||||
import com.intellij.ide.plugins.marketplace.CheckErrorsResult
|
||||
import com.intellij.ide.plugins.marketplace.IdeCompatibleUpdate
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult
|
||||
import com.intellij.ide.plugins.marketplace.InstallPluginResult
|
||||
import com.intellij.ide.plugins.marketplace.IntellijPluginMetadata
|
||||
import com.intellij.ide.plugins.marketplace.PluginReviewComment
|
||||
@@ -28,6 +29,7 @@ interface UiPluginManagerController {
|
||||
fun getTarget(): PluginSource
|
||||
fun getPlugins(): List<PluginUiModel>
|
||||
fun getVisiblePlugins(showImplementationDetails: Boolean): List<PluginUiModel>
|
||||
fun initSession(sessionId: String): InitSessionResult
|
||||
fun getInstalledPlugins(): List<PluginUiModel>
|
||||
fun getUpdates(): List<PluginUiModel>
|
||||
fun isPluginDisabled(pluginId: PluginId): Boolean
|
||||
@@ -64,8 +66,8 @@ interface UiPluginManagerController {
|
||||
fun filterPluginsRequiringUltimateButItsDisabled(pluginIds: List<PluginId>): List<PluginId>
|
||||
fun findPluginNames(pluginIds: List<PluginId>): List<String>
|
||||
fun findPlugin(pluginId: PluginId): PluginUiModel?
|
||||
fun getLastCompatiblePluginUpdateModel(pluginId: PluginId, buildNumber: String? = null, indicator: ProgressIndicator? = null): PluginUiModel?
|
||||
|
||||
fun getLastCompatiblePluginUpdateModel(pluginId: PluginId, buildNumber: String? = null, indicator: ProgressIndicator? = null): PluginUiModel?
|
||||
fun getLastCompatiblePluginUpdate(allIds: Set<PluginId>, throwExceptions: Boolean, buildNumber: String? = null): List<IdeCompatibleUpdate>
|
||||
fun updateDescriptorsForInstalledPlugins()
|
||||
fun isNeedUpdate(pluginId: PluginId): Boolean
|
||||
@@ -73,9 +75,10 @@ interface UiPluginManagerController {
|
||||
fun getAllPluginsTags(): Set<String>
|
||||
fun getAllVendors(): Set<String>
|
||||
fun getPluginInstallationState(pluginId: PluginId): PluginInstallationState
|
||||
fun getPluginInstallationStates(pluginIds: List<PluginId>): Map<PluginId, PluginInstallationState>
|
||||
fun getPluginInstallationStates(): Map<PluginId, PluginInstallationState>
|
||||
fun checkPluginCanBeDownloaded(pluginUiModel: PluginUiModel, progressIndicator: ProgressIndicator?): Boolean
|
||||
fun setPluginStatus(sessionId: String, pluginIds: List<PluginId>, enable: Boolean)
|
||||
|
||||
suspend fun loadErrors(sessionId: String): Map<PluginId, CheckErrorsResult>
|
||||
|
||||
suspend fun resetSession(sessionId: String, removeSession: Boolean, parentComponent: JComponent? = null): Map<PluginId, Boolean>
|
||||
|
||||
+8
-2
@@ -9,6 +9,7 @@ import com.intellij.platform.pluginManager.shared.rpc.PluginManagerApi
|
||||
import com.intellij.ide.plugins.api.PluginDto
|
||||
import com.intellij.ide.plugins.marketplace.CheckErrorsResult
|
||||
import com.intellij.ide.plugins.marketplace.IdeCompatibleUpdate
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult
|
||||
import com.intellij.ide.plugins.marketplace.IntellijPluginMetadata
|
||||
import com.intellij.ide.plugins.marketplace.PluginReviewComment
|
||||
import com.intellij.ide.plugins.marketplace.PluginSearchResult
|
||||
@@ -84,8 +85,8 @@ class BackendPluginManagerApi : PluginManagerApi {
|
||||
return DefaultUiPluginManagerController.getPluginInstallationState(pluginId)
|
||||
}
|
||||
|
||||
override suspend fun getPluginInstallationStates(pluginIds: List<PluginId>): Map<PluginId, PluginInstallationState> {
|
||||
return DefaultUiPluginManagerController.getPluginInstallationStates(pluginIds)
|
||||
override suspend fun getPluginInstallationStates(): Map<PluginId, PluginInstallationState> {
|
||||
return DefaultUiPluginManagerController.getPluginInstallationStates()
|
||||
}
|
||||
|
||||
override suspend fun getCustomRepoPlugins(): List<PluginDto> {
|
||||
@@ -209,4 +210,9 @@ class BackendPluginManagerApi : PluginManagerApi {
|
||||
override suspend fun loadErrors(sessionId: String): Map<PluginId, CheckErrorsResult> {
|
||||
return DefaultUiPluginManagerController.loadErrors(sessionId)
|
||||
}
|
||||
|
||||
override suspend fun initSession(sessionId: String): InitSessionResult {
|
||||
val initSessionResult = DefaultUiPluginManagerController.initSession(sessionId)
|
||||
return InitSessionResult(initSessionResult.visiblePlugins.map { PluginDto.fromModel(it) }, initSessionResult.pluginStates)
|
||||
}
|
||||
}
|
||||
+7
-2
@@ -7,6 +7,7 @@ import com.intellij.ide.plugins.api.PluginDto
|
||||
import com.intellij.ide.plugins.marketplace.ApplyPluginsStateResult
|
||||
import com.intellij.ide.plugins.marketplace.CheckErrorsResult
|
||||
import com.intellij.ide.plugins.marketplace.IdeCompatibleUpdate
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult
|
||||
import com.intellij.ide.plugins.marketplace.InstallPluginResult
|
||||
import com.intellij.ide.plugins.marketplace.IntellijPluginMetadata
|
||||
import com.intellij.ide.plugins.marketplace.PluginReviewComment
|
||||
@@ -49,6 +50,10 @@ class BackendUiPluginManagerController() : UiPluginManagerController {
|
||||
return awaitForResult { PluginManagerApi.getInstance().getVisiblePlugins(showImplementationDetails).withSource() }
|
||||
}
|
||||
|
||||
override fun initSession(sessionId: String): InitSessionResult {
|
||||
return awaitForResult { PluginManagerApi.getInstance().initSession(sessionId) }
|
||||
}
|
||||
|
||||
override fun getInstalledPlugins(): List<PluginUiModel> {
|
||||
return awaitForResult { PluginManagerApi.getInstance().getInstalledPlugins().withSource() }
|
||||
}
|
||||
@@ -111,8 +116,8 @@ class BackendUiPluginManagerController() : UiPluginManagerController {
|
||||
return awaitForResult { PluginManagerApi.getInstance().getPluginInstallationState(pluginId) }
|
||||
}
|
||||
|
||||
override fun getPluginInstallationStates(pluginIds: List<PluginId>): Map<PluginId, PluginInstallationState> {
|
||||
return awaitForResult { PluginManagerApi.getInstance().getPluginInstallationStates(pluginIds) }
|
||||
override fun getPluginInstallationStates(): Map<PluginId, PluginInstallationState> {
|
||||
return awaitForResult { PluginManagerApi.getInstance().getPluginInstallationStates() }
|
||||
}
|
||||
|
||||
override fun checkPluginCanBeDownloaded(pluginUiModel: PluginUiModel, progressIndicator: ProgressIndicator?): Boolean {
|
||||
|
||||
+3
-1
@@ -5,6 +5,7 @@ import com.intellij.ide.plugins.marketplace.MarketplaceSearchPluginData
|
||||
import com.intellij.ide.plugins.api.PluginDto
|
||||
import com.intellij.ide.plugins.marketplace.CheckErrorsResult
|
||||
import com.intellij.ide.plugins.marketplace.IdeCompatibleUpdate
|
||||
import com.intellij.ide.plugins.marketplace.InitSessionResult
|
||||
import com.intellij.ide.plugins.marketplace.IntellijPluginMetadata
|
||||
import com.intellij.ide.plugins.marketplace.IntellijUpdateMetadata
|
||||
import com.intellij.ide.plugins.marketplace.PluginReviewComment
|
||||
@@ -62,9 +63,10 @@ interface PluginManagerApi : RemoteApi<Unit> {
|
||||
suspend fun disposeUpdaterService(sessionId: String)
|
||||
suspend fun notifyUpdateFinished(sessionId: String)
|
||||
suspend fun getPluginInstallationState(pluginId: PluginId): PluginInstallationState
|
||||
suspend fun getPluginInstallationStates(pluginIds: List<PluginId>): Map<PluginId, PluginInstallationState>
|
||||
suspend fun getPluginInstallationStates(): Map<PluginId, PluginInstallationState>
|
||||
suspend fun checkPluginCanBeDownloaded(plugin: PluginDto): Boolean
|
||||
suspend fun loadErrors(sessionId: String): Map<PluginId, CheckErrorsResult>
|
||||
suspend fun initSession(sessionId: String): InitSessionResult
|
||||
|
||||
companion object {
|
||||
suspend fun getInstance(): PluginManagerApi {
|
||||
|
||||
Reference in New Issue
Block a user