Files
VDownload/VDownload/Activation/ActivationService.cs
2026-02-17 22:49:36 +01:00

133 lines
4.5 KiB
C#

using Microsoft.UI.Xaml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VDownload.Core.Views;
using VDownload.Services.Common;
using VDownload.Services.Data.Application;
using VDownload.Services.Data.Authentication;
using VDownload.Services.Data.Settings;
using VDownload.Services.Data.Subscriptions;
using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.DictionaryResources;
using VDownload.Services.UI.Notifications;
using VDownload.Services.UI.StoragePicker;
namespace VDownload.Activation
{
public interface IActivationService
{
Task ActivateAsync(object activationArgs);
}
public class ActivationService : IActivationService
{
#region SERVICES
protected readonly ActivationHandler<LaunchActivatedEventArgs> _defaultHandler;
protected readonly IEnumerable<IActivationHandler> _activationHandlers;
#endregion
#region FIELDS
protected readonly ICollection<Func<Task>> _beforeActivationInitializations = new List<Func<Task>>();
protected readonly ICollection<Func<Task>> _afterActivationInitializations = new List<Func<Task>>();
protected readonly ICollection<Func<Task>> _afterWindowRootLoadedInitializations = new List<Func<Task>>();
protected BaseWindow _window;
#endregion
#region CONSTRUCTORS
public ActivationService(ActivationHandler<LaunchActivatedEventArgs> defaultHandler, IEnumerable<IActivationHandler> activationHandlers, ISettingsService settingsService, IApplicationDataService applicationDataService, IAuthenticationDataService authenticationDataService, ISubscriptionsDataService subscriptionsDataService, IStoragePickerService storagePickerService, INotificationsService notificationsService, IDictionaryResourcesService dictionaryResourcesService, IDialogsService dialogsService)
{
_defaultHandler = defaultHandler;
_activationHandlers = activationHandlers;
_beforeActivationInitializations.Add(() => dictionaryResourcesService.Initialize((App.Current as App).Resources));
_afterActivationInitializations.Add(settingsService.Initialize);
_afterActivationInitializations.Add(applicationDataService.Initialize);
_afterActivationInitializations.Add(authenticationDataService.Initialize);
_afterActivationInitializations.Add(subscriptionsDataService.Initialize);
_afterActivationInitializations.Add(() => storagePickerService.Initialize(_window));
_afterActivationInitializations.Add(() => notificationsService.Initialize(_window));
_afterWindowRootLoadedInitializations.Add(() => dialogsService.Initialize(_window.XamlRoot));
}
#endregion
#region PUBLIC METHODS
public async Task ActivateAsync(object activationArgs)
{
await InitializeAsync();
ViewModelToViewConverter.Initialize((App.Current as App)!.Host.Services);
await HandleActivationAsync(activationArgs);
_window = App.GetService<BaseWindow>();
_window.RootLoaded += Window_RootLoaded;
_window.Activate();
await StartupAsync();
}
#endregion
#region PRIVATE METHODS
#region EVENT HANDLERS
protected async void Window_RootLoaded(object sender, EventArgs e) => await AfterWindowRootLoaded();
#endregion
protected async Task InitializeAsync()
{
List<Task> tasks = new List<Task>();
foreach (Func<Task> init in _beforeActivationInitializations)
{
tasks.Add(init.Invoke());
}
await Task.WhenAll(tasks);
}
protected async Task StartupAsync() => await Task.WhenAll(_afterActivationInitializations.Select(x => x.Invoke()));
protected async Task AfterWindowRootLoaded() => await Task.WhenAll(_afterWindowRootLoadedInitializations.Select(x => x.Invoke()));
protected async Task HandleActivationAsync(object activationArgs)
{
var activationHandler = _activationHandlers.FirstOrDefault(h => h.CanHandle(activationArgs));
if (activationHandler != null)
{
await activationHandler.HandleAsync(activationArgs);
}
if (_defaultHandler.CanHandle(activationArgs))
{
await _defaultHandler.HandleAsync(activationArgs);
}
}
#endregion
}
}