mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Fix issue that plugin manager will save settings for the uninstalled and settings-removed plugins
This commit is contained in:
parent
0e4cf57e9e
commit
f0e74a2aa5
3 changed files with 41 additions and 8 deletions
|
|
@ -14,7 +14,6 @@ using ISavable = Flow.Launcher.Plugin.ISavable;
|
||||||
using Flow.Launcher.Plugin.SharedCommands;
|
using Flow.Launcher.Plugin.SharedCommands;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using Flow.Launcher.Core.Resource;
|
using Flow.Launcher.Core.Resource;
|
||||||
using Flow.Launcher.Infrastructure.Storage;
|
|
||||||
|
|
||||||
namespace Flow.Launcher.Core.Plugin
|
namespace Flow.Launcher.Core.Plugin
|
||||||
{
|
{
|
||||||
|
|
@ -548,10 +547,17 @@ namespace Flow.Launcher.Core.Plugin
|
||||||
var assemblyLoader = new PluginAssemblyLoader(plugin.ExecuteFilePath);
|
var assemblyLoader = new PluginAssemblyLoader(plugin.ExecuteFilePath);
|
||||||
var assembly = assemblyLoader.LoadAssemblyAndDependencies();
|
var assembly = assemblyLoader.LoadAssemblyAndDependencies();
|
||||||
var assemblyName = assembly.GetName().Name;
|
var assemblyName = assembly.GetName().Name;
|
||||||
var directoryPath = Path.Combine(DataLocation.DataDirectory(), JsonStorage<object>.DirectoryName, Constant.Plugins, assemblyName);
|
|
||||||
if (Directory.Exists(directoryPath))
|
// if user want to remove the plugin settings, we cannot call save method for the plugin json storage instance of this plugin
|
||||||
|
// so we need to remove it from the api instance
|
||||||
|
var method = API.GetType().GetMethod("RemovePluginSettings");
|
||||||
|
var pluginJsonStorage = method?.Invoke(API, new object[] { assemblyName });
|
||||||
|
|
||||||
|
// if there exists a json storage for current plugin, we need to delete the directory path
|
||||||
|
if (pluginJsonStorage != null)
|
||||||
{
|
{
|
||||||
Directory.Delete(directoryPath, true);
|
var deleteMethod = pluginJsonStorage.GetType().GetMethod("DeleteDirectory");
|
||||||
|
deleteMethod?.Invoke(pluginJsonStorage, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,17 @@ using Flow.Launcher.Infrastructure.UserSettings;
|
||||||
|
|
||||||
namespace Flow.Launcher.Infrastructure.Storage
|
namespace Flow.Launcher.Infrastructure.Storage
|
||||||
{
|
{
|
||||||
public class PluginJsonStorage<T> :JsonStorage<T> where T : new()
|
public class PluginJsonStorage<T> : JsonStorage<T> where T : new()
|
||||||
{
|
{
|
||||||
|
// Use assembly name to check which plugin is using this storage
|
||||||
|
public readonly string AssemblyName;
|
||||||
|
|
||||||
public PluginJsonStorage()
|
public PluginJsonStorage()
|
||||||
{
|
{
|
||||||
// C# related, add python related below
|
// C# related, add python related below
|
||||||
var dataType = typeof(T);
|
var dataType = typeof(T);
|
||||||
var assemblyName = dataType.Assembly.GetName().Name;
|
AssemblyName = dataType.Assembly.GetName().Name;
|
||||||
DirectoryPath = Path.Combine(DataLocation.DataDirectory(), DirectoryName, Constant.Plugins, assemblyName);
|
DirectoryPath = Path.Combine(DataLocation.DataDirectory(), DirectoryName, Constant.Plugins, AssemblyName);
|
||||||
Helper.ValidateDirectory(DirectoryPath);
|
Helper.ValidateDirectory(DirectoryPath);
|
||||||
|
|
||||||
FilePath = Path.Combine(DirectoryPath, $"{dataType.Name}{FileSuffix}");
|
FilePath = Path.Combine(DirectoryPath, $"{dataType.Name}{FileSuffix}");
|
||||||
|
|
@ -20,6 +23,13 @@ namespace Flow.Launcher.Infrastructure.Storage
|
||||||
{
|
{
|
||||||
Data = data;
|
Data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DeleteDirectory()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(DirectoryPath))
|
||||||
|
{
|
||||||
|
Directory.Delete(DirectoryPath, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,23 @@ namespace Flow.Launcher
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<Type, object> _pluginJsonStorages = new();
|
private readonly ConcurrentDictionary<Type, object> _pluginJsonStorages = new();
|
||||||
|
|
||||||
|
public object RemovePluginSettings(string assemblyName)
|
||||||
|
{
|
||||||
|
foreach (var keyValuePair in _pluginJsonStorages)
|
||||||
|
{
|
||||||
|
var key = keyValuePair.Key;
|
||||||
|
var value = keyValuePair.Value;
|
||||||
|
var name = value.GetType().GetField("AssemblyName")?.GetValue(value)?.ToString();
|
||||||
|
if (name == assemblyName)
|
||||||
|
{
|
||||||
|
_pluginJsonStorages.Remove(key, out var pluginJsonStorage);
|
||||||
|
return pluginJsonStorage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save plugin settings.
|
/// Save plugin settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue