/*
* Copyright (c) 2025 Proton AG
*
* This file is part of ProtonVPN.
*
* ProtonVPN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ProtonVPN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ProtonVPN. If not, see .
*/
using Autofac;
using Autofac.Builder;
using ProtonVPN.Api.Installers;
using ProtonVPN.Client.Commands;
using ProtonVPN.Client.Core.Bases.Helpers;
using ProtonVPN.Client.Core.Bases.ViewModels;
using ProtonVPN.Client.EventMessaging.Installers;
using ProtonVPN.Client.Factories;
using ProtonVPN.Client.Files.Installers;
using ProtonVPN.Client.Handlers;
using ProtonVPN.Client.Handlers.Bases;
using ProtonVPN.Client.Localization.Installers;
using ProtonVPN.Client.Logic.Announcements.Installers;
using ProtonVPN.Client.Logic.Auth.Installers;
using ProtonVPN.Client.Logic.Connection.Installers;
using ProtonVPN.Client.Logic.Feedback.Installers;
using ProtonVPN.Client.Logic.Profiles.Installers;
using ProtonVPN.Client.Logic.Recents.Installers;
using ProtonVPN.Client.Logic.Searches.Installers;
using ProtonVPN.Client.Logic.Servers.Installers;
using ProtonVPN.Client.Logic.Services.Installers;
using ProtonVPN.Client.Logic.Updates.Installers;
using ProtonVPN.Client.Logic.Users.Installers;
using ProtonVPN.Client.Models.Announcements;
using ProtonVPN.Client.Notifications.Installers;
using ProtonVPN.Client.Services;
using ProtonVPN.Client.Services.Activation;
using ProtonVPN.Client.Services.Bootstrapping;
using ProtonVPN.Client.Services.Bootstrapping.Activators;
using ProtonVPN.Client.Services.Browsing;
using ProtonVPN.Client.Services.DefaultConnections;
using ProtonVPN.Client.Services.Dispatching;
using ProtonVPN.Client.Services.Edition;
using ProtonVPN.Client.Services.Enabling;
using ProtonVPN.Client.Services.Lifecycle;
using ProtonVPN.Client.Services.LocationExclusion;
using ProtonVPN.Client.Services.Mapping;
using ProtonVPN.Client.Services.Navigation;
using ProtonVPN.Client.Services.PortForwarding;
using ProtonVPN.Client.Services.ProcessCommunication;
using ProtonVPN.Client.Services.Selection;
using ProtonVPN.Client.Services.SignoutHandling;
using ProtonVPN.Client.Services.TeachingTips;
using ProtonVPN.Client.Services.Upselling;
using ProtonVPN.Client.Services.Validation;
using ProtonVPN.Client.Services.Verification;
using ProtonVPN.Client.Settings.Installers;
using ProtonVPN.Client.UI;
using ProtonVPN.Client.UI.Dialogs.DebugTools;
using ProtonVPN.Client.UI.Dialogs.NpsSurvey;
using ProtonVPN.Client.UI.Dialogs.OneTimeAnnouncement;
using ProtonVPN.Client.UI.Dialogs.ReportIssue;
using ProtonVPN.Client.UI.Dialogs.ReportIssue.Pages;
using ProtonVPN.Client.UI.Dialogs.Tray;
using ProtonVPN.Client.UI.Dialogs.Tray.Pages;
using ProtonVPN.Client.UI.Dialogs.Troubleshooting;
using ProtonVPN.Client.UI.Dialogs.Upsell;
using ProtonVPN.Client.UI.Dialogs.Upsell.Features;
using ProtonVPN.Client.UI.Login;
using ProtonVPN.Client.UI.Login.Components;
using ProtonVPN.Client.UI.Login.Overlays;
using ProtonVPN.Client.UI.Login.Pages;
using ProtonVPN.Client.UI.Main;
using ProtonVPN.Client.UI.Main.Components;
using ProtonVPN.Client.UI.Main.Components.Banners;
using ProtonVPN.Client.UI.Main.FeatureIcons;
using ProtonVPN.Client.UI.Main.Features.KillSwitch;
using ProtonVPN.Client.UI.Main.Features.NetShield;
using ProtonVPN.Client.UI.Main.Features.PortForwarding;
using ProtonVPN.Client.UI.Main.Features.SplitTunneling;
using ProtonVPN.Client.UI.Main.Home;
using ProtonVPN.Client.UI.Main.Home.Card;
using ProtonVPN.Client.UI.Main.Home.Card.DefaultConnections;
using ProtonVPN.Client.UI.Main.Home.Details;
using ProtonVPN.Client.UI.Main.Home.Details.Connection;
using ProtonVPN.Client.UI.Main.Home.Details.Flyouts;
using ProtonVPN.Client.UI.Main.Home.Details.Location;
using ProtonVPN.Client.UI.Main.Home.Status;
using ProtonVPN.Client.UI.Main.Home.Upsell;
using ProtonVPN.Client.UI.Main.Map;
using ProtonVPN.Client.UI.Main.Profiles;
using ProtonVPN.Client.UI.Main.Profiles.Components;
using ProtonVPN.Client.UI.Main.Settings;
using ProtonVPN.Client.UI.Main.Settings.Connection;
using ProtonVPN.Client.UI.Main.Settings.Pages;
using ProtonVPN.Client.UI.Main.Settings.Pages.About;
using ProtonVPN.Client.UI.Main.Settings.Pages.Advanced;
using ProtonVPN.Client.UI.Main.Settings.Pages.Connection;
using ProtonVPN.Client.UI.Main.Settings.Pages.ConnectionPreferences;
using ProtonVPN.Client.UI.Main.Sidebar;
using ProtonVPN.Client.UI.Main.Sidebar.Connections;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.All;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.P2P;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.SecureCore;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.Tor;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Gateways;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Profiles;
using ProtonVPN.Client.UI.Main.Sidebar.Connections.Recents;
using ProtonVPN.Client.UI.Main.Sidebar.Search;
using ProtonVPN.Client.UI.Main.Widgets;
using ProtonVPN.Client.UI.Overlays.HumanVerification;
using ProtonVPN.Client.UI.Overlays.Information;
using ProtonVPN.Client.UI.Overlays.Information.Notification;
using ProtonVPN.Client.UI.Overlays.Selection;
using ProtonVPN.Client.UI.Overlays.Upsell;
using ProtonVPN.Client.UI.Overlays.Welcome;
using ProtonVPN.Client.UI.Overlays.WhatsNew;
using ProtonVPN.Client.UI.Tray;
using ProtonVPN.Client.UI.Update;
using ProtonVPN.Client.UnsecureWifiDetection.Installers;
using ProtonVPN.Common.Legacy.OS.DeviceIds;
using ProtonVPN.Common.Legacy.OS.Processes;
using ProtonVPN.Common.Legacy.OS.Systems;
using ProtonVPN.Configurations.Installers;
using ProtonVPN.Crypto.Installers;
using ProtonVPN.Dns.Installers;
using ProtonVPN.EntityMapping.Installers;
using ProtonVPN.Files.Installers;
using ProtonVPN.IPv6.Installers;
using ProtonVPN.IssueReporting.Installers;
using ProtonVPN.Logging.Installers;
using ProtonVPN.NetworkTimeProtocols.Installers;
using ProtonVPN.OperatingSystems.Antiviruses.Installers;
using ProtonVPN.OperatingSystems.Network.Installers;
using ProtonVPN.OperatingSystems.Processes.Installers;
using ProtonVPN.OperatingSystems.Registries.Installers;
using ProtonVPN.OperatingSystems.Services.Installers;
using ProtonVPN.OperatingSystems.WebAuthn.Installers;
using ProtonVPN.ProcessCommunication.Client.Installers;
using ProtonVPN.Serialization.Installers;
using ProtonVPN.StatisticalEvents.Installers;
using ProtonVPN.Client.UI.Main.Home.Card.Feedback;
namespace ProtonVPN.Client.Installers;
public class AppModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterLoggerConfiguration(c => c.ClientLogsFilePath);
RegisterExternalModules(builder);
RegisterLocalServices(builder);
RegisterLocalHandlers(builder);
RegisterViewModels(builder);
RegisterExternalServices(builder);
RegisterCommands(builder);
}
private static IRegistrationBuilder RegisterViewModel(ContainerBuilder builder)
where TViewModel : ViewModelBase
{
return builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
}
private void RegisterExternalServices(ContainerBuilder builder)
{
builder.RegisterType().As().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
}
private void RegisterExternalModules(ContainerBuilder builder)
{
builder.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule()
.RegisterModule();
}
private void RegisterLocalServices(ContainerBuilder builder)
{
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate();
builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
builder.RegisterType().AsImplementedInterfaces().SingleInstance();
}
private void RegisterLocalHandlers(ContainerBuilder builder)
{
Type handlerType = typeof(IHandler);
builder.RegisterAssemblyTypes(handlerType.Assembly)
.Where(handlerType.IsAssignableFrom)
.AsImplementedInterfaces()
.SingleInstance()
.AutoActivate();
}
private void RegisterCommands(ContainerBuilder builder)
{
Type providerType = typeof(ICommandProvider);
builder.RegisterAssemblyTypes(providerType.Assembly)
.Where(providerType.IsAssignableFrom)
.AsImplementedInterfaces()
.SingleInstance();
}
private void RegisterViewModels(ContainerBuilder builder)
{
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder).AutoActivate();
RegisterViewModel(builder);
RegisterViewModel(builder);
RegisterViewModel(builder);
builder.RegisterType().SingleInstance();
}
}