@@ -24,9 +24,6 @@ public static class PluginManager
2424 {
2525 private static readonly string ClassName = nameof ( PluginManager ) ;
2626
27- private static IEnumerable < PluginPair > _contextMenuPlugins ;
28- private static IEnumerable < PluginPair > _homePlugins ;
29-
3027 public static List < PluginPair > AllPlugins { get ; private set ; }
3128 public static readonly HashSet < PluginPair > GlobalPlugins = new ( ) ;
3229 public static readonly Dictionary < string , PluginPair > NonGlobalPlugins = new ( ) ;
@@ -36,8 +33,12 @@ public static class PluginManager
3633 private static IPublicAPI API => api ??= Ioc . Default . GetRequiredService < IPublicAPI > ( ) ;
3734
3835 private static PluginsSettings Settings ;
39- private static List < PluginMetadata > _metadatas ;
40- private static readonly List < string > _modifiedPlugins = new ( ) ;
36+ private static readonly ConcurrentBag < string > ModifiedPlugins = new ( ) ;
37+
38+ private static IEnumerable < PluginPair > _contextMenuPlugins ;
39+ private static IEnumerable < PluginPair > _homePlugins ;
40+ private static IEnumerable < PluginPair > _resultUpdatePlugin ;
41+ private static IEnumerable < PluginPair > _translationPlugins ;
4142
4243 /// <summary>
4344 /// Directories that will hold Flow Launcher plugin directory
@@ -173,12 +174,18 @@ static PluginManager()
173174 /// <param name="settings"></param>
174175 public static void LoadPlugins ( PluginsSettings settings )
175176 {
176- _metadatas = PluginConfig . Parse ( Directories ) ;
177+ var metadatas = PluginConfig . Parse ( Directories ) ;
177178 Settings = settings ;
178- Settings . UpdatePluginSettings ( _metadatas ) ;
179- AllPlugins = PluginsLoader . Plugins ( _metadatas , Settings ) ;
179+ Settings . UpdatePluginSettings ( metadatas ) ;
180+ AllPlugins = PluginsLoader . Plugins ( metadatas , Settings ) ;
180181 // Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins
181- UpdatePluginDirectory ( _metadatas ) ;
182+ UpdatePluginDirectory ( metadatas ) ;
183+
184+ // Initialize plugin enumerable after all plugins are initialized
185+ _contextMenuPlugins = GetPluginsForInterface < IContextMenu > ( ) ;
186+ _homePlugins = GetPluginsForInterface < IAsyncHomeQuery > ( ) ;
187+ _resultUpdatePlugin = GetPluginsForInterface < IResultUpdated > ( ) ;
188+ _translationPlugins = GetPluginsForInterface < IPluginI18n > ( ) ;
182189 }
183190
184191 private static void UpdatePluginDirectory ( List < PluginMetadata > metadatas )
@@ -248,9 +255,6 @@ public static async Task InitializePluginsAsync()
248255
249256 await Task . WhenAll ( InitTasks ) ;
250257
251- _contextMenuPlugins = GetPluginsForInterface < IContextMenu > ( ) ;
252- _homePlugins = GetPluginsForInterface < IAsyncHomeQuery > ( ) ;
253-
254258 foreach ( var plugin in AllPlugins )
255259 {
256260 // set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin
@@ -409,16 +413,26 @@ public static PluginPair GetPluginForId(string id)
409413 return AllPlugins . FirstOrDefault ( o => o . Metadata . ID == id ) ;
410414 }
411415
412- public static IEnumerable < PluginPair > GetPluginsForInterface < T > ( ) where T : IFeatures
416+ private static IEnumerable < PluginPair > GetPluginsForInterface < T > ( ) where T : IFeatures
413417 {
414418 // Handle scenario where this is called before all plugins are instantiated, e.g. language change on startup
415419 return AllPlugins ? . Where ( p => p . Plugin is T ) ?? Array . Empty < PluginPair > ( ) ;
416420 }
417421
422+ public static IList < PluginPair > GetResultUpdatePlugin ( )
423+ {
424+ return _resultUpdatePlugin . Where ( p => ! PluginModified ( p . Metadata . ID ) ) . ToList ( ) ;
425+ }
426+
427+ public static IList < PluginPair > GetTranslationPlugins ( )
428+ {
429+ return _translationPlugins . Where ( p => ! PluginModified ( p . Metadata . ID ) ) . ToList ( ) ;
430+ }
431+
418432 public static List < Result > GetContextMenusForPlugin ( Result result )
419433 {
420434 var results = new List < Result > ( ) ;
421- var pluginPair = _contextMenuPlugins . FirstOrDefault ( o => o . Metadata . ID == result . PluginID ) ;
435+ var pluginPair = _contextMenuPlugins . Where ( p => ! PluginModified ( p . Metadata . ID ) ) . FirstOrDefault ( o => o . Metadata . ID == result . PluginID ) ;
422436 if ( pluginPair != null )
423437 {
424438 var plugin = ( IContextMenu ) pluginPair . Plugin ;
@@ -446,7 +460,7 @@ public static List<Result> GetContextMenusForPlugin(Result result)
446460
447461 public static bool IsHomePlugin ( string id )
448462 {
449- return _homePlugins . Any ( p => p . Metadata . ID == id ) ;
463+ return _homePlugins . Where ( p => ! PluginModified ( p . Metadata . ID ) ) . Any ( p => p . Metadata . ID == id ) ;
450464 }
451465
452466 public static bool ActionKeywordRegistered ( string actionKeyword )
@@ -544,14 +558,14 @@ private static bool SameOrLesserPluginVersionExists(string metadataPath)
544558
545559 public static bool PluginModified ( string id )
546560 {
547- return _modifiedPlugins . Contains ( id ) ;
561+ return ModifiedPlugins . Contains ( id ) ;
548562 }
549563
550564 public static async Task UpdatePluginAsync ( PluginMetadata existingVersion , UserPlugin newVersion , string zipFilePath )
551565 {
552- InstallPlugin ( newVersion , zipFilePath , checkModified : false ) ;
553- await UninstallPluginAsync ( existingVersion , removePluginFromSettings : false , removePluginSettings : false , checkModified : false ) ;
554- _modifiedPlugins . Add ( existingVersion . ID ) ;
566+ InstallPlugin ( newVersion , zipFilePath , checkModified : false ) ;
567+ await UninstallPluginAsync ( existingVersion , removePluginFromSettings : false , removePluginSettings : false , checkModified : false ) ;
568+ ModifiedPlugins . Add ( existingVersion . ID ) ;
555569 }
556570
557571 public static void InstallPlugin ( UserPlugin plugin , string zipFilePath )
@@ -638,7 +652,7 @@ internal static void InstallPlugin(UserPlugin plugin, string zipFilePath, bool c
638652
639653 if ( checkModified )
640654 {
641- _modifiedPlugins . Add ( plugin . ID ) ;
655+ ModifiedPlugins . Add ( plugin . ID ) ;
642656 }
643657 }
644658
@@ -713,7 +727,7 @@ internal static async Task UninstallPluginAsync(PluginMetadata plugin, bool remo
713727
714728 if ( checkModified )
715729 {
716- _modifiedPlugins . Add ( plugin . ID ) ;
730+ ModifiedPlugins . Add ( plugin . ID ) ;
717731 }
718732 }
719733
0 commit comments