diff --git a/src/AppConfiguration.cs b/src/AppConfiguration.cs index 117d489..0e2d9e7 100644 --- a/src/AppConfiguration.cs +++ b/src/AppConfiguration.cs @@ -116,17 +116,6 @@ private void WriteToFile() )] internal partial class AppConfigurationSerializerContext : JsonSerializerContext {} -abstract class AppConfigurationException : Exception -{ - protected AppConfigurationException(string message) : base(message) {} -} - -class AppConfigurationLoadException : AppConfigurationException -{ - public AppConfigurationLoadException(string message) : base(message) {} -} - -class AppConfigurationWriteException : AppConfigurationException -{ - public AppConfigurationWriteException(string message) : base(message) {} -} +abstract class AppConfigurationException(string message) : Exception(message) {} +class AppConfigurationLoadException(string message) : AppConfigurationException(message) {} +class AppConfigurationWriteException(string message) : AppConfigurationException(message) {} diff --git a/src/Operations/AskForRebootOperation.cs b/src/Operations/AskForRebootOperation.cs index 3900384..98413f8 100644 --- a/src/Operations/AskForRebootOperation.cs +++ b/src/Operations/AskForRebootOperation.cs @@ -3,17 +3,8 @@ namespace Win10BloatRemover.Operations; -class AskForRebootOperation : IOperation +class AskForRebootOperation(IUserInterface ui, RebootRecommendedFlag rebootFlag) : IOperation { - private readonly IUserInterface ui; - private readonly RebootRecommendedFlag rebootFlag; - - public AskForRebootOperation(IUserInterface ui, RebootRecommendedFlag rebootFlag) - { - this.ui = ui; - this.rebootFlag = rebootFlag; - } - public void Run() { if (rebootFlag.IsRebootRecommended) diff --git a/src/Operations/AutoUpdatesDisabler.cs b/src/Operations/AutoUpdatesDisabler.cs index 390e613..f7588c2 100644 --- a/src/Operations/AutoUpdatesDisabler.cs +++ b/src/Operations/AutoUpdatesDisabler.cs @@ -4,11 +4,8 @@ namespace Win10BloatRemover.Operations; -public class AutoUpdatesDisabler : IOperation +public class AutoUpdatesDisabler(IUserInterface ui) : IOperation { - private readonly IUserInterface ui; - public AutoUpdatesDisabler(IUserInterface ui) => this.ui = ui; - public void Run() { ui.PrintMessage("Writing values into the Registry..."); diff --git a/src/Operations/BrowserOpener.cs b/src/Operations/BrowserOpener.cs index bb146d7..6513c8c 100644 --- a/src/Operations/BrowserOpener.cs +++ b/src/Operations/BrowserOpener.cs @@ -2,15 +2,8 @@ namespace Win10BloatRemover.Operations; -public class BrowserOpener : IOperation +public class BrowserOpener(string url) : IOperation { - private readonly string url; - - public BrowserOpener(string url) - { - this.url = url; - } - public void Run() { var startInfo = new ProcessStartInfo { diff --git a/src/Operations/ConsumerFeaturesDisabler.cs b/src/Operations/ConsumerFeaturesDisabler.cs index 9fb947d..a3e5ece 100644 --- a/src/Operations/ConsumerFeaturesDisabler.cs +++ b/src/Operations/ConsumerFeaturesDisabler.cs @@ -4,11 +4,8 @@ namespace Win10BloatRemover.Operations; -public class ConsumerFeaturesDisabler : IOperation +public class ConsumerFeaturesDisabler(IUserInterface ui) : IOperation { - private readonly IUserInterface ui; - public ConsumerFeaturesDisabler(IUserInterface ui) => this.ui = ui; - public bool IsRebootRecommended { get; private set; } public void Run() diff --git a/src/Operations/DefenderDisabler.cs b/src/Operations/DefenderDisabler.cs index 2b75c35..ee578d0 100644 --- a/src/Operations/DefenderDisabler.cs +++ b/src/Operations/DefenderDisabler.cs @@ -4,7 +4,7 @@ namespace Win10BloatRemover.Operations; -public class DefenderDisabler : IOperation +public class DefenderDisabler(IUserInterface ui, ServiceRemover serviceRemover) : IOperation { private static readonly string[] defenderServices = [ "wscsvc", @@ -20,17 +20,8 @@ public class DefenderDisabler : IOperation @"\Microsoft\Windows\Windows Defender\Windows Defender Verification" ]; - private readonly IUserInterface ui; - private readonly ServiceRemover serviceRemover; - public bool IsRebootRecommended { get; private set; } - public DefenderDisabler(IUserInterface ui, ServiceRemover serviceRemover) - { - this.ui = ui; - this.serviceRemover = serviceRemover; - } - public void Run() { CheckForTamperProtection(); diff --git a/src/Operations/EdgeRemover.cs b/src/Operations/EdgeRemover.cs index 224f4e8..85f8da6 100644 --- a/src/Operations/EdgeRemover.cs +++ b/src/Operations/EdgeRemover.cs @@ -8,17 +8,8 @@ namespace Win10BloatRemover.Operations; -public class EdgeRemover : IOperation +public class EdgeRemover(IUserInterface ui, AppxRemover appxRemover) : IOperation { - private readonly IUserInterface ui; - private readonly AppxRemover appxRemover; - - public EdgeRemover(IUserInterface ui, AppxRemover appxRemover) - { - this.ui = ui; - this.appxRemover = appxRemover; - } - public void Run() { UninstallEdgeChromium(); diff --git a/src/Operations/ErrorReportingDisabler.cs b/src/Operations/ErrorReportingDisabler.cs index 75d4de0..13ea6ba 100644 --- a/src/Operations/ErrorReportingDisabler.cs +++ b/src/Operations/ErrorReportingDisabler.cs @@ -3,24 +3,15 @@ namespace Win10BloatRemover.Operations; -public class ErrorReportingDisabler : IOperation +public class ErrorReportingDisabler(IUserInterface ui, ServiceRemover serviceRemover) : IOperation { private static readonly string[] errorReportingServices = ["WerSvc", "wercplsupport"]; private static readonly string[] errorReportingScheduledTasks = [ @"\Microsoft\Windows\Windows Error Reporting\QueueReporting" ]; - private readonly IUserInterface ui; - private readonly ServiceRemover serviceRemover; - public bool IsRebootRecommended => serviceRemover.IsRebootRecommended; - public ErrorReportingDisabler(IUserInterface ui, ServiceRemover serviceRemover) - { - this.ui = ui; - this.serviceRemover = serviceRemover; - } - public void Run() { DisableErrorReporting(); diff --git a/src/Operations/FeaturesRemover.cs b/src/Operations/FeaturesRemover.cs index 1a9a29f..ea97b9a 100644 --- a/src/Operations/FeaturesRemover.cs +++ b/src/Operations/FeaturesRemover.cs @@ -4,19 +4,10 @@ namespace Win10BloatRemover.Operations; -public class FeaturesRemover : IOperation +public class FeaturesRemover(string[] featuresToRemove, IUserInterface ui) : IOperation { - private readonly string[] featuresToRemove; - private readonly IUserInterface ui; - public bool IsRebootRecommended { get; private set; } - public FeaturesRemover(string[] featuresToRemove, IUserInterface ui) - { - this.featuresToRemove = featuresToRemove; - this.ui = ui; - } - public void Run() { using var dismClient = new DismClient(); diff --git a/src/Operations/LicensePrinter.cs b/src/Operations/LicensePrinter.cs index 5b2bb18..f71e5f7 100644 --- a/src/Operations/LicensePrinter.cs +++ b/src/Operations/LicensePrinter.cs @@ -3,11 +3,8 @@ namespace Win10BloatRemover.Operations; -public class LicensePrinter : IOperation +public class LicensePrinter(IUserInterface ui) : IOperation { - private readonly IUserInterface ui; - public LicensePrinter(IUserInterface ui) => this.ui = ui; - public void Run() { Stream licenseFile = GetType().Assembly.GetManifestResourceStream("Win10BloatRemover.Resources.License.txt")!; diff --git a/src/Operations/OneDriveRemover.cs b/src/Operations/OneDriveRemover.cs index b5122d5..e61956b 100644 --- a/src/Operations/OneDriveRemover.cs +++ b/src/Operations/OneDriveRemover.cs @@ -6,12 +6,8 @@ namespace Win10BloatRemover.Operations; -public class OneDriveRemover : IOperation +public class OneDriveRemover(IUserInterface ui) : IOperation { - private readonly IUserInterface ui; - - public OneDriveRemover(IUserInterface ui) => this.ui = ui; - public void Run() { DisableOneDrive(); diff --git a/src/Operations/PrivacySettingsTweaker.cs b/src/Operations/PrivacySettingsTweaker.cs index 11228a0..876ad37 100644 --- a/src/Operations/PrivacySettingsTweaker.cs +++ b/src/Operations/PrivacySettingsTweaker.cs @@ -4,7 +4,7 @@ namespace Win10BloatRemover.Operations; -public class PrivacySettingsTweaker : IOperation +public class PrivacySettingsTweaker(IUserInterface ui) : IOperation { private static readonly string[] appPermissionsToDeny = [ "location", @@ -14,9 +14,6 @@ public class PrivacySettingsTweaker : IOperation "userAccountInformation" ]; - private readonly IUserInterface ui; - public PrivacySettingsTweaker(IUserInterface ui) => this.ui = ui; - public void Run() { ui.PrintMessage("Writing values into the Registry..."); diff --git a/src/Operations/ScheduledTasksDisabler.cs b/src/Operations/ScheduledTasksDisabler.cs index 65741be..810ca81 100644 --- a/src/Operations/ScheduledTasksDisabler.cs +++ b/src/Operations/ScheduledTasksDisabler.cs @@ -3,17 +3,8 @@ namespace Win10BloatRemover.Operations; -public class ScheduledTasksDisabler : IOperation +public class ScheduledTasksDisabler(string[] scheduledTasksToDisable, IUserInterface ui) : IOperation { - private readonly string[] scheduledTasksToDisable; - private readonly IUserInterface ui; - - public ScheduledTasksDisabler(string[] scheduledTasksToDisable, IUserInterface ui) - { - this.ui = ui; - this.scheduledTasksToDisable = scheduledTasksToDisable; - } - public void Run() { foreach (string task in scheduledTasksToDisable) diff --git a/src/Operations/ServiceRemover.cs b/src/Operations/ServiceRemover.cs index 553332b..34738c0 100644 --- a/src/Operations/ServiceRemover.cs +++ b/src/Operations/ServiceRemover.cs @@ -1,26 +1,14 @@ using Microsoft.Win32; -using System.Diagnostics; using System.IO; using Win10BloatRemover.UI; using Win10BloatRemover.Utils; namespace Win10BloatRemover.Operations; -public class ServiceRemovalOperation : IOperation +public class ServiceRemovalOperation(string[] servicesToRemove, IUserInterface ui, ServiceRemover serviceRemover) : IOperation { - private readonly string[] servicesToRemove; - private readonly IUserInterface ui; - private readonly ServiceRemover serviceRemover; - public bool IsRebootRecommended => serviceRemover.IsRebootRecommended; - public ServiceRemovalOperation(string[] servicesToRemove, IUserInterface ui, ServiceRemover serviceRemover) - { - this.servicesToRemove = servicesToRemove; - this.ui = ui; - this.serviceRemover = serviceRemover; - } - public void Run() { ui.PrintHeading("Backing up services..."); diff --git a/src/Operations/SuggestionsDisabler.cs b/src/Operations/SuggestionsDisabler.cs index 38dab2e..e16cb51 100644 --- a/src/Operations/SuggestionsDisabler.cs +++ b/src/Operations/SuggestionsDisabler.cs @@ -4,11 +4,8 @@ namespace Win10BloatRemover.Operations; -public class SuggestionsDisabler : IOperation +public class SuggestionsDisabler(IUserInterface ui) : IOperation { - private readonly IUserInterface ui; - public SuggestionsDisabler(IUserInterface ui) => this.ui = ui; - public void Run() { DisableSuggestions(); diff --git a/src/Operations/TelemetryDisabler.cs b/src/Operations/TelemetryDisabler.cs index bde6657..83e15aa 100644 --- a/src/Operations/TelemetryDisabler.cs +++ b/src/Operations/TelemetryDisabler.cs @@ -4,7 +4,7 @@ namespace Win10BloatRemover.Operations; -public class TelemetryDisabler : IOperation +public class TelemetryDisabler(IUserInterface ui, ServiceRemover serviceRemover) : IOperation { private static readonly string[] telemetryServices = [ "DiagTrack", @@ -34,17 +34,8 @@ public class TelemetryDisabler : IOperation @"\Microsoft\Windows\PI\Sqm-Tasks" ]; - private readonly IUserInterface ui; - private readonly ServiceRemover serviceRemover; - public bool IsRebootRecommended { get; private set; } - public TelemetryDisabler(IUserInterface ui, ServiceRemover serviceRemover) - { - this.ui = ui; - this.serviceRemover = serviceRemover; - } - public void Run() { RemoveTelemetryServices(); diff --git a/src/UI/ConsoleMenu.cs b/src/UI/ConsoleMenu.cs index b9348f5..50743fd 100644 --- a/src/UI/ConsoleMenu.cs +++ b/src/UI/ConsoleMenu.cs @@ -4,22 +4,14 @@ namespace Win10BloatRemover.UI; -class ConsoleMenu +class ConsoleMenu(MenuEntry[] entries, RebootRecommendedFlag rebootFlag) { private const int FirstMenuEntryNumber = 1; private bool exitRequested = false; - private readonly MenuEntry[] entries; - private readonly RebootRecommendedFlag rebootFlag; private static readonly Version programVersion = typeof(ConsoleMenu).Assembly.GetName().Version!; - public ConsoleMenu(MenuEntry[] entries, RebootRecommendedFlag rebootFlag) - { - this.entries = entries; - this.rebootFlag = rebootFlag; - } - public void RunLoopUntilExitRequested() { while (!exitRequested) diff --git a/src/UI/MenuEntries.cs b/src/UI/MenuEntries.cs index 8e1d7ed..e921b73 100644 --- a/src/UI/MenuEntries.cs +++ b/src/UI/MenuEntries.cs @@ -11,12 +11,8 @@ abstract class MenuEntry public abstract IOperation CreateNewOperation(IUserInterface ui); } -class UWPAppRemovalEntry : MenuEntry +class UWPAppRemovalEntry(AppConfiguration configuration) : MenuEntry { - private readonly AppConfiguration configuration; - - public UWPAppRemovalEntry(AppConfiguration configuration) => this.configuration = configuration; - public override string FullName => "Remove UWP apps"; public override string GetExplanation() { @@ -83,12 +79,8 @@ public override string GetExplanation() => """ public override IOperation CreateNewOperation(IUserInterface ui) => new OneDriveRemover(ui); } -class ServicesRemovalEntry : MenuEntry +class ServicesRemovalEntry(AppConfiguration configuration) : MenuEntry { - private readonly AppConfiguration configuration; - - public ServicesRemovalEntry(AppConfiguration configuration) => this.configuration = configuration; - public override string FullName => "Remove miscellaneous services"; public override string GetExplanation() { @@ -102,12 +94,8 @@ public override IOperation CreateNewOperation(IUserInterface ui) => new ServiceRemovalOperation(configuration.ServicesToRemove, ui, new ServiceRemover(ui)); } -class WindowsFeaturesRemovalEntry : MenuEntry +class WindowsFeaturesRemovalEntry(AppConfiguration configuration) : MenuEntry { - private readonly AppConfiguration configuration; - - public WindowsFeaturesRemovalEntry(AppConfiguration configuration) => this.configuration = configuration; - public override string FullName => "Remove Windows features"; public override string GetExplanation() { @@ -168,12 +156,8 @@ At least Windows 10 Pro edition is required to disable automatic Windows updates public override IOperation CreateNewOperation(IUserInterface ui) => new AutoUpdatesDisabler(ui); } -class ScheduledTasksDisablingEntry : MenuEntry +class ScheduledTasksDisablingEntry(AppConfiguration configuration) : MenuEntry { - private readonly AppConfiguration configuration; - - public ScheduledTasksDisablingEntry(AppConfiguration configuration) => this.configuration = configuration; - public override string FullName => "Disable miscellaneous scheduled tasks"; public override string GetExplanation() { @@ -269,12 +253,8 @@ Developed by Fs00 public override IOperation CreateNewOperation(IUserInterface ui) => new LicensePrinter(ui); } -class QuitEntry : MenuEntry +class QuitEntry(RebootRecommendedFlag rebootFlag) : MenuEntry { - private readonly RebootRecommendedFlag rebootFlag; - - public QuitEntry(RebootRecommendedFlag rebootFlag) => this.rebootFlag = rebootFlag; - public override string FullName => "Exit the application"; public override bool ShouldQuit => true; public override string GetExplanation() => "Are you sure?"; diff --git a/src/Utils/AppxRemover.cs b/src/Utils/AppxRemover.cs index f69d258..a952aec 100644 --- a/src/Utils/AppxRemover.cs +++ b/src/Utils/AppxRemover.cs @@ -7,7 +7,7 @@ namespace Win10BloatRemover.Utils; -public class AppxRemover +public class AppxRemover(IUserInterface ui) { public readonly record struct Result(int RemovedApps, int FailedRemovals); @@ -18,10 +18,6 @@ private enum RemovalOutcome Failure } - private readonly IUserInterface ui; - - public AppxRemover(IUserInterface ui) => this.ui = ui; - public Result RemoveAppsForCurrentUser(params string[] appNames) { return PerformAppsRemoval(appNames, new CurrentUserRemovalMethod(ui)); @@ -52,13 +48,11 @@ private static bool IsSystemApp(Package package) return package.SignatureKind == PackageSignatureKind.System; } - private abstract class RemovalMethod + private abstract class RemovalMethod(IUserInterface ui) { - protected readonly IUserInterface ui; + protected readonly IUserInterface ui = ui; protected readonly PackageManager packageManager = new PackageManager(); - protected RemovalMethod(IUserInterface ui) => this.ui = ui; - public virtual RemovalOutcome RemovePackagesForApp(string appName) { // Most apps are made up by a single package, but it's not always the case @@ -109,10 +103,8 @@ private void PrintError(IAsyncOperationWithProgress code == 0; public bool IsNotSuccessful() => !IsSuccessful(); diff --git a/src/Utils/TokenPrivilege.cs b/src/Utils/TokenPrivilege.cs index 454e022..117b8d4 100644 --- a/src/Utils/TokenPrivilege.cs +++ b/src/Utils/TokenPrivilege.cs @@ -48,31 +48,20 @@ public void Dispose() private const int ERROR_NOT_ALL_ASSIGNED = 1300; [StructLayout(LayoutKind.Sequential)] - private struct TokenPrivileges + private struct TokenPrivileges(Luid luid, uint attributes) { // We can use this struct only with one privilege since CLR doesn't support marshalling dynamic-sized arrays - public TokenPrivileges(Luid luid, uint attributes) - { - Count = 1; - Privileges = [new LuidAndAttributes(luid, attributes)]; - } + private uint Count = 1; - private uint Count; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] - private LuidAndAttributes[] Privileges; + private LuidAndAttributes[] Privileges = [new LuidAndAttributes(luid, attributes)]; } [StructLayout(LayoutKind.Sequential)] - private readonly struct LuidAndAttributes + private readonly struct LuidAndAttributes(Luid luid, uint attributes) { - public LuidAndAttributes(Luid luid, uint attributes) - { - Luid = luid; - Attributes = attributes; - } - - private readonly Luid Luid; - private readonly uint Attributes; + private readonly Luid Luid = luid; + private readonly uint Attributes = attributes; } [StructLayout(LayoutKind.Sequential)]