2026-05-28 11:03:49 +08:00
|
|
|
using Avalonia.Controls;
|
|
|
|
|
using Avalonia.Controls.ApplicationLifetimes;
|
|
|
|
|
using Avalonia.Threading;
|
|
|
|
|
using LanMountainDesktop.Launcher.Models;
|
|
|
|
|
using LanMountainDesktop.Launcher.Resources;
|
|
|
|
|
using LanMountainDesktop.Launcher.Views;
|
|
|
|
|
|
|
|
|
|
namespace LanMountainDesktop.Launcher.Shell.EntryHandlers;
|
|
|
|
|
|
|
|
|
|
internal static class PreviewEntryHandler
|
|
|
|
|
{
|
|
|
|
|
public static bool TryHandle(CommandContext context, IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
switch (context.Command.ToLowerInvariant())
|
|
|
|
|
{
|
|
|
|
|
case "preview-splash":
|
|
|
|
|
RunSplashPreview(desktop);
|
|
|
|
|
return true;
|
|
|
|
|
case "preview-error":
|
|
|
|
|
RunErrorPreview(desktop);
|
|
|
|
|
return true;
|
|
|
|
|
case "preview-multi-instance":
|
|
|
|
|
RunMultiInstancePreview(desktop);
|
|
|
|
|
return true;
|
|
|
|
|
case "preview-update":
|
|
|
|
|
RunUpdatePreview(desktop);
|
|
|
|
|
return true;
|
|
|
|
|
case "preview-oobe":
|
|
|
|
|
RunOobePreview(desktop);
|
|
|
|
|
return true;
|
|
|
|
|
case "preview-debug":
|
|
|
|
|
new DevDebugWindow().Show();
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunSplashPreview(IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
var splashWindow = LaunchEntryHandler.CreateSplashWindow();
|
|
|
|
|
splashWindow.SetDebugMode(true);
|
|
|
|
|
splashWindow.Show();
|
|
|
|
|
_ = SimulateSplashPreviewAsync(desktop, splashWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunErrorPreview(IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
var errorWindow = new ErrorWindow();
|
|
|
|
|
errorWindow.SetErrorMessage(Strings.Preview_ErrorMessage);
|
|
|
|
|
errorWindow.Show();
|
|
|
|
|
_ = WaitForWindowCloseAsync(desktop, errorWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunMultiInstancePreview(IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
var promptWindow = new MultiInstancePromptWindow();
|
|
|
|
|
promptWindow.SetDetails(Environment.ProcessId, "ForegroundDesktop");
|
|
|
|
|
promptWindow.Show();
|
|
|
|
|
_ = WaitForWindowCloseAsync(desktop, promptWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunUpdatePreview(IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
var updateWindow = new UpdateWindow();
|
|
|
|
|
updateWindow.SetDebugMode(true);
|
|
|
|
|
updateWindow.Show();
|
|
|
|
|
_ = SimulateUpdatePreviewAsync(desktop, updateWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RunOobePreview(IClassicDesktopStyleApplicationLifetime desktop)
|
|
|
|
|
{
|
|
|
|
|
var oobeWindow = new OobeWindow();
|
|
|
|
|
oobeWindow.Show();
|
|
|
|
|
_ = SimulateOobePreviewAsync(desktop, oobeWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static async Task SimulateSplashPreviewAsync(IClassicDesktopStyleApplicationLifetime desktop, SplashWindow window)
|
|
|
|
|
{
|
|
|
|
|
var stages = new[] { "initializing", "update", "plugins", "launch", "ready" };
|
|
|
|
|
var messages = new[]
|
|
|
|
|
{
|
|
|
|
|
Strings.Preview_SplashInitializing,
|
|
|
|
|
Strings.Preview_SplashCheckingUpdates,
|
|
|
|
|
Strings.Preview_SplashCheckingPlugins,
|
|
|
|
|
Strings.Preview_SplashLaunchingHost,
|
|
|
|
|
Strings.Preview_SplashReady
|
|
|
|
|
};
|
|
|
|
|
var reporter = (ISplashStageReporter)window;
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < stages.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
reporter.Report(stages[i], messages[i]);
|
|
|
|
|
await Task.Delay(800).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Task.Delay(5000).ConfigureAwait(false);
|
|
|
|
|
await Dispatcher.UIThread.InvokeAsync(() => desktop.Shutdown(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static async Task SimulateUpdatePreviewAsync(IClassicDesktopStyleApplicationLifetime desktop, UpdateWindow window)
|
|
|
|
|
{
|
|
|
|
|
var stages = new[] { "verify", "extract", "apply", "plugins", "cleanup" };
|
|
|
|
|
for (var i = 0; i < stages.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
window.Report(stages[i], string.Format(Strings.Preview_UpdateProcessing, stages[i]), (i + 1) * 20);
|
|
|
|
|
await Task.Delay(600).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.ReportComplete(true, null);
|
|
|
|
|
await Task.Delay(3000).ConfigureAwait(false);
|
|
|
|
|
await Dispatcher.UIThread.InvokeAsync(() => desktop.Shutdown(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static async Task SimulateOobePreviewAsync(IClassicDesktopStyleApplicationLifetime desktop, OobeWindow window)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2026-06-05 11:08:11 +08:00
|
|
|
await window.WaitForCompletionAsync().ConfigureAwait(false);
|
2026-05-28 11:03:49 +08:00
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.Error("OOBE preview failed.", ex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Dispatcher.UIThread.InvokeAsync(() => desktop.Shutdown(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static async Task WaitForWindowCloseAsync(IClassicDesktopStyleApplicationLifetime desktop, Window window)
|
|
|
|
|
{
|
|
|
|
|
var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
|
|
|
|
|
window.Closed += (_, _) => tcs.TrySetResult();
|
|
|
|
|
await tcs.Task.ConfigureAwait(false);
|
|
|
|
|
await Dispatcher.UIThread.InvokeAsync(() => desktop.Shutdown(0));
|
|
|
|
|
}
|
|
|
|
|
}
|