diff --git a/.github/config/gitversion.yml b/.github/config/gitversion.yml index f4a115a..b0eb3bf 100644 --- a/.github/config/gitversion.yml +++ b/.github/config/gitversion.yml @@ -1,4 +1,4 @@ -next-version: 2.0 +next-version: 1.0.0 assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatch @@ -9,3 +9,10 @@ branches: increment: Patch tag: '' is-release-branch: true + test: + regex: ^features + mode: ContinuousDelivery + increment: Patch + tag: '' + is-release-branch: true + source-branches: [] diff --git a/.github/workflows/push_master.yml b/.github/workflows/push_master.yml new file mode 100644 index 0000000..accf086 --- /dev/null +++ b/.github/workflows/push_master.yml @@ -0,0 +1,66 @@ +name: Build and publish application on master push + + +on: + push: + branches: + - "master" + - "features/github_actions" + #paths: + #- "VDownload**" + + +jobs: + build: + name: Build + runs-on: windows-latest + env: + MSBUILD_PATH: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.com + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Setup GitVersion + uses: gittools/actions/gitversion/setup@v0.9.7 + with: + versionSpec: 5.x + - name: Determine Version + uses: gittools/actions/gitversion/execute@v0.9.7 + id: gitversion + with: + useConfigFile: true + configFilePath: .github/config/gitversion.yml + - name: Set version in VDownload.csproj file + id: package_version + uses: KageKirin/set-csproj-version@v0 + with: + file: VDownload/VDownload.csproj + version: ${{steps.gitversion.outputs.SemVer}} + - name: Set version in Package.appxmanifest file + uses: Nambers/ReplaceStringInFile@v1.3 + with: + path: VDownload/Package.appxmanifest + oldString: 0\.0\.0\.0 + newString: ${{steps.gitversion.outputs.SemVer}}.0 + showFileContent: true + escapeBackslash: true + - name: Set version in app.manifest file + uses: Nambers/ReplaceStringInFile@v1.3 + with: + path: VDownload/app.manifest + oldString: 0\.0\.0\.0 + newString: ${{steps.gitversion.outputs.SemVer}}.0 + showFileContent: true + escapeBackslash: true + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 8.0.x + - name: Build application + run: dotnet build -o build + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: build + path: build diff --git a/VDownload.Core/VDownload.Core.Strings/StringResource.cs b/VDownload.Core/VDownload.Core.Strings/StringResource.cs new file mode 100644 index 0000000..5b2fc9f --- /dev/null +++ b/VDownload.Core/VDownload.Core.Strings/StringResource.cs @@ -0,0 +1,41 @@ +using Windows.ApplicationModel.Resources; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace VDownload.Core.Strings +{ + public class StringResource + { + #region FIELDS + + protected ResourceLoader _resourceLoader; + + #endregion + + + + #region CONSTRUCTORS + + internal StringResource(ResourceLoader resourceLoader) + { + _resourceLoader = resourceLoader; + } + + #endregion + + + + #region PUBLIC METHODS + + public string Get(string key) + { + return _resourceLoader.GetString(key); + } + + #endregion + } +} diff --git a/VDownload.Core/VDownload.Core.Strings/StringResourcesManager.cs b/VDownload.Core/VDownload.Core.Strings/StringResourcesManager.cs new file mode 100644 index 0000000..3bcdad2 --- /dev/null +++ b/VDownload.Core/VDownload.Core.Strings/StringResourcesManager.cs @@ -0,0 +1,57 @@ +using Microsoft.UI.Xaml; +using Windows.ApplicationModel.Resources; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace VDownload.Core.Strings +{ + public static class StringResourcesManager + { + #region PROPERTIES + + public static StringResource BaseView { get; } = BuildResource("BaseViewResources"); + public static StringResource HomeView { get; } = BuildResource("HomeViewResources"); + public static StringResource HomeVideoView { get; } = BuildResource("HomeVideoViewResources"); + public static StringResource HomeVideoCollectionView { get; } = BuildResource("HomeVideoCollectionViewResources"); + public static StringResource HomeDownloadsView { get; } = BuildResource("HomeDownloadsViewResources"); + public static StringResource AuthenticationView { get; } = BuildResource("AuthenticationViewResources"); + public static StringResource Notifications { get; } = BuildResource("NotificationsResources"); + public static StringResource Search { get; } = BuildResource("SearchResources"); + public static StringResource Common { get; } = BuildResource("CommonResources"); + public static StringResource DialogButtons { get; } = BuildResource("DialogButtonsResources"); + public static StringResource SettingsView { get; } = BuildResource("SettingsViewResources"); + public static StringResource FilenameTemplate { get; } = BuildResource("FilenameTemplateResources"); + public static StringResource AboutView { get; } = BuildResource("AboutViewResources"); + public static StringResource SubscriptionsView { get; } = BuildResource("SubscriptionsViewResources"); + + #endregion + + + + #region PRIVATE METHODS + + private static StringResource BuildResource(string resourceName) + { + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", $"teststring {resourceName}\n"); + ResourceLoader loader; + try + { + loader = new ResourceLoader($"VDownload.Core.Strings/{resourceName}"); + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", $"afterteststring {resourceName}\n"); + } + catch (Exception e) + { + + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", $"teststringerror {e.Message}\n"); + throw; + } + return new StringResource(loader); + } + + #endregion + } +} diff --git a/VDownload.Core/VDownload.Core.Strings/VDownload.Core.Strings.csproj b/VDownload.Core/VDownload.Core.Strings/VDownload.Core.Strings.csproj index 7a200cb..146088e 100644 --- a/VDownload.Core/VDownload.Core.Strings/VDownload.Core.Strings.csproj +++ b/VDownload.Core/VDownload.Core.Strings/VDownload.Core.Strings.csproj @@ -15,8 +15,48 @@ + + Always + + + Always + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always diff --git a/VDownload.Core/VDownload.Core.Tasks/DownloadTask.cs b/VDownload.Core/VDownload.Core.Tasks/DownloadTask.cs index da21750..f855683 100644 --- a/VDownload.Core/VDownload.Core.Tasks/DownloadTask.cs +++ b/VDownload.Core/VDownload.Core.Tasks/DownloadTask.cs @@ -11,11 +11,11 @@ using System.Linq; using Windows.Storage; using System.IO; using VDownload.Services.UI.Notifications; -using VDownload.Services.UI.StringResources; using System.Collections.Generic; using System.Net.Http; using Instances.Exceptions; using FFMpegCore.Exceptions; +using VDownload.Core.Strings; namespace VDownload.Core.Tasks { @@ -39,7 +39,6 @@ namespace VDownload.Core.Tasks protected readonly IConfigurationService _configurationService; protected readonly ISettingsService _settingsService; protected readonly IFFmpegService _ffmpegService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly INotificationsService _notificationsService; #endregion @@ -87,12 +86,11 @@ namespace VDownload.Core.Tasks #region CONSTRUCTORS - internal DownloadTask(Video video, VideoDownloadOptions downloadOptions, IConfigurationService configurationService, ISettingsService settingsService, IFFmpegService ffmpegService, IStringResourcesService stringResourcesService, INotificationsService notificationsService) + internal DownloadTask(Video video, VideoDownloadOptions downloadOptions, IConfigurationService configurationService, ISettingsService settingsService, IFFmpegService ffmpegService, INotificationsService notificationsService) { _configurationService = configurationService; _settingsService = settingsService; _ffmpegService = ffmpegService; - _stringResourcesService = stringResourcesService; _notificationsService = notificationsService; _video = video; @@ -165,8 +163,8 @@ namespace VDownload.Core.Tasks List content = new List() { - $"{_stringResourcesService.NotificationsResources.Get("Title")}: {Video.Title}", - $"{_stringResourcesService.NotificationsResources.Get("Author")}: {Video.Author}" + $"{StringResourcesManager.Notifications.Get("Title")}: {Video.Title}", + $"{StringResourcesManager.Notifications.Get("Author")}: {Video.Author}" }; string errorMessage = null; @@ -222,15 +220,15 @@ namespace VDownload.Core.Tasks if (ex is TaskCanceledException || ex is HttpRequestException) { - message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorDownloadingTimeout"); + message = StringResourcesManager.HomeDownloadsView.Get("ErrorDownloadingTimeout"); } else if (ex is InstanceFileNotFoundException) { - message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorFFmpegPath"); + message = StringResourcesManager.HomeDownloadsView.Get("ErrorFFmpegPath"); } else if (ex is FFMpegException) { - message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorFFmpeg"); + message = StringResourcesManager.HomeDownloadsView.Get("ErrorFFmpeg"); } else { @@ -249,15 +247,15 @@ namespace VDownload.Core.Tasks case TaskResult.Error: if (_settingsService.Data.Common.Notifications.OnUnsuccessful) { - string title = _stringResourcesService.NotificationsResources.Get("OnUnsuccessfulTitle"); - content.Add($"{_stringResourcesService.NotificationsResources.Get("Message")}: {errorMessage}"); + string title = StringResourcesManager.Notifications.Get("OnUnsuccessfulTitle"); + content.Add($"{StringResourcesManager.Notifications.Get("Message")}: {errorMessage}"); _notificationsService.SendNotification(title, content); } break; case TaskResult.Success: if (_settingsService.Data.Common.Notifications.OnSuccessful) { - string title = _stringResourcesService.NotificationsResources.Get("OnSuccessfulTitle"); + string title = StringResourcesManager.Notifications.Get("OnSuccessfulTitle"); _notificationsService.SendNotification(title, content); } break; diff --git a/VDownload.Core/VDownload.Core.Tasks/DownloadTaskFactoryService.cs b/VDownload.Core/VDownload.Core.Tasks/DownloadTaskFactoryService.cs index ff2b3f2..1e25a64 100644 --- a/VDownload.Core/VDownload.Core.Tasks/DownloadTaskFactoryService.cs +++ b/VDownload.Core/VDownload.Core.Tasks/DownloadTaskFactoryService.cs @@ -7,7 +7,6 @@ using VDownload.Models; using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Settings; using VDownload.Services.UI.Notifications; -using VDownload.Services.UI.StringResources; using VDownload.Services.Utility.FFmpeg; namespace VDownload.Core.Tasks @@ -26,7 +25,6 @@ namespace VDownload.Core.Tasks protected readonly IConfigurationService _configurationService; protected readonly ISettingsService _settingsService; protected readonly IFFmpegService _ffmpegService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly INotificationsService _notificationsService; #endregion @@ -35,12 +33,11 @@ namespace VDownload.Core.Tasks #region CONSTRUCTORS - public DownloadTaskFactoryService(IConfigurationService configurationService, ISettingsService settingsService, IFFmpegService ffmpegService, IStringResourcesService stringResourcesService, INotificationsService notificationsService) + public DownloadTaskFactoryService(IConfigurationService configurationService, ISettingsService settingsService, IFFmpegService ffmpegService, INotificationsService notificationsService) { _configurationService = configurationService; _settingsService = settingsService; _ffmpegService = ffmpegService; - _stringResourcesService = stringResourcesService; _notificationsService = notificationsService; } @@ -52,7 +49,7 @@ namespace VDownload.Core.Tasks public DownloadTask Create(Video video, VideoDownloadOptions downloadOptions) { - return new DownloadTask(video, downloadOptions, _configurationService, _settingsService, _ffmpegService, _stringResourcesService, _notificationsService); + return new DownloadTask(video, downloadOptions, _configurationService, _settingsService, _ffmpegService, _notificationsService); } #endregion diff --git a/VDownload.Core/VDownload.Core.Tasks/VDownload.Core.Tasks.csproj b/VDownload.Core/VDownload.Core.Tasks/VDownload.Core.Tasks.csproj index 29a2a02..ae5c5fc 100644 --- a/VDownload.Core/VDownload.Core.Tasks/VDownload.Core.Tasks.csproj +++ b/VDownload.Core/VDownload.Core.Tasks/VDownload.Core.Tasks.csproj @@ -19,8 +19,8 @@ - + diff --git a/VDownload.Core/VDownload.Core.ViewModels/About/AboutViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/About/AboutViewModel.cs index 938ad57..6d824a3 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/About/AboutViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/About/AboutViewModel.cs @@ -9,10 +9,10 @@ using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Core.ViewModels.About.Helpers; using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration.Models; -using VDownload.Services.UI.StringResources; using Windows.System.UserProfile; namespace VDownload.Core.ViewModels.About @@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels.About { #region SERVICES - protected readonly IStringResourcesService _stringResourcesService; protected readonly IConfigurationService _configurationService; #endregion @@ -51,15 +50,14 @@ namespace VDownload.Core.ViewModels.About #region CONSTRUCTORS - public AboutViewModel(IStringResourcesService stringResourcesService, IConfigurationService configurationService) + public AboutViewModel(IConfigurationService configurationService) { - _stringResourcesService = stringResourcesService; _configurationService = configurationService; string version = Assembly.GetEntryAssembly().GetCustomAttribute()?.InformationalVersion; if (version == "0.0.0") { - version = _stringResourcesService.AboutViewResources.Get("SelfbuiltVersion"); + version = StringResourcesManager.AboutView.Get("SelfbuiltVersion"); } _version = version; diff --git a/VDownload.Core/VDownload.Core.ViewModels/Authentication/AuthenticationViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Authentication/AuthenticationViewModel.cs index 4356c02..1c210df 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Authentication/AuthenticationViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Authentication/AuthenticationViewModel.cs @@ -8,9 +8,9 @@ using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Services.Data.Configuration; using VDownload.Services.UI.Dialogs; -using VDownload.Services.UI.StringResources; using VDownload.Services.UI.WebView; using VDownload.Sources.Twitch.Authentication; @@ -36,7 +36,6 @@ namespace VDownload.Core.ViewModels.Authentication protected readonly IDialogsService _dialogsService; protected readonly IWebViewService _webViewService; protected readonly IConfigurationService _configurationService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly ITwitchAuthenticationService _twitchAuthenticationService; #endregion @@ -60,12 +59,11 @@ namespace VDownload.Core.ViewModels.Authentication #region CONSTRUCTORS - public AuthenticationViewModel(IDialogsService dialogsService, IWebViewService webViewService, IConfigurationService configurationService, IStringResourcesService stringResourcesService, ITwitchAuthenticationService twitchAuthenticationService) + public AuthenticationViewModel(IDialogsService dialogsService, IWebViewService webViewService, IConfigurationService configurationService, ITwitchAuthenticationService twitchAuthenticationService) { _dialogsService = dialogsService; _webViewService = webViewService; _configurationService = configurationService; - _stringResourcesService = stringResourcesService; _twitchAuthenticationService = twitchAuthenticationService; } @@ -100,7 +98,7 @@ namespace VDownload.Core.ViewModels.Authentication Sources.Twitch.Configuration.Models.Authentication auth = _configurationService.Twitch.Authentication; string authUrl = string.Format(auth.Url, auth.ClientId, auth.RedirectUrl, auth.ResponseType, string.Join(' ', auth.Scopes)); - string url = await _webViewService.Show(new Uri(authUrl), (url) => url.StartsWith(auth.RedirectUrl), _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationWindowTitle")); + string url = await _webViewService.Show(new Uri(authUrl), (url) => url.StartsWith(auth.RedirectUrl), StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationWindowTitle")); Regex regex = new Regex(auth.RedirectUrlRegex); Match match = regex.Match(url); @@ -112,8 +110,8 @@ namespace VDownload.Core.ViewModels.Authentication } else { - string title = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogTitle"); - string message = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogMessage"); + string title = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDialogTitle"); + string message = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDialogMessage"); await _dialogsService.ShowOk(title, message); } } @@ -138,11 +136,11 @@ namespace VDownload.Core.ViewModels.Authentication if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) { TwitchButtonEnable = false; - TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection"); + TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection"); } else { - TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticated"); + TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionNotAuthenticated"); } TwitchButtonState = AuthenticationButton.SignIn; } @@ -155,7 +153,7 @@ namespace VDownload.Core.ViewModels.Authentication } catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) { - TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionCannotValidate"); + TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionCannotValidate"); TwitchButtonState = AuthenticationButton.SignIn; TwitchButtonEnable = false; return; @@ -163,13 +161,13 @@ namespace VDownload.Core.ViewModels.Authentication if (validationResult.Success) { - TwitchDescription = string.Format(_stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticated"), validationResult.TokenData.Login, validationResult.TokenData.ExpirationDate); + TwitchDescription = string.Format(StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionAuthenticated"), validationResult.TokenData.Login, validationResult.TokenData.ExpirationDate); TwitchButtonState = AuthenticationButton.SignOut; } else { await _twitchAuthenticationService.DeleteToken(); - TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticationInvalid"); + TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionAuthenticationInvalid"); TwitchButtonState = AuthenticationButton.SignIn; } } diff --git a/VDownload.Core/VDownload.Core.ViewModels/BaseViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/BaseViewModel.cs index cd7ff21..4c36354 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/BaseViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/BaseViewModel.cs @@ -10,10 +10,10 @@ using VDownload.Core.ViewModels.Authentication; using VDownload.Core.ViewModels.Home; using VDownload.Core.ViewModels.Settings; using VDownload.Services.UI.DictionaryResources; -using VDownload.Services.UI.StringResources; using SimpleToolkit.UI.Models; using VDownload.Core.ViewModels.About; using VDownload.Core.ViewModels.Subscriptions; +using VDownload.Core.Strings; namespace VDownload.Core.ViewModels { @@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels { #region SERVICES - protected readonly IStringResourcesService _stringResourcesService; protected readonly IDictionaryResourcesService _dictionaryResourcesService; #endregion @@ -53,9 +52,8 @@ namespace VDownload.Core.ViewModels #region CONSTRUCTORS - public BaseViewModel(IStringResourcesService stringResourcesService, IDictionaryResourcesService dictionaryResourcesService) + public BaseViewModel(IDictionaryResourcesService dictionaryResourcesService) { - _stringResourcesService = stringResourcesService; _dictionaryResourcesService = dictionaryResourcesService; Items = new ReadOnlyObservableCollection @@ -64,13 +62,13 @@ namespace VDownload.Core.ViewModels { new NavigationViewItem() { - Name = _stringResourcesService.BaseViewResources.Get("HomeNavigationViewItem"), + Name = StringResourcesManager.BaseView.Get("HomeNavigationViewItem"), IconSource = _dictionaryResourcesService.Get("ImageBaseViewHome"), ViewModel = typeof(HomeViewModel), }, new NavigationViewItem() { - Name = _stringResourcesService.BaseViewResources.Get("SubscriptionsNavigationViewItem"), + Name = StringResourcesManager.BaseView.Get("SubscriptionsNavigationViewItem"), IconSource = _dictionaryResourcesService.Get("ImageBaseViewSubscriptions"), ViewModel = typeof(SubscriptionsViewModel), }, @@ -82,13 +80,13 @@ namespace VDownload.Core.ViewModels { new NavigationViewItem() { - Name = _stringResourcesService.BaseViewResources.Get("AboutNavigationViewItem"), + Name = StringResourcesManager.BaseView.Get("AboutNavigationViewItem"), IconSource = _dictionaryResourcesService.Get("ImageBaseViewAbout"), ViewModel = typeof(AboutViewModel), }, new NavigationViewItem() { - Name = _stringResourcesService.BaseViewResources.Get("AuthenticationNavigationViewItem"), + Name = StringResourcesManager.BaseView.Get("AuthenticationNavigationViewItem"), IconSource = _dictionaryResourcesService.Get("ImageBaseViewAuthentication"), ViewModel = typeof(AuthenticationViewModel), } diff --git a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeDownloadsViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeDownloadsViewModel.cs index 47e53a5..e32dbc4 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeDownloadsViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeDownloadsViewModel.cs @@ -7,10 +7,10 @@ using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Core.Tasks; using VDownload.Services.Data.Settings; using VDownload.Services.UI.Dialogs; -using VDownload.Services.UI.StringResources; namespace VDownload.Core.ViewModels.Home { @@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels.Home protected readonly IDownloadTaskManager _tasksManager; protected readonly IDialogsService _dialogsService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly ISettingsService _settingsService; #endregion @@ -41,13 +40,12 @@ namespace VDownload.Core.ViewModels.Home #region CONSTRUCTORS - public HomeDownloadsViewModel(IDownloadTaskManager tasksManager, IDialogsService dialogsService, IStringResourcesService stringResourcesService, ISettingsService settingsService) + public HomeDownloadsViewModel(IDownloadTaskManager tasksManager, IDialogsService dialogsService, ISettingsService settingsService) { _tasksManager = tasksManager; _tasksManager.TaskCollectionChanged += Tasks_CollectionChanged; _dialogsService = dialogsService; - _stringResourcesService = stringResourcesService; _settingsService = settingsService; _taskListIsEmpty = _tasksManager.Tasks.Count == 0; @@ -73,8 +71,8 @@ namespace VDownload.Core.ViewModels.Home { if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) { - string title = _stringResourcesService.HomeDownloadsViewResources.Get("DialogErrorTitle"); - string message = _stringResourcesService.HomeDownloadsViewResources.Get("DialogErrorMessageNoInternetConnection"); + string title = StringResourcesManager.HomeDownloadsView.Get("DialogErrorTitle"); + string message = StringResourcesManager.HomeDownloadsView.Get("DialogErrorMessageNoInternetConnection"); await _dialogsService.ShowOk(title, message); return; } @@ -87,8 +85,8 @@ namespace VDownload.Core.ViewModels.Home NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection ) { - string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); - string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); + string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle"); + string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage"); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); continueEnqueue = result == DialogResultYesNo.Yes; } diff --git a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoCollectionViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoCollectionViewModel.cs index ca3fe15..430cb2b 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoCollectionViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoCollectionViewModel.cs @@ -18,9 +18,9 @@ using SimpleToolkit.MVVM; using System.Text.RegularExpressions; using VDownload.Services.Utility.Filename; using VDownload.Services.UI.Dialogs; -using VDownload.Services.UI.StringResources; using CommunityToolkit.WinUI.Helpers; using VDownload.Services.Data.Application; +using VDownload.Core.Strings; namespace VDownload.Core.ViewModels.Home { @@ -34,7 +34,6 @@ namespace VDownload.Core.ViewModels.Home protected readonly IStoragePickerService _storagePickerService; protected readonly IFilenameService _filenameService; protected readonly IDialogsService _dialogsService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly IApplicationDataService _applicationDataService; #endregion @@ -181,14 +180,13 @@ namespace VDownload.Core.ViewModels.Home #region CONSTRUCTORS - public HomeVideoCollectionViewModel(IDownloadTaskManager tasksManager, ISettingsService settingsService, IStoragePickerService storagePickerService, IFilenameService filenameService, IDialogsService dialogsService, IStringResourcesService stringResourcesService, IApplicationDataService applicationDataService) + public HomeVideoCollectionViewModel(IDownloadTaskManager tasksManager, ISettingsService settingsService, IStoragePickerService storagePickerService, IFilenameService filenameService, IDialogsService dialogsService, IApplicationDataService applicationDataService) { _tasksManager = tasksManager; _settingsService = settingsService; _storagePickerService = storagePickerService; _filenameService = filenameService; _dialogsService = dialogsService; - _stringResourcesService = stringResourcesService; _applicationDataService = applicationDataService; _removedVideos = new List(); @@ -306,8 +304,8 @@ namespace VDownload.Core.ViewModels.Home NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection ) { - string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); - string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); + string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle"); + string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage"); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); download = result == DialogResultYesNo.Yes; } diff --git a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoViewModel.cs index 4c4e483..8ebb554 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeVideoViewModel.cs @@ -8,13 +8,13 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Core.Tasks; using VDownload.Models; using VDownload.Services.Data.Application; using VDownload.Services.Data.Settings; using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.StoragePicker; -using VDownload.Services.UI.StringResources; using VDownload.Services.Utility.Filename; namespace VDownload.Core.ViewModels.Home @@ -29,7 +29,6 @@ namespace VDownload.Core.ViewModels.Home protected readonly IStoragePickerService _storagePickerService; protected readonly IFilenameService _filenameService; protected readonly IDialogsService _dialogsService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly IApplicationDataService _applicationDataService; #endregion @@ -98,14 +97,13 @@ namespace VDownload.Core.ViewModels.Home #region CONSTRUCTORS - public HomeVideoViewModel(IDownloadTaskManager tasksManager, ISettingsService settingsService, IStoragePickerService storagePickerService, IFilenameService filenameService, IDialogsService dialogsService, IStringResourcesService stringResourcesService, IApplicationDataService applicationDataService) + public HomeVideoViewModel(IDownloadTaskManager tasksManager, ISettingsService settingsService, IStoragePickerService storagePickerService, IFilenameService filenameService, IDialogsService dialogsService, IApplicationDataService applicationDataService) { _tasksManager = tasksManager; _settingsService = settingsService; _storagePickerService = storagePickerService; _filenameService = filenameService; _dialogsService = dialogsService; - _stringResourcesService = stringResourcesService; _applicationDataService = applicationDataService; } @@ -184,8 +182,8 @@ namespace VDownload.Core.ViewModels.Home NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection ) { - string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); - string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); + string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle"); + string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage"); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); download = result == DialogResultYesNo.Yes; } diff --git a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeViewModel.cs index 9319f71..050750e 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Home/HomeViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Home/HomeViewModel.cs @@ -7,13 +7,13 @@ using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Core.Tasks; using VDownload.Models; using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Settings; using VDownload.Services.Data.Subscriptions; using VDownload.Services.UI.Dialogs; -using VDownload.Services.UI.StringResources; using VDownload.Sources; using VDownload.Sources.Common; using VDownload.Sources.Twitch.Configuration.Models; @@ -45,7 +45,6 @@ namespace VDownload.Core.ViewModels.Home protected readonly IConfigurationService _configurationService; protected readonly ISettingsService _settingsService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly ISearchService _searchService; protected readonly ISubscriptionsDataService _subscriptionsDataService; protected readonly IDialogsService _dialogsService; @@ -116,11 +115,10 @@ namespace VDownload.Core.ViewModels.Home #region CONSTRUCTORS - public HomeViewModel(IConfigurationService configurationService, ISettingsService settingsService, IStringResourcesService stringResourcesService, ISearchService searchService, ISubscriptionsDataService subscriptionsDataService, IDialogsService dialogsService, IDownloadTaskManager downloadTaskManager, HomeVideoViewModel videoViewModel, HomeVideoCollectionViewModel videoCollectionViewModel) + public HomeViewModel(IConfigurationService configurationService, ISettingsService settingsService, ISearchService searchService, ISubscriptionsDataService subscriptionsDataService, IDialogsService dialogsService, IDownloadTaskManager downloadTaskManager, HomeVideoViewModel videoViewModel, HomeVideoCollectionViewModel videoCollectionViewModel) { _configurationService = configurationService; _settingsService = settingsService; - _stringResourcesService = stringResourcesService; _searchService = searchService; _subscriptionsDataService = subscriptionsDataService; _dialogsService = dialogsService; @@ -181,7 +179,7 @@ namespace VDownload.Core.ViewModels.Home StartSearch(); - SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = _stringResourcesService.CommonResources.Get("SubscriptionVideoListName") }; + SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = StringResourcesManager.Common.Get("SubscriptionVideoListName") }; List tasks = new List(); try { @@ -218,14 +216,14 @@ namespace VDownload.Core.ViewModels.Home if (subList.Count > 0) { - OptionBarMessage = $"{_stringResourcesService.HomeViewResources.Get("OptionBarMessageVideosFound")} {subList.Count}"; + OptionBarMessage = $"{StringResourcesManager.HomeView.Get("OptionBarMessageVideosFound")} {subList.Count}"; _videoCollectionViewModel.LoadCollection(subList); MainContent = _videoCollectionView; } else { - OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageVideosNotFound"); + OptionBarMessage = StringResourcesManager.HomeView.Get("OptionBarMessageVideosNotFound"); } OptionBarSearchNotPending = true; @@ -285,7 +283,7 @@ namespace VDownload.Core.ViewModels.Home } catch (MediaSearchException ex) { - ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); + ShowError(StringResourcesManager.Search.Get(ex.StringCode)); return; } catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) @@ -321,7 +319,7 @@ namespace VDownload.Core.ViewModels.Home } catch (MediaSearchException ex) { - ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); + ShowError(StringResourcesManager.Search.Get(ex.StringCode)); return; } catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) @@ -357,8 +355,8 @@ namespace VDownload.Core.ViewModels.Home NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection ) { - string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); - string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); + string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle"); + string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage"); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); if (result == DialogResultYesNo.No) { @@ -417,14 +415,14 @@ namespace VDownload.Core.ViewModels.Home { OptionBarSearchNotPending = false; OptionBarLoading = true; - OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading"); + OptionBarMessage = StringResourcesManager.HomeView.Get("OptionBarMessageLoading"); } protected async void BackToDownload_EventHandler(object sender, EventArgs e) => await Navigation(); - protected string ErrorNoInternetConnection() => _stringResourcesService.HomeViewResources.Get("ErrorInfoBarNoInternetConnection"); + protected string ErrorNoInternetConnection() => StringResourcesManager.HomeView.Get("ErrorInfoBarNoInternetConnection"); - protected string ErrorSearchTimeout() => _stringResourcesService.SearchResources.Get("SearchTimeout"); + protected string ErrorSearchTimeout() => StringResourcesManager.Search.Get("SearchTimeout"); #endregion } diff --git a/VDownload.Core/VDownload.Core.ViewModels/Settings/SettingsViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Settings/SettingsViewModel.cs index cfa9784..1330ecc 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Settings/SettingsViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Settings/SettingsViewModel.cs @@ -6,11 +6,11 @@ using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Models; using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Settings; using VDownload.Services.UI.StoragePicker; -using VDownload.Services.UI.StringResources; namespace VDownload.Core.ViewModels.Settings { @@ -20,7 +20,6 @@ namespace VDownload.Core.ViewModels.Settings protected readonly ISettingsService _settingsService; protected readonly IConfigurationService _configurationService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly IStoragePickerService _storagePickerService; #endregion @@ -176,16 +175,15 @@ namespace VDownload.Core.ViewModels.Settings #region CONSTRUCTORS - public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStringResourcesService stringResourcesService, IStoragePickerService storagePickerService) + public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStoragePickerService storagePickerService) { _settingsService = settingsService; _configurationService = configurationService; - _stringResourcesService = stringResourcesService; _storagePickerService = storagePickerService; base.PropertyChanged += PropertyChangedEventHandler; - _tasksFilenameTemplateTooltip = string.Join('\n', _configurationService.Common.FilenameTemplates.Select(x => _stringResourcesService.FilenameTemplateResources.Get(x.Name))); + _tasksFilenameTemplateTooltip = string.Join('\n', _configurationService.Common.FilenameTemplates.Select(x => StringResourcesManager.FilenameTemplate.Get(x.Name))); } #endregion diff --git a/VDownload.Core/VDownload.Core.ViewModels/Subscriptions/SubscriptionsViewModel.cs b/VDownload.Core/VDownload.Core.ViewModels/Subscriptions/SubscriptionsViewModel.cs index 31d8712..63bfefb 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/Subscriptions/SubscriptionsViewModel.cs +++ b/VDownload.Core/VDownload.Core.ViewModels/Subscriptions/SubscriptionsViewModel.cs @@ -9,10 +9,10 @@ using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; +using VDownload.Core.Strings; using VDownload.Core.ViewModels.Subscriptions.Helpers; using VDownload.Models; using VDownload.Services.Data.Subscriptions; -using VDownload.Services.UI.StringResources; using VDownload.Sources; using VDownload.Sources.Common; @@ -23,7 +23,6 @@ namespace VDownload.Core.ViewModels.Subscriptions #region SERVICES protected readonly ISearchService _searchService; - protected readonly IStringResourcesService _stringResourcesService; protected readonly ISubscriptionsDataService _subscriptionsDataService; #endregion @@ -53,10 +52,9 @@ namespace VDownload.Core.ViewModels.Subscriptions #region CONSTRUCTORS - public SubscriptionsViewModel(ISearchService searchService, IStringResourcesService stringResourcesService, ISubscriptionsDataService subscriptionsDataService) + public SubscriptionsViewModel(ISearchService searchService, ISubscriptionsDataService subscriptionsDataService) { _searchService = searchService; - _stringResourcesService = stringResourcesService; _subscriptionsDataService = subscriptionsDataService; _playlists = new ObservableCollection(); @@ -96,7 +94,7 @@ namespace VDownload.Core.ViewModels.Subscriptions { if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) { - ShowError(_stringResourcesService.SubscriptionsViewResources.Get("NoInternetConnectionError")); + ShowError(StringResourcesManager.SubscriptionsView.Get("NoInternetConnectionError")); return; } @@ -109,18 +107,18 @@ namespace VDownload.Core.ViewModels.Subscriptions } catch (MediaSearchException ex) { - ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); + ShowError(StringResourcesManager.Search.Get(ex.StringCode)); return; } catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) { - ShowError(_stringResourcesService.SearchResources.Get("SearchTimeout")); + ShowError(StringResourcesManager.Search.Get("SearchTimeout")); return; } if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name)) { - ShowError(_stringResourcesService.SubscriptionsViewResources.Get("DuplicateError")); + ShowError(StringResourcesManager.SubscriptionsView.Get("DuplicateError")); return; } diff --git a/VDownload.Core/VDownload.Core.ViewModels/VDownload.Core.ViewModels.csproj b/VDownload.Core/VDownload.Core.ViewModels/VDownload.Core.ViewModels.csproj index e493bd7..bf03ae7 100644 --- a/VDownload.Core/VDownload.Core.ViewModels/VDownload.Core.ViewModels.csproj +++ b/VDownload.Core/VDownload.Core.ViewModels/VDownload.Core.ViewModels.csproj @@ -24,7 +24,6 @@ - diff --git a/VDownload.Core/VDownload.Core.Views/ViewModelToViewConverter.cs b/VDownload.Core/VDownload.Core.Views/ViewModelToViewConverter.cs index bcf00dd..79b497a 100644 --- a/VDownload.Core/VDownload.Core.Views/ViewModelToViewConverter.cs +++ b/VDownload.Core/VDownload.Core.Views/ViewModelToViewConverter.cs @@ -31,13 +31,7 @@ namespace VDownload.Core.Views { typeof(AuthenticationViewModel), typeof(AuthenticationView) } }; - #endregion - - - - #region PROPERTIES - - public static IServiceProvider ServiceProvider { protected get; set; } + protected static IServiceProvider _serviceProvider; #endregion @@ -45,6 +39,8 @@ namespace VDownload.Core.Views #region PUBLIC METHODS + public static void Initialize(IServiceProvider serviceProvider) => _serviceProvider = serviceProvider; + public object Convert(object value, Type targetType, object parameter, string language) { if (value is null) @@ -53,11 +49,11 @@ namespace VDownload.Core.Views } if (value is Type type && _viewModelViewBinding.ContainsKey(type)) { - return ServiceProvider.GetService(_viewModelViewBinding[type]); + return _serviceProvider.GetService(_viewModelViewBinding[type]); } if (_viewModelViewBinding.ContainsKey(value.GetType())) { - return ServiceProvider.GetService(_viewModelViewBinding[value.GetType()]); + return _serviceProvider.GetService(_viewModelViewBinding[value.GetType()]); } return null; } diff --git a/VDownload.Services/VDownload.Services.Common/IInitializableService.cs b/VDownload.Services/VDownload.Services.Common/IInitializableService.cs new file mode 100644 index 0000000..726f8e3 --- /dev/null +++ b/VDownload.Services/VDownload.Services.Common/IInitializableService.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VDownload.Services.Common +{ + public interface IInitializableService + { + #region METHODS + + Task Initialize(); + + #endregion + } + + public interface IInitializableService + { + #region METHODS + + Task Initialize(T arg); + + #endregion + } +} diff --git a/VDownload.Services/VDownload.Services.Common/VDownload.Services.Common.csproj b/VDownload.Services/VDownload.Services.Common/VDownload.Services.Common.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/VDownload.Services/VDownload.Services.Common/VDownload.Services.Common.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/ApplicationDataService.cs b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/ApplicationDataService.cs index 9684b3a..90f84c8 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/ApplicationDataService.cs +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/ApplicationDataService.cs @@ -4,11 +4,12 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; using VDownload.Services.Data.Configuration; namespace VDownload.Services.Data.Application { - public interface IApplicationDataService + public interface IApplicationDataService : IInitializableService { #region PROPERTIES @@ -73,6 +74,8 @@ namespace VDownload.Services.Data.Application #region PUBLIC METHODS + public async Task Initialize() => await Load(); + public async Task Load() { if (File.Exists(_filePath)) diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/VDownload.Services.Data.Application.csproj b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/VDownload.Services.Data.Application.csproj index 8b38c4b..62d33a0 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/VDownload.Services.Data.Application.csproj +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Application/VDownload.Services.Data.Application.csproj @@ -11,6 +11,7 @@ + diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/AuthenticationDataService.cs b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/AuthenticationDataService.cs index 80a0840..f97de09 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/AuthenticationDataService.cs +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/AuthenticationDataService.cs @@ -4,11 +4,12 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; using VDownload.Services.Data.Configuration; namespace VDownload.Services.Data.Authentication { - public interface IAuthenticationDataService + public interface IAuthenticationDataService : IInitializableService { #region PROPERTIES @@ -70,6 +71,8 @@ namespace VDownload.Services.Data.Authentication #region PUBLIC METHODS + public async Task Initialize() => await Load(); + public async Task Load() { Data = null; diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/VDownload.Services.Data.Authentication.csproj b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/VDownload.Services.Data.Authentication.csproj index 8b38c4b..62d33a0 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/VDownload.Services.Data.Authentication.csproj +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Authentication/VDownload.Services.Data.Authentication.csproj @@ -11,6 +11,7 @@ + diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/SettingsService.cs b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/SettingsService.cs index 2d83230..898eb44 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/SettingsService.cs +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/SettingsService.cs @@ -4,11 +4,12 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; using VDownload.Services.Data.Configuration; namespace VDownload.Services.Data.Settings { - public interface ISettingsService + public interface ISettingsService : IInitializableService { #region PROPERTIES @@ -73,6 +74,8 @@ namespace VDownload.Services.Data.Settings #region PUBLIC METHODS + public async Task Initialize() => await Load(); + public async Task Load() { if (File.Exists(_filePath)) diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/VDownload.Services.Data.Settings.csproj b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/VDownload.Services.Data.Settings.csproj index 12f9356..e689809 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/VDownload.Services.Data.Settings.csproj +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Settings/VDownload.Services.Data.Settings.csproj @@ -13,6 +13,7 @@ + diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/SubscriptionsDataService.cs b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/SubscriptionsDataService.cs index 4caee21..db08b2d 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/SubscriptionsDataService.cs +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/SubscriptionsDataService.cs @@ -2,13 +2,15 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; using VDownload.Services.Data.Configuration; namespace VDownload.Services.Data.Subscriptions { - public interface ISubscriptionsDataService + public interface ISubscriptionsDataService : IInitializableService { #region PROPERTIES @@ -72,6 +74,8 @@ namespace VDownload.Services.Data.Subscriptions #region PUBLIC METHODS + public async Task Initialize() => await Load(); + public async Task Load() { if (File.Exists(_filePath)) diff --git a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/VDownload.Services.Data.Subscriptions.csproj b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/VDownload.Services.Data.Subscriptions.csproj index d81009e..4c44878 100644 --- a/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/VDownload.Services.Data.Subscriptions.csproj +++ b/VDownload.Services/VDownload.Services.Data/VDownload.Services.Data.Subscriptions/VDownload.Services.Data.Subscriptions.csproj @@ -12,6 +12,7 @@ + diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/DialogsService.cs b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/DialogsService.cs index 845663d..2e91dea 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/DialogsService.cs +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/DialogsService.cs @@ -6,22 +6,13 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; -using VDownload.Services.UI.StringResources; +using VDownload.Core.Strings; +using VDownload.Services.Common; namespace VDownload.Services.UI.Dialogs { - public interface IDialogsService + public interface IDialogsService : IInitializableService { - #region PROPERTIES - - XamlRoot DefaultRoot { get; set; } - - #endregion - - - - #region METHODS - Task ShowClose(string title, string message); Task ShowDouble(string title, string message, string primaryButtonText, string secondaryButtonText); Task ShowOk(string title, string message); @@ -30,53 +21,21 @@ namespace VDownload.Services.UI.Dialogs Task ShowTriple(string title, string message, string primaryButtonText, string secondaryButtonText, string cancelButtonText); Task ShowYesNo(string title, string message); Task ShowYesNoCancel(string title, string message); - - #endregion } public class DialogsService : IDialogsService { - #region SERVICES - - protected readonly IStringResourcesService _stringResourcesService; - - #endregion - - - #region FIELDS - protected string _okString; - protected string _closeString; - protected string _cancelString; - protected string _yesString; - protected string _noString; + protected string _okString = StringResourcesManager.DialogButtons.Get("OK"); + protected string _closeString = StringResourcesManager.DialogButtons.Get("Close"); + protected string _cancelString = StringResourcesManager.DialogButtons.Get("Cancel"); + protected string _yesString = StringResourcesManager.DialogButtons.Get("Yes"); + protected string _noString = StringResourcesManager.DialogButtons.Get("No"); - #endregion - - - - #region PROPERTIES - - public XamlRoot DefaultRoot { get; set; } - - #endregion - - - - #region CONSTRUCTORS - - public DialogsService(IStringResourcesService stringResourcesService) - { - _stringResourcesService = stringResourcesService; - _okString = _stringResourcesService.DialogButtonsResources.Get("OK"); - _closeString = _stringResourcesService.DialogButtonsResources.Get("Close"); - _cancelString = _stringResourcesService.DialogButtonsResources.Get("Cancel"); - _yesString = _stringResourcesService.DialogButtonsResources.Get("Yes"); - _noString = _stringResourcesService.DialogButtonsResources.Get("No"); - } + protected XamlRoot _root; #endregion @@ -84,6 +43,8 @@ namespace VDownload.Services.UI.Dialogs #region PUBLIC METHODS + public async Task Initialize(XamlRoot arg) => await Task.Run(() => _root = arg); + public async Task ShowOk(string title, string message) => await ShowSingle(title, message, _okString); public async Task ShowClose(string title, string message) => await ShowSingle(title, message, _closeString); public async Task ShowSingle(string title, string message, string buttonText) @@ -138,7 +99,7 @@ namespace VDownload.Services.UI.Dialogs { Title = title, Content = message, - XamlRoot = DefaultRoot + XamlRoot = _root }; } diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/VDownload.Services.UI.Dialogs.csproj b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/VDownload.Services.UI.Dialogs.csproj index 8744244..6167d47 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/VDownload.Services.UI.Dialogs.csproj +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Dialogs/VDownload.Services.UI.Dialogs.csproj @@ -15,6 +15,7 @@ - + + diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/DictionaryResourcesService.cs b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/DictionaryResourcesService.cs index 5c97eef..4c4ae40 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/DictionaryResourcesService.cs +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/DictionaryResourcesService.cs @@ -4,10 +4,12 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; +using Windows.Media.Core; namespace VDownload.Services.UI.DictionaryResources { - public interface IDictionaryResourcesService + public interface IDictionaryResourcesService : IInitializableService { T Get(string key); } @@ -16,9 +18,9 @@ namespace VDownload.Services.UI.DictionaryResources public class DictionaryResourcesService : IDictionaryResourcesService { - #region CONSTRUCTORS + #region FIELDS - public DictionaryResourcesService() { } + protected ResourceDictionary _resources; #endregion @@ -26,9 +28,11 @@ namespace VDownload.Services.UI.DictionaryResources #region PUBLIC METHODS + public async Task Initialize(ResourceDictionary arg) => await Task.Run(() => _resources = arg); + public T Get(string key) { - Application.Current.Resources.TryGetValue(key, out object value); + _resources.TryGetValue(key, out object value); if (value is not null && value is T cast) { return cast; diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/VDownload.Services.UI.DictionaryResources.csproj b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/VDownload.Services.UI.DictionaryResources.csproj index 0404798..54b8411 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/VDownload.Services.UI.DictionaryResources.csproj +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.DictionaryResources/VDownload.Services.UI.DictionaryResources.csproj @@ -15,6 +15,7 @@ + diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/NotificationsService.cs b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/NotificationsService.cs index 653760b..527dbd2 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/NotificationsService.cs +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/NotificationsService.cs @@ -1,17 +1,19 @@ using Microsoft.Toolkit.Uwp.Notifications; +using Microsoft.UI.Xaml; using Microsoft.Windows.AppNotifications; using Microsoft.Windows.AppNotifications.Builder; +using SimpleToolkit.UI.WinUI.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using VDownload.Services.Common; namespace VDownload.Services.UI.Notifications { - public interface INotificationsService + public interface INotificationsService : IInitializableService { - void Initialize(Action notificationInvoked); void SendNotification(string title, IEnumerable message); } @@ -19,7 +21,15 @@ namespace VDownload.Services.UI.Notifications public class NotificationsService : INotificationsService { - #region CONSTRCUTORS + #region FIELDS + + protected Window _window; + + #endregion + + + + #region CONSTRUCTORS ~NotificationsService() { @@ -32,12 +42,14 @@ namespace VDownload.Services.UI.Notifications #region PUBLIC METHODS - public void Initialize(Action notificationInvoked) + public async Task Initialize(Window window) => await Task.Run(() => { - AppNotificationManager.Default.NotificationInvoked += (obj, args) => notificationInvoked.Invoke(); + _window = window; + + AppNotificationManager.Default.NotificationInvoked += NotificationInvoked; AppNotificationManager.Default.Register(); - } + }); public void SendNotification(string title, IEnumerable message) { @@ -54,5 +66,13 @@ namespace VDownload.Services.UI.Notifications } #endregion + + + + #region PRIVATE METHODS + + private void NotificationInvoked(AppNotificationManager sender, AppNotificationActivatedEventArgs args) => WindowHelper.ShowWindow(_window); + + #endregion } } diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/VDownload.Services.UI.Notifications.csproj b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/VDownload.Services.UI.Notifications.csproj index 8d89a91..e6fa01d 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/VDownload.Services.UI.Notifications.csproj +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.Notifications/VDownload.Services.UI.Notifications.csproj @@ -13,5 +13,10 @@ + + + + + diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/StoragePickerService.cs b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/StoragePickerService.cs index 5981f8c..effbd19 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/StoragePickerService.cs +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/StoragePickerService.cs @@ -3,24 +3,15 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using VDownload.Services.Common; using Windows.Storage; using Windows.Storage.Pickers; using WinRT.Interop; namespace VDownload.Services.UI.StoragePicker { - public interface IStoragePickerService + public interface IStoragePickerService : IInitializableService { - #region PROPERTIES - - Window DefaultRoot { get; set; } - - #endregion - - - - #region METHODS - Task OpenDirectory(); Task OpenDirectory(StoragePickerStartLocation startLocation); Task> OpenMultipleFiles(); @@ -33,17 +24,15 @@ namespace VDownload.Services.UI.StoragePicker Task OpenSingleFile(string[] fileTypes, StoragePickerStartLocation startLocation); Task SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType); Task SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType, StoragePickerStartLocation startLocation); - - #endregion } public class StoragePickerService : IStoragePickerService { - #region PROPERTIES + #region FIELDS - public Window DefaultRoot { get; set; } + protected Window _root; #endregion @@ -51,6 +40,8 @@ namespace VDownload.Services.UI.StoragePicker #region PUBLIC METHODS + public async Task Initialize(Window arg) => await Task.Run(() => _root = arg); + public async Task OpenDirectory() => await OpenDirectory(StoragePickerStartLocation.Unspecified); public async Task OpenDirectory(StoragePickerStartLocation startLocation) { @@ -111,7 +102,7 @@ namespace VDownload.Services.UI.StoragePicker protected void InitializePicker(object picker) { - var hwnd = WindowNative.GetWindowHandle(DefaultRoot); + var hwnd = WindowNative.GetWindowHandle(_root); InitializeWithWindow.Initialize(picker, hwnd); } diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/VDownload.Services.UI.StoragePicker.csproj b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/VDownload.Services.UI.StoragePicker.csproj index 6ea7798..8407c20 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/VDownload.Services.UI.StoragePicker.csproj +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StoragePicker/VDownload.Services.UI.StoragePicker.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StringResources/StringResourcesService.cs b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StringResources/StringResourcesService.cs index e7bf3e0..97f9e2c 100644 --- a/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StringResources/StringResourcesService.cs +++ b/VDownload.Services/VDownload.Services.UI/VDownload.Services.UI.StringResources/StringResourcesService.cs @@ -82,7 +82,11 @@ namespace VDownload.Services.UI.StringResources #region PRIVATE METHODS - protected StringResources BuildResource(string resourceName) => new StringResources(ResourceLoader.GetForViewIndependentUse($"{_configurationService.Common.StringResourcesAssembly}/{resourceName}")); + protected StringResources BuildResource(string resourceName) + { + ResourceLoader loader = new ResourceLoader($"{_configurationService.Common.StringResourcesAssembly}/{resourceName}"); + return new StringResources(loader); + } #endregion } diff --git a/VDownload.sln b/VDownload.sln index 117e850..0261eef 100644 --- a/VDownload.sln +++ b/VDownload.sln @@ -53,8 +53,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VDownload.Core", "VDownload EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Models", "VDownload.Models\VDownload.Models.csproj", "{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.UI.StringResources", "VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj", "{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.UI.DictionaryResources", "VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj", "{8DC55331-B9F3-4811-8474-348662963260}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Sources.Twitch.Settings", "VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Settings\VDownload.Sources.Twitch.Settings.csproj", "{A726FD43-B111-423B-BAF6-D65B4C0E37B5}" @@ -73,7 +71,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Utility. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Data.Application", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Application\VDownload.Services.Data.Application.csproj", "{4983E15B-3730-4646-A2BD-16B9ECC9E4FF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VDownload.Services.Data.Subscriptions", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Subscriptions\VDownload.Services.Data.Subscriptions.csproj", "{3193DABC-87F8-4256-9449-3CF42FEF7098}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Data.Subscriptions", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Subscriptions\VDownload.Services.Data.Subscriptions.csproj", "{3193DABC-87F8-4256-9449-3CF42FEF7098}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Common", "VDownload.Services\VDownload.Services.Common\VDownload.Services.Common.csproj", "{267F5A31-1257-4820-9FE5-C11D26CC3C55}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -381,22 +381,6 @@ Global {16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x64.Build.0 = Release|Any CPU {16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x86.ActiveCfg = Release|Any CPU {16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x86.Build.0 = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|ARM64.Build.0 = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x64.ActiveCfg = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x64.Build.0 = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x86.ActiveCfg = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x86.Build.0 = Debug|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|Any CPU.Build.0 = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|ARM64.ActiveCfg = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|ARM64.Build.0 = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x64.ActiveCfg = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x64.Build.0 = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x86.ActiveCfg = Release|Any CPU - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x86.Build.0 = Release|Any CPU {8DC55331-B9F3-4811-8474-348662963260}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DC55331-B9F3-4811-8474-348662963260}.Debug|Any CPU.Build.0 = Debug|Any CPU {8DC55331-B9F3-4811-8474-348662963260}.Debug|ARM64.ActiveCfg = Debug|Any CPU @@ -557,6 +541,22 @@ Global {3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x64.Build.0 = Release|Any CPU {3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x86.ActiveCfg = Release|Any CPU {3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x86.Build.0 = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|ARM64.Build.0 = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x64.ActiveCfg = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x64.Build.0 = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x86.ActiveCfg = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x86.Build.0 = Debug|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|Any CPU.Build.0 = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|ARM64.ActiveCfg = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|ARM64.Build.0 = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x64.ActiveCfg = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x64.Build.0 = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x86.ActiveCfg = Release|Any CPU + {267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -582,7 +582,6 @@ Global {711FA7BE-27DA-425D-9777-967F6E519CFF} = {8D94F264-4EE9-4C24-AB77-2CCA36858309} {8E850249-E79D-40E7-B02D-393632DF8B8E} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC} {64A217AE-4E95-468E-85C3-67C27D689FF4} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC} - {6F6CA153-1AC6-454A-ACDC-2C706E2A437E} = {4CC2DC7D-27D2-4F52-89DF-7D45B41BB40F} {8DC55331-B9F3-4811-8474-348662963260} = {4CC2DC7D-27D2-4F52-89DF-7D45B41BB40F} {A726FD43-B111-423B-BAF6-D65B4C0E37B5} = {8D94F264-4EE9-4C24-AB77-2CCA36858309} {E1D4352C-51AC-4572-8515-0B4E89A2442F} = {8539067C-9968-4AEB-928C-FEDC43989A79} @@ -593,6 +592,7 @@ Global {4647EFB5-A206-4F47-976D-BAED11B52579} = {1020167A-4101-496E-82CF-41B65769DD28} {4983E15B-3730-4646-A2BD-16B9ECC9E4FF} = {05A45688-7EEF-4656-818A-2477625C3707} {3193DABC-87F8-4256-9449-3CF42FEF7098} = {05A45688-7EEF-4656-818A-2477625C3707} + {267F5A31-1257-4820-9FE5-C11D26CC3C55} = {8D351DB0-74E6-4C1E-A123-34D6BBBD5585} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9FD7B842-C3E2-4FD0-AD8A-C8E619280AB7} diff --git a/VDownload/Activation/ActivationHandler.cs b/VDownload/Activation/ActivationHandler.cs new file mode 100644 index 0000000..1d6ef5f --- /dev/null +++ b/VDownload/Activation/ActivationHandler.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VDownload.Activation +{ + public interface IActivationHandler + { + bool CanHandle(object args); + Task HandleAsync(object args); + } + + + + public abstract class ActivationHandler : IActivationHandler + where T : class + { + #region PUBLIC METHODS + + public bool CanHandle(object args) => args is T && CanHandleInternal((args as T)!); + + public async Task HandleAsync(object args) => await HandleInternalAsync((args as T)!); + + #endregion + + + + #region PRIVATE METHODS + + protected virtual bool CanHandleInternal(T args) => true; + + protected abstract Task HandleInternalAsync(T args); + + #endregion + } +} diff --git a/VDownload/Activation/ActivationService.cs b/VDownload/Activation/ActivationService.cs new file mode 100644 index 0000000..1cb9125 --- /dev/null +++ b/VDownload/Activation/ActivationService.cs @@ -0,0 +1,137 @@ +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 _defaultHandler; + protected readonly IEnumerable _activationHandlers; + + #endregion + + + + #region FIELDS + + protected readonly ICollection> _beforeActivationInitializations = new List>(); + protected readonly ICollection> _afterActivationInitializations = new List>(); + protected readonly ICollection> _afterWindowRootLoadedInitializations = new List>(); + + protected BaseWindow _window; + + #endregion + + + + #region CONSTRUCTORS + + public ActivationService(ActivationHandler defaultHandler, IEnumerable 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) + { + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "testactivate\n"); + await InitializeAsync(); + ViewModelToViewConverter.Initialize((App.Current as App)!.Host.Services); + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "test1\n"); + + await HandleActivationAsync(activationArgs); + + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "test2\n"); + _window = App.GetService(); + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "test3\n"); + _window.RootLoaded += Window_RootLoaded; + _window.Activate(); + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "test4\n"); + + 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 tasks = new List(); + foreach (Func 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 + } +} diff --git a/VDownload/Activation/DefaultActivationHandler.cs b/VDownload/Activation/DefaultActivationHandler.cs new file mode 100644 index 0000000..402ec4c --- /dev/null +++ b/VDownload/Activation/DefaultActivationHandler.cs @@ -0,0 +1,21 @@ +using Microsoft.UI.Xaml; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VDownload.Activation +{ + public class DefaultActivationHandler : ActivationHandler + { + #region PRIVATE METHODS + + protected override async Task HandleInternalAsync(LaunchActivatedEventArgs args) + { + await Task.CompletedTask; + } + + #endregion + } +} diff --git a/VDownload/App.xaml.cs b/VDownload/App.xaml.cs index fc2d7c1..22ce65d 100644 --- a/VDownload/App.xaml.cs +++ b/VDownload/App.xaml.cs @@ -1,12 +1,18 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Microsoft.Toolkit.Uwp.Notifications; +using Microsoft.UI; using Microsoft.UI.Xaml; using Microsoft.Windows.AppNotifications; using System; +using System.IO; +using System.Net; using System.Net.Http; using System.Threading.Tasks; +using VDownload.Activation; using VDownload.Core.Tasks; using VDownload.Core.ViewModels; using VDownload.Core.ViewModels.About; @@ -30,7 +36,6 @@ using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.DictionaryResources; using VDownload.Services.UI.Notifications; using VDownload.Services.UI.StoragePicker; -using VDownload.Services.UI.StringResources; using VDownload.Services.UI.WebView; using VDownload.Services.Utility.Encryption; using VDownload.Services.Utility.FFmpeg; @@ -47,11 +52,21 @@ namespace VDownload { public partial class App : Application { - #region FIELDS + #region PROPERTIES - protected IServiceProvider _serviceProvider; + public static BaseWindow Window { get; protected set; } - protected BaseWindow _window; + public static T GetService() where T : class + { + if ((App.Current as App)!.Host.Services.GetService(typeof(T)) is not T service) + { + throw new ArgumentException($"{typeof(T)} needs to be registered in ConfigureServices within App.xaml.cs."); + } + + return service; + } + + public IHost Host { get; set; } #endregion @@ -63,22 +78,36 @@ namespace VDownload { this.InitializeComponent(); + Host = Microsoft.Extensions.Hosting.Host + .CreateDefaultBuilder() + .UseContentRoot(AppContext.BaseDirectory) + .ConfigureAppConfiguration((builder) => + { + builder.Sources.Add(new JsonConfigurationSource + { + Path = "configuration.json" + }); + }) + .ConfigureLogging((builder) => + { + builder.AddConsole(); + }) + .ConfigureServices((context, services) => + { + BuildCore(services); - IServiceCollection services = new ServiceCollection(); + BuildDataServices(services); + BuildUIServices(services); + BuildUtilityServices(services); + BuildSourcesServices(services); - BuildCore(services); + BuildTasksManager(services); + BuildPresentation(services); + BuildActivation(services); + }) + .Build(); - BuildConfiguration(services); - - BuildDataServices(services); - BuildUIServices(services); - BuildUtilityServices(services); - BuildSourcesServices(services); - - BuildTasksManager(services); - BuildPresentation(services); - - _serviceProvider = services.BuildServiceProvider(); + UnhandledException += UnhandledExceptionCatched; } #endregion @@ -87,27 +116,30 @@ namespace VDownload #region PRIVATE METHODS + #region EVENT HANDLERS + + protected override async void OnLaunched(LaunchActivatedEventArgs args) + { + base.OnLaunched(args); + + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "testlaunched\n"); + + await GetService().ActivateAsync(args); + } + + protected void UnhandledExceptionCatched(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) + { + File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", $"test {e.Message} {e.Exception.StackTrace}\n"); + Environment.Exit(0); + } + + #endregion + protected void BuildCore(IServiceCollection services) { services.AddSingleton(); } - protected void BuildConfiguration(IServiceCollection services) - { - IConfigurationBuilder configBuilder = new ConfigurationBuilder - { - Sources = - { - new JsonConfigurationSource - { - Path = "configuration.json" - } - } - }; - IConfiguration config = configBuilder.Build(); - services.AddSingleton(config); - } - protected void BuildDataServices(IServiceCollection services) { services.AddSingleton(); @@ -119,7 +151,6 @@ namespace VDownload protected void BuildUIServices(IServiceCollection services) { - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); @@ -178,40 +209,11 @@ namespace VDownload services.AddTransient(); } - protected async Task InitializeServices() + protected void BuildActivation(IServiceCollection services) { - IApplicationDataService applicationDataService = _serviceProvider.GetService(); - ISettingsService settingsService = _serviceProvider.GetService(); - IAuthenticationDataService authenticationDataService = _serviceProvider.GetService(); - ISubscriptionsDataService subscriptionsDataService = _serviceProvider.GetService(); - Task initViewModelToViewConverterTask = Task.Run(() => ViewModelToViewConverter.ServiceProvider = _serviceProvider); - Task initStoragePickerServiceTask = Task.Run(() => _serviceProvider.GetService().DefaultRoot = _window); - Task initNotificationsServiceTask = Task.Run(() => _serviceProvider.GetService().Initialize(() => WindowHelper.ShowWindow(_window))); + services.AddTransient, DefaultActivationHandler>(); - await Task.WhenAll( - applicationDataService.Load(), - settingsService.Load(), - authenticationDataService.Load(), - subscriptionsDataService.Load(), - initStoragePickerServiceTask, - initViewModelToViewConverterTask, - initNotificationsServiceTask - ); - } - - protected override async void OnLaunched(LaunchActivatedEventArgs args) - { - _window = _serviceProvider.GetService(); - _window.RootLoaded += Window_RootLoaded; - _window.Activate(); - - await InitializeServices(); - } - - protected void Window_RootLoaded(object sender, EventArgs e) - { - IDialogsService dialogsService = _serviceProvider.GetService(); - dialogsService.DefaultRoot = _window.XamlRoot; + services.AddSingleton(); } #endregion diff --git a/VDownload/Package.appxmanifest b/VDownload/Package.appxmanifest index a07c131..0efd66c 100644 --- a/VDownload/Package.appxmanifest +++ b/VDownload/Package.appxmanifest @@ -11,7 +11,7 @@ diff --git a/VDownload/VDownload.csproj b/VDownload/VDownload.csproj index f25b174..eefb73b 100644 --- a/VDownload/VDownload.csproj +++ b/VDownload/VDownload.csproj @@ -1,24 +1,24 @@  WinExe - net8.0-windows10.0.19041.0 - 10.0.17763.0 - VDownload - app.manifest - x86;x64;ARM64 - win10-x86;win10-x64;win10-arm64 - win10-$(Platform).pubxml - true - true - true - true - false - Assets\Logo\Logo.ico - LICENSE - True - 0.0.0 - false - true + net8.0-windows10.0.19041.0 + 10.0.17763.0 + VDownload + app.manifest + x64;ARM64 + win10-x64;win10-arm64 + win10-$(Platform).pubxml + true + true + true + false + Assets\Logo\Logo.ico + LICENSE + True + 0.0.0 + false + None + true @@ -168,6 +168,7 @@ + @@ -188,8 +189,12 @@ + + + + @@ -199,14 +204,17 @@ - + + + + diff --git a/VDownload/WindowHelper.cs b/VDownload/WindowHelper.cs deleted file mode 100644 index e63b411..0000000 --- a/VDownload/WindowHelper.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.UI.Xaml; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace VDownload -{ - public static partial class WindowHelper - { - #region PUBLIC METHODS - - public static void ShowWindow(Window window) - { - // Bring the window to the foreground... first get the window handle... - var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(window); - - // Restore window if minimized... requires DLL import above - ShowWindow(hwnd, 0x00000009); - - // And call SetForegroundWindow... requires DLL import above - SetForegroundWindow(hwnd); - } - - #endregion - - - - #region PRIVATE METHODS - - [LibraryImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - private static partial bool ShowWindow(IntPtr hWnd, int nCmdShow); - - [LibraryImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - private static partial bool SetForegroundWindow(IntPtr hWnd); - - #endregion - } -} diff --git a/VDownload/app.manifest b/VDownload/app.manifest index f61aa10..92e60ea 100644 --- a/VDownload/app.manifest +++ b/VDownload/app.manifest @@ -1,6 +1,6 @@ - + @@ -13,4 +13,4 @@ PerMonitorV2 - \ No newline at end of file +