settings-sync: fix enabling/disabling of dynamic plugins: IDEA-301159

Use correct API. The previously used API only updates the disabled_plugins.txt which is processed only after restart, which is fine for non-dynamic plugins, but not for dynamic ones.

GitOrigin-RevId: 2355b742eb0bccd1bc0953aa9451f9600b90c61a
This commit is contained in:
Kirill Likhodedov
2022-09-02 20:20:09 +00:00
committed by intellij-monorepo-bot
parent 123f7ba7ce
commit 3ff68f6493
5 changed files with 55 additions and 38 deletions
@@ -1,6 +1,7 @@
package com.intellij.settingsSync.plugins
import com.intellij.ide.plugins.DisabledPluginsState
import com.intellij.ide.plugins.PluginEnabler
import com.intellij.ide.plugins.PluginManagerCore
import com.intellij.openapi.Disposable
import com.intellij.openapi.extensions.PluginId
@@ -10,12 +11,12 @@ class CorePluginManagerProxy : PluginManagerProxy {
override fun getPlugins() = PluginManagerCore.getPlugins()
override fun enablePlugin(pluginId: PluginId) {
PluginManagerCore.enablePlugin(pluginId)
override fun enablePlugins(plugins: Set<PluginId>) {
PluginEnabler.getInstance().enableById(plugins)
}
override fun disablePlugin(pluginId: PluginId) {
PluginManagerCore.disablePlugin(pluginId)
override fun disablePlugins(plugins: Set<PluginId>) {
PluginEnabler.getInstance().disableById(plugins)
}
override fun addDisablePluginListener(disabledListener: Runnable, parentDisposable: Disposable) {
@@ -11,8 +11,8 @@ interface PluginManagerProxy {
}
fun getPlugins(): Array<IdeaPluginDescriptor>
fun enablePlugin(pluginId: PluginId)
fun disablePlugin(pluginId: PluginId)
fun enablePlugins(plugins: Set<PluginId>)
fun disablePlugins(plugins: Set<PluginId>)
fun findPlugin(pluginId: PluginId): IdeaPluginDescriptor?
fun createInstaller(): SettingsSyncPluginInstaller
@@ -6,6 +6,7 @@ import com.intellij.ide.plugins.PluginStateListener
import com.intellij.ide.plugins.PluginStateManager
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runInEdt
import com.intellij.openapi.components.*
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.extensions.PluginId
@@ -88,8 +89,8 @@ internal class SettingsSyncPluginManager : PersistentStateComponent<SettingsSync
val pluginManagerProxy = PluginManagerProxy.getInstance()
val installer = pluginManagerProxy.createInstaller()
val pluginsToDisable = mutableListOf<PluginId>()
val pluginsToEnable = mutableListOf<PluginId>()
val pluginsToDisable = mutableSetOf<PluginId>()
val pluginsToEnable = mutableSetOf<PluginId>()
val pluginsToInstall = mutableListOf<PluginId>()
synchronized(LOCK) {
@@ -118,14 +119,16 @@ internal class SettingsSyncPluginManager : PersistentStateComponent<SettingsSync
}
}
LOG.info("Enabling plugins: $pluginsToEnable")
for (plugin in pluginsToEnable) {
pluginManagerProxy.enablePlugin(plugin)
runInEdt {
LOG.info("Enabling plugins: $pluginsToEnable")
pluginManagerProxy.enablePlugins(pluginsToEnable)
}
LOG.info("Disabling plugins: $pluginsToDisable")
for (plugin in pluginsToDisable) {
pluginManagerProxy.disablePlugin(plugin)
runInEdt {
LOG.info("Disabling plugins: $pluginsToDisable")
pluginManagerProxy.disablePlugins(pluginsToDisable)
}
LOG.info("Installing plugins: $pluginsToInstall")
installer.installPlugins(pluginsToInstall)
}
@@ -134,7 +134,7 @@ class SettingsSyncPluginManagerTest : LightPlatformTestCase() {
"QuickJump",
listOf(TestPluginDependency("com.intellij.modules.platform", false))
)
testPluginManager.addPluginDescriptor(pluginManager, descriptor)
testPluginManager.addPluginDescriptors(pluginManager, descriptor)
TestCase.assertTrue(descriptor.isEnabled)
loadPluginManagerState(incomingPluginData)
pluginManager.pushChangesToIde()
@@ -151,7 +151,7 @@ class SettingsSyncPluginManagerTest : LightPlatformTestCase() {
"QuickJump",
listOf(TestPluginDependency("com.intellij.modules.platform", false))
)
testPluginManager.addPluginDescriptor(pluginManager, descriptor)
testPluginManager.addPluginDescriptors(pluginManager, descriptor)
assertSerializedStateEquals(
"""
<component>
@@ -183,8 +183,7 @@ class SettingsSyncPluginManagerTest : LightPlatformTestCase() {
"codeflections.typengo",
listOf(TestPluginDependency("com.intellij.modules.platform", false))
)
testPluginManager.addPluginDescriptor(pluginManager, quickJump)
testPluginManager.addPluginDescriptor(pluginManager, typengo)
testPluginManager.addPluginDescriptors(pluginManager, quickJump, typengo)
loadPluginManagerState(incomingPluginData)
pluginManager.state.plugins["codeflections.typengo"] = SettingsSyncPluginManager.PluginData().apply {
@@ -13,27 +13,31 @@ import java.util.concurrent.CopyOnWriteArrayList
internal class TestPluginManager : PluginManagerProxy {
val installer = TestPluginInstaller()
private val ownPluginDescriptors = HashMap<PluginId, IdeaPluginDescriptor>()
private val disabledPluginListeners = CopyOnWriteArrayList<Runnable>()
private val pluginEnabledStateListeners = CopyOnWriteArrayList<Runnable>()
override fun getPlugins(): Array<IdeaPluginDescriptor> {
val descriptors = arrayListOf<IdeaPluginDescriptor>()
descriptors.addAll(PluginManagerCore.getPlugins())
descriptors.addAll(ownPluginDescriptors.values)
return descriptors.toTypedArray()
return ownPluginDescriptors.values.toTypedArray()
}
override fun enablePlugin(pluginId: PluginId) {
val descriptor = findPlugin(pluginId)
assert(descriptor is TestPluginDescriptor)
descriptor?.isEnabled = true
override fun enablePlugins(plugins: Set<PluginId>) {
for (plugin in plugins) {
val descriptor = findPlugin(plugin)
assert(descriptor is TestPluginDescriptor)
descriptor?.isEnabled = true
}
for (pluginListener in pluginEnabledStateListeners) {
pluginListener.run()
}
}
override fun disablePlugin(pluginId: PluginId) {
val descriptor = findPlugin(pluginId)
assert(descriptor is TestPluginDescriptor)
descriptor?.isEnabled = false
for (disabledPluginListener in disabledPluginListeners) {
disabledPluginListener.run()
override fun disablePlugins(plugins: Set<PluginId>) {
for (plugin in plugins) {
val descriptor = findPlugin(plugin)
assert(descriptor is TestPluginDescriptor)
descriptor?.isEnabled = false
}
for (pluginListener in pluginEnabledStateListeners) {
pluginListener.run()
}
}
@@ -42,9 +46,9 @@ internal class TestPluginManager : PluginManagerProxy {
}
override fun addDisablePluginListener(disabledListener: Runnable, parentDisposable: Disposable) {
disabledPluginListeners.add(disabledListener)
pluginEnabledStateListeners.add(disabledListener)
Disposer.register(parentDisposable, Disposable {
disabledPluginListeners.remove(disabledListener)
pluginEnabledStateListeners.remove(disabledListener)
})
}
@@ -59,8 +63,18 @@ internal class TestPluginManager : PluginManagerProxy {
return installer
}
fun addPluginDescriptor(pluginManager: SettingsSyncPluginManager, descriptor: IdeaPluginDescriptor) {
ownPluginDescriptors[descriptor.pluginId] = descriptor
pluginManager.getPluginStateListener().install(descriptor)
fun addPluginDescriptors(pluginManager: SettingsSyncPluginManager, vararg descriptors: IdeaPluginDescriptor) {
for (descriptor in descriptors) {
ownPluginDescriptors[descriptor.pluginId] = descriptor
pluginManager.getPluginStateListener().install(descriptor)
}
}
fun disablePlugin(pluginId: PluginId) {
disablePlugins(setOf(pluginId))
}
fun enablePlugin(pluginId: PluginId) {
enablePlugins(setOf(pluginId))
}
}