diff --git a/Flow.Launcher/Images/mainsearch.png b/Doc/mainsearch.png
similarity index 100%
rename from Flow.Launcher/Images/mainsearch.png
rename to Doc/mainsearch.png
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index 31bf04286..3d4522498 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -3,10 +3,10 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
-using Newtonsoft.Json;
using Flow.Launcher.Infrastructure.Exception;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Plugin;
@@ -65,7 +65,7 @@ namespace Flow.Launcher.Core.Plugin
{
List results = new List();
- JsonRPCQueryResponseModel queryResponseModel = JsonConvert.DeserializeObject(output);
+ JsonRPCQueryResponseModel queryResponseModel = JsonSerializer.Deserialize(output);
if (queryResponseModel.Result == null) return null;
foreach (JsonRPCResult result in queryResponseModel.Result)
@@ -84,7 +84,7 @@ namespace Flow.Launcher.Core.Plugin
else
{
string actionReponse = ExecuteCallback(result1.JsonRPCAction);
- JsonRPCRequestModel jsonRpcRequestModel = JsonConvert.DeserializeObject(actionReponse);
+ JsonRPCRequestModel jsonRpcRequestModel = JsonSerializer.Deserialize(actionReponse);
if (jsonRpcRequestModel != null
&& !String.IsNullOrEmpty(jsonRpcRequestModel.Method)
&& jsonRpcRequestModel.Method.StartsWith("Flow.Launcher."))
diff --git a/Flow.Launcher.Core/Plugin/PluginConfig.cs b/Flow.Launcher.Core/Plugin/PluginConfig.cs
index b946fa44d..46f79c60c 100644
--- a/Flow.Launcher.Core/Plugin/PluginConfig.cs
+++ b/Flow.Launcher.Core/Plugin/PluginConfig.cs
@@ -2,10 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using System.IO;
-using Newtonsoft.Json;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Plugin;
+using System.Text.Json;
namespace Flow.Launcher.Core.Plugin
{
@@ -61,7 +61,7 @@ namespace Flow.Launcher.Core.Plugin
PluginMetadata metadata;
try
{
- metadata = JsonConvert.DeserializeObject(File.ReadAllText(configPath));
+ metadata = JsonSerializer.Deserialize(File.ReadAllText(configPath));
metadata.PluginDirectory = pluginDirectory;
// for plugins which doesn't has ActionKeywords key
metadata.ActionKeywords = metadata.ActionKeywords ?? new List { metadata.ActionKeyword };
diff --git a/Flow.Launcher.Core/Updater.cs b/Flow.Launcher.Core/Updater.cs
index 20df23e40..b203967de 100644
--- a/Flow.Launcher.Core/Updater.cs
+++ b/Flow.Launcher.Core/Updater.cs
@@ -8,15 +8,14 @@ using System.Threading.Tasks;
using System.Windows;
using JetBrains.Annotations;
using Squirrel;
-using Newtonsoft.Json;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Infrastructure.Logger;
-using System.IO;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Core
{
@@ -29,101 +28,80 @@ namespace Flow.Launcher.Core
GitHubRepository = gitHubRepository;
}
- public async Task UpdateApp(IPublicAPI api , bool silentUpdate = true)
+ public async Task UpdateApp(IPublicAPI api, bool silentUpdate = true)
{
- UpdateManager updateManager;
- UpdateInfo newUpdateInfo;
-
- if (!silentUpdate)
- api.ShowMsg("Please wait...", "Checking for new update");
-
try
{
- updateManager = await GitHubUpdateManager(GitHubRepository);
- }
- catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException)
- {
- Log.Exception($"|Updater.UpdateApp|Please check your connection and proxy settings to api.github.com.", e);
- return;
- }
+ UpdateInfo newUpdateInfo;
- try
- {
- // UpdateApp CheckForUpdate will return value only if the app is squirrel installed
- newUpdateInfo = await updateManager.CheckForUpdate().NonNull();
- }
- catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException)
- {
- Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to api.github.com.", e);
- updateManager.Dispose();
- return;
- }
-
- var newReleaseVersion = Version.Parse(newUpdateInfo.FutureReleaseEntry.Version.ToString());
- var currentVersion = Version.Parse(Constant.Version);
-
- Log.Info($"|Updater.UpdateApp|Future Release <{newUpdateInfo.FutureReleaseEntry.Formatted()}>");
-
- if (newReleaseVersion <= currentVersion)
- {
if (!silentUpdate)
- MessageBox.Show("You already have the latest Flow Launcher version");
- updateManager.Dispose();
- return;
- }
+ api.ShowMsg("Please wait...", "Checking for new update");
- if (!silentUpdate)
- api.ShowMsg("Update found", "Updating...");
+ using var updateManager = await GitHubUpdateManager(GitHubRepository).ConfigureAwait(false);
- try
- {
- await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply);
+
+ // UpdateApp CheckForUpdate will return value only if the app is squirrel installed
+ newUpdateInfo = await updateManager.CheckForUpdate().NonNull().ConfigureAwait(false);
+
+ var newReleaseVersion = Version.Parse(newUpdateInfo.FutureReleaseEntry.Version.ToString());
+ var currentVersion = Version.Parse(Constant.Version);
+
+ Log.Info($"|Updater.UpdateApp|Future Release <{newUpdateInfo.FutureReleaseEntry.Formatted()}>");
+
+ if (newReleaseVersion <= currentVersion)
+ {
+ if (!silentUpdate)
+ MessageBox.Show("You already have the latest Flow Launcher version");
+ return;
+ }
+
+ if (!silentUpdate)
+ api.ShowMsg("Update found", "Updating...");
+
+ await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply).ConfigureAwait(false);
+
+ await updateManager.ApplyReleases(newUpdateInfo).ConfigureAwait(false);
+
+ if (DataLocation.PortableDataLocationInUse())
+ {
+ var targetDestination = updateManager.RootAppDirectory + $"\\app-{newReleaseVersion.ToString()}\\{DataLocation.PortableFolderName}";
+ FilesFolders.CopyAll(DataLocation.PortableDataPath, targetDestination);
+ if (!FilesFolders.VerifyBothFolderFilesEqual(DataLocation.PortableDataPath, targetDestination))
+ MessageBox.Show("Flow Launcher was not able to move your user profile data to the new update version. Please manually " +
+ $"move your profile data folder from {DataLocation.PortableDataPath} to {targetDestination}");
+ }
+ else
+ {
+ await updateManager.CreateUninstallerRegistryEntry().ConfigureAwait(false);
+ }
+
+ var newVersionTips = NewVersinoTips(newReleaseVersion.ToString());
+
+ Log.Info($"|Updater.UpdateApp|Update success:{newVersionTips}");
+
+ if (MessageBox.Show(newVersionTips, "New Update", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ UpdateManager.RestartApp(Constant.ApplicationFileName);
+ }
}
catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException)
{
Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e);
- updateManager.Dispose();
+ api.ShowMsg("Update Failed", "Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.");
return;
}
-
- await updateManager.ApplyReleases(newUpdateInfo);
-
- if (DataLocation.PortableDataLocationInUse())
- {
- var targetDestination = updateManager.RootAppDirectory + $"\\app-{newReleaseVersion.ToString()}\\{DataLocation.PortableFolderName}";
- FilesFolders.CopyAll(DataLocation.PortableDataPath, targetDestination);
- if (!FilesFolders.VerifyBothFolderFilesEqual(DataLocation.PortableDataPath, targetDestination))
- MessageBox.Show("Flow Launcher was not able to move your user profile data to the new update version. Please manually " +
- $"move your profile data folder from {DataLocation.PortableDataPath} to {targetDestination}");
- }
- else
- {
- await updateManager.CreateUninstallerRegistryEntry();
- }
-
- var newVersionTips = NewVersinoTips(newReleaseVersion.ToString());
-
- Log.Info($"|Updater.UpdateApp|Update success:{newVersionTips}");
-
- // always dispose UpdateManager
- updateManager.Dispose();
-
- if (MessageBox.Show(newVersionTips, "New Update", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
- {
- UpdateManager.RestartApp(Constant.ApplicationFileName);
- }
}
[UsedImplicitly]
private class GithubRelease
{
- [JsonProperty("prerelease")]
+ [JsonPropertyName("prerelease")]
public bool Prerelease { get; [UsedImplicitly] set; }
- [JsonProperty("published_at")]
+ [JsonPropertyName("published_at")]
public DateTime PublishedAt { get; [UsedImplicitly] set; }
- [JsonProperty("html_url")]
+ [JsonPropertyName("html_url")]
public string HtmlUrl { get; [UsedImplicitly] set; }
}
@@ -133,13 +111,13 @@ namespace Flow.Launcher.Core
var uri = new Uri(repository);
var api = $"https://api.github.com/repos{uri.AbsolutePath}/releases";
- var json = await Http.Get(api);
+ var jsonStream = await Http.GetStreamAsync(api).ConfigureAwait(false);
- var releases = JsonConvert.DeserializeObject>(json);
+ var releases = await System.Text.Json.JsonSerializer.DeserializeAsync>(jsonStream).ConfigureAwait(false);
var latest = releases.Where(r => !r.Prerelease).OrderByDescending(r => r.PublishedAt).First();
var latestUrl = latest.HtmlUrl.Replace("/tag/", "/download/");
- var client = new WebClient { Proxy = Http.WebProxy() };
+ var client = new WebClient { Proxy = Http.WebProxy };
var downloader = new FileDownloader(client);
var manager = new UpdateManager(latestUrl, urlDownloader: downloader);
diff --git a/Flow.Launcher.Infrastructure/Constant.cs b/Flow.Launcher.Infrastructure/Constant.cs
index df1464048..de6ed1b29 100644
--- a/Flow.Launcher.Infrastructure/Constant.cs
+++ b/Flow.Launcher.Infrastructure/Constant.cs
@@ -30,10 +30,12 @@ namespace Flow.Launcher.Infrastructure
public static string PythonPath;
- public static readonly string QueryTextBoxIconImagePath = $"{ProgramDirectory}\\Images\\mainsearch.png";
+ public static readonly string QueryTextBoxIconImagePath = $"{ProgramDirectory}\\Images\\mainsearch.svg";
public const string DefaultTheme = "Darker";
public const string Themes = "Themes";
+
+ public const string Website = "https://flow-launcher.github.io";
}
}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 28d4c0e1f..8153de6c8 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -49,7 +49,6 @@
-
diff --git a/Flow.Launcher.Infrastructure/Helper.cs b/Flow.Launcher.Infrastructure/Helper.cs
index fa7e18533..faa4c93b5 100644
--- a/Flow.Launcher.Infrastructure/Helper.cs
+++ b/Flow.Launcher.Infrastructure/Helper.cs
@@ -1,12 +1,18 @@
using System;
using System.IO;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
+using System.Runtime.CompilerServices;
+using System.Text.Json;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Infrastructure
{
public static class Helper
{
+ static Helper()
+ {
+ jsonFormattedSerializerOptions.Converters.Add(new JsonStringEnumConverter());
+ }
+
///
/// http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy
///
@@ -65,13 +71,18 @@ namespace Flow.Launcher.Infrastructure
}
}
+ private static readonly JsonSerializerOptions jsonFormattedSerializerOptions = new JsonSerializerOptions
+ {
+ WriteIndented = true
+ };
+
public static string Formatted(this T t)
{
- var formatted = JsonConvert.SerializeObject(
- t,
- Formatting.Indented,
- new StringEnumConverter()
- );
+ var formatted = JsonSerializer.Serialize(t, new JsonSerializerOptions
+ {
+ WriteIndented = true
+ });
+
return formatted;
}
}
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index 1d5f240e1..78fa099c9 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -6,6 +6,8 @@ using System.Threading.Tasks;
using JetBrains.Annotations;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using System;
+using System.ComponentModel;
namespace Flow.Launcher.Infrastructure.Http
{
@@ -13,6 +15,14 @@ namespace Flow.Launcher.Infrastructure.Http
{
private const string UserAgent = @"Mozilla/5.0 (Trident/7.0; rv:11.0) like Gecko";
+ private static HttpClient client;
+
+ private static SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler()
+ {
+ UseProxy = true,
+ Proxy = WebProxy
+ };
+
static Http()
{
// need to be added so it would work on a win10 machine
@@ -20,58 +30,133 @@ namespace Flow.Launcher.Infrastructure.Http
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12;
+
+ client = new HttpClient(socketsHttpHandler, false);
+ client.DefaultRequestHeaders.Add("User-Agent", UserAgent);
}
- public static HttpProxy Proxy { private get; set; }
- public static IWebProxy WebProxy()
+ private static HttpProxy proxy;
+
+ public static HttpProxy Proxy
{
- if (Proxy != null && Proxy.Enabled && !string.IsNullOrEmpty(Proxy.Server))
+ private get { return proxy; }
+ set
{
- if (string.IsNullOrEmpty(Proxy.UserName) || string.IsNullOrEmpty(Proxy.Password))
+ proxy = value;
+ proxy.PropertyChanged += UpdateProxy;
+ }
+ }
+
+ public static WebProxy WebProxy { get; } = new WebProxy();
+
+ ///
+ /// Update the Address of the Proxy to modify the client Proxy
+ ///
+ public static void UpdateProxy(ProxyProperty property)
+ {
+ (WebProxy.Address, WebProxy.Credentials) = property switch
+ {
+ ProxyProperty.Enabled => Proxy.Enabled switch
{
- var webProxy = new WebProxy(Proxy.Server, Proxy.Port);
- return webProxy;
+ true => Proxy.UserName switch
+ {
+ var userName when !string.IsNullOrEmpty(userName) =>
+ (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), null),
+ _ => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"),
+ new NetworkCredential(Proxy.UserName, Proxy.Password))
+ },
+ false => (null, null)
+ },
+ ProxyProperty.Server => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
+ ProxyProperty.Port => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"), WebProxy.Credentials),
+ ProxyProperty.UserName => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
+ ProxyProperty.Password => (WebProxy.Address, new NetworkCredential(Proxy.UserName, Proxy.Password)),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+ }
+
+ public static async Task DownloadAsync([NotNull] string url, [NotNull] string filePath)
+ {
+ try
+ {
+ using var response = await client.GetAsync(url);
+ if (response.StatusCode == HttpStatusCode.OK)
+ {
+ await using var fileStream = new FileStream(filePath, FileMode.CreateNew);
+ await response.Content.CopyToAsync(fileStream);
}
else
{
- var webProxy = new WebProxy(Proxy.Server, Proxy.Port)
- {
- Credentials = new NetworkCredential(Proxy.UserName, Proxy.Password)
- };
- return webProxy;
+ throw new HttpRequestException($"Error code <{response.StatusCode}> returned from <{url}>");
}
}
- else
+ catch (HttpRequestException e)
{
- return WebRequest.GetSystemWebProxy();
+ Log.Exception("Infrastructure.Http", "Http Request Error", e, "DownloadAsync");
+ throw;
}
}
- public static void Download([NotNull] string url, [NotNull] string filePath)
- {
- var client = new WebClient { Proxy = WebProxy() };
- client.Headers.Add("user-agent", UserAgent);
- client.DownloadFile(url, filePath);
- }
-
- public static async Task Get([NotNull] string url, string encoding = "UTF-8")
+ ///
+ /// Asynchrously get the result as string from url.
+ /// When supposing the result larger than 83kb, try using GetStreamAsync to avoid reading as string
+ ///
+ ///
+ ///
+ public static Task GetAsync([NotNull] string url)
{
Log.Debug($"|Http.Get|Url <{url}>");
- var request = WebRequest.CreateHttp(url);
- request.Method = "GET";
- request.Timeout = 1000;
- request.Proxy = WebProxy();
- request.UserAgent = UserAgent;
- var response = await request.GetResponseAsync() as HttpWebResponse;
- response = response.NonNull();
- var stream = response.GetResponseStream().NonNull();
+ return GetAsync(new Uri(url.Replace("#", "%23")));
+ }
- using var reader = new StreamReader(stream, Encoding.GetEncoding(encoding));
- var content = await reader.ReadToEndAsync();
- if (response.StatusCode != HttpStatusCode.OK)
- throw new HttpRequestException($"Error code <{response.StatusCode}> with content <{content}> returned from <{url}>");
-
- return content;
+ ///
+ /// Asynchrously get the result as string from url.
+ /// When supposing the result larger than 83kb, try using GetStreamAsync to avoid reading as string
+ ///
+ ///
+ ///
+ public static async Task GetAsync([NotNull] Uri url)
+ {
+ Log.Debug($"|Http.Get|Url <{url}>");
+ try
+ {
+ using var response = await client.GetAsync(url);
+ var content = await response.Content.ReadAsStringAsync();
+ if (response.StatusCode == HttpStatusCode.OK)
+ {
+ return content;
+ }
+ else
+ {
+ throw new HttpRequestException(
+ $"Error code <{response.StatusCode}> with content <{content}> returned from <{url}>");
+ }
+ }
+ catch (HttpRequestException e)
+ {
+ Log.Exception("Infrastructure.Http", "Http Request Error", e, "GetAsync");
+ throw;
+ }
+ }
+
+ ///
+ /// Asynchrously get the result as stream from url.
+ ///
+ ///
+ ///
+ public static async Task GetStreamAsync([NotNull] string url)
+ {
+ try
+ {
+ Log.Debug($"|Http.Get|Url <{url}>");
+ var response = await client.GetAsync(url);
+ return await response.Content.ReadAsStreamAsync();
+ }
+ catch (HttpRequestException e)
+ {
+ Log.Exception("Infrastructure.Http", "Http Request Error", e, "GetStreamAsync");
+ throw;
+ }
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Infrastructure/Logger/Log.cs b/Flow.Launcher.Infrastructure/Logger/Log.cs
index 289ec5d68..91eeb183d 100644
--- a/Flow.Launcher.Infrastructure/Logger/Log.cs
+++ b/Flow.Launcher.Infrastructure/Logger/Log.cs
@@ -128,7 +128,7 @@ namespace Flow.Launcher.Infrastructure.Logger
public static void Exception(string message, System.Exception e)
{
#if DEBUG
- throw e;
+ throw e;
#else
if (FormatValid(message))
{
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 784c11110..268dc20b8 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -1,7 +1,7 @@
using System;
using System.Globalization;
using System.IO;
-using Newtonsoft.Json;
+using System.Text.Json;
using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Infrastructure.Storage
@@ -11,7 +11,7 @@ namespace Flow.Launcher.Infrastructure.Storage
///
public class JsonStrorage
{
- private readonly JsonSerializerSettings _serializerSettings;
+ private readonly JsonSerializerOptions _serializerSettings;
private T _data;
// need a new directory name
public const string DirectoryName = "Settings";
@@ -24,10 +24,9 @@ namespace Flow.Launcher.Infrastructure.Storage
{
// use property initialization instead of DefaultValueAttribute
// easier and flexible for default value of object
- _serializerSettings = new JsonSerializerSettings
+ _serializerSettings = new JsonSerializerOptions
{
- ObjectCreationHandling = ObjectCreationHandling.Replace,
- NullValueHandling = NullValueHandling.Ignore
+ IgnoreNullValues = false
};
}
@@ -56,7 +55,7 @@ namespace Flow.Launcher.Infrastructure.Storage
{
try
{
- _data = JsonConvert.DeserializeObject(searlized, _serializerSettings);
+ _data = JsonSerializer.Deserialize(searlized, _serializerSettings);
}
catch (JsonException e)
{
@@ -77,7 +76,7 @@ namespace Flow.Launcher.Infrastructure.Storage
BackupOriginFile();
}
- _data = JsonConvert.DeserializeObject("{}", _serializerSettings);
+ _data = JsonSerializer.Deserialize("{}", _serializerSettings);
Save();
}
@@ -94,7 +93,8 @@ namespace Flow.Launcher.Infrastructure.Storage
public void Save()
{
- string serialized = JsonConvert.SerializeObject(_data, Formatting.Indented);
+ string serialized = JsonSerializer.Serialize(_data, new JsonSerializerOptions() { WriteIndented = true });
+
File.WriteAllText(FilePath, serialized);
}
}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/HttpProxy.cs b/Flow.Launcher.Infrastructure/UserSettings/HttpProxy.cs
index c1b0c1dd7..213193526 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/HttpProxy.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/HttpProxy.cs
@@ -1,11 +1,80 @@
-namespace Flow.Launcher.Infrastructure.UserSettings
+using System.ComponentModel;
+
+namespace Flow.Launcher.Infrastructure.UserSettings
{
+ public enum ProxyProperty
+ {
+ Enabled,
+ Server,
+ Port,
+ UserName,
+ Password
+ }
+
public class HttpProxy
{
- public bool Enabled { get; set; } = false;
- public string Server { get; set; }
- public int Port { get; set; }
- public string UserName { get; set; }
- public string Password { get; set; }
+ private bool _enabled = false;
+ private string _server;
+ private int _port;
+ private string _userName;
+ private string _password;
+
+ public bool Enabled
+ {
+ get => _enabled;
+ set
+ {
+ _enabled = value;
+ OnPropertyChanged(ProxyProperty.Enabled);
+ }
+ }
+
+ public string Server
+ {
+ get => _server;
+ set
+ {
+ _server = value;
+ OnPropertyChanged(ProxyProperty.Server);
+ }
+ }
+
+ public int Port
+ {
+ get => _port;
+ set
+ {
+ _port = value;
+ OnPropertyChanged(ProxyProperty.Port);
+ }
+ }
+
+ public string UserName
+ {
+ get => _userName;
+ set
+ {
+ _userName = value;
+ OnPropertyChanged(ProxyProperty.UserName);
+ }
+ }
+
+ public string Password
+ {
+ get => _password;
+ set
+ {
+ _password = value;
+ OnPropertyChanged(ProxyProperty.Password);
+ }
+ }
+
+ public delegate void ProxyPropertyChangedHandler(ProxyProperty property);
+ public event ProxyPropertyChangedHandler PropertyChanged;
+
+ private void OnPropertyChanged(ProxyProperty property)
+ {
+ PropertyChanged?.Invoke(property);
+ }
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 832b6fbfa..769237bcb 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -1,8 +1,7 @@
using System;
using System.Collections.ObjectModel;
using System.Drawing;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
+using System.Text.Json.Serialization;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Infrastructure.UserSettings
@@ -16,7 +15,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool ShowOpenResultHotkey { get; set; } = true;
public string Language
{
- get => language; set {
+ get => language; set
+ {
language = value;
OnPropertyChanged();
}
@@ -73,9 +73,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public int MaxResultsToShow { get; set; } = 5;
public int ActivateTimes { get; set; }
- // Order defaults to 0 or -1, so 1 will let this property appear last
- [JsonProperty(Order = 1)]
- public PluginsSettings PluginSettings { get; set; } = new PluginsSettings();
+
public ObservableCollection CustomPluginHotkeys { get; set; } = new ObservableCollection();
public bool DontPromptUpdateMsg { get; set; }
@@ -100,8 +98,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public HttpProxy Proxy { get; set; } = new HttpProxy();
- [JsonConverter(typeof(StringEnumConverter))]
+ [JsonConverter(typeof(JsonStringEnumConverter))]
public LastQueryMode LastQueryMode { get; set; } = LastQueryMode.Selected;
+
+
+ // This needs to be loaded last by staying at the bottom
+ public PluginsSettings PluginSettings { get; set; } = new PluginsSettings();
}
public enum LastQueryMode
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 70013c274..b7b52ac35 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -62,7 +62,6 @@
-
\ No newline at end of file
diff --git a/Flow.Launcher.Plugin/PluginMetadata.cs b/Flow.Launcher.Plugin/PluginMetadata.cs
index d81b442e2..4c40be53c 100644
--- a/Flow.Launcher.Plugin/PluginMetadata.cs
+++ b/Flow.Launcher.Plugin/PluginMetadata.cs
@@ -1,11 +1,10 @@
using System;
using System.Collections.Generic;
using System.IO;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin
{
- [JsonObject(MemberSerialization.OptOut)]
public class PluginMetadata : BaseModel
{
private string _pluginDirectory;
diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln
index 4d8997177..21c3b47dc 100644
--- a/Flow.Launcher.sln
+++ b/Flow.Launcher.sln
@@ -20,7 +20,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher", "Flow.Launc
{F9C4C081-4CC3-4146-95F1-E102B4E10A5F} = {F9C4C081-4CC3-4146-95F1-E102B4E10A5F}
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {59BD9891-3837-438A-958D-ADC7F91F6F7E}
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567} = {F35190AA-4758-4D9E-A193-E3BDF6AD3567}
{9B130CC5-14FB-41FF-B310-0A95B6894C37} = {9B130CC5-14FB-41FF-B310-0A95B6894C37}
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {FDED22C8-B637-42E8-824A-63B5B6E05A3A}
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {A3DCCBCA-ACC1-421D-B16E-210896234C26}
@@ -44,8 +43,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Sys",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Url", "Plugins\Flow.Launcher.Plugin.Url\Flow.Launcher.Plugin.Url.csproj", "{A3DCCBCA-ACC1-421D-B16E-210896234C26}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Color", "Plugins\Flow.Launcher.Plugin.Color\Flow.Launcher.Plugin.Color.csproj", "{F35190AA-4758-4D9E-A193-E3BDF6AD3567}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FFD651C7-0546-441F-BC8C-D4EE8FD01EA7}"
ProjectSection(SolutionItems) = preProject
.gitattributes = .gitattributes
@@ -214,18 +211,6 @@ Global
{A3DCCBCA-ACC1-421D-B16E-210896234C26}.Release|x64.Build.0 = Release|Any CPU
{A3DCCBCA-ACC1-421D-B16E-210896234C26}.Release|x86.ActiveCfg = Release|Any CPU
{A3DCCBCA-ACC1-421D-B16E-210896234C26}.Release|x86.Build.0 = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|x64.Build.0 = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Debug|x86.Build.0 = Debug|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|Any CPU.Build.0 = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|x64.ActiveCfg = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|x64.Build.0 = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|x86.ActiveCfg = Release|Any CPU
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}.Release|x86.Build.0 = Release|Any CPU
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -309,7 +294,6 @@ Global
{FDED22C8-B637-42E8-824A-63B5B6E05A3A} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{A3DCCBCA-ACC1-421D-B16E-210896234C26} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{9B130CC5-14FB-41FF-B310-0A95B6894C37} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {3A73F5A7-0335-40D8-BF7C-F20BE5D0BA87}
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 8548ba39e..c3b56b904 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -1,4 +1,4 @@
-
+
WinExe
@@ -60,6 +60,9 @@
Designer
PreserveNewest
+
+ PreserveNewest
+
@@ -78,7 +81,8 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
+
@@ -87,116 +91,7 @@
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Images/mainsearch.svg b/Flow.Launcher/Images/mainsearch.svg
new file mode 100644
index 000000000..5d28abdb3
--- /dev/null
+++ b/Flow.Launcher/Images/mainsearch.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index adb49b65d..6ee28e3ba 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -72,7 +72,7 @@
Are you sure you want to delete {0} plugin hotkey?
Query window shadow effect
Shadow effect has a substantial usage of GPU.
- Not recommended if you computer performance is limited.
+ Not recommended if your computer performance is limited.
HTTP Proxy
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index bf001d507..85fc1462c 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -45,8 +45,8 @@
Nová akcia skratky:
Priečinok s pluginmi
Autor
- Príprava: {0}ms
- Čas dopytu: {0}ms
+ Príprava:
+ Čas dopytu:
Motív
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 07bb96339..a2cfe569d 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -6,6 +6,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="clr-namespace:Flow.Launcher.Converters"
+ xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
mc:Ignorable="d"
Title="Flow Launcher"
Topmost="True"
@@ -92,7 +93,8 @@
-
+
-
+
@@ -429,8 +431,8 @@
-
-
+
+
diff --git a/Flow.Launcher/Storage/QueryHistory.cs b/Flow.Launcher/Storage/QueryHistory.cs
index de3bcaa22..2b2103605 100644
--- a/Flow.Launcher/Storage/QueryHistory.cs
+++ b/Flow.Launcher/Storage/QueryHistory.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using Newtonsoft.Json;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Storage
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index c110bdf92..09e69f6d8 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Newtonsoft.Json;
+using System.Text.Json;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Storage
@@ -8,7 +8,6 @@ namespace Flow.Launcher.Storage
// todo this class is not thread safe.... but used from multiple threads.
public class TopMostRecord
{
- [JsonProperty]
private Dictionary records = new Dictionary();
internal bool IsTopMost(Result result)
diff --git a/Flow.Launcher/Storage/UserSelectedRecord.cs b/Flow.Launcher/Storage/UserSelectedRecord.cs
index 1fda04e9b..c7ffe1a1d 100644
--- a/Flow.Launcher/Storage/UserSelectedRecord.cs
+++ b/Flow.Launcher/Storage/UserSelectedRecord.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using Newtonsoft.Json;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
@@ -7,7 +6,6 @@ namespace Flow.Launcher.Storage
{
public class UserSelectedRecord
{
- [JsonProperty]
private Dictionary records = new Dictionary();
public void Add(Result result)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 7a3aa9f2f..ae356447c 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -21,6 +21,7 @@ using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Storage;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.Image;
+using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.ViewModel
{
@@ -284,7 +285,7 @@ namespace Flow.Launcher.ViewModel
public string OpenResultCommandModifiers { get; private set; }
- public ImageSource Image => ImageLoader.Load(Constant.QueryTextBoxIconImagePath);
+ public string Image => Constant.QueryTextBoxIconImagePath;
#endregion
@@ -414,8 +415,15 @@ namespace Flow.Launcher.ViewModel
{
if (!plugin.Metadata.Disabled)
{
- var results = PluginManager.QueryForPlugin(plugin, query);
- UpdateResultView(results, plugin.Metadata, query);
+ try
+ {
+ var results = PluginManager.QueryForPlugin(plugin, query);
+ UpdateResultView(results, plugin.Metadata, query);
+ }
+ catch(Exception e)
+ {
+ Log.Exception("MainViewModel", $"Exception when querying the plugin {plugin.Metadata.Name}", e, "QueryResults");
+ }
}
});
}
@@ -432,7 +440,10 @@ namespace Flow.Launcher.ViewModel
{ // update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
}
- }, currentCancellationToken);
+ }, currentCancellationToken).ContinueWith(t =>
+ {
+ Log.Exception("MainViewModel", "Error when querying plugins", t.Exception?.InnerException, "QueryResults");
+ }, TaskContinuationOptions.OnlyOnFaulted);
}
}
else
diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs
index 00a0e1ae5..4c65f2b9f 100644
--- a/Flow.Launcher/ViewModel/ResultViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultViewModel.cs
@@ -1,4 +1,5 @@
using System;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
@@ -12,9 +13,9 @@ namespace Flow.Launcher.ViewModel
{
public class ResultViewModel : BaseModel
{
- public class LazyAsync : Lazy>
+ public class LazyAsync : Lazy>
{
- private T defaultValue;
+ private readonly T defaultValue;
private readonly Action _updateCallback;
public new T Value
@@ -23,21 +24,27 @@ namespace Flow.Launcher.ViewModel
{
if (!IsValueCreated)
{
- base.Value.ContinueWith(_ =>
- {
- _updateCallback();
- });
+ _ = Exercute(); // manually use callback strategy
return defaultValue;
}
-
- if (!base.Value.IsCompleted || base.Value.IsFaulted)
+
+ if (!base.Value.IsCompletedSuccessfully)
return defaultValue;
return base.Value.Result;
+
+ // If none of the variables captured by the local function are captured by other lambdas,
+ // the compiler can avoid heap allocations.
+ async ValueTask Exercute()
+ {
+ await base.Value.ConfigureAwait(false);
+ _updateCallback();
+ }
+
}
}
- public LazyAsync(Func> factory, T defaultValue, Action updateCallback) : base(factory)
+ public LazyAsync(Func> factory, T defaultValue, Action updateCallback) : base(factory)
{
if (defaultValue != null)
{
@@ -55,13 +62,13 @@ namespace Flow.Launcher.ViewModel
Result = result;
Image = new LazyAsync(
- SetImage,
+ SetImage,
ImageLoader.DefaultImage,
() =>
{
OnPropertyChanged(nameof(Image));
});
- }
+ }
Settings = settings;
}
@@ -82,7 +89,7 @@ namespace Flow.Launcher.ViewModel
public LazyAsync Image { get; set; }
- private async Task SetImage()
+ private async ValueTask SetImage()
{
var imagePath = Result.IcoPath;
if (string.IsNullOrEmpty(imagePath) && Result.Icon != null)
@@ -94,7 +101,7 @@ namespace Flow.Launcher.ViewModel
catch (Exception e)
{
Log.Exception($"|ResultViewModel.Image|IcoPath is empty and exception when calling Icon() for result <{Result.Title}> of plugin <{Result.PluginDirectory}>", e);
- imagePath = Constant.MissingImgIcon;
+ return ImageLoader.DefaultImage;
}
}
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index 853925852..c43167e09 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -213,7 +213,7 @@ namespace Flow.Launcher.ViewModel
#region plugin
- public static string Plugin => "http://www.wox.one/plugin";
+ public static string Plugin => @"https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest";
public PluginViewModel SelectedPlugin { get; set; }
public IList PluginViewModels
@@ -438,7 +438,7 @@ namespace Flow.Launcher.ViewModel
}
}
- public ImageSource ThemeImage => ImageLoader.Load(Constant.QueryTextBoxIconImagePath);
+ public string ThemeImage => Constant.QueryTextBoxIconImagePath;
#endregion
@@ -450,7 +450,7 @@ namespace Flow.Launcher.ViewModel
#region about
- public string Github => _updater.GitHubRepository;
+ public string Website => Constant.Website;
public string ReleaseNotes => _updater.GitHubRepository + @"/releases/latest";
public static string Version => Constant.Version;
public string ActivatedTimes => string.Format(_translater.GetTranslation("about_activate_times"), Settings.ActivateTimes);
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 85b745a6b..d2a8736a6 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -40,14 +40,6 @@
-
- Always
-
-
- Designer
- MSBuild:Compile
- PreserveNewest
-
Always
@@ -60,13 +52,16 @@
-
+
-
+
MSBuild:Compile
Designer
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
index de4f3849b..b0c3d2e29 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
@@ -4,7 +4,7 @@
"Name": "Browser Bookmarks",
"Description": "Search your browser bookmarks",
"Author": "qianlifeng, Ioannis G.",
- "Version": "1.3.1",
+ "Version": "1.3.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 9e1fefdb3..1090926fc 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -11,6 +11,7 @@
true
false
false
+ en
@@ -43,57 +44,14 @@
-
+
-
- PreserveNewest
-
-
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 709757d1a..7d9ca58d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Calculator",
"Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)",
"Author": "cxfksword",
- "Version": "1.1.3",
+ "Version": "1.1.4",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Caculator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj b/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj
deleted file mode 100644
index c7fe8271a..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
- Library
- netcoreapp3.1
- {F35190AA-4758-4D9E-A193-E3BDF6AD3567}
- Properties
- Flow.Launcher.Plugin.Color
- Flow.Launcher.Plugin.Color
- true
- false
- false
-
-
-
- true
- full
- false
- ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.Color\
- DEBUG;TRACE
- prompt
- 4
- false
-
-
-
- pdbonly
- true
- ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Color\
- TRACE
- prompt
- 4
- false
-
-
-
-
- PreserveNewest
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Images/color.png b/Plugins/Flow.Launcher.Plugin.Color/Images/color.png
deleted file mode 100644
index da28583b1..000000000
Binary files a/Plugins/Flow.Launcher.Plugin.Color/Images/color.png and /dev/null differ
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/de.xaml
deleted file mode 100644
index 3244dee14..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/de.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Farben
- Stellt eine HEX-Farben Vorschau bereit. (Versuche #000 in Flow Launcher)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/en.xaml
deleted file mode 100644
index 85e2830db..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/en.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Colors
- Allows to preview colors using hex values.(Try #000 in Flow Launcher)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/pl.xaml
deleted file mode 100644
index 15525cfe9..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/pl.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Kolory
- Podgląd kolorów po wpisaniu ich kodu szesnastkowego. (Spróbuj wpisać #000 w oknie Flow Launchera)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/sk.xaml
deleted file mode 100644
index 4b208691a..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/sk.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Farby
- Zobrazuje náhľad farieb v HEX formáte. (Skúste #000 vo Flow Launcheri)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/tr.xaml
deleted file mode 100644
index f56e73526..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/tr.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- Renkler
- Hex kodunu girdiğiniz renkleri görüntülemeye yarar.(#000 yazmayı deneyin)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-cn.xaml
deleted file mode 100644
index 39ede4844..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-cn.xaml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- 颜色
- 提供在Flow Launcher查询hex颜色。(尝试在Flow Launcher中输入#000)
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-tw.xaml
deleted file mode 100644
index 4e7062a22..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Languages/zh-tw.xaml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- 顏色
- 提供在 Flow Launcher 查詢 hex 顏色。(試著在 Flow Launcher 中輸入 #000)
-
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Main.cs b/Plugins/Flow.Launcher.Plugin.Color/Main.cs
deleted file mode 100644
index a15483ebc..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/Main.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.Drawing.Imaging;
-using System.IO;
-using System.Linq;
-using System.Windows;
-
-namespace Flow.Launcher.Plugin.Color
-{
- public sealed class ColorsPlugin : IPlugin, IPluginI18n
- {
- private string DIR_PATH = Path.Combine(Path.GetTempPath(), @"Plugins\Colors\");
- private PluginInitContext context;
- private const int IMG_SIZE = 32;
-
- private DirectoryInfo ColorsDirectory { get; set; }
-
- public ColorsPlugin()
- {
- if (!Directory.Exists(DIR_PATH))
- {
- ColorsDirectory = Directory.CreateDirectory(DIR_PATH);
- }
- else
- {
- ColorsDirectory = new DirectoryInfo(DIR_PATH);
- }
- }
-
- public List Query(Query query)
- {
- var raw = query.Search;
- if (!IsAvailable(raw)) return new List(0);
- try
- {
- var cached = Find(raw);
- if (cached.Length == 0)
- {
- var path = CreateImage(raw);
- return new List
- {
- new Result
- {
- Title = raw,
- IcoPath = path,
- Action = _ =>
- {
- Clipboard.SetText(raw);
- return true;
- }
- }
- };
- }
- return cached.Select(x => new Result
- {
- Title = raw,
- IcoPath = x.FullName,
- Action = _ =>
- {
- Clipboard.SetText(raw);
- return true;
- }
- }).ToList();
- }
- catch (Exception exception)
- {
- // todo: log
- return new List(0);
- }
- }
-
- private bool IsAvailable(string query)
- {
- // todo: rgb, names
- var length = query.Length - 1; // minus `#` sign
- return query.StartsWith("#") && (length == 3 || length == 6);
- }
-
- public FileInfo[] Find(string name)
- {
- var file = string.Format("{0}.png", name.Substring(1));
- return ColorsDirectory.GetFiles(file, SearchOption.TopDirectoryOnly);
- }
-
- private string CreateImage(string name)
- {
- using (var bitmap = new Bitmap(IMG_SIZE, IMG_SIZE))
- using (var graphics = Graphics.FromImage(bitmap))
- {
- var color = ColorTranslator.FromHtml(name);
- graphics.Clear(color);
-
- var path = CreateFileName(name);
- bitmap.Save(path, ImageFormat.Png);
- return path;
- }
- }
-
- private string CreateFileName(string name)
- {
- return string.Format("{0}{1}.png", ColorsDirectory.FullName, name.Substring(1));
- }
-
- public void Init(PluginInitContext context)
- {
- this.context = context;
- }
-
-
- public string GetTranslatedPluginTitle()
- {
- return context.API.GetTranslation("flowlauncher_plugin_color_plugin_name");
- }
-
- public string GetTranslatedPluginDescription()
- {
- return context.API.GetTranslation("flowlauncher_plugin_color_plugin_description");
- }
- }
-}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/plugin.json b/Plugins/Flow.Launcher.Plugin.Color/plugin.json
deleted file mode 100644
index 8c0c483ba..000000000
--- a/Plugins/Flow.Launcher.Plugin.Color/plugin.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "ID": "9B36CE6181FC47FBB597AA2C29CD9B0A",
- "ActionKeyword": "*",
- "Name": "Colors",
- "Description": "Provide hex color preview.(Try #000 in Flow Launcher)",
- "Author": "qianlifeng",
- "Version": "1.1.1",
- "Language": "csharp",
- "Website": "https://github.com/Flow-Launcher/Flow.Launcher",
- "ExecuteFileName": "Flow.Launcher.Plugin.Color.dll",
- "IcoPath": "Images\\color.png"
-}
diff --git a/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj b/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
index 699737634..06969a135 100644
--- a/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
+++ b/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
@@ -45,53 +45,10 @@
-
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.ControlPanel/plugin.json b/Plugins/Flow.Launcher.Plugin.ControlPanel/plugin.json
index 4f552a014..23f35e9ac 100644
--- a/Plugins/Flow.Launcher.Plugin.ControlPanel/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.ControlPanel/plugin.json
@@ -4,7 +4,7 @@
"Name": "Control Panel",
"Description": "Search within the Control Panel.",
"Author": "CoenraadS",
- "Version": "1.1.1",
+ "Version": "1.1.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.ControlPanel.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index a1a08843a..9f0b46d93 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -7,6 +7,7 @@
true
true
false
+ en
@@ -26,73 +27,10 @@
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
- Always
-
-
-
+
PreserveNewest
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/FolderLinks/FolderLink.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/FolderLinks/FolderLink.cs
index 379b5848f..43ecdad97 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/FolderLinks/FolderLink.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/FolderLinks/FolderLink.cs
@@ -1,15 +1,15 @@
-using Newtonsoft.Json;
-using System;
+using System;
using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin.Explorer.Search.FolderLinks
{
- [JsonObject(MemberSerialization.OptIn)]
public class FolderLink
{
- [JsonProperty]
public string Path { get; set; }
+ [JsonIgnore]
public string Nickname
{
get
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
index 5b12870c8..e62ea93fc 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -1,28 +1,22 @@
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.FolderLinks;
-using Newtonsoft.Json;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin.Explorer
{
public class Settings
{
- [JsonProperty]
public int MaxResult { get; set; } = 100;
- [JsonProperty]
public List QuickFolderAccessLinks { get; set; } = new List();
- [JsonProperty]
public bool UseWindowsIndexForDirectorySearch { get; set; } = true;
- [JsonProperty]
public List IndexSearchExcludedSubdirectoryPaths { get; set; } = new List();
- [JsonProperty]
public string SearchActionKeyword { get; set; } = Query.GlobalPluginWildcardSign;
- [JsonProperty]
public string FileContentSearchActionKeyword { get; set; } = Constants.DefaultContentSearchActionKeyword;
}
}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
index 2c57ac668..aa44c4413 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
@@ -7,7 +7,7 @@
"Name": "Explorer",
"Description": "Search and manage files and folders. Explorer utilises Windows Index Search",
"Author": "Jeremy Wu",
- "Version": "1.2.5",
+ "Version": "1.2.6",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
index e6bfa7aa3..cc280b9a9 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
@@ -10,6 +10,7 @@
true
false
false
+ en
@@ -46,55 +47,12 @@
-
- PreserveNewest
-
-
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
index 80900a445..7f73263a8 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Plugin Indicator",
"Description": "Provide plugin actionword suggestion",
"Author": "qianlifeng",
- "Version": "1.1.1",
+ "Version": "1.1.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginIndicator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
index 76cb0f86b..7bc357be4 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
@@ -10,12 +10,9 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
private PluginInitContext Context { get; set; }
- private Settings Settings { get; set; }
-
- public ContextMenu(PluginInitContext context, Settings settings)
+ public ContextMenu(PluginInitContext context)
{
Context = context;
- Settings = settings;
}
public List LoadContextMenus(Result selectedResult)
@@ -58,7 +55,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
? pluginManifestInfo.UrlSourceCode.Replace("/tree/master", "/issues/new/choose")
: pluginManifestInfo.UrlSourceCode;
- SharedCommands.SearchWeb.NewBrowserWindow(link);
+ SharedCommands.SearchWeb.NewTabInBrowser(link);
return true;
}
},
@@ -69,7 +66,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = selectedResult.IcoPath,
Action = _ =>
{
- SharedCommands.SearchWeb.NewBrowserWindow("https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest");
+ SharedCommands.SearchWeb.NewTabInBrowser("https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest");
return true;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
index cc1a931ce..2e352d832 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
@@ -27,15 +27,12 @@
PreserveNewest
-
-
-
- PreserveNewest
-
-
-
+
+ PreserveNewest
+
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 8d24c145c..3017f39c3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -1,4 +1,4 @@
-
@@ -11,6 +11,8 @@
Plugin Install
Plugin Uninstall
Install failed: unable to find the plugin.json metadata file from the new plugin
+ Error installing plugin
+ Error occured while trying to install {0}
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
index 43f92e7b9..f10f022d7 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs
@@ -1,13 +1,16 @@
using Flow.Launcher.Infrastructure.Storage;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.PluginsManager.ViewModels;
using Flow.Launcher.Plugin.PluginsManager.Views;
using System.Collections.Generic;
+using System.Linq;
using System.Windows.Controls;
+using Flow.Launcher.Infrastructure;
+using System;
+using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.PluginsManager
{
- public class Main : ISettingProvider, IPlugin, ISavable, IContextMenu, IPluginI18n
+ public class Main : ISettingProvider, IPlugin, ISavable, IContextMenu, IPluginI18n, IReloadable
{
internal PluginInitContext Context { get; set; }
@@ -17,6 +20,10 @@ namespace Flow.Launcher.Plugin.PluginsManager
private IContextMenu contextMenu;
+ internal PluginsManager pluginManager;
+
+ private DateTime lastUpdateTime = DateTime.MinValue;
+
public Control CreateSettingPanel()
{
return new PluginsManagerSettings(viewModel);
@@ -27,7 +34,9 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context = context;
viewModel = new SettingsViewModel(context);
Settings = viewModel.Settings;
- contextMenu = new ContextMenu(Context, Settings);
+ contextMenu = new ContextMenu(Context);
+ pluginManager = new PluginsManager(Context, Settings);
+ lastUpdateTime = DateTime.Now;
}
public List LoadContextMenus(Result selectedResult)
@@ -39,17 +48,29 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
var search = query.Search.ToLower();
- var pluginManager = new PluginsManager(Context, Settings);
+ if (string.IsNullOrWhiteSpace(search))
+ return pluginManager.GetDefaultHotKeys();
- if (!string.IsNullOrEmpty(search)
- && ($"{Settings.HotkeyUninstall} ".StartsWith(search) || search.StartsWith($"{Settings.HotkeyUninstall} ")))
- return pluginManager.RequestUninstall(search);
+ if ((DateTime.Now - lastUpdateTime).TotalHours > 12) // 12 hours
+ {
+ Task.Run(async () =>
+ {
+ await pluginManager.UpdateManifest();
+ lastUpdateTime = DateTime.Now;
+ });
+ }
- if (!string.IsNullOrEmpty(search)
- && ($"{Settings.HotkeyUpdate} ".StartsWith(search) || search.StartsWith($"{Settings.HotkeyUpdate} ")))
- return pluginManager.RequestUpdate(search);
-
- return pluginManager.RequestInstallOrUpdate(search);
+ return search switch
+ {
+ var s when s.StartsWith(Settings.HotKeyInstall) => pluginManager.RequestInstallOrUpdate(s),
+ var s when s.StartsWith(Settings.HotkeyUninstall) => pluginManager.RequestUninstall(s),
+ var s when s.StartsWith(Settings.HotkeyUpdate) => pluginManager.RequestUpdate(s),
+ _ => pluginManager.GetDefaultHotKeys().Where(hotkey =>
+ {
+ hotkey.Score = StringMatcher.FuzzySearch(search, hotkey.Title).Score;
+ return hotkey.Score > 0;
+ }).ToList()
+ };
}
public void Save()
@@ -66,5 +87,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
return Context.API.GetTranslation("plugin_pluginsmanager_plugin_description");
}
+
+ public void ReloadData()
+ {
+ Task.Run(() => pluginManager.UpdateManifest()).Wait();
+ lastUpdateTime = DateTime.Now;
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Models/PluginsManifest.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Models/PluginsManifest.cs
index 290221710..814e0764d 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Models/PluginsManifest.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Models/PluginsManifest.cs
@@ -1,8 +1,8 @@
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Infrastructure.Logger;
-using Newtonsoft.Json;
using System;
using System.Collections.Generic;
+using System.Text.Json;
using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.PluginsManager.Models
@@ -10,23 +10,20 @@ namespace Flow.Launcher.Plugin.PluginsManager.Models
internal class PluginsManifest
{
internal List UserPlugins { get; private set; }
+
internal PluginsManifest()
{
- DownloadManifest();
+ Task.Run(async () => await DownloadManifest()).Wait();
}
- private void DownloadManifest()
+ internal async Task DownloadManifest()
{
- var json = string.Empty;
try
{
- var t = Task.Run(
- async () =>
- json = await Http.Get("https://raw.githubusercontent.com/Flow-Launcher/Flow.Launcher.PluginsManifest/main/plugins.json"));
+ await using var jsonStream = await Http.GetStreamAsync("https://raw.githubusercontent.com/Flow-Launcher/Flow.Launcher.PluginsManifest/main/plugins.json")
+ .ConfigureAwait(false);
- t.Wait();
-
- UserPlugins = JsonConvert.DeserializeObject>(json);
+ UserPlugins = await JsonSerializer.DeserializeAsync>(jsonStream).ConfigureAwait(false);
}
catch (Exception e)
{
@@ -34,7 +31,6 @@ namespace Flow.Launcher.Plugin.PluginsManager.Models
UserPlugins = new List();
}
-
}
}
-}
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 90f3277fb..68df5bc1f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -7,20 +7,22 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Threading.Tasks;
using System.Windows;
namespace Flow.Launcher.Plugin.PluginsManager
{
internal class PluginsManager
{
- private readonly PluginsManifest pluginsManifest;
+ private PluginsManifest pluginsManifest;
private PluginInitContext Context { get; set; }
private Settings Settings { get; set; }
private bool shouldHideWindow = true;
- private bool ShouldHideWindow
+
+ private bool ShouldHideWindow
{
set { shouldHideWindow = value; }
get
@@ -42,18 +44,63 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context = context;
Settings = settings;
}
- internal void InstallOrUpdate(UserPlugin plugin)
+
+ internal async Task UpdateManifest()
+ {
+ await pluginsManifest.DownloadManifest();
+ }
+
+ internal List GetDefaultHotKeys()
+ {
+ return new List()
+ {
+ new Result()
+ {
+ Title = Settings.HotKeyInstall,
+ IcoPath = icoPath,
+ Action = _ =>
+ {
+ Context.API.ChangeQuery("pm install ");
+ return false;
+ }
+ },
+ new Result()
+ {
+ Title = Settings.HotkeyUninstall,
+ IcoPath = icoPath,
+ Action = _ =>
+ {
+ Context.API.ChangeQuery("pm uninstall ");
+ return false;
+ }
+ },
+ new Result()
+ {
+ Title = Settings.HotkeyUpdate,
+ IcoPath = icoPath,
+ Action = _ =>
+ {
+ Context.API.ChangeQuery("pm update ");
+ return false;
+ }
+ }
+ };
+ }
+
+ internal async Task InstallOrUpdate(UserPlugin plugin)
{
if (PluginExists(plugin.ID))
{
- if (Context.API.GetAllPlugins().Any(x => x.Metadata.ID == plugin.ID && x.Metadata.Version != plugin.Version))
+ if (Context.API.GetAllPlugins()
+ .Any(x => x.Metadata.ID == plugin.ID && x.Metadata.Version.CompareTo(plugin.Version) < 0))
{
if (MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_update_exists"),
- Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
- Context
- .API
- .ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {Settings.HotkeyUpdate} {plugin.Name}");
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ Context
+ .API
+ .ChangeQuery(
+ $"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {Settings.HotkeyUpdate} {plugin.Name}");
Application.Current.MainWindow.Show();
shouldHideWindow = false;
@@ -66,10 +113,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
var message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt"),
- plugin.Name, plugin.Author,
- Environment.NewLine, Environment.NewLine);
+ plugin.Name, plugin.Author,
+ Environment.NewLine, Environment.NewLine);
- if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_install_title"), MessageBoxButton.YesNo) == MessageBoxResult.No)
+ if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_install_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.No)
return;
var filePath = Path.Combine(DataLocation.PluginsDirectory, $"{plugin.Name}-{plugin.Version}.zip");
@@ -77,30 +125,34 @@ namespace Flow.Launcher.Plugin.PluginsManager
try
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
- Context.API.GetTranslation("plugin_pluginsmanager_please_wait"));
+ Context.API.GetTranslation("plugin_pluginsmanager_please_wait"));
- Http.Download(plugin.UrlDownload, filePath);
+ await Http.DownloadAsync(plugin.UrlDownload, filePath).ConfigureAwait(false);
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
- Context.API.GetTranslation("plugin_pluginsmanager_download_success"));
+ Context.API.GetTranslation("plugin_pluginsmanager_download_success"));
+
+ Install(plugin, filePath);
}
catch (Exception e)
{
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
- Context.API.GetTranslation("plugin_pluginsmanager_download_success"));
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"), plugin.Name));
- Log.Exception("PluginsManager", "An error occured while downloading plugin", e, "PluginDownload");
+ Log.Exception("PluginsManager", "An error occured while downloading plugin", e, "InstallOrUpdate");
+
+ return;
}
- Application.Current.Dispatcher.Invoke(() => { Install(plugin, filePath); Context.API.RestartApp(); });
+ Context.API.RestartApp();
}
internal List RequestUpdate(string search)
{
var autocompletedResults = AutoCompleteReturnAllResults(search,
- Settings.HotkeyUpdate,
- "Update",
- "Select a plugin to update");
+ Settings.HotkeyUpdate,
+ "Update",
+ "Select a plugin to update");
if (autocompletedResults.Any())
return autocompletedResults;
@@ -108,63 +160,84 @@ namespace Flow.Launcher.Plugin.PluginsManager
var uninstallSearch = search.Replace(Settings.HotkeyUpdate, string.Empty).TrimStart();
- var resultsForUpdate =
- from existingPlugin in Context.API.GetAllPlugins()
- join pluginFromManifest in pluginsManifest.UserPlugins
- on existingPlugin.Metadata.ID equals pluginFromManifest.ID
- where existingPlugin.Metadata.Version != pluginFromManifest.Version
- select
- new
- {
- pluginFromManifest.Name,
- pluginFromManifest.Author,
- CurrentVersion = existingPlugin.Metadata.Version,
- NewVersion = pluginFromManifest.Version,
- existingPlugin.Metadata.IcoPath,
- PluginExistingMetadata = existingPlugin.Metadata,
- PluginNewUserPlugin = pluginFromManifest
- };
+ var resultsForUpdate =
+ from existingPlugin in Context.API.GetAllPlugins()
+ join pluginFromManifest in pluginsManifest.UserPlugins
+ on existingPlugin.Metadata.ID equals pluginFromManifest.ID
+ where existingPlugin.Metadata.Version.CompareTo(pluginFromManifest.Version) < 0 // if current version precedes manifest version
+ select
+ new
+ {
+ pluginFromManifest.Name,
+ pluginFromManifest.Author,
+ CurrentVersion = existingPlugin.Metadata.Version,
+ NewVersion = pluginFromManifest.Version,
+ existingPlugin.Metadata.IcoPath,
+ PluginExistingMetadata = existingPlugin.Metadata,
+ PluginNewUserPlugin = pluginFromManifest
+ };
if (!resultsForUpdate.Any())
- return new List {
- new Result
- {
- Title = Context.API.GetTranslation("plugin_pluginsmanager_update_noresult_title"),
- SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_update_noresult_subtitle"),
- IcoPath = icoPath
- }};
+ return new List
+ {
+ new Result
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_update_noresult_title"),
+ SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_update_noresult_subtitle"),
+ IcoPath = icoPath
+ }
+ };
var results = resultsForUpdate
- .Select(x =>
- new Result
+ .Select(x =>
+ new Result
+ {
+ Title = $"{x.Name} by {x.Author}",
+ SubTitle = $"Update from version {x.CurrentVersion} to {x.NewVersion}",
+ IcoPath = x.IcoPath,
+ Action = e =>
+ {
+ string message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
+ x.Name, x.Author,
+ Environment.NewLine, Environment.NewLine);
+
+ if (MessageBox.Show(message,
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Uninstall(x.PluginExistingMetadata);
+
+ var downloadToFilePath = Path.Combine(DataLocation.PluginsDirectory,
+ $"{x.Name}-{x.NewVersion}.zip");
+
+ Task.Run(async delegate
{
- Title = $"{x.Name} by {x.Author}",
- SubTitle = $"Update from version {x.CurrentVersion} to {x.NewVersion}",
- IcoPath = x.IcoPath,
- Action = e =>
- {
- string message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
- x.Name, x.Author,
- Environment.NewLine, Environment.NewLine);
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
+ Context.API.GetTranslation("plugin_pluginsmanager_please_wait"));
- if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
- {
- Uninstall(x.PluginExistingMetadata);
+ await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath).ConfigureAwait(false);
- var downloadToFilePath = Path.Combine(DataLocation.PluginsDirectory, $"{x.Name}-{x.NewVersion}.zip");
- Http.Download(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath);
- Install(x.PluginNewUserPlugin, downloadToFilePath);
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
+ Context.API.GetTranslation("plugin_pluginsmanager_download_success"));
- Context.API.RestartApp();
+ Install(x.PluginNewUserPlugin, downloadToFilePath);
- return true;
- }
+ Context.API.RestartApp();
+ }).ContinueWith(t =>
+ {
+ Log.Exception("PluginsManager", $"Update failed for {x.Name}", t.Exception.InnerException, "RequestUpdate");
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"), x.Name));
+ }, TaskContinuationOptions.OnlyOnFaulted);
- return false;
- }
- });
+ return true;
+ }
+
+ return false;
+ }
+ });
return Search(results, uninstallSearch);
}
@@ -180,39 +253,40 @@ namespace Flow.Launcher.Plugin.PluginsManager
return results.ToList();
return results
- .Where(x =>
- {
- var matchResult = StringMatcher.FuzzySearch(searchName, x.Title);
- if (matchResult.IsSearchPrecisionScoreMet())
- x.Score = matchResult.Score;
+ .Where(x =>
+ {
+ var matchResult = StringMatcher.FuzzySearch(searchName, x.Title);
+ if (matchResult.IsSearchPrecisionScoreMet())
+ x.Score = matchResult.Score;
- return matchResult.IsSearchPrecisionScoreMet();
- })
- .ToList();
+ return matchResult.IsSearchPrecisionScoreMet();
+ })
+ .ToList();
}
internal List RequestInstallOrUpdate(string searchName)
{
+ var searchNameWithoutKeyword = searchName.Replace(Settings.HotKeyInstall, string.Empty).Trim();
+
var results =
pluginsManifest
- .UserPlugins
- .Select(x =>
- new Result
- {
- Title = $"{x.Name} by {x.Author}",
- SubTitle = x.Description,
- IcoPath = icoPath,
- Action = e =>
+ .UserPlugins
+ .Select(x =>
+ new Result
{
- Application.Current.MainWindow.Hide();
- InstallOrUpdate(x);
+ Title = $"{x.Name} by {x.Author}",
+ SubTitle = x.Description,
+ IcoPath = icoPath,
+ Action = e =>
+ {
+ Application.Current.MainWindow.Hide();
+ _ = InstallOrUpdate(x); // No need to wait
+ return ShouldHideWindow;
+ },
+ ContextData = x
+ });
- return ShouldHideWindow;
- },
- ContextData = x
- });
-
- return Search(results, searchName);
+ return Search(results, searchNameWithoutKeyword);
}
private void Install(UserPlugin plugin, string downloadedFilePath)
@@ -253,10 +327,10 @@ namespace Flow.Launcher.Plugin.PluginsManager
internal List RequestUninstall(string search)
{
- var autocompletedResults = AutoCompleteReturnAllResults(search,
- Settings.HotkeyUninstall,
- "Uninstall",
- "Select a plugin to uninstall");
+ var autocompletedResults = AutoCompleteReturnAllResults(search,
+ Settings.HotkeyUninstall,
+ "Uninstall",
+ "Select a plugin to uninstall");
if (autocompletedResults.Any())
return autocompletedResults;
@@ -264,32 +338,34 @@ namespace Flow.Launcher.Plugin.PluginsManager
var uninstallSearch = search.Replace(Settings.HotkeyUninstall, string.Empty).TrimStart();
var results = Context.API
- .GetAllPlugins()
- .Select(x =>
- new Result
- {
- Title = $"{x.Metadata.Name} by {x.Metadata.Author}",
- SubTitle = x.Metadata.Description,
- IcoPath = x.Metadata.IcoPath,
- Action = e =>
- {
- string message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
- x.Metadata.Name, x.Metadata.Author,
- Environment.NewLine, Environment.NewLine);
+ .GetAllPlugins()
+ .Select(x =>
+ new Result
+ {
+ Title = $"{x.Metadata.Name} by {x.Metadata.Author}",
+ SubTitle = x.Metadata.Description,
+ IcoPath = x.Metadata.IcoPath,
+ Action = e =>
+ {
+ string message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
+ x.Metadata.Name, x.Metadata.Author,
+ Environment.NewLine, Environment.NewLine);
- if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
- {
- Application.Current.MainWindow.Hide();
- Uninstall(x.Metadata);
- Context.API.RestartApp();
+ if (MessageBox.Show(message,
+ Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Application.Current.MainWindow.Hide();
+ Uninstall(x.Metadata);
+ Context.API.RestartApp();
- return true;
- }
+ return true;
+ }
- return false;
- }
- });
+ return false;
+ }
+ });
return Search(results, uninstallSearch);
}
@@ -317,8 +393,9 @@ namespace Flow.Launcher.Plugin.PluginsManager
Action = e =>
{
Context
- .API
- .ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {hotkey} ");
+ .API
+ .ChangeQuery(
+ $"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {hotkey} ");
return false;
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
index e2e8d22e5..9c5b0d29f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
@@ -6,6 +6,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
internal class Settings
{
+ internal string HotKeyInstall { get; set; } = "install";
internal string HotkeyUninstall { get; set; } = "uninstall";
internal string HotkeyUpdate { get; set; } = "update";
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
index e970e5a8e..ef2c1255a 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
@@ -6,7 +6,7 @@
"Name": "Plugins Manager",
"Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
"Author": "Jeremy Wu",
- "Version": "1.3.0",
+ "Version": "1.4.1",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
index cf9c96294..a643ebf86 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
@@ -36,14 +36,14 @@
-
- PreserveNewest
-
-
+
Designer
MSBuild:Compile
PreserveNewest
+
+ PreserveNewest
+
Always
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
index d769397a8..2bb40c644 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
@@ -4,7 +4,7 @@
"Name":"Process Killer",
"Description":"kill running processes from Flow",
"Author":"Flow-Launcher",
- "Version":"1.2.1",
+ "Version":"1.2.2",
"Language":"csharp",
"Website":"https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller",
"IcoPath":"Images\\app.png",
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 3802297c7..12e113855 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -53,52 +53,12 @@
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- Always
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.Program/plugin.json b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
index 7d7a42e03..6c2c18e47 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
@@ -4,7 +4,7 @@
"Name": "Program",
"Description": "Search programs in Flow.Launcher",
"Author": "qianlifeng",
- "Version": "1.2.2",
+ "Version": "1.2.3",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Program.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
index 178d95010..c542dc89b 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
@@ -33,32 +33,6 @@
4
false
-
-
-
- Always
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
@@ -72,20 +46,12 @@
-
- PreserveNewest
-
-
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
- MSBuild:Compile
- Designer
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
index 63e74d678..4ad572cf6 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
@@ -4,7 +4,7 @@
"Name": "Shell",
"Description": "Provide executing commands from Flow Launcher. Commands should start with >",
"Author": "qianlifeng",
- "Version": "1.1.1",
+ "Version": "1.1.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
index bdab40457..8ef4dc0fb 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
@@ -40,46 +40,12 @@
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
@@ -93,39 +59,4 @@
PreserveNewest
-
-
-
- PreserveNewest
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
index 8d4b9a238..cf8ed6041 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
@@ -4,7 +4,7 @@
"Name": "System Commands",
"Description": "Provide System related commands. e.g. shutdown,lock,setting etc.",
"Author": "qianlifeng",
- "Version": "1.1.1",
+ "Version": "1.1.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Sys.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
index 7d802d815..671a8b1c2 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
@@ -44,49 +44,14 @@
-
+
-
- PreserveNewest
-
-
-
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
-
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
diff --git a/Plugins/Flow.Launcher.Plugin.Url/plugin.json b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
index be64f6708..89dc20a33 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
@@ -4,7 +4,7 @@
"Name": "URL",
"Description": "Open the typed URL from Flow Launcher",
"Author": "qianlifeng",
- "Version": "1.1.1",
+ "Version": "1.1.2",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Url.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj b/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
index 431ca9ce8..af86af842 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
@@ -35,88 +35,12 @@
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
MSBuild:Compile
Designer
PreserveNewest
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
- PreserveNewest
-
-
- MSBuild:Compile
- Designer
+
PreserveNewest
@@ -134,12 +58,6 @@
PreserveNewest
-
-
-
- PreserveNewest
-
-
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
index c7ccb4d51..98e9376fb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
@@ -1,10 +1,10 @@
using System.IO;
using System.Windows.Media;
using JetBrains.Annotations;
-using Newtonsoft.Json;
using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure;
using System.Reflection;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin.WebSearch
{
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
index 555ee4647..8a1700415 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
@@ -1,6 +1,6 @@
using System;
using System.Collections.ObjectModel;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using Flow.Launcher.Plugin.WebSearch.SuggestionSources;
namespace Flow.Launcher.Plugin.WebSearch
@@ -196,7 +196,8 @@ namespace Flow.Launcher.Plugin.WebSearch
[JsonIgnore]
public SuggestionSource[] Suggestions { get; set; } = {
new Google(),
- new Baidu()
+ new Baidu(),
+ new Bing()
};
[JsonIgnore]
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Baidu.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Baidu.cs
index 57db223bc..2e385510f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Baidu.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Baidu.cs
@@ -2,12 +2,12 @@
using System.Collections.Generic;
using System.Linq;
using System.Net;
+using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Infrastructure.Logger;
+using System.Net.Http;
namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
{
@@ -22,9 +22,9 @@ namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
try
{
const string api = "http://suggestion.baidu.com/su?json=1&wd=";
- result = await Http.Get(api + Uri.EscapeUriString(query), "GB2312");
+ result = await Http.GetAsync(api + Uri.EscapeUriString(query)).ConfigureAwait(false);
}
- catch (WebException e)
+ catch (HttpRequestException e)
{
Log.Exception("|Baidu.Suggestions|Can't get suggestion from baidu", e);
return new List();
@@ -34,25 +34,20 @@ namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
Match match = _reg.Match(result);
if (match.Success)
{
- JContainer json;
+ JsonDocument json;
try
{
- json = JsonConvert.DeserializeObject(match.Groups[1].Value) as JContainer;
+ json = JsonDocument.Parse(match.Groups[1].Value);
}
- catch (JsonSerializationException e)
+ catch(JsonException e)
{
Log.Exception("|Baidu.Suggestions|can't parse suggestions", e);
return new List();
}
- if (json != null)
- {
- var results = json["s"] as JArray;
- if (results != null)
- {
- return results.OfType().Select(o => o.Value).OfType().ToList();
- }
- }
+ var results = json?.RootElement.GetProperty("s");
+
+ return results?.EnumerateArray().Select(o => o.GetString()).ToList() ?? new List();
}
return new List();
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Bing.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Bing.cs
new file mode 100644
index 000000000..9c4746711
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Bing.cs
@@ -0,0 +1,62 @@
+using Flow.Launcher.Infrastructure.Http;
+using Flow.Launcher.Infrastructure.Logger;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.Http;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Text.Json;
+using System.Linq;
+
+namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
+{
+ class Bing : SuggestionSource
+ {
+ public override async Task> Suggestions(string query)
+ {
+ Stream resultStream;
+
+ try
+ {
+ const string api = "https://api.bing.com/qsonhs.aspx?q=";
+ resultStream = await Http.GetStreamAsync(api + Uri.EscapeUriString(query)).ConfigureAwait(false);
+ }
+ catch (HttpRequestException e)
+ {
+ Log.Exception("|Bing.Suggestions|Can't get suggestion from Bing", e);
+ return new List();
+ }
+
+ if (resultStream.Length == 0) return new List();
+
+ JsonElement json;
+ try
+ {
+ json = (await JsonDocument.ParseAsync(resultStream)).RootElement.GetProperty("AS");
+ }
+ catch (JsonException e)
+ {
+ Log.Exception("|Bing.Suggestions|can't parse suggestions", e);
+ return new List();
+ }
+
+ if (json.GetProperty("FullResults").GetInt32() == 0)
+ return new List();
+
+ return json.GetProperty("Results")
+ .EnumerateArray()
+ .SelectMany(r => r.GetProperty("Suggests")
+ .EnumerateArray()
+ .Select(s => s.GetProperty("Txt").GetString()))
+ .ToList();
+
+ }
+
+ public override string ToString()
+ {
+ return "Bing";
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Google.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Google.cs
index 81878bd8b..f23cb66ff 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Google.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SuggestionSources/Google.cs
@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Infrastructure.Logger;
+using System.Net.Http;
+using System.Text.Json;
+using System.IO;
namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
{
@@ -14,38 +15,32 @@ namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources
{
public override async Task> Suggestions(string query)
{
- string result;
+ Stream resultStream;
try
{
const string api = "https://www.google.com/complete/search?output=chrome&q=";
- result = await Http.Get(api + Uri.EscapeUriString(query));
+ resultStream = await Http.GetStreamAsync(api + Uri.EscapeUriString(query)).ConfigureAwait(false);
}
- catch (WebException e)
+ catch (HttpRequestException e)
{
Log.Exception("|Google.Suggestions|Can't get suggestion from google", e);
return new List();
- ;
}
- if (string.IsNullOrEmpty(result)) return new List();
- JContainer json;
+ if (resultStream.Length == 0) return new List();
+ JsonDocument json;
try
{
- json = JsonConvert.DeserializeObject(result) as JContainer;
+ json = await JsonDocument.ParseAsync(resultStream);
}
- catch (JsonSerializationException e)
+ catch (JsonException e)
{
Log.Exception("|Google.Suggestions|can't parse suggestions", e);
return new List();
}
- if (json != null)
- {
- var results = json[1] as JContainer;
- if (results != null)
- {
- return results.OfType().Select(o => o.Value).OfType().ToList();
- }
- }
- return new List();
+
+ var results = json?.RootElement.EnumerateArray().ElementAt(1);
+
+ return results?.EnumerateArray().Select(o => o.GetString()).ToList() ?? new List();
}
public override string ToString()
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
index 329f1c41d..c036fbf8b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
@@ -25,7 +25,7 @@
"Name": "Web Searches",
"Description": "Provide the web search ability",
"Author": "qianlifeng",
- "Version": "1.1.2",
+ "Version": "1.2.1",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.WebSearch.dll",
diff --git a/README.md b/README.md
index 5f3f7e1a7..654877f3a 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
[](https://ci.appveyor.com/project/JohnTheGr8/flow-launcher/branch/dev)
[](https://github.com/Flow-Launcher/Flow.Launcher/releases)
[](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)
@@ -45,7 +45,7 @@ Windows may complain about security due to code not being signed, this will be c
- Open flow's search window: Alt+Space is the default hotkey.
- Open context menu: Ctrl+O/Shift+Enter.
- Cancel/Return to previous screen: Esc.
-- Install/Uninstall/Update plugins: in the search window, type `pm`/`pm uninstall`/`pm update` + the plugin name.
+- Install/Uninstall/Update plugins: in the search window, type `pm install`/`pm uninstall`/`pm update` + the plugin name.
- Saved user settings are located:
- If using roaming: `%APPDATA%\FlowLauncher`
- If using portable, by default: `%localappdata%\FlowLauncher\app-\UserData`
diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1
index 18ce33c4f..b08fac8f6 100644
--- a/Scripts/post_build.ps1
+++ b/Scripts/post_build.ps1
@@ -1,13 +1,13 @@
param(
[string]$config = "Release",
- [string]$solution,
- [string]$targetpath
+ [string]$solution = (Join-Path $PSScriptRoot ".." -Resolve)
)
Write-Host "Config: $config"
function Build-Version {
if ([string]::IsNullOrEmpty($env:flowVersion)) {
- $v = (Get-Command ${TargetPath}).FileVersionInfo.FileVersion
+ $targetPath = Join-Path $solution "Output/Release/Flow.Launcher.dll" -Resolve
+ $v = (Get-Command ${targetPath}).FileVersionInfo.FileVersion
} else {
$v = $env:flowVersion
}
@@ -31,22 +31,18 @@ function Build-Path {
return $p
}
-function Copy-Resources ($path, $config) {
- $project = "$path\Flow.Launcher"
- $output = "$path\Output"
- $target = "$output\$config"
- Copy-Item -Recurse -Force $project\Images\* $target\Images\
- Copy-Item -Recurse -Force $path\JsonRPC $target\JsonRPC
+function Copy-Resources ($path) {
# making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced.
- Copy-Item -Force $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe $output\Update.exe
+ Copy-Item -Force $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe $path\Output\Update.exe
}
function Delete-Unused ($path, $config) {
$target = "$path\Output\$config"
$included = Get-ChildItem $target -Filter "*.dll"
foreach ($i in $included){
- Remove-Item -Path $target\Plugins -Include $i -Recurse
- Write-Host "Deleting duplicated $i"
+ $deleteList = Get-ChildItem $target\Plugins -Include $i -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq "$i" }
+ $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName }
+ $deleteList | Remove-Item
}
Remove-Item -Path $target -Include "*.xml" -Recurse
}
@@ -55,17 +51,6 @@ function Validate-Directory ($output) {
New-Item $output -ItemType Directory -Force
}
-function Zip-Release ($path, $version, $output) {
- Write-Host "Begin zip release"
-
- $content = "$path\Output\Release\*"
- $zipFile = "$output\Flow-Launcher-v$version.zip"
-
- Compress-Archive -Force -Path $content -DestinationPath $zipFile
-
- Write-Host "End zip release"
-}
-
function Pack-Squirrel-Installer ($path, $version, $output) {
# msbuild based installer generation is not working in appveyor, not sure why
Write-Host "Begin pack squirrel installer"
@@ -75,6 +60,8 @@ function Pack-Squirrel-Installer ($path, $version, $output) {
Write-Host "Packing: $spec"
Write-Host "Input path: $input"
+ # making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced.
+ New-Alias Nuget $env:USERPROFILE\.nuget\packages\NuGet.CommandLine\5.4.0\tools\NuGet.exe -Force
# TODO: can we use dotnet pack here?
nuget pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release
@@ -100,40 +87,30 @@ function Pack-Squirrel-Installer ($path, $version, $output) {
Write-Host "End pack squirrel installer"
}
-function IsDotNetCoreAppSelfContainedPublishEvent{
- return Test-Path $solution\Output\Release\coreclr.dll
-}
+function Publish-Self-Contained ($p) {
-function FixPublishLastWriteDateTimeError ($solutionPath) {
- #Fix error from publishing self contained app, when nuget tries to pack core dll references throws the error 'The DateTimeOffset specified cannot be converted into a Zip file timestamp'
- gci -path "$solutionPath\Output\Release" -rec -file *.dll | Where-Object {$_.LastWriteTime -lt (Get-Date).AddYears(-20)} | % { try { $_.LastWriteTime = '01/01/2000 00:00:00' } catch {} }
+ $csproj = Join-Path "$p" "Flow.Launcher/Flow.Launcher.csproj" -Resolve
+ $profile = Join-Path "$p" "Flow.Launcher/Properties/PublishProfiles/NetCore3.1-SelfContained.pubxml" -Resolve
+
+ # we call dotnet publish on the main project.
+ # The other projects should have been built in Release at this point.
+ dotnet publish -c Release $csproj /p:PublishProfile=$profile
}
function Main {
$p = Build-Path
$v = Build-Version
- Copy-Resources $p $config
+ Copy-Resources $p
if ($config -eq "Release"){
- if(IsDotNetCoreAppSelfContainedPublishEvent) {
- FixPublishLastWriteDateTimeError $p
- }
-
Delete-Unused $p $config
+
+ Publish-Self-Contained $p
+
$o = "$p\Output\Packages"
Validate-Directory $o
- # making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced.
- New-Alias Nuget $env:USERPROFILE\.nuget\packages\NuGet.CommandLine\5.4.0\tools\NuGet.exe -Force
Pack-Squirrel-Installer $p $v $o
-
- $isInCI = $env:APPVEYOR
- if ($isInCI) {
- Zip-Release $p $v $o
- }
-
- Write-Host "List output directory"
- Get-ChildItem $o
}
}
diff --git a/SolutionAssemblyInfo.cs b/SolutionAssemblyInfo.cs
index ccbfef5d0..afd76b5d7 100644
--- a/SolutionAssemblyInfo.cs
+++ b/SolutionAssemblyInfo.cs
@@ -16,6 +16,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
-[assembly: AssemblyVersion("1.6.0")]
-[assembly: AssemblyFileVersion("1.6.0")]
-[assembly: AssemblyInformationalVersion("1.6.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("1.7.0")]
+[assembly: AssemblyFileVersion("1.7.0")]
+[assembly: AssemblyInformationalVersion("1.7.0")]
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
index 1f0937d6d..2c2f43b66 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.6.0.{build}'
+version: '1.7.0.{build}'
init:
- ps: |
@@ -26,17 +26,42 @@ before_build:
build:
project: Flow.Launcher.sln
verbosity: minimal
+after_build:
+ - ps: .\Scripts\post_build.ps1
artifacts:
-- path: 'Output\Packages\Flow-Launcher-*.zip'
- name: Zip
- path: 'Output\Release\Flow.Launcher.Plugin.*.nupkg'
name: Plugin nupkg
+- path: 'Output\Packages\Flow-Launcher-*.exe'
+ name: Squirrel Installer
+- path: 'Output\Packages\FlowLauncher-*-full.nupkg'
+ name: Squirrel nupkg
+- path: 'Output\Packages\RELEASES'
+ name: Squirrel RELEASES
deploy:
- provider: NuGet
- artifact: /.*\.nupkg/
- api_key:
- secure: n80IeWR3pN81p0w4uXq4mO0TdTXoJSHHFL+yTB9YBJ0Wni2DjZGYwOFdaWzW4hRi
- on:
- branch: master
\ No newline at end of file
+ - provider: NuGet
+ artifact: Plugin nupkg
+ api_key:
+ secure: n80IeWR3pN81p0w4uXq4mO0TdTXoJSHHFL+yTB9YBJ0Wni2DjZGYwOFdaWzW4hRi
+ on:
+ branch: master
+
+ - provider: GitHub
+ release: v$(flowVersion)
+ auth_token:
+ secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
+ artifact: Squirrel Installer, Squirrel nupkg, Squirrel RELEASES
+ draft: true
+ force_update: true
+ on:
+ branch: master
+
+ - provider: GitHub
+ release: v$(flowVersion)
+ auth_token:
+ secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
+ artifact: Squirrel Installer, Squirrel nupkg, Squirrel RELEASES
+ force_update: true
+ on:
+ APPVEYOR_REPO_TAG: true
\ No newline at end of file