IJPL-180572 Plugin state propagation improvements

GitOrigin-RevId: 26e82ef69b82af0ad2d9a29395ede41db6057414
This commit is contained in:
Denis Zaichenko
2025-06-24 12:21:26 +00:00
committed by intellij-monorepo-bot
parent bdd92d86cd
commit 0f067ec876
19 changed files with 154 additions and 84 deletions
@@ -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
+2
View File
@@ -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);
@@ -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()
}
}
}
}
@@ -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 }
}
@@ -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()
}
@@ -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) {
@@ -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())
}
}
@@ -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)
}
@@ -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>
@@ -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,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 {
@@ -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 {