From 99003c204e0f17c5a3c9e4e81c31b3f410f17a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 12 Jun 2026 15:15:42 -0400 Subject: [PATCH 1/2] Make Avalonia frontend the default Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Pages/SettingsPages/Interface_P.axaml | 2 +- .../SettingsEngine_Names.cs | 2 + src/UniGetUI.Tests/ModernAppLauncherTests.cs | 72 +++++++++++++++++-- src/UniGetUI/ModernAppLauncher.cs | 24 ++++++- .../GeneralPages/Interface_P.xaml | 2 +- 5 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml index 4909487c9a..ad2506ceec 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/Interface_P.axaml @@ -27,7 +27,7 @@ - "WinGetComApiPolicy", K.WinGetDownloadFullManifest => "WinGetDownloadFullManifest", K.DisableClassicMode => "DisableClassicMode", + K.UseClassicMode => "UseClassicMode", K.DisableInstallerHostChangeWarning => "DisableInstallerHostChangeWarning", K.BunPreferLatestVersions => "BunPreferLatestVersions", K.RedactUsernameInLog => "RedactUsernameInLog", diff --git a/src/UniGetUI.Tests/ModernAppLauncherTests.cs b/src/UniGetUI.Tests/ModernAppLauncherTests.cs index 895d8cf1ac..35864494ab 100644 --- a/src/UniGetUI.Tests/ModernAppLauncherTests.cs +++ b/src/UniGetUI.Tests/ModernAppLauncherTests.cs @@ -1,5 +1,6 @@ using UniGetUI.Core.Data; using UniGetUI.Core.SettingsEngine; +using System.Runtime.InteropServices; namespace UniGetUI.Tests; @@ -28,18 +29,20 @@ public void Dispose() } [Fact] - public void ClassicModeDefaultsToEnabled() + public void ClassicModeDefaultsToDisabled() { - Assert.True(ModernAppLauncher.IsClassicModeEnabled()); + Assert.False(ModernAppLauncher.IsClassicModeEnabled()); - Settings.Set(Settings.K.DisableClassicMode, true); + Settings.Set(Settings.K.UseClassicMode, true); - Assert.False(ModernAppLauncher.IsClassicModeEnabled()); + Assert.True(ModernAppLauncher.IsClassicModeEnabled()); } [Fact] - public void BetaTestersDefaultToModernUI() + public void BetaTestersAlwaysUseModernUI() { + Settings.Set(Settings.K.UseClassicMode, true); + Assert.True(ModernAppLauncher.IsClassicModeEnabled()); Settings.Set(Settings.K.EnableUniGetUIBeta, true); @@ -47,6 +50,14 @@ public void BetaTestersDefaultToModernUI() Assert.False(ModernAppLauncher.IsClassicModeEnabled()); } + [Fact] + public void LegacyDisableClassicModeSettingDoesNotEnableClassicMode() + { + Settings.Set(Settings.K.DisableClassicMode, true); + + Assert.False(ModernAppLauncher.IsClassicModeEnabled()); + } + [Fact] public void ResolveModernExecutablePath_PrefersRootExecutable() { @@ -107,6 +118,57 @@ public void ResolveModernExecutablePath_FindsDevelopmentBuildOutput() Assert.Equal(expected, ModernAppLauncher.ResolveModernExecutablePath(baseDirectory)); } + [Fact] + public void ResolveModernExecutablePath_PrefersCurrentArchitectureDevelopmentBuildOutput() + { + string baseDirectory = Path.Combine( + _testRoot, + "UniGetUI", + "bin", + "x64", + "Debug", + "net10.0-windows10.0.26100.0", + "win-x64" + ); + Directory.CreateDirectory(baseDirectory); + + string currentRuntimeIdentifier = RuntimeInformation.ProcessArchitecture switch + { + Architecture.X64 => "win-x64", + Architecture.Arm64 => "win-arm64", + Architecture.X86 => "win-x86", + Architecture.Arm => "win-arm", + _ => "win-x64", + }; + string otherRuntimeIdentifier = currentRuntimeIdentifier == "win-x64" + ? "win-arm64" + : "win-x64"; + + string expected = CreateAvaloniaDevelopmentExecutable(currentRuntimeIdentifier); + string other = CreateAvaloniaDevelopmentExecutable(otherRuntimeIdentifier); + + File.SetLastWriteTimeUtc(expected, DateTime.UtcNow.AddMinutes(-5)); + File.SetLastWriteTimeUtc(other, DateTime.UtcNow); + + Assert.Equal(expected, ModernAppLauncher.ResolveModernExecutablePath(baseDirectory)); + } + + private string CreateAvaloniaDevelopmentExecutable(string runtimeIdentifier) + { + string path = Path.Combine( + _testRoot, + "UniGetUI.Avalonia", + "bin", + "Debug", + "net10.0-windows10.0.26100.0", + runtimeIdentifier, + ModernAppLauncher.ModernAppExecutableName + ); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllText(path, ""); + return path; + } + [Fact] public void CreateStartInfo_PreservesArguments() { diff --git a/src/UniGetUI/ModernAppLauncher.cs b/src/UniGetUI/ModernAppLauncher.cs index 6f96c8881f..3250875a2f 100644 --- a/src/UniGetUI/ModernAppLauncher.cs +++ b/src/UniGetUI/ModernAppLauncher.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Runtime.InteropServices; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; @@ -10,7 +11,7 @@ internal static class ModernAppLauncher internal const string ModernAppExecutableName = "UniGetUI.Avalonia.exe"; public static bool IsClassicModeEnabled() => - !Settings.Get(Settings.K.DisableClassicMode) && !Settings.Get(Settings.K.EnableUniGetUIBeta); + Settings.Get(Settings.K.UseClassicMode) && !Settings.Get(Settings.K.EnableUniGetUIBeta); public static void Launch(string[] args) { @@ -89,7 +90,8 @@ string candidate in Directory ModernAppExecutableName, SearchOption.AllDirectories ) - .OrderByDescending(File.GetLastWriteTimeUtc) + .OrderByDescending(IsCurrentRuntimeCandidate) + .ThenByDescending(File.GetLastWriteTimeUtc) ) { yield return candidate; @@ -99,4 +101,22 @@ string candidate in Directory directory = directory.Parent; } } + + private static bool IsCurrentRuntimeCandidate(string candidate) + { + string runtimeIdentifier = RuntimeInformation.ProcessArchitecture switch + { + Architecture.X64 => "win-x64", + Architecture.Arm64 => "win-arm64", + Architecture.X86 => "win-x86", + Architecture.Arm => "win-arm", + _ => "", + }; + + return runtimeIdentifier.Length > 0 + && candidate.Contains( + $"{Path.DirectorySeparatorChar}{runtimeIdentifier}{Path.DirectorySeparatorChar}", + StringComparison.OrdinalIgnoreCase + ); + } } diff --git a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Interface_P.xaml b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Interface_P.xaml index 2d79a0ea60..ba58da05c8 100644 --- a/src/UniGetUI/Pages/SettingsPages/GeneralPages/Interface_P.xaml +++ b/src/UniGetUI/Pages/SettingsPages/GeneralPages/Interface_P.xaml @@ -40,7 +40,7 @@ Date: Fri, 12 Jun 2026 15:23:28 -0400 Subject: [PATCH 2/2] Fix launcher test import ordering Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/UniGetUI.Tests/ModernAppLauncherTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UniGetUI.Tests/ModernAppLauncherTests.cs b/src/UniGetUI.Tests/ModernAppLauncherTests.cs index 35864494ab..f8d8b4c8ae 100644 --- a/src/UniGetUI.Tests/ModernAppLauncherTests.cs +++ b/src/UniGetUI.Tests/ModernAppLauncherTests.cs @@ -1,6 +1,6 @@ +using System.Runtime.InteropServices; using UniGetUI.Core.Data; using UniGetUI.Core.SettingsEngine; -using System.Runtime.InteropServices; namespace UniGetUI.Tests;