From f806c23e578a48fc698544f684444e84046a4218 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Thu, 20 Oct 2022 02:30:58 +0800 Subject: [PATCH 1/6] Fix UWP icon missing issue --- .../Programs/UWP.cs | 125 ++++++++++-------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index ad7387f107f..b8c029d0505 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -601,67 +601,86 @@ internal string LogoPathFromUri(string uri) // windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size // windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx - string path; - if (uri.Contains("\\")) - { - path = Path.Combine(Package.Location, uri); - } - else - { - // for C:\Windows\MiracastView etc - path = Path.Combine(Package.Location, "Assets", uri); - } + string path = Path.Combine(Package.Location, uri); + + // TODO: NOT sure why we needed this? Maybe for Windows 8? + //if (uri.Contains("\\")) + //{ + // path = Path.Combine(Package.Location, uri); + //} + //else + //{ + // // for C:\Windows\MiracastView etc + // path = Path.Combine(Package.Location, "Assets", uri); + //} var extension = Path.GetExtension(path); if (extension != null) { - var end = path.Length - extension.Length; - var prefix = path.Substring(0, end); - var paths = new List - { - path - }; - - var scaleFactors = new Dictionary> + if (File.Exists(path)) { - // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables, - { - PackageVersion.Windows10, new List - { - 100, - 125, - 150, - 200, - 400 - } - }, - { - PackageVersion.Windows81, new List - { - 100, - 120, - 140, - 160, - 180 - } - }, - { - PackageVersion.Windows8, new List - { - 100 - } - } - }; + return path; // shortcut, avoid enumerating files + } - if (scaleFactors.ContainsKey(Package.Version)) + var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44 + var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets + if (String.IsNullOrEmpty(logoNamePrefix) || String.IsNullOrEmpty(logoDir) || !Directory.Exists(logoDir)) { - foreach (var factor in scaleFactors[Package.Version]) - { - paths.Add($"{prefix}.scale-{factor}{extension}"); - } + // Known issue: Edge always triggers it since logo is not at uri + ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + + $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Package.Location}", new FileNotFoundException()); + return string.Empty; } - var selected = paths.FirstOrDefault(File.Exists); + var files = Directory.EnumerateFiles(logoDir); + + // Just ignore all qulifiers + // select like logo[xxx].png + // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast + var selected = files.FirstOrDefault(file => + Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) + ); + + //var scaleFactors = new Dictionary> + //{ + // // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables, + // { + // PackageVersion.Windows10, new List + // { + // 100, + // 125, + // 150, + // 200, + // 400 + // } + // }, + // { + // PackageVersion.Windows81, new List + // { + // 100, + // 120, + // 140, + // 160, + // 180 + // } + // }, + // { + // PackageVersion.Windows8, new List + // { + // 100 + // } + // } + //}; + + //if (scaleFactors.ContainsKey(Package.Version)) + //{ + // foreach (var factor in scaleFactors[Package.Version]) + // { + // // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast + // suffixes.Add($"scale-{factor}{extension}"); // MS don't require scale as the last + // } + //} + if (!string.IsNullOrEmpty(selected)) { return selected; @@ -669,7 +688,7 @@ internal string LogoPathFromUri(string uri) else { ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + - $"|{UserModelId} can't find logo uri for {uri} in package location: {Package.Location}", new FileNotFoundException()); + $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Package.Location}", new FileNotFoundException()); return string.Empty; } } From d533c5ee935a1284d9161b38248faadfd4595c64 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 21 Oct 2022 01:01:07 +0800 Subject: [PATCH 2/6] Try to find in Assets\ if logo doesn't exist --- .../Programs/UWP.cs | 177 +++++++++--------- 1 file changed, 90 insertions(+), 87 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index b8c029d0505..3d4e3a405cb 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -603,109 +603,112 @@ internal string LogoPathFromUri(string uri) string path = Path.Combine(Package.Location, uri); - // TODO: NOT sure why we needed this? Maybe for Windows 8? - //if (uri.Contains("\\")) - //{ - // path = Path.Combine(Package.Location, uri); - //} - //else - //{ - // // for C:\Windows\MiracastView etc - // path = Path.Combine(Package.Location, "Assets", uri); - //} - - var extension = Path.GetExtension(path); - if (extension != null) - { - if (File.Exists(path)) - { - return path; // shortcut, avoid enumerating files - } + var logoPath = TryToFindLogo(uri, path); + if (String.IsNullOrEmpty(logoPath)) + { + // TODO: Don't know why, just keep it at the moment + // Maybe on older version of Windows 10? + // for C:\Windows\MiracastView etc + return TryToFindLogo(uri, Path.Combine(Package.Location, "Assets", uri)); + } + return logoPath; - var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44 - var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets - if (String.IsNullOrEmpty(logoNamePrefix) || String.IsNullOrEmpty(logoDir) || !Directory.Exists(logoDir)) + string TryToFindLogo(string uri, string path) + { + var extension = Path.GetExtension(path); + if (extension != null) { - // Known issue: Edge always triggers it since logo is not at uri - ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + - $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Package.Location}", new FileNotFoundException()); - return string.Empty; - } + if (File.Exists(path)) + { + return path; // shortcut, avoid enumerating files + } - var files = Directory.EnumerateFiles(logoDir); - - // Just ignore all qulifiers - // select like logo[xxx].png - // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast - var selected = files.FirstOrDefault(file => - Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) - ); - - //var scaleFactors = new Dictionary> - //{ - // // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables, - // { - // PackageVersion.Windows10, new List - // { - // 100, - // 125, - // 150, - // 200, - // 400 - // } - // }, - // { - // PackageVersion.Windows81, new List - // { - // 100, - // 120, - // 140, - // 160, - // 180 - // } - // }, - // { - // PackageVersion.Windows8, new List - // { - // 100 - // } - // } - //}; - - //if (scaleFactors.ContainsKey(Package.Version)) - //{ - // foreach (var factor in scaleFactors[Package.Version]) - // { - // // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast - // suffixes.Add($"scale-{factor}{extension}"); // MS don't require scale as the last - // } - //} - - if (!string.IsNullOrEmpty(selected)) - { - return selected; + var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44 + var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets + if (String.IsNullOrEmpty(logoNamePrefix) || String.IsNullOrEmpty(logoDir) || !Directory.Exists(logoDir)) + { + // Known issue: Edge always triggers it since logo is not at uri + ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + + $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Package.Location}", new FileNotFoundException()); + return string.Empty; + } + + var files = Directory.EnumerateFiles(logoDir); + + // Currently we don't care which one to choose + // Just ignore all qualifiers + // select like logo.[xxx_yyy].png + // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast + var selected = files.FirstOrDefault(file => + Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) + ); + + //var scaleFactors = new Dictionary> + //{ + // // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables, + // { + // PackageVersion.Windows10, new List + // { + // 100, + // 125, + // 150, + // 200, + // 400 + // } + // }, + // { + // PackageVersion.Windows81, new List + // { + // 100, + // 120, + // 140, + // 160, + // 180 + // } + // }, + // { + // PackageVersion.Windows8, new List + // { + // 100 + // } + // } + //}; + + //if (scaleFactors.ContainsKey(Package.Version)) + //{ + // foreach (var factor in scaleFactors[Package.Version]) + // { + // // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast + // suffixes.Add($"scale-{factor}{extension}"); // MS don't require scale as the last + // } + //} + + if (!string.IsNullOrEmpty(selected)) + { + return selected; + } + else + { + ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + + $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Package.Location}", new FileNotFoundException()); + return string.Empty; + } } else { ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + - $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Package.Location}", new FileNotFoundException()); + $"|Unable to find extension from {uri} for {UserModelId} " + + $"in package location {Package.Location}", new FileNotFoundException()); return string.Empty; } } - else - { - ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" + - $"|Unable to find extension from {uri} for {UserModelId} " + - $"in package location {Package.Location}", new FileNotFoundException()); - return string.Empty; - } } public ImageSource Logo() { var logo = ImageFromPath(LogoPath); - var plated = PlatedImage(logo); + var plated = PlatedImage(logo); // TODO: maybe get plated directly from app package? // todo magic! temp fix for cross thread object plated.Freeze(); From 8ac873b953d0cec678a71c80ed840241052da837 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 28 Oct 2022 16:25:28 +0800 Subject: [PATCH 3/6] remove comments --- .../Programs/UWP.cs | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index 3d4e3a405cb..075ffbaf6c1 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -643,46 +643,6 @@ string TryToFindLogo(string uri, string path) Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) ); - //var scaleFactors = new Dictionary> - //{ - // // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables, - // { - // PackageVersion.Windows10, new List - // { - // 100, - // 125, - // 150, - // 200, - // 400 - // } - // }, - // { - // PackageVersion.Windows81, new List - // { - // 100, - // 120, - // 140, - // 160, - // 180 - // } - // }, - // { - // PackageVersion.Windows8, new List - // { - // 100 - // } - // } - //}; - - //if (scaleFactors.ContainsKey(Package.Version)) - //{ - // foreach (var factor in scaleFactors[Package.Version]) - // { - // // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast - // suffixes.Add($"scale-{factor}{extension}"); // MS don't require scale as the last - // } - //} - if (!string.IsNullOrEmpty(selected)) { return selected; From 3af296e4d7a4452f62c5ec3e7a9a20acdf772ab7 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 28 Oct 2022 16:36:44 +0800 Subject: [PATCH 4/6] Try to get 44x44 logo --- .../Programs/UWP.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index 075ffbaf6c1..3d8b6a2f04a 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -618,10 +618,10 @@ string TryToFindLogo(string uri, string path) var extension = Path.GetExtension(path); if (extension != null) { - if (File.Exists(path)) - { - return path; // shortcut, avoid enumerating files - } + //if (File.Exists(path)) + //{ + // return path; // shortcut, avoid enumerating files + //} var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44 var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets @@ -639,10 +639,26 @@ string TryToFindLogo(string uri, string path) // Just ignore all qualifiers // select like logo.[xxx_yyy].png // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast - var selected = files.FirstOrDefault(file => + var logos = files.Where(file => Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) ); + var selected = logos.FirstOrDefault(); + + foreach(var logo in logos) + { + + var imageStream = File.OpenRead(logo); + var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None); + var height = decoder.Frames[0].PixelHeight; + var width = decoder.Frames[0].PixelWidth; + if(height == 44 && width == 44) + { + selected = logo; + break; + } + } + if (!string.IsNullOrEmpty(selected)) { return selected; From 0ab82de704e14690b3b1c55b8ed88e224d54da62 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Mon, 31 Oct 2022 20:03:34 +0800 Subject: [PATCH 5/6] Try to find logo closest to 44x44 --- .../Flow.Launcher.Plugin.Program/Programs/UWP.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index 3d8b6a2f04a..8ad13691cb4 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -644,7 +644,8 @@ string TryToFindLogo(string uri, string path) ); var selected = logos.FirstOrDefault(); - + var closest = selected; + int min = int.MaxValue; foreach(var logo in logos) { @@ -652,13 +653,18 @@ string TryToFindLogo(string uri, string path) var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None); var height = decoder.Frames[0].PixelHeight; var width = decoder.Frames[0].PixelWidth; - if(height == 44 && width == 44) + int pixelCountDiff = Math.Abs(height * width - 1936); // 44*44=1936 + if(pixelCountDiff < min) { - selected = logo; - break; + // try to find the closest to 44x44 logo + closest = logo; + if (pixelCountDiff == 0) + break; // found 44x44 + min = pixelCountDiff; } } + selected = closest; if (!string.IsNullOrEmpty(selected)) { return selected; From 44c541bd1eb8cddfb5dcb2d55b41f4b1bccb8466 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 4 Nov 2022 16:01:14 +0800 Subject: [PATCH 6/6] Fix path case in comparison --- Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index 8ad13691cb4..316aaaac301 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -640,7 +640,8 @@ string TryToFindLogo(string uri, string path) // select like logo.[xxx_yyy].png // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast var logos = files.Where(file => - Path.GetFileName(file).StartsWith(logoNamePrefix) && extension == Path.GetExtension(file) + Path.GetFileName(file)?.StartsWith(logoNamePrefix, StringComparison.OrdinalIgnoreCase) ?? false + && extension.Equals(Path.GetExtension(file), StringComparison.OrdinalIgnoreCase) ); var selected = logos.FirstOrDefault();