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..f8d8b4c8ae 100644
--- a/src/UniGetUI.Tests/ModernAppLauncherTests.cs
+++ b/src/UniGetUI.Tests/ModernAppLauncherTests.cs
@@ -1,3 +1,4 @@
+using System.Runtime.InteropServices;
using UniGetUI.Core.Data;
using UniGetUI.Core.SettingsEngine;
@@ -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 @@