Skip to content

Commit 5e63738

Browse files
authored
Merge branch 'dev' into error_log
2 parents 53c1232 + 67cc1e2 commit 5e63738

File tree

27 files changed

+483
-221
lines changed

27 files changed

+483
-221
lines changed

Flow.Launcher.Core/Configuration/Portable.cs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class Portable : IPortable
2222
/// As at Squirrel.Windows version 1.5.2, UpdateManager needs to be disposed after finish
2323
/// </summary>
2424
/// <returns></returns>
25-
private UpdateManager NewUpdateManager()
25+
private static UpdateManager NewUpdateManager()
2626
{
2727
var applicationFolderName = Constant.ApplicationDirectory
2828
.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
@@ -81,20 +81,16 @@ public void EnablePortableMode()
8181

8282
public void RemoveShortcuts()
8383
{
84-
using (var portabilityUpdater = NewUpdateManager())
85-
{
86-
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.StartMenu);
87-
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Desktop);
88-
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Startup);
89-
}
84+
using var portabilityUpdater = NewUpdateManager();
85+
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.StartMenu);
86+
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Desktop);
87+
portabilityUpdater.RemoveShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Startup);
9088
}
9189

9290
public void RemoveUninstallerEntry()
9391
{
94-
using (var portabilityUpdater = NewUpdateManager())
95-
{
96-
portabilityUpdater.RemoveUninstallerRegistryEntry();
97-
}
92+
using var portabilityUpdater = NewUpdateManager();
93+
portabilityUpdater.RemoveUninstallerRegistryEntry();
9894
}
9995

10096
public void MoveUserDataFolder(string fromLocation, string toLocation)
@@ -110,12 +106,10 @@ public void VerifyUserDataAfterMove(string fromLocation, string toLocation)
110106

111107
public void CreateShortcuts()
112108
{
113-
using (var portabilityUpdater = NewUpdateManager())
114-
{
115-
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.StartMenu, false);
116-
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Desktop, false);
117-
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Startup, false);
118-
}
109+
using var portabilityUpdater = NewUpdateManager();
110+
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.StartMenu, false);
111+
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Desktop, false);
112+
portabilityUpdater.CreateShortcutsForExecutable(Constant.ApplicationFileName, ShortcutLocation.Startup, false);
119113
}
120114

121115
public void CreateUninstallerEntry()
@@ -129,18 +123,14 @@ public void CreateUninstallerEntry()
129123
subKey2.SetValue("DisplayIcon", Path.Combine(Constant.ApplicationDirectory, "app.ico"), RegistryValueKind.String);
130124
}
131125

132-
using (var portabilityUpdater = NewUpdateManager())
133-
{
134-
_ = portabilityUpdater.CreateUninstallerRegistryEntry();
135-
}
126+
using var portabilityUpdater = NewUpdateManager();
127+
_ = portabilityUpdater.CreateUninstallerRegistryEntry();
136128
}
137129

138-
internal void IndicateDeletion(string filePathTodelete)
130+
private static void IndicateDeletion(string filePathTodelete)
139131
{
140132
var deleteFilePath = Path.Combine(filePathTodelete, DataLocation.DeletionIndicatorFile);
141-
using (var _ = File.CreateText(deleteFilePath))
142-
{
143-
}
133+
using var _ = File.CreateText(deleteFilePath);
144134
}
145135

146136
///<summary>

Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
using Flow.Launcher.Infrastructure.Logger;
2-
using Flow.Launcher.Infrastructure.UserSettings;
3-
using Flow.Launcher.Plugin;
4-
using Flow.Launcher.Plugin.SharedCommands;
5-
using System;
1+
using System;
62
using System.Collections.Generic;
73
using System.IO;
84
using System.Linq;
95
using System.Windows;
106
using System.Windows.Forms;
11-
using Flow.Launcher.Core.Resource;
127
using CommunityToolkit.Mvvm.DependencyInjection;
8+
using Flow.Launcher.Infrastructure.Logger;
9+
using Flow.Launcher.Infrastructure.UserSettings;
10+
using Flow.Launcher.Plugin;
11+
using Flow.Launcher.Plugin.SharedCommands;
1312

1413
namespace Flow.Launcher.Core.ExternalPlugins.Environments
1514
{
@@ -43,8 +42,11 @@ internal AbstractPluginEnvironment(List<PluginMetadata> pluginMetadataList, Plug
4342

4443
internal IEnumerable<PluginPair> Setup()
4544
{
45+
// If no plugin is using the language, return empty list
4646
if (!PluginMetadataList.Any(o => o.Language.Equals(Language, StringComparison.OrdinalIgnoreCase)))
47+
{
4748
return new List<PluginPair>();
49+
}
4850

4951
if (!string.IsNullOrEmpty(PluginsSettingsFilePath) && FilesFolders.FileExists(PluginsSettingsFilePath))
5052
{
@@ -56,24 +58,55 @@ internal IEnumerable<PluginPair> Setup()
5658
}
5759

5860
var noRuntimeMessage = string.Format(
59-
InternationalizationManager.Instance.GetTranslation("runtimePluginInstalledChooseRuntimePrompt"),
61+
API.GetTranslation("runtimePluginInstalledChooseRuntimePrompt"),
6062
Language,
6163
EnvName,
6264
Environment.NewLine
6365
);
6466
if (API.ShowMsgBox(noRuntimeMessage, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
6567
{
66-
var msg = string.Format(InternationalizationManager.Instance.GetTranslation("runtimePluginChooseRuntimeExecutable"), EnvName);
67-
string selectedFile;
68+
var msg = string.Format(API.GetTranslation("runtimePluginChooseRuntimeExecutable"), EnvName);
6869

69-
selectedFile = GetFileFromDialog(msg, FileDialogFilter);
70+
var selectedFile = GetFileFromDialog(msg, FileDialogFilter);
7071

7172
if (!string.IsNullOrEmpty(selectedFile))
73+
{
7274
PluginsSettingsFilePath = selectedFile;
73-
75+
}
7476
// Nothing selected because user pressed cancel from the file dialog window
75-
if (string.IsNullOrEmpty(selectedFile))
76-
InstallEnvironment();
77+
else
78+
{
79+
var forceDownloadMessage = string.Format(
80+
API.GetTranslation("runtimeExecutableInvalidChooseDownload"),
81+
Language,
82+
EnvName,
83+
Environment.NewLine
84+
);
85+
86+
// Let users select valid path or choose to download
87+
while (string.IsNullOrEmpty(selectedFile))
88+
{
89+
if (API.ShowMsgBox(forceDownloadMessage, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.Yes)
90+
{
91+
// Continue select file
92+
selectedFile = GetFileFromDialog(msg, FileDialogFilter);
93+
}
94+
else
95+
{
96+
// User selected no, break the loop
97+
break;
98+
}
99+
}
100+
101+
if (!string.IsNullOrEmpty(selectedFile))
102+
{
103+
PluginsSettingsFilePath = selectedFile;
104+
}
105+
else
106+
{
107+
InstallEnvironment();
108+
}
109+
}
77110
}
78111
else
79112
{
@@ -86,7 +119,7 @@ internal IEnumerable<PluginPair> Setup()
86119
}
87120
else
88121
{
89-
API.ShowMsgBox(string.Format(InternationalizationManager.Instance.GetTranslation("runtimePluginUnableToSetExecutablePath"), Language));
122+
API.ShowMsgBox(string.Format(API.GetTranslation("runtimePluginUnableToSetExecutablePath"), Language));
90123
Log.Error("PluginsLoader",
91124
$"Not able to successfully set {EnvName} path, setting's plugin executable path variable is still an empty string.",
92125
$"{Language}Environment");
@@ -99,13 +132,11 @@ internal IEnumerable<PluginPair> Setup()
99132

100133
private void EnsureLatestInstalled(string expectedPath, string currentPath, string installedDirPath)
101134
{
102-
if (expectedPath == currentPath)
103-
return;
135+
if (expectedPath == currentPath) return;
104136

105137
FilesFolders.RemoveFolderIfExists(installedDirPath, (s) => API.ShowMsgBox(s));
106138

107139
InstallEnvironment();
108-
109140
}
110141

111142
internal abstract PluginPair CreatePluginPair(string filePath, PluginMetadata metadata);
@@ -126,7 +157,7 @@ private IEnumerable<PluginPair> SetPathForPluginPairs(string filePath, string la
126157
return pluginPairs;
127158
}
128159

129-
private string GetFileFromDialog(string title, string filter = "")
160+
private static string GetFileFromDialog(string title, string filter = "")
130161
{
131162
var dlg = new OpenFileDialog
132163
{
@@ -140,7 +171,6 @@ private string GetFileFromDialog(string title, string filter = "")
140171

141172
var result = dlg.ShowDialog();
142173
return result == DialogResult.OK ? dlg.FileName : string.Empty;
143-
144174
}
145175

146176
/// <summary>
@@ -183,31 +213,33 @@ public static void PreStartPluginExecutablePathUpdate(Settings settings)
183213
else
184214
{
185215
if (IsUsingPortablePath(settings.PluginSettings.PythonExecutablePath, DataLocation.PythonEnvironmentName))
216+
{
186217
settings.PluginSettings.PythonExecutablePath
187218
= GetUpdatedEnvironmentPath(settings.PluginSettings.PythonExecutablePath);
219+
}
188220

189221
if (IsUsingPortablePath(settings.PluginSettings.NodeExecutablePath, DataLocation.NodeEnvironmentName))
222+
{
190223
settings.PluginSettings.NodeExecutablePath
191224
= GetUpdatedEnvironmentPath(settings.PluginSettings.NodeExecutablePath);
225+
}
192226
}
193227
}
194228

195229
private static bool IsUsingPortablePath(string filePath, string pluginEnvironmentName)
196230
{
197-
if (string.IsNullOrEmpty(filePath))
198-
return false;
231+
if (string.IsNullOrEmpty(filePath)) return false;
199232

200233
// DataLocation.PortableDataPath returns the current portable path, this determines if an out
201234
// of date path is also a portable path.
202-
var portableAppEnvLocation = $"UserData\\{DataLocation.PluginEnvironments}\\{pluginEnvironmentName}";
235+
var portableAppEnvLocation = Path.Combine("UserData", DataLocation.PluginEnvironments, pluginEnvironmentName);
203236

204237
return filePath.Contains(portableAppEnvLocation);
205238
}
206239

207240
private static bool IsUsingRoamingPath(string filePath)
208241
{
209-
if (string.IsNullOrEmpty(filePath))
210-
return false;
242+
if (string.IsNullOrEmpty(filePath)) return false;
211243

212244
return filePath.StartsWith(DataLocation.RoamingDataPath);
213245
}
@@ -217,8 +249,8 @@ private static string GetUpdatedEnvironmentPath(string filePath)
217249
var index = filePath.IndexOf(DataLocation.PluginEnvironments);
218250

219251
// get the substring after "Environments" because we can not determine it dynamically
220-
var ExecutablePathSubstring = filePath.Substring(index + DataLocation.PluginEnvironments.Count());
221-
return $"{DataLocation.PluginEnvironmentsPath}{ExecutablePathSubstring}";
252+
var executablePathSubstring = filePath[(index + DataLocation.PluginEnvironments.Length)..];
253+
return $"{DataLocation.PluginEnvironmentsPath}{executablePathSubstring}";
222254
}
223255
}
224256
}

Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using Droplex;
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using Droplex;
24
using Flow.Launcher.Core.Plugin;
35
using Flow.Launcher.Infrastructure.UserSettings;
46
using Flow.Launcher.Plugin;
57
using Flow.Launcher.Plugin.SharedCommands;
6-
using System.Collections.Generic;
7-
using System.IO;
88

99
namespace Flow.Launcher.Core.ExternalPlugins.Environments
1010
{
@@ -22,7 +22,11 @@ internal class PythonEnvironment : AbstractPluginEnvironment
2222

2323
internal override string FileDialogFilter => "Python|pythonw.exe";
2424

25-
internal override string PluginsSettingsFilePath { get => PluginSettings.PythonExecutablePath; set => PluginSettings.PythonExecutablePath = value; }
25+
internal override string PluginsSettingsFilePath
26+
{
27+
get => PluginSettings.PythonExecutablePath;
28+
set => PluginSettings.PythonExecutablePath = value;
29+
}
2630

2731
internal PythonEnvironment(List<PluginMetadata> pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
2832

Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System.Collections.Generic;
2+
using System.IO;
23
using Droplex;
4+
using Flow.Launcher.Core.Plugin;
35
using Flow.Launcher.Infrastructure.UserSettings;
4-
using Flow.Launcher.Plugin.SharedCommands;
56
using Flow.Launcher.Plugin;
6-
using System.IO;
7-
using Flow.Launcher.Core.Plugin;
7+
using Flow.Launcher.Plugin.SharedCommands;
88

99
namespace Flow.Launcher.Core.ExternalPlugins.Environments
1010
{
@@ -19,7 +19,11 @@ internal class TypeScriptEnvironment : AbstractPluginEnvironment
1919
internal override string InstallPath => Path.Combine(EnvPath, "Node-v16.18.0");
2020
internal override string ExecutablePath => Path.Combine(InstallPath, "node-v16.18.0-win-x64\\node.exe");
2121

22-
internal override string PluginsSettingsFilePath { get => PluginSettings.NodeExecutablePath; set => PluginSettings.NodeExecutablePath = value; }
22+
internal override string PluginsSettingsFilePath
23+
{
24+
get => PluginSettings.NodeExecutablePath;
25+
set => PluginSettings.NodeExecutablePath = value;
26+
}
2327

2428
internal TypeScriptEnvironment(List<PluginMetadata> pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
2529

Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System.Collections.Generic;
2+
using System.IO;
23
using Droplex;
4+
using Flow.Launcher.Core.Plugin;
35
using Flow.Launcher.Infrastructure.UserSettings;
4-
using Flow.Launcher.Plugin.SharedCommands;
56
using Flow.Launcher.Plugin;
6-
using System.IO;
7-
using Flow.Launcher.Core.Plugin;
7+
using Flow.Launcher.Plugin.SharedCommands;
88

99
namespace Flow.Launcher.Core.ExternalPlugins.Environments
1010
{
@@ -19,7 +19,11 @@ internal class TypeScriptV2Environment : AbstractPluginEnvironment
1919
internal override string InstallPath => Path.Combine(EnvPath, "Node-v16.18.0");
2020
internal override string ExecutablePath => Path.Combine(InstallPath, "node-v16.18.0-win-x64\\node.exe");
2121

22-
internal override string PluginsSettingsFilePath { get => PluginSettings.NodeExecutablePath; set => PluginSettings.NodeExecutablePath = value; }
22+
internal override string PluginsSettingsFilePath
23+
{
24+
get => PluginSettings.NodeExecutablePath;
25+
set => PluginSettings.NodeExecutablePath = value;
26+
}
2327

2428
internal TypeScriptV2Environment(List<PluginMetadata> pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
2529

Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class JsonRPCPluginSettings
2323
protected ConcurrentDictionary<string, object?> Settings { get; set; } = null!;
2424
public required IPublicAPI API { get; init; }
2525

26+
private static readonly string ClassName = nameof(JsonRPCPluginSettings);
27+
2628
private JsonStorage<ConcurrentDictionary<string, object?>> _storage = null!;
2729

2830
private static readonly Thickness SettingPanelMargin = (Thickness)Application.Current.FindResource("SettingPanelMargin");
@@ -122,12 +124,26 @@ public void UpdateSettings(IReadOnlyDictionary<string, object> settings)
122124

123125
public async Task SaveAsync()
124126
{
125-
await _storage.SaveAsync();
127+
try
128+
{
129+
await _storage.SaveAsync();
130+
}
131+
catch (System.Exception e)
132+
{
133+
API.LogException(ClassName, $"Failed to save plugin settings to path: {SettingPath}", e);
134+
}
126135
}
127136

128137
public void Save()
129138
{
130-
_storage.Save();
139+
try
140+
{
141+
_storage.Save();
142+
}
143+
catch (System.Exception e)
144+
{
145+
API.LogException(ClassName, $"Failed to save plugin settings to path: {SettingPath}", e);
146+
}
131147
}
132148

133149
public bool NeedCreateSettingPanel()

0 commit comments

Comments
 (0)