< Summary

Information
Class: SwitchBlade.Services.WindowsStartupManager
Assembly: SwitchBlade
File(s): D:\a\switchblade\switchblade\Services\WindowsStartupManager.cs
Tag: 203_23722840422
Line coverage
100%
Covered lines: 49
Uncovered lines: 0
Coverable lines: 49
Total lines: 97
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%22100%
IsStartupEnabled()100%11100%
EnableStartup(...)100%44100%
DisableStartup()100%22100%
CheckAndApplyStartupMarker()100%66100%

File(s)

D:\a\switchblade\switchblade\Services\WindowsStartupManager.cs

#LineLine coverage
 1using System;
 2using Microsoft.Win32;
 3using SwitchBlade.Contracts;
 4
 5namespace SwitchBlade.Services
 6{
 7    /// <summary>
 8    /// Manages Windows startup registry entries for the application.
 9    /// Extracted from SettingsService to follow Single Responsibility Principle.
 10    /// </summary>
 11    public class WindowsStartupManager : IWindowsStartupManager
 12    {
 13        private const string APP_REGISTRY_KEY = @"Software\SwitchBlade";
 14        private const string STARTUP_REGISTRY_KEY = @"Software\Microsoft\Windows\CurrentVersion\Run";
 15        private const string STARTUP_VALUE_NAME = "SwitchBlade";
 16
 17        private readonly IRegistryService _registryService;
 18        private readonly ILogger? _logger;
 19
 2120        public WindowsStartupManager(IRegistryService registryService, ILogger? logger = null)
 2121        {
 2122            _registryService = registryService ?? throw new ArgumentNullException(nameof(registryService));
 2023            _logger = logger;
 2024        }
 25
 26        /// <inheritdoc />
 27        public bool IsStartupEnabled()
 428        {
 29            try
 430            {
 431                return _registryService.GetCurrentUserValue(STARTUP_REGISTRY_KEY, STARTUP_VALUE_NAME) != null;
 32            }
 133            catch
 134            {
 135                return false;
 36            }
 437        }
 38
 39        /// <inheritdoc />
 40        public void EnableStartup(string executablePath)
 541        {
 542            if (string.IsNullOrEmpty(executablePath))
 243            {
 244                throw new ArgumentException("Executable path cannot be null or empty.", nameof(executablePath));
 45            }
 46
 47            try
 348            {
 49                // Add /minimized so app starts in background on Windows startup
 350                _registryService.SetCurrentUserValue(STARTUP_REGISTRY_KEY, STARTUP_VALUE_NAME, $"\"{executablePath}\" /m
 151            }
 252            catch (Exception ex)
 253            {
 254                _logger?.LogError("Failed to enable startup registry entry", ex);
 255            }
 356        }
 57
 58        /// <inheritdoc />
 59        public void DisableStartup()
 460        {
 61            try
 462            {
 463                _registryService.DeleteCurrentUserValue(STARTUP_REGISTRY_KEY, STARTUP_VALUE_NAME, false);
 264            }
 265            catch (Exception ex)
 266            {
 267                _logger?.LogError("Failed to disable startup registry entry", ex);
 268            }
 469        }
 70
 71        /// <inheritdoc />
 72        public bool CheckAndApplyStartupMarker()
 773        {
 74            try
 775            {
 776                object? markerValue = _registryService.GetCurrentUserValue(APP_REGISTRY_KEY, "EnableStartupOnFirstRun");
 577                if (markerValue != null)
 378                {
 79                    // Check if it's "1" (string from MSI) or 1 (integer)
 380                    string markerStr = markerValue.ToString() ?? "0";
 381                    bool shouldEnable = markerStr == "1";
 82
 83                    // Always delete the marker after checking (it's a one-time flag)
 384                    _registryService.DeleteCurrentUserValue(APP_REGISTRY_KEY, "EnableStartupOnFirstRun", false);
 85
 386                    return shouldEnable;
 87                }
 288            }
 289            catch (Exception ex)
 290            {
 291                _logger?.LogError("Failed to read/delete EnableStartupOnFirstRun marker", ex);
 292            }
 93
 494            return false;
 795        }
 96    }
 97}