From b219f109ec1c69c21d57be7ac3e03dcd6f981877 Mon Sep 17 00:00:00 2001 From: lincube Date: Thu, 28 May 2026 10:43:30 +0800 Subject: [PATCH] refactor(launcher): reorganize into responsibility folders Co-authored-by: Cursor --- .../AirApp/AirAppHostLocator.cs | 2 +- .../AirApp/AirAppInstanceKey.cs | 2 +- .../AirApp/IAirAppProcessStarter.cs | 10 +- .../AirApp/LauncherAirAppLifecycleIpcHost.cs | 2 +- .../AirApp/LauncherAirAppLifecycleService.cs | 2 +- LanMountainDesktop.Launcher/App.axaml.cs | 8 +- LanMountainDesktop.Launcher/AppJsonContext.cs | 7 +- .../DeploymentLocator.cs | 2 +- .../HostDiscoveryOptions.cs | 2 +- .../HostLaunchPlan.cs | 2 +- .../HostResolutionResult.cs | 2 +- .../LegacyVersionDetector.cs | 2 +- LanMountainDesktop.Launcher/GlobalUsings.cs | 9 ++ .../{Services => Infrastructure}/Commands.cs | 7 +- .../DataLocationResolver.cs | 2 +- .../DeferredSplashStageReporter.cs | 2 +- .../DotNetRuntimeProbe.cs | 2 +- .../ISplashStageReporter.cs | 2 +- .../LanguagePreferenceService.cs | 2 +- .../LauncherBackgroundService.cs | 2 +- .../LauncherDebugSettingsStore.cs | 2 +- .../LauncherExecutionContext.cs | 2 +- .../{Services => Infrastructure}/Logger.cs | 2 +- .../ThemeService.cs | 2 +- .../Ipc/LauncherCoordinatorIpcClient.cs | 2 +- .../Ipc/LauncherCoordinatorIpcServer.cs | 2 +- .../Ipc/LauncherUpdateProgressIpcServer.cs | 3 +- .../LanMountainDesktop.Launcher.csproj | 1 + .../DataLocationOobeStep.cs | 2 +- .../HostAppSettingsOobeMerger.cs | 2 +- .../{Services => Oobe}/IOobeStep.cs | 2 +- .../LauncherWindowsStartupService.cs | 2 +- .../{Services => Oobe}/OobeStateService.cs | 2 +- .../PrivacyAgreementService.cs | 2 +- .../{Services => Oobe}/WelcomeOobeStep.cs | 2 +- .../PluginInstallerService.cs | 4 +- .../PluginUpgradeQueueService.cs | 6 +- LanMountainDesktop.Launcher/Program.cs | 2 - ...ncherFlowCoordinator.HostStartupMonitor.cs | 116 ++---------------- .../LauncherFlowCoordinator.UiPresenter.cs | 1 - .../Services/LauncherFlowCoordinator.cs | 3 +- .../Startup/HostStartupMonitor.cs | 1 - .../Startup/PublicIpcConnection.cs | 1 - .../StartupAttemptRegistry.cs | 2 +- .../Startup/StartupDiagnostics.cs | 1 - .../Startup/StartupSuccessTracker.cs | 1 - .../IUpdateProgressReporter.cs | 2 +- .../NullUpdateProgressReporter.cs | 2 +- .../Update/UpdateCheckService.cs | 0 .../UpdateEngineService.cs | 2 +- .../Views/OobeWindow.axaml.cs | 24 ++-- .../AirAppProcessStarterRuntimeTests.cs | 4 +- .../CornerRadiusStyleTests.cs | 2 +- .../LauncherAirAppLifecycleServiceTests.cs | 2 +- .../LauncherGlobalUsings.cs | 6 + .../PluginInstallerServiceTests.cs | 2 +- .../PluginManifestRuntimeTests.cs | 4 +- 57 files changed, 92 insertions(+), 197 deletions(-) rename LanMountainDesktop.Launcher/{Services => }/AirApp/AirAppHostLocator.cs (98%) rename LanMountainDesktop.Launcher/{Services => }/AirApp/AirAppInstanceKey.cs (93%) rename LanMountainDesktop.Launcher/{Services => }/AirApp/IAirAppProcessStarter.cs (93%) rename LanMountainDesktop.Launcher/{Services => }/AirApp/LauncherAirAppLifecycleIpcHost.cs (93%) rename LanMountainDesktop.Launcher/{Services => }/AirApp/LauncherAirAppLifecycleService.cs (99%) rename LanMountainDesktop.Launcher/{Services => Deployment}/DeploymentLocator.cs (99%) rename LanMountainDesktop.Launcher/{Services => Deployment}/HostDiscoveryOptions.cs (96%) rename LanMountainDesktop.Launcher/{Services => Deployment}/HostLaunchPlan.cs (99%) rename LanMountainDesktop.Launcher/{Services => Deployment}/HostResolutionResult.cs (89%) rename LanMountainDesktop.Launcher/{Services => Deployment}/LegacyVersionDetector.cs (99%) create mode 100644 LanMountainDesktop.Launcher/GlobalUsings.cs rename LanMountainDesktop.Launcher/{Services => Infrastructure}/Commands.cs (95%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/DataLocationResolver.cs (99%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/DeferredSplashStageReporter.cs (94%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/DotNetRuntimeProbe.cs (99%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/ISplashStageReporter.cs (80%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/LanguagePreferenceService.cs (96%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/LauncherBackgroundService.cs (99%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/LauncherDebugSettingsStore.cs (98%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/LauncherExecutionContext.cs (93%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/Logger.cs (98%) rename LanMountainDesktop.Launcher/{Services => Infrastructure}/ThemeService.cs (96%) rename LanMountainDesktop.Launcher/{Services => }/Ipc/LauncherCoordinatorIpcClient.cs (98%) rename LanMountainDesktop.Launcher/{Services => }/Ipc/LauncherCoordinatorIpcServer.cs (99%) rename LanMountainDesktop.Launcher/{Services => }/Ipc/LauncherUpdateProgressIpcServer.cs (97%) rename LanMountainDesktop.Launcher/{Services => Oobe}/DataLocationOobeStep.cs (97%) rename LanMountainDesktop.Launcher/{Services => Oobe}/HostAppSettingsOobeMerger.cs (99%) rename LanMountainDesktop.Launcher/{Services => Oobe}/IOobeStep.cs (65%) rename LanMountainDesktop.Launcher/{Services => Oobe}/LauncherWindowsStartupService.cs (97%) rename LanMountainDesktop.Launcher/{Services => Oobe}/OobeStateService.cs (99%) rename LanMountainDesktop.Launcher/{Services => Oobe}/PrivacyAgreementService.cs (99%) rename LanMountainDesktop.Launcher/{Services => Oobe}/WelcomeOobeStep.cs (96%) rename LanMountainDesktop.Launcher/{Services => Plugins}/PluginInstallerService.cs (99%) rename LanMountainDesktop.Launcher/{Services => Plugins}/PluginUpgradeQueueService.cs (92%) rename LanMountainDesktop.Launcher/{Services => Startup}/StartupAttemptRegistry.cs (99%) rename LanMountainDesktop.Launcher/{Services => Update}/IUpdateProgressReporter.cs (81%) rename LanMountainDesktop.Launcher/{Services => Update}/NullUpdateProgressReporter.cs (84%) create mode 100644 LanMountainDesktop.Launcher/Update/UpdateCheckService.cs rename LanMountainDesktop.Launcher/{Services => Update}/UpdateEngineService.cs (99%) create mode 100644 LanMountainDesktop.Tests/LauncherGlobalUsings.cs diff --git a/LanMountainDesktop.Launcher/Services/AirApp/AirAppHostLocator.cs b/LanMountainDesktop.Launcher/AirApp/AirAppHostLocator.cs similarity index 98% rename from LanMountainDesktop.Launcher/Services/AirApp/AirAppHostLocator.cs rename to LanMountainDesktop.Launcher/AirApp/AirAppHostLocator.cs index ebd0b31..6722834 100644 --- a/LanMountainDesktop.Launcher/Services/AirApp/AirAppHostLocator.cs +++ b/LanMountainDesktop.Launcher/AirApp/AirAppHostLocator.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services.AirApp; +namespace LanMountainDesktop.Launcher.AirApp; internal sealed class AirAppHostLocator { diff --git a/LanMountainDesktop.Launcher/Services/AirApp/AirAppInstanceKey.cs b/LanMountainDesktop.Launcher/AirApp/AirAppInstanceKey.cs similarity index 93% rename from LanMountainDesktop.Launcher/Services/AirApp/AirAppInstanceKey.cs rename to LanMountainDesktop.Launcher/AirApp/AirAppInstanceKey.cs index 87e49c2..d55326c 100644 --- a/LanMountainDesktop.Launcher/Services/AirApp/AirAppInstanceKey.cs +++ b/LanMountainDesktop.Launcher/AirApp/AirAppInstanceKey.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services.AirApp; +namespace LanMountainDesktop.Launcher.AirApp; internal static class AirAppInstanceKey { diff --git a/LanMountainDesktop.Launcher/Services/AirApp/IAirAppProcessStarter.cs b/LanMountainDesktop.Launcher/AirApp/IAirAppProcessStarter.cs similarity index 93% rename from LanMountainDesktop.Launcher/Services/AirApp/IAirAppProcessStarter.cs rename to LanMountainDesktop.Launcher/AirApp/IAirAppProcessStarter.cs index 3f85ef1..dae6f9c 100644 --- a/LanMountainDesktop.Launcher/Services/AirApp/IAirAppProcessStarter.cs +++ b/LanMountainDesktop.Launcher/AirApp/IAirAppProcessStarter.cs @@ -1,7 +1,5 @@ using System.Diagnostics; -using LanMountainDesktop.Launcher.Services; - -namespace LanMountainDesktop.Launcher.Services.AirApp; +namespace LanMountainDesktop.Launcher.AirApp; internal interface IAirAppProcessStarter { @@ -60,7 +58,7 @@ internal sealed class AirAppProcessStarter : IAirAppProcessStarter AddArgument(startInfo, "--source-placement-id", sourcePlacementId.Trim()); } - LanMountainDesktop.Launcher.Services.Logger.Info( + Logger.Info( $"Starting AirAppHost. AppId='{appId}'; InstanceKey='{instanceKey}'; HostPath='{hostPath}'; DataRoot='{dataRoot ?? string.Empty}'."); var process = Process.Start(startInfo); if (process is not null) @@ -70,12 +68,12 @@ internal sealed class AirAppProcessStarter : IAirAppProcessStarter { try { - LanMountainDesktop.Launcher.Services.Logger.Info( + Logger.Info( $"AirAppHost exited. AppId='{appId}'; InstanceKey='{instanceKey}'; ProcessId={process.Id}; ExitCode={process.ExitCode}."); } catch (Exception ex) { - LanMountainDesktop.Launcher.Services.Logger.Warn($"Failed to log AirAppHost exit: {ex.Message}"); + Logger.Warn($"Failed to log AirAppHost exit: {ex.Message}"); } }; } diff --git a/LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleIpcHost.cs b/LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleIpcHost.cs similarity index 93% rename from LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleIpcHost.cs rename to LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleIpcHost.cs index ec1b142..83a73b2 100644 --- a/LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleIpcHost.cs +++ b/LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleIpcHost.cs @@ -1,7 +1,7 @@ using LanMountainDesktop.Shared.IPC; using LanMountainDesktop.Shared.IPC.Abstractions.Services; -namespace LanMountainDesktop.Launcher.Services.AirApp; +namespace LanMountainDesktop.Launcher.AirApp; internal sealed class LauncherAirAppLifecycleIpcHost : IDisposable { diff --git a/LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleService.cs b/LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleService.cs rename to LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleService.cs index db45807..3067f8d 100644 --- a/LanMountainDesktop.Launcher/Services/AirApp/LauncherAirAppLifecycleService.cs +++ b/LanMountainDesktop.Launcher/AirApp/LauncherAirAppLifecycleService.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Runtime.InteropServices; using LanMountainDesktop.Shared.IPC.Abstractions.Services; -namespace LanMountainDesktop.Launcher.Services.AirApp; +namespace LanMountainDesktop.Launcher.AirApp; internal sealed class LauncherAirAppLifecycleService : IAirAppLifecycleService { diff --git a/LanMountainDesktop.Launcher/App.axaml.cs b/LanMountainDesktop.Launcher/App.axaml.cs index e19a3a4..b0c2d65 100644 --- a/LanMountainDesktop.Launcher/App.axaml.cs +++ b/LanMountainDesktop.Launcher/App.axaml.cs @@ -7,8 +7,6 @@ using Avalonia.Threading; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Resources; using LanMountainDesktop.Launcher.Services; -using LanMountainDesktop.Launcher.Services.AirApp; -using LanMountainDesktop.Launcher.Services.Ipc; using LanMountainDesktop.Launcher.Views; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC; @@ -70,12 +68,12 @@ public partial class App : Application return; } - // 调试模式:只显示 DevDebugWindow,不走正常启动流程 - // 避免启动主程序后 Launcher 自动退出,导致开发者无法预览 UI + // ??模式?只?示 DevDebugWindow?不走正常启?流? + // 避?启?主?序? Launcher ??????导????????? UI if (context.IsDebugMode && !context.IsPreviewCommand && !string.Equals(context.Command, "apply-update", StringComparison.OrdinalIgnoreCase)) { - Logger.Info("Debug mode active — showing DevDebugWindow instead of normal launch flow."); + Logger.Info("Debug mode active ?? showing DevDebugWindow instead of normal launch flow."); var devDebugWindow = new DevDebugWindow(); devDebugWindow.Show(); base.OnFrameworkInitializationCompleted(); diff --git a/LanMountainDesktop.Launcher/AppJsonContext.cs b/LanMountainDesktop.Launcher/AppJsonContext.cs index ff2105f..f3a1530 100644 --- a/LanMountainDesktop.Launcher/AppJsonContext.cs +++ b/LanMountainDesktop.Launcher/AppJsonContext.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using LanMountainDesktop.Launcher.Models; -using LanMountainDesktop.Launcher.Services; +using LanMountainDesktop.Launcher.Plugins; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC.Abstractions.Services; @@ -30,15 +30,10 @@ namespace LanMountainDesktop.Launcher; [JsonSerializable(typeof(PublicTaskbarStatus))] [JsonSerializable(typeof(PublicShellActivationResult))] [JsonSerializable(typeof(LauncherResult))] -[JsonSerializable(typeof(HostDiscoveryConfig))] [JsonSerializable(typeof(PluginManifest))] -[JsonSerializable(typeof(PendingUpgrade))] [JsonSerializable(typeof(List))] [JsonSerializable(typeof(OobeStateFile))] [JsonSerializable(typeof(DataLocationConfig))] -[JsonSerializable(typeof(GitHubRelease))] -[JsonSerializable(typeof(GitHubAsset))] -[JsonSerializable(typeof(List))] [JsonSerializable(typeof(StartupAttemptRecord))] [JsonSerializable(typeof(PrivacyConfig))] [JsonSerializable(typeof(PrivacyAgreementState))] diff --git a/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs b/LanMountainDesktop.Launcher/Deployment/DeploymentLocator.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/DeploymentLocator.cs rename to LanMountainDesktop.Launcher/Deployment/DeploymentLocator.cs index 0ef085c..935e381 100644 --- a/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs +++ b/LanMountainDesktop.Launcher/Deployment/DeploymentLocator.cs @@ -3,7 +3,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Shared.Contracts.Launcher; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Deployment; internal sealed class DeploymentLocator { diff --git a/LanMountainDesktop.Launcher/Services/HostDiscoveryOptions.cs b/LanMountainDesktop.Launcher/Deployment/HostDiscoveryOptions.cs similarity index 96% rename from LanMountainDesktop.Launcher/Services/HostDiscoveryOptions.cs rename to LanMountainDesktop.Launcher/Deployment/HostDiscoveryOptions.cs index ea031fa..06fca58 100644 --- a/LanMountainDesktop.Launcher/Services/HostDiscoveryOptions.cs +++ b/LanMountainDesktop.Launcher/Deployment/HostDiscoveryOptions.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Deployment; /// /// 主程序发现选项 diff --git a/LanMountainDesktop.Launcher/Services/HostLaunchPlan.cs b/LanMountainDesktop.Launcher/Deployment/HostLaunchPlan.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/HostLaunchPlan.cs rename to LanMountainDesktop.Launcher/Deployment/HostLaunchPlan.cs index ce01a88..67e6ffc 100644 --- a/LanMountainDesktop.Launcher/Services/HostLaunchPlan.cs +++ b/LanMountainDesktop.Launcher/Deployment/HostLaunchPlan.cs @@ -1,6 +1,6 @@ using LanMountainDesktop.Shared.Contracts.Launcher; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Deployment; internal sealed record HostLaunchPlan( string HostPath, diff --git a/LanMountainDesktop.Launcher/Services/HostResolutionResult.cs b/LanMountainDesktop.Launcher/Deployment/HostResolutionResult.cs similarity index 89% rename from LanMountainDesktop.Launcher/Services/HostResolutionResult.cs rename to LanMountainDesktop.Launcher/Deployment/HostResolutionResult.cs index c42e377..f944492 100644 --- a/LanMountainDesktop.Launcher/Services/HostResolutionResult.cs +++ b/LanMountainDesktop.Launcher/Deployment/HostResolutionResult.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Deployment; internal sealed class HostResolutionResult { diff --git a/LanMountainDesktop.Launcher/Services/LegacyVersionDetector.cs b/LanMountainDesktop.Launcher/Deployment/LegacyVersionDetector.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/LegacyVersionDetector.cs rename to LanMountainDesktop.Launcher/Deployment/LegacyVersionDetector.cs index 19e25e4..5eea3bb 100644 --- a/LanMountainDesktop.Launcher/Services/LegacyVersionDetector.cs +++ b/LanMountainDesktop.Launcher/Deployment/LegacyVersionDetector.cs @@ -1,7 +1,7 @@ using System.Diagnostics; using Microsoft.Win32; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Deployment; /// /// 老版本检测器 - 检测 0.8.x 及更早的单应用模式安装 diff --git a/LanMountainDesktop.Launcher/GlobalUsings.cs b/LanMountainDesktop.Launcher/GlobalUsings.cs new file mode 100644 index 0000000..b30d6bc --- /dev/null +++ b/LanMountainDesktop.Launcher/GlobalUsings.cs @@ -0,0 +1,9 @@ +global using LanMountainDesktop.Launcher.AirApp; +global using LanMountainDesktop.Launcher.Deployment; +global using LanMountainDesktop.Launcher.Infrastructure; +global using LanMountainDesktop.Launcher.Ipc; +global using LanMountainDesktop.Launcher.Oobe; +global using LanMountainDesktop.Launcher.Plugins; +global using LanMountainDesktop.Launcher.Startup; +global using LanMountainDesktop.Launcher.Update; +global using LanMountainDesktop.Launcher.Services; diff --git a/LanMountainDesktop.Launcher/Services/Commands.cs b/LanMountainDesktop.Launcher/Infrastructure/Commands.cs similarity index 95% rename from LanMountainDesktop.Launcher/Services/Commands.cs rename to LanMountainDesktop.Launcher/Infrastructure/Commands.cs index ad298a4..a348e55 100644 --- a/LanMountainDesktop.Launcher/Services/Commands.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/Commands.cs @@ -2,7 +2,7 @@ using System.Text; using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal static class Commands { @@ -171,16 +171,12 @@ internal static class Commands ? launcherDir : AppContext.BaseDirectory); - // 发布版结构:Launcher 和 app-* 目录在同一目录 - // 检查当前目录是否有 app-* 子目录(发布版) var appDirs = Directory.GetDirectories(baseDir, "app-*", SearchOption.TopDirectoryOnly); if (appDirs.Length > 0) { - // 找到 app-* 目录,说明是发布版结构 return baseDir; } - // 开发环境:检查父目录是否有主程序 var parent = Path.GetFullPath(Path.Combine(baseDir, "..")); var parentHost = OperatingSystem.IsWindows() ? Path.Combine(parent, "LanMountainDesktop.exe") @@ -190,7 +186,6 @@ internal static class Commands return parent; } - // 默认返回 baseDir return baseDir; } } diff --git a/LanMountainDesktop.Launcher/Services/DataLocationResolver.cs b/LanMountainDesktop.Launcher/Infrastructure/DataLocationResolver.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/DataLocationResolver.cs rename to LanMountainDesktop.Launcher/Infrastructure/DataLocationResolver.cs index 752cc68..0cf3d50 100644 --- a/LanMountainDesktop.Launcher/Services/DataLocationResolver.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/DataLocationResolver.cs @@ -1,7 +1,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; /// /// 解析应用数据目录位置。 diff --git a/LanMountainDesktop.Launcher/Services/DeferredSplashStageReporter.cs b/LanMountainDesktop.Launcher/Infrastructure/DeferredSplashStageReporter.cs similarity index 94% rename from LanMountainDesktop.Launcher/Services/DeferredSplashStageReporter.cs rename to LanMountainDesktop.Launcher/Infrastructure/DeferredSplashStageReporter.cs index ea8de25..4d2db12 100644 --- a/LanMountainDesktop.Launcher/Services/DeferredSplashStageReporter.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/DeferredSplashStageReporter.cs @@ -1,7 +1,7 @@ using Avalonia.Threading; using LanMountainDesktop.Launcher.Views; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal sealed class DeferredSplashStageReporter : ISplashStageReporter { diff --git a/LanMountainDesktop.Launcher/Services/DotNetRuntimeProbe.cs b/LanMountainDesktop.Launcher/Infrastructure/DotNetRuntimeProbe.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/DotNetRuntimeProbe.cs rename to LanMountainDesktop.Launcher/Infrastructure/DotNetRuntimeProbe.cs index 04c9a41..0ce5e5c 100644 --- a/LanMountainDesktop.Launcher/Services/DotNetRuntimeProbe.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/DotNetRuntimeProbe.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Runtime.InteropServices; using Microsoft.Win32; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal enum DotNetRuntimeArchitecture { diff --git a/LanMountainDesktop.Launcher/Services/ISplashStageReporter.cs b/LanMountainDesktop.Launcher/Infrastructure/ISplashStageReporter.cs similarity index 80% rename from LanMountainDesktop.Launcher/Services/ISplashStageReporter.cs rename to LanMountainDesktop.Launcher/Infrastructure/ISplashStageReporter.cs index 38bca81..cb9cce6 100644 --- a/LanMountainDesktop.Launcher/Services/ISplashStageReporter.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/ISplashStageReporter.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal interface ISplashStageReporter { diff --git a/LanMountainDesktop.Launcher/Services/LanguagePreferenceService.cs b/LanMountainDesktop.Launcher/Infrastructure/LanguagePreferenceService.cs similarity index 96% rename from LanMountainDesktop.Launcher/Services/LanguagePreferenceService.cs rename to LanMountainDesktop.Launcher/Infrastructure/LanguagePreferenceService.cs index 561eaec..badba21 100644 --- a/LanMountainDesktop.Launcher/Services/LanguagePreferenceService.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/LanguagePreferenceService.cs @@ -1,7 +1,7 @@ using System.Globalization; using System.Text.Json.Nodes; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal static class LanguagePreferenceService { diff --git a/LanMountainDesktop.Launcher/Services/LauncherBackgroundService.cs b/LanMountainDesktop.Launcher/Infrastructure/LauncherBackgroundService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/LauncherBackgroundService.cs rename to LanMountainDesktop.Launcher/Infrastructure/LauncherBackgroundService.cs index d39f4ad..d6bd978 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherBackgroundService.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/LauncherBackgroundService.cs @@ -1,6 +1,6 @@ using Avalonia.Media.Imaging; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; /// /// 启动器背景图片服务 diff --git a/LanMountainDesktop.Launcher/Services/LauncherDebugSettingsStore.cs b/LanMountainDesktop.Launcher/Infrastructure/LauncherDebugSettingsStore.cs similarity index 98% rename from LanMountainDesktop.Launcher/Services/LauncherDebugSettingsStore.cs rename to LanMountainDesktop.Launcher/Infrastructure/LauncherDebugSettingsStore.cs index 9ed4cad..5734351 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherDebugSettingsStore.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/LauncherDebugSettingsStore.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal sealed record LauncherDebugSettings(bool DevModeEnabled, string? CustomHostPath); diff --git a/LanMountainDesktop.Launcher/Services/LauncherExecutionContext.cs b/LanMountainDesktop.Launcher/Infrastructure/LauncherExecutionContext.cs similarity index 93% rename from LanMountainDesktop.Launcher/Services/LauncherExecutionContext.cs rename to LanMountainDesktop.Launcher/Infrastructure/LauncherExecutionContext.cs index 8845da8..aed8033 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherExecutionContext.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/LauncherExecutionContext.cs @@ -1,7 +1,7 @@ using System.Security.Principal; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; internal static class LauncherExecutionContext { diff --git a/LanMountainDesktop.Launcher/Services/Logger.cs b/LanMountainDesktop.Launcher/Infrastructure/Logger.cs similarity index 98% rename from LanMountainDesktop.Launcher/Services/Logger.cs rename to LanMountainDesktop.Launcher/Infrastructure/Logger.cs index a76e987..30ff062 100644 --- a/LanMountainDesktop.Launcher/Services/Logger.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/Logger.cs @@ -1,6 +1,6 @@ using System.Text; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; /// /// 简单的日志记录器 - 同时输出到控制台和文件 diff --git a/LanMountainDesktop.Launcher/Services/ThemeService.cs b/LanMountainDesktop.Launcher/Infrastructure/ThemeService.cs similarity index 96% rename from LanMountainDesktop.Launcher/Services/ThemeService.cs rename to LanMountainDesktop.Launcher/Infrastructure/ThemeService.cs index d5818e3..fa35383 100644 --- a/LanMountainDesktop.Launcher/Services/ThemeService.cs +++ b/LanMountainDesktop.Launcher/Infrastructure/ThemeService.cs @@ -2,7 +2,7 @@ using Avalonia; using Avalonia.Styling; using FluentAvalonia.Styling; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Infrastructure; /// /// 主题服务,管理启动器的主题设置 diff --git a/LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcClient.cs b/LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcClient.cs similarity index 98% rename from LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcClient.cs rename to LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcClient.cs index 6cc1475..fe34d84 100644 --- a/LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcClient.cs +++ b/LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcClient.cs @@ -3,7 +3,7 @@ using System.Text; using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services.Ipc; +namespace LanMountainDesktop.Launcher.Ipc; internal sealed class LauncherCoordinatorIpcClient { diff --git a/LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcServer.cs b/LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcServer.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcServer.cs rename to LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcServer.cs index 7e8b044..1f6114e 100644 --- a/LanMountainDesktop.Launcher/Services/Ipc/LauncherCoordinatorIpcServer.cs +++ b/LanMountainDesktop.Launcher/Ipc/LauncherCoordinatorIpcServer.cs @@ -4,7 +4,7 @@ using System.Text.Json; using System.IO.Pipes; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services.Ipc; +namespace LanMountainDesktop.Launcher.Ipc; internal sealed class LauncherCoordinatorIpcServer : IDisposable { diff --git a/LanMountainDesktop.Launcher/Services/Ipc/LauncherUpdateProgressIpcServer.cs b/LanMountainDesktop.Launcher/Ipc/LauncherUpdateProgressIpcServer.cs similarity index 97% rename from LanMountainDesktop.Launcher/Services/Ipc/LauncherUpdateProgressIpcServer.cs rename to LanMountainDesktop.Launcher/Ipc/LauncherUpdateProgressIpcServer.cs index e35946d..103f861 100644 --- a/LanMountainDesktop.Launcher/Services/Ipc/LauncherUpdateProgressIpcServer.cs +++ b/LanMountainDesktop.Launcher/Ipc/LauncherUpdateProgressIpcServer.cs @@ -2,10 +2,9 @@ using System.Buffers; using System.IO.Pipes; using System.Text; using System.Text.Json; -using LanMountainDesktop.Launcher.Services; using LanMountainDesktop.Shared.Contracts.Update; -namespace LanMountainDesktop.Launcher.Services.Ipc; +namespace LanMountainDesktop.Launcher.Ipc; internal sealed class LauncherUpdateProgressIpcServer : IUpdateProgressReporter, IDisposable { diff --git a/LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj b/LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj index ce3817c..3e77576 100644 --- a/LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj +++ b/LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj @@ -18,6 +18,7 @@ + diff --git a/LanMountainDesktop.Launcher/Services/DataLocationOobeStep.cs b/LanMountainDesktop.Launcher/Oobe/DataLocationOobeStep.cs similarity index 97% rename from LanMountainDesktop.Launcher/Services/DataLocationOobeStep.cs rename to LanMountainDesktop.Launcher/Oobe/DataLocationOobeStep.cs index 67e40a2..bab3d5f 100644 --- a/LanMountainDesktop.Launcher/Services/DataLocationOobeStep.cs +++ b/LanMountainDesktop.Launcher/Oobe/DataLocationOobeStep.cs @@ -2,7 +2,7 @@ using Avalonia.Threading; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Views; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; internal sealed class DataLocationOobeStep : IOobeStep { diff --git a/LanMountainDesktop.Launcher/Services/HostAppSettingsOobeMerger.cs b/LanMountainDesktop.Launcher/Oobe/HostAppSettingsOobeMerger.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/HostAppSettingsOobeMerger.cs rename to LanMountainDesktop.Launcher/Oobe/HostAppSettingsOobeMerger.cs index 8c69ba5..1e37f3f 100644 --- a/LanMountainDesktop.Launcher/Services/HostAppSettingsOobeMerger.cs +++ b/LanMountainDesktop.Launcher/Oobe/HostAppSettingsOobeMerger.cs @@ -2,7 +2,7 @@ using System.Text.Json; using System.Text.Json.Nodes; using LanMountainDesktop.Shared.Contracts.Launcher; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; /// /// 在 OOBE 中向 Host 的 settings.json 写入启动与展示相关字段,属性名与 Host diff --git a/LanMountainDesktop.Launcher/Services/IOobeStep.cs b/LanMountainDesktop.Launcher/Oobe/IOobeStep.cs similarity index 65% rename from LanMountainDesktop.Launcher/Services/IOobeStep.cs rename to LanMountainDesktop.Launcher/Oobe/IOobeStep.cs index 8fc0944..e66ee91 100644 --- a/LanMountainDesktop.Launcher/Services/IOobeStep.cs +++ b/LanMountainDesktop.Launcher/Oobe/IOobeStep.cs @@ -1,4 +1,4 @@ -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; internal interface IOobeStep { diff --git a/LanMountainDesktop.Launcher/Services/LauncherWindowsStartupService.cs b/LanMountainDesktop.Launcher/Oobe/LauncherWindowsStartupService.cs similarity index 97% rename from LanMountainDesktop.Launcher/Services/LauncherWindowsStartupService.cs rename to LanMountainDesktop.Launcher/Oobe/LauncherWindowsStartupService.cs index d94a912..207a5ea 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherWindowsStartupService.cs +++ b/LanMountainDesktop.Launcher/Oobe/LauncherWindowsStartupService.cs @@ -1,7 +1,7 @@ using System; using Microsoft.Win32; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; /// /// 将当前 Windows 用户登录时自启动项指向本 Launcher 进程(与正式入口一致)。 diff --git a/LanMountainDesktop.Launcher/Services/OobeStateService.cs b/LanMountainDesktop.Launcher/Oobe/OobeStateService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/OobeStateService.cs rename to LanMountainDesktop.Launcher/Oobe/OobeStateService.cs index a7c4ca3..079ef0e 100644 --- a/LanMountainDesktop.Launcher/Services/OobeStateService.cs +++ b/LanMountainDesktop.Launcher/Oobe/OobeStateService.cs @@ -1,7 +1,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; internal sealed class OobeStateService { diff --git a/LanMountainDesktop.Launcher/Services/PrivacyAgreementService.cs b/LanMountainDesktop.Launcher/Oobe/PrivacyAgreementService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/PrivacyAgreementService.cs rename to LanMountainDesktop.Launcher/Oobe/PrivacyAgreementService.cs index bca07a6..9e75104 100644 --- a/LanMountainDesktop.Launcher/Services/PrivacyAgreementService.cs +++ b/LanMountainDesktop.Launcher/Oobe/PrivacyAgreementService.cs @@ -3,7 +3,7 @@ using System.Text; using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; /// /// 隐私协议同意状态管理服务(带防篡改保护) diff --git a/LanMountainDesktop.Launcher/Services/WelcomeOobeStep.cs b/LanMountainDesktop.Launcher/Oobe/WelcomeOobeStep.cs similarity index 96% rename from LanMountainDesktop.Launcher/Services/WelcomeOobeStep.cs rename to LanMountainDesktop.Launcher/Oobe/WelcomeOobeStep.cs index 241b5e6..2b34b6d 100644 --- a/LanMountainDesktop.Launcher/Services/WelcomeOobeStep.cs +++ b/LanMountainDesktop.Launcher/Oobe/WelcomeOobeStep.cs @@ -1,7 +1,7 @@ using Avalonia.Threading; using LanMountainDesktop.Launcher.Views; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Oobe; internal sealed class WelcomeOobeStep : IOobeStep { diff --git a/LanMountainDesktop.Launcher/Services/PluginInstallerService.cs b/LanMountainDesktop.Launcher/Plugins/PluginInstallerService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/PluginInstallerService.cs rename to LanMountainDesktop.Launcher/Plugins/PluginInstallerService.cs index 215bbe6..fb52344 100644 --- a/LanMountainDesktop.Launcher/Services/PluginInstallerService.cs +++ b/LanMountainDesktop.Launcher/Plugins/PluginInstallerService.cs @@ -2,7 +2,7 @@ using System.IO.Compression; using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Plugins; /// /// 插件安装服务 - 简化版,不依赖 PluginSdk @@ -290,7 +290,7 @@ internal sealed class PluginInstallerService /// /// 简化的插件清单模型 /// -public class PluginManifest +internal class PluginManifest { public string Id { get; set; } = ""; public string Name { get; set; } = ""; diff --git a/LanMountainDesktop.Launcher/Services/PluginUpgradeQueueService.cs b/LanMountainDesktop.Launcher/Plugins/PluginUpgradeQueueService.cs similarity index 92% rename from LanMountainDesktop.Launcher/Services/PluginUpgradeQueueService.cs rename to LanMountainDesktop.Launcher/Plugins/PluginUpgradeQueueService.cs index 25d57fd..2d68a42 100644 --- a/LanMountainDesktop.Launcher/Services/PluginUpgradeQueueService.cs +++ b/LanMountainDesktop.Launcher/Plugins/PluginUpgradeQueueService.cs @@ -1,7 +1,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Plugins; internal sealed class PluginUpgradeQueueService { @@ -29,7 +29,7 @@ internal sealed class PluginUpgradeQueueService } var text = File.ReadAllText(pendingPath); - var pending = JsonSerializer.Deserialize(text, AppJsonContext.Default.ListPendingUpgrade) ?? []; + var pending = JsonSerializer.Deserialize>(text, AppJsonContext.Default.Options) ?? []; var failures = new List(); var succeeded = new List(); @@ -63,7 +63,7 @@ internal sealed class PluginUpgradeQueueService } else { - File.WriteAllText(pendingPath, JsonSerializer.Serialize(remaining, AppJsonContext.Default.ListPendingUpgrade)); + File.WriteAllText(pendingPath, JsonSerializer.Serialize(remaining, AppJsonContext.Default.Options)); } return new LauncherResult diff --git a/LanMountainDesktop.Launcher/Program.cs b/LanMountainDesktop.Launcher/Program.cs index 9c27e83..fc6eb5f 100644 --- a/LanMountainDesktop.Launcher/Program.cs +++ b/LanMountainDesktop.Launcher/Program.cs @@ -1,7 +1,5 @@ using Avalonia; using LanMountainDesktop.Launcher.Models; -using LanMountainDesktop.Launcher.Services; - namespace LanMountainDesktop.Launcher; public static class Program diff --git a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.HostStartupMonitor.cs b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.HostStartupMonitor.cs index cd252b5..d1e72fb 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.HostStartupMonitor.cs +++ b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.HostStartupMonitor.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using Avalonia.Threading; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Resources; -using LanMountainDesktop.Launcher.Services.Ipc; using LanMountainDesktop.Launcher.Startup; using LanMountainDesktop.Launcher.Views; using LanMountainDesktop.Shared.Contracts.Launcher; @@ -185,115 +184,18 @@ internal sealed partial class LauncherFlowCoordinator } } + private static async Task TryGetPublicShellStatusAsync( + LanMountainDesktopIpcClient ipcClient) => + await HostStartupMonitor.TryGetPublicShellStatusAsync(ipcClient).ConfigureAwait(false); + private static async Task TryRecoverActivationThroughExistingHostAsync( LanMountainDesktopIpcClient ipcClient, StartupSuccessTracker startupSuccessTracker, - TimeSpan timeout) - { - var activation = await TryActivateExistingHostWithStatusAsync(ipcClient, timeout).ConfigureAwait(false); - if (activation is null) - { - return null; - } - - if (startupSuccessTracker.TryResolve(activation.Status, out var shellSuccess)) - { - return shellSuccess; - } - - if (activation.Accepted) - { - return startupSuccessTracker.BuildRecoverySuccessState(); - } - - return HostActivationPolicy.IsRecoverableActivationFailure(activation) - ? new StartupSuccessState( - StartupStage.Ready, - "startup_pending", - activation.Message) - : null; - } - - private static async Task TryGetPublicShellStatusAsync( - LanMountainDesktopIpcClient ipcClient) - { - try - { - var shellProxy = ipcClient.CreateProxy(); - return await shellProxy.GetShellStatusAsync().ConfigureAwait(false); - } - catch (Exception ex) - { - Logger.Warn($"Failed to query public shell status: {ex.Message}"); - return null; - } - } - - private static async Task TryRecoverWithPublicActivationAsync( - LanMountainDesktopIpcClient ipcClient, - Process hostProcess, - Task successTask, - StartupSuccessTracker startupSuccessTracker) - { - try - { - var shellProxy = ipcClient.CreateProxy(); - var activation = await shellProxy.ActivateMainWindowWithStatusAsync().ConfigureAwait(false); - StartupDiagnostics.TraceShellStatus("recovery_activation", activation.Status); - if (startupSuccessTracker.TryResolve(activation.Status, out var shellSuccess)) - { - return shellSuccess; - } - - var completedTask = await Task.WhenAny(successTask, Task.Delay(TimeSpan.FromSeconds(5))).ConfigureAwait(false); - if (completedTask == successTask) - { - return await successTask.ConfigureAwait(false); - } - - if (!hostProcess.HasExited && (activation.Accepted || HostActivationPolicy.IsRecoverableActivationFailure(activation))) - { - return startupSuccessTracker.BuildRecoverySuccessState(); - } - } - catch (Exception ex) - { - Logger.Warn($"Public activation recovery failed: {ex.Message}"); - } - - return null; - } - - private static LoadingStateMessage BuildDelayedLoadingState( - LoadingStateMessage loadingState, - string summaryMessage, - string detailMessage, - DateTimeOffset startedAtUtc) - { - var delayedItems = loadingState.ActiveItems - .Where(item => !string.Equals(item.Id, "launcher-soft-timeout", StringComparison.OrdinalIgnoreCase)) - .ToList(); - - delayedItems.Insert(0, new LoadingItem - { - Id = "launcher-soft-timeout", - Type = LoadingItemType.System, - Name = "Startup still in progress", - Description = detailMessage, - State = LoadingState.Delayed, - ProgressPercent = Math.Max(loadingState.OverallProgressPercent, 1), - Message = detailMessage, - StartTime = startedAtUtc - }); - - return loadingState with - { - ActiveItems = delayedItems, - Message = summaryMessage, - Timestamp = DateTimeOffset.UtcNow, - TotalCount = Math.Max(loadingState.TotalCount, delayedItems.Count) - }; - } + TimeSpan timeout) => + await HostStartupMonitor.TryRecoverActivationThroughExistingHostAsync( + ipcClient, + startupSuccessTracker, + timeout).ConfigureAwait(false); private static Dictionary BuildAttemptDetails( StartupAttemptRecord? trackedAttempt, diff --git a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.UiPresenter.cs b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.UiPresenter.cs index 0dc9a11..22c81a7 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.UiPresenter.cs +++ b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.UiPresenter.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using Avalonia.Threading; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Resources; -using LanMountainDesktop.Launcher.Services.Ipc; using LanMountainDesktop.Launcher.Views; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC; diff --git a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs index d3fbd25..85f74f3 100644 --- a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs +++ b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using Avalonia.Threading; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Resources; -using LanMountainDesktop.Launcher.Services.Ipc; using LanMountainDesktop.Launcher.Startup; using LanMountainDesktop.Launcher.Views; using LanMountainDesktop.Shared.Contracts.Launcher; @@ -340,7 +339,7 @@ internal sealed partial class LauncherFlowCoordinator { softTimeoutShown = true; reporter.Report("delayed", SoftTimeoutStatusMessage); - loadingState = BuildDelayedLoadingState( + loadingState = HostStartupMonitor.BuildDelayedLoadingState( loadingState, SoftTimeoutStatusMessage, SoftTimeoutDetailsMessage, diff --git a/LanMountainDesktop.Launcher/Startup/HostStartupMonitor.cs b/LanMountainDesktop.Launcher/Startup/HostStartupMonitor.cs index b1962c5..5413ea4 100644 --- a/LanMountainDesktop.Launcher/Startup/HostStartupMonitor.cs +++ b/LanMountainDesktop.Launcher/Startup/HostStartupMonitor.cs @@ -1,7 +1,6 @@ using System.Diagnostics; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Launcher.Resources; -using LanMountainDesktop.Launcher.Services; using LanMountainDesktop.Launcher.Views; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC; diff --git a/LanMountainDesktop.Launcher/Startup/PublicIpcConnection.cs b/LanMountainDesktop.Launcher/Startup/PublicIpcConnection.cs index 9c9a3aa..29bad7c 100644 --- a/LanMountainDesktop.Launcher/Startup/PublicIpcConnection.cs +++ b/LanMountainDesktop.Launcher/Startup/PublicIpcConnection.cs @@ -1,4 +1,3 @@ -using LanMountainDesktop.Launcher.Services; using LanMountainDesktop.Shared.IPC; namespace LanMountainDesktop.Launcher.Startup; diff --git a/LanMountainDesktop.Launcher/Services/StartupAttemptRegistry.cs b/LanMountainDesktop.Launcher/Startup/StartupAttemptRegistry.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/StartupAttemptRegistry.cs rename to LanMountainDesktop.Launcher/Startup/StartupAttemptRegistry.cs index c9ebd30..ecea348 100644 --- a/LanMountainDesktop.Launcher/Services/StartupAttemptRegistry.cs +++ b/LanMountainDesktop.Launcher/Startup/StartupAttemptRegistry.cs @@ -5,7 +5,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; using LanMountainDesktop.Shared.Contracts.Launcher; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Startup; internal sealed class StartupAttemptRegistry { diff --git a/LanMountainDesktop.Launcher/Startup/StartupDiagnostics.cs b/LanMountainDesktop.Launcher/Startup/StartupDiagnostics.cs index 1ce6fb4..2b341c7 100644 --- a/LanMountainDesktop.Launcher/Startup/StartupDiagnostics.cs +++ b/LanMountainDesktop.Launcher/Startup/StartupDiagnostics.cs @@ -1,5 +1,4 @@ using System.Text.Json; -using LanMountainDesktop.Launcher.Services; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC.Abstractions.Services; diff --git a/LanMountainDesktop.Launcher/Startup/StartupSuccessTracker.cs b/LanMountainDesktop.Launcher/Startup/StartupSuccessTracker.cs index 9d4ef41..0734d89 100644 --- a/LanMountainDesktop.Launcher/Startup/StartupSuccessTracker.cs +++ b/LanMountainDesktop.Launcher/Startup/StartupSuccessTracker.cs @@ -1,4 +1,3 @@ -using LanMountainDesktop.Launcher.Services; using LanMountainDesktop.Shared.Contracts.Launcher; using LanMountainDesktop.Shared.IPC.Abstractions.Services; diff --git a/LanMountainDesktop.Launcher/Services/IUpdateProgressReporter.cs b/LanMountainDesktop.Launcher/Update/IUpdateProgressReporter.cs similarity index 81% rename from LanMountainDesktop.Launcher/Services/IUpdateProgressReporter.cs rename to LanMountainDesktop.Launcher/Update/IUpdateProgressReporter.cs index 3d4c33c..752b058 100644 --- a/LanMountainDesktop.Launcher/Services/IUpdateProgressReporter.cs +++ b/LanMountainDesktop.Launcher/Update/IUpdateProgressReporter.cs @@ -1,6 +1,6 @@ using LanMountainDesktop.Shared.Contracts.Update; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Update; public interface IUpdateProgressReporter { diff --git a/LanMountainDesktop.Launcher/Services/NullUpdateProgressReporter.cs b/LanMountainDesktop.Launcher/Update/NullUpdateProgressReporter.cs similarity index 84% rename from LanMountainDesktop.Launcher/Services/NullUpdateProgressReporter.cs rename to LanMountainDesktop.Launcher/Update/NullUpdateProgressReporter.cs index 7164026..fda4d97 100644 --- a/LanMountainDesktop.Launcher/Services/NullUpdateProgressReporter.cs +++ b/LanMountainDesktop.Launcher/Update/NullUpdateProgressReporter.cs @@ -1,6 +1,6 @@ using LanMountainDesktop.Shared.Contracts.Update; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Update; internal sealed class NullUpdateProgressReporter : IUpdateProgressReporter { diff --git a/LanMountainDesktop.Launcher/Update/UpdateCheckService.cs b/LanMountainDesktop.Launcher/Update/UpdateCheckService.cs new file mode 100644 index 0000000..e69de29 diff --git a/LanMountainDesktop.Launcher/Services/UpdateEngineService.cs b/LanMountainDesktop.Launcher/Update/UpdateEngineService.cs similarity index 99% rename from LanMountainDesktop.Launcher/Services/UpdateEngineService.cs rename to LanMountainDesktop.Launcher/Update/UpdateEngineService.cs index 312bdb6..a6d358f 100644 --- a/LanMountainDesktop.Launcher/Services/UpdateEngineService.cs +++ b/LanMountainDesktop.Launcher/Update/UpdateEngineService.cs @@ -4,7 +4,7 @@ using System.Text.Json; using LanMountainDesktop.Launcher.Models; using ContractsUpdate = LanMountainDesktop.Shared.Contracts.Update; -namespace LanMountainDesktop.Launcher.Services; +namespace LanMountainDesktop.Launcher.Update; internal sealed class UpdateEngineService { diff --git a/LanMountainDesktop.Launcher/Views/OobeWindow.axaml.cs b/LanMountainDesktop.Launcher/Views/OobeWindow.axaml.cs index 32fe177..b3fd702 100644 --- a/LanMountainDesktop.Launcher/Views/OobeWindow.axaml.cs +++ b/LanMountainDesktop.Launcher/Views/OobeWindow.axaml.cs @@ -28,7 +28,7 @@ public partial class OobeWindow : Window private bool _migrateExistingData; // 主题选择 - private Services.ThemeMode _selectedThemeMode = Services.ThemeMode.Light; + private ThemeMode _selectedThemeMode = ThemeMode.Light; private string _selectedAccentColor = "#0078D4"; private MonetSource _selectedMonetSource = MonetSource.Wallpaper; @@ -82,19 +82,19 @@ public partial class OobeWindow : Window // 浅色/深色模式选择 if (this.FindControl("LightModeOption") is { } lightModeOption) { - lightModeOption.PointerPressed += (s, e) => SelectThemeMode(Services.ThemeMode.Light); + lightModeOption.PointerPressed += (s, e) => SelectThemeMode(ThemeMode.Light); } if (this.FindControl("DarkModeOption") is { } darkModeOption) { - darkModeOption.PointerPressed += (s, e) => SelectThemeMode(Services.ThemeMode.Dark); + darkModeOption.PointerPressed += (s, e) => SelectThemeMode(ThemeMode.Dark); } if (this.FindControl("LightModeRadio") is { } lightModeRadio) { lightModeRadio.IsCheckedChanged += (s, e) => { - if (lightModeRadio.IsChecked == true) SelectThemeMode(Services.ThemeMode.Light); + if (lightModeRadio.IsChecked == true) SelectThemeMode(ThemeMode.Light); }; } @@ -102,7 +102,7 @@ public partial class OobeWindow : Window { darkModeRadio.IsCheckedChanged += (s, e) => { - if (darkModeRadio.IsChecked == true) SelectThemeMode(Services.ThemeMode.Dark); + if (darkModeRadio.IsChecked == true) SelectThemeMode(ThemeMode.Dark); }; } @@ -812,7 +812,7 @@ public partial class OobeWindow : Window } // 主题选择方法 - private void SelectThemeMode(Services.ThemeMode mode) + private void SelectThemeMode(ThemeMode mode) { _selectedThemeMode = mode; @@ -821,30 +821,30 @@ public partial class OobeWindow : Window if (this.FindControl("LightModeRadio") is { } lightModeRadio) { - lightModeRadio.IsChecked = mode == Services.ThemeMode.Light; + lightModeRadio.IsChecked = mode == ThemeMode.Light; } if (this.FindControl("DarkModeRadio") is { } darkModeRadio) { - darkModeRadio.IsChecked = mode == Services.ThemeMode.Dark; + darkModeRadio.IsChecked = mode == ThemeMode.Dark; } if (this.FindControl("LightModeOption") is { } lightModeOption) { - lightModeOption.BorderBrush = mode == Services.ThemeMode.Light + lightModeOption.BorderBrush = mode == ThemeMode.Light ? Application.Current?.Resources["AccentFillColorDefaultBrush"] as IBrush : Application.Current?.Resources["CardStrokeColorDefaultBrush"] as IBrush; - lightModeOption.BorderThickness = mode == Services.ThemeMode.Light + lightModeOption.BorderThickness = mode == ThemeMode.Light ? new Thickness(2) : new Thickness(1); } if (this.FindControl("DarkModeOption") is { } darkModeOption) { - darkModeOption.BorderBrush = mode == Services.ThemeMode.Dark + darkModeOption.BorderBrush = mode == ThemeMode.Dark ? Application.Current?.Resources["AccentFillColorDefaultBrush"] as IBrush : Application.Current?.Resources["CardStrokeColorDefaultBrush"] as IBrush; - darkModeOption.BorderThickness = mode == Services.ThemeMode.Dark + darkModeOption.BorderThickness = mode == ThemeMode.Dark ? new Thickness(2) : new Thickness(1); } diff --git a/LanMountainDesktop.Tests/AirAppProcessStarterRuntimeTests.cs b/LanMountainDesktop.Tests/AirAppProcessStarterRuntimeTests.cs index 0d36850..116bf56 100644 --- a/LanMountainDesktop.Tests/AirAppProcessStarterRuntimeTests.cs +++ b/LanMountainDesktop.Tests/AirAppProcessStarterRuntimeTests.cs @@ -1,5 +1,5 @@ -using LanMountainDesktop.Launcher.Services; -using LanMountainDesktop.Launcher.Services.AirApp; +using LanMountainDesktop.Launcher.AirApp; +using LanMountainDesktop.Launcher.Infrastructure; using Xunit; namespace LanMountainDesktop.Tests; diff --git a/LanMountainDesktop.Tests/CornerRadiusStyleTests.cs b/LanMountainDesktop.Tests/CornerRadiusStyleTests.cs index ce750d2..14d6826 100644 --- a/LanMountainDesktop.Tests/CornerRadiusStyleTests.cs +++ b/LanMountainDesktop.Tests/CornerRadiusStyleTests.cs @@ -69,7 +69,7 @@ public sealed class CornerRadiusStyleTests ThemeVariant: "Dark")); var context = new PluginDesktopComponentContext( - new PluginManifest("plugin.id", "Plugin Name", "plugin.dll"), + new LanMountainDesktop.PluginSdk.PluginManifest("plugin.id", "Plugin Name", "plugin.dll"), "C:\\Plugins\\plugin.id", "C:\\Data\\plugin.id", new NullServiceProvider(), diff --git a/LanMountainDesktop.Tests/LauncherAirAppLifecycleServiceTests.cs b/LanMountainDesktop.Tests/LauncherAirAppLifecycleServiceTests.cs index 2fdde93..b88e182 100644 --- a/LanMountainDesktop.Tests/LauncherAirAppLifecycleServiceTests.cs +++ b/LanMountainDesktop.Tests/LauncherAirAppLifecycleServiceTests.cs @@ -1,7 +1,7 @@ using System.Diagnostics; using LanMountainDesktop.ComponentSystem; using LanMountainDesktop.Launcher; -using LanMountainDesktop.Launcher.Services.AirApp; +using LanMountainDesktop.Launcher.AirApp; using LanMountainDesktop.Shared.IPC.Abstractions.Services; using Xunit; diff --git a/LanMountainDesktop.Tests/LauncherGlobalUsings.cs b/LanMountainDesktop.Tests/LauncherGlobalUsings.cs new file mode 100644 index 0000000..e25d9dd --- /dev/null +++ b/LanMountainDesktop.Tests/LauncherGlobalUsings.cs @@ -0,0 +1,6 @@ +global using LanMountainDesktop.Launcher.AirApp; +global using LanMountainDesktop.Launcher.Deployment; +global using LanMountainDesktop.Launcher.Infrastructure; +global using LanMountainDesktop.Launcher.Ipc; +global using LanMountainDesktop.Launcher.Oobe; +global using LanMountainDesktop.Launcher.Update; diff --git a/LanMountainDesktop.Tests/PluginInstallerServiceTests.cs b/LanMountainDesktop.Tests/PluginInstallerServiceTests.cs index 4500fe5..dbb30e6 100644 --- a/LanMountainDesktop.Tests/PluginInstallerServiceTests.cs +++ b/LanMountainDesktop.Tests/PluginInstallerServiceTests.cs @@ -1,4 +1,4 @@ -using LanMountainDesktop.Launcher.Services; +using LanMountainDesktop.Launcher.Plugins; using System.IO.Compression; using Xunit; diff --git a/LanMountainDesktop.Tests/PluginManifestRuntimeTests.cs b/LanMountainDesktop.Tests/PluginManifestRuntimeTests.cs index 82113af..7fe55bc 100644 --- a/LanMountainDesktop.Tests/PluginManifestRuntimeTests.cs +++ b/LanMountainDesktop.Tests/PluginManifestRuntimeTests.cs @@ -18,7 +18,7 @@ public sealed class PluginManifestRuntimeTests """; using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); - var manifest = PluginManifest.Load(stream, "plugin.json"); + var manifest = LanMountainDesktop.PluginSdk.PluginManifest.Load(stream, "plugin.json"); Assert.NotNull(manifest.Runtime); Assert.Equal(PluginRuntimeModes.InProcess, manifest.Runtime!.Mode); @@ -40,7 +40,7 @@ public sealed class PluginManifestRuntimeTests """; using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); - var ex = Assert.Throws(() => PluginManifest.Load(stream, "plugin.json")); + var ex = Assert.Throws(() => LanMountainDesktop.PluginSdk.PluginManifest.Load(stream, "plugin.json")); Assert.Contains("runtime.mode", ex.Message); Assert.Contains("shared-worker", ex.Message);