Merge pull request #84 from mateuszskoczek/features/github_actions

Features/GitHub actions
This commit is contained in:
2024-04-23 11:56:55 +02:00
committed by GitHub
Unverified
47 changed files with 724 additions and 335 deletions

View File

@@ -1,4 +1,4 @@
next-version: 2.0 next-version: 1.0.0
assembly-versioning-scheme: MajorMinorPatch assembly-versioning-scheme: MajorMinorPatch
assembly-file-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatch
@@ -9,3 +9,10 @@ branches:
increment: Patch increment: Patch
tag: '' tag: ''
is-release-branch: true is-release-branch: true
test:
regex: ^features
mode: ContinuousDelivery
increment: Patch
tag: ''
is-release-branch: true
source-branches: []

66
.github/workflows/push_master.yml vendored Normal file
View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -15,8 +15,48 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PRIResource Update="Strings\en-US\AboutViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\AuthenticationViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\BaseViewResources.resw"> <PRIResource Update="Strings\en-US\BaseViewResources.resw">
<Generator></Generator> <Generator></Generator>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\CommonResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\DialogButtonsResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\FilenameTemplateResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\HomeDownloadsViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\HomeVideoCollectionViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\HomeVideoViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\HomeViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\NotificationsResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\SearchResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\SettingsViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource>
<PRIResource Update="Strings\en-US\SubscriptionsViewResources.resw">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</PRIResource> </PRIResource>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -11,11 +11,11 @@ using System.Linq;
using Windows.Storage; using Windows.Storage;
using System.IO; using System.IO;
using VDownload.Services.UI.Notifications; using VDownload.Services.UI.Notifications;
using VDownload.Services.UI.StringResources;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Http; using System.Net.Http;
using Instances.Exceptions; using Instances.Exceptions;
using FFMpegCore.Exceptions; using FFMpegCore.Exceptions;
using VDownload.Core.Strings;
namespace VDownload.Core.Tasks namespace VDownload.Core.Tasks
{ {
@@ -39,7 +39,6 @@ namespace VDownload.Core.Tasks
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
protected readonly ISettingsService _settingsService; protected readonly ISettingsService _settingsService;
protected readonly IFFmpegService _ffmpegService; protected readonly IFFmpegService _ffmpegService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly INotificationsService _notificationsService; protected readonly INotificationsService _notificationsService;
#endregion #endregion
@@ -87,12 +86,11 @@ namespace VDownload.Core.Tasks
#region CONSTRUCTORS #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; _configurationService = configurationService;
_settingsService = settingsService; _settingsService = settingsService;
_ffmpegService = ffmpegService; _ffmpegService = ffmpegService;
_stringResourcesService = stringResourcesService;
_notificationsService = notificationsService; _notificationsService = notificationsService;
_video = video; _video = video;
@@ -165,8 +163,8 @@ namespace VDownload.Core.Tasks
List<string> content = new List<string>() List<string> content = new List<string>()
{ {
$"{_stringResourcesService.NotificationsResources.Get("Title")}: {Video.Title}", $"{StringResourcesManager.Notifications.Get("Title")}: {Video.Title}",
$"{_stringResourcesService.NotificationsResources.Get("Author")}: {Video.Author}" $"{StringResourcesManager.Notifications.Get("Author")}: {Video.Author}"
}; };
string errorMessage = null; string errorMessage = null;
@@ -222,15 +220,15 @@ namespace VDownload.Core.Tasks
if (ex is TaskCanceledException || ex is HttpRequestException) if (ex is TaskCanceledException || ex is HttpRequestException)
{ {
message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorDownloadingTimeout"); message = StringResourcesManager.HomeDownloadsView.Get("ErrorDownloadingTimeout");
} }
else if (ex is InstanceFileNotFoundException) else if (ex is InstanceFileNotFoundException)
{ {
message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorFFmpegPath"); message = StringResourcesManager.HomeDownloadsView.Get("ErrorFFmpegPath");
} }
else if (ex is FFMpegException) else if (ex is FFMpegException)
{ {
message = _stringResourcesService.HomeDownloadsViewResources.Get("ErrorFFmpeg"); message = StringResourcesManager.HomeDownloadsView.Get("ErrorFFmpeg");
} }
else else
{ {
@@ -249,15 +247,15 @@ namespace VDownload.Core.Tasks
case TaskResult.Error: case TaskResult.Error:
if (_settingsService.Data.Common.Notifications.OnUnsuccessful) if (_settingsService.Data.Common.Notifications.OnUnsuccessful)
{ {
string title = _stringResourcesService.NotificationsResources.Get("OnUnsuccessfulTitle"); string title = StringResourcesManager.Notifications.Get("OnUnsuccessfulTitle");
content.Add($"{_stringResourcesService.NotificationsResources.Get("Message")}: {errorMessage}"); content.Add($"{StringResourcesManager.Notifications.Get("Message")}: {errorMessage}");
_notificationsService.SendNotification(title, content); _notificationsService.SendNotification(title, content);
} }
break; break;
case TaskResult.Success: case TaskResult.Success:
if (_settingsService.Data.Common.Notifications.OnSuccessful) if (_settingsService.Data.Common.Notifications.OnSuccessful)
{ {
string title = _stringResourcesService.NotificationsResources.Get("OnSuccessfulTitle"); string title = StringResourcesManager.Notifications.Get("OnSuccessfulTitle");
_notificationsService.SendNotification(title, content); _notificationsService.SendNotification(title, content);
} }
break; break;

View File

@@ -7,7 +7,6 @@ using VDownload.Models;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
using VDownload.Services.Data.Settings; using VDownload.Services.Data.Settings;
using VDownload.Services.UI.Notifications; using VDownload.Services.UI.Notifications;
using VDownload.Services.UI.StringResources;
using VDownload.Services.Utility.FFmpeg; using VDownload.Services.Utility.FFmpeg;
namespace VDownload.Core.Tasks namespace VDownload.Core.Tasks
@@ -26,7 +25,6 @@ namespace VDownload.Core.Tasks
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
protected readonly ISettingsService _settingsService; protected readonly ISettingsService _settingsService;
protected readonly IFFmpegService _ffmpegService; protected readonly IFFmpegService _ffmpegService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly INotificationsService _notificationsService; protected readonly INotificationsService _notificationsService;
#endregion #endregion
@@ -35,12 +33,11 @@ namespace VDownload.Core.Tasks
#region CONSTRUCTORS #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; _configurationService = configurationService;
_settingsService = settingsService; _settingsService = settingsService;
_ffmpegService = ffmpegService; _ffmpegService = ffmpegService;
_stringResourcesService = stringResourcesService;
_notificationsService = notificationsService; _notificationsService = notificationsService;
} }
@@ -52,7 +49,7 @@ namespace VDownload.Core.Tasks
public DownloadTask Create(Video video, VideoDownloadOptions downloadOptions) 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 #endregion

View File

@@ -19,8 +19,8 @@
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Settings\VDownload.Services.Data.Settings.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Settings\VDownload.Services.Data.Settings.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.FFmpeg\VDownload.Services.Utility.FFmpeg.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.FFmpeg\VDownload.Services.Utility.FFmpeg.csproj" />
<ProjectReference Include="..\VDownload.Core.Strings\VDownload.Core.Strings.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -9,10 +9,10 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Core.ViewModels.About.Helpers; using VDownload.Core.ViewModels.About.Helpers;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
using VDownload.Services.Data.Configuration.Models; using VDownload.Services.Data.Configuration.Models;
using VDownload.Services.UI.StringResources;
using Windows.System.UserProfile; using Windows.System.UserProfile;
namespace VDownload.Core.ViewModels.About namespace VDownload.Core.ViewModels.About
@@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels.About
{ {
#region SERVICES #region SERVICES
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
#endregion #endregion
@@ -51,15 +50,14 @@ namespace VDownload.Core.ViewModels.About
#region CONSTRUCTORS #region CONSTRUCTORS
public AboutViewModel(IStringResourcesService stringResourcesService, IConfigurationService configurationService) public AboutViewModel(IConfigurationService configurationService)
{ {
_stringResourcesService = stringResourcesService;
_configurationService = configurationService; _configurationService = configurationService;
string version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion; string version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
if (version == "0.0.0") if (version == "0.0.0")
{ {
version = _stringResourcesService.AboutViewResources.Get("SelfbuiltVersion"); version = StringResourcesManager.AboutView.Get("SelfbuiltVersion");
} }
_version = version; _version = version;

View File

@@ -8,9 +8,9 @@ using System.Net.Http;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.StringResources;
using VDownload.Services.UI.WebView; using VDownload.Services.UI.WebView;
using VDownload.Sources.Twitch.Authentication; using VDownload.Sources.Twitch.Authentication;
@@ -36,7 +36,6 @@ namespace VDownload.Core.ViewModels.Authentication
protected readonly IDialogsService _dialogsService; protected readonly IDialogsService _dialogsService;
protected readonly IWebViewService _webViewService; protected readonly IWebViewService _webViewService;
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly ITwitchAuthenticationService _twitchAuthenticationService; protected readonly ITwitchAuthenticationService _twitchAuthenticationService;
#endregion #endregion
@@ -60,12 +59,11 @@ namespace VDownload.Core.ViewModels.Authentication
#region CONSTRUCTORS #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; _dialogsService = dialogsService;
_webViewService = webViewService; _webViewService = webViewService;
_configurationService = configurationService; _configurationService = configurationService;
_stringResourcesService = stringResourcesService;
_twitchAuthenticationService = twitchAuthenticationService; _twitchAuthenticationService = twitchAuthenticationService;
} }
@@ -100,7 +98,7 @@ namespace VDownload.Core.ViewModels.Authentication
Sources.Twitch.Configuration.Models.Authentication auth = _configurationService.Twitch.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 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); Regex regex = new Regex(auth.RedirectUrlRegex);
Match match = regex.Match(url); Match match = regex.Match(url);
@@ -112,8 +110,8 @@ namespace VDownload.Core.ViewModels.Authentication
} }
else else
{ {
string title = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogTitle"); string title = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDialogTitle");
string message = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDialogMessage"); string message = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDialogMessage");
await _dialogsService.ShowOk(title, message); await _dialogsService.ShowOk(title, message);
} }
} }
@@ -138,11 +136,11 @@ namespace VDownload.Core.ViewModels.Authentication
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{ {
TwitchButtonEnable = false; TwitchButtonEnable = false;
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection"); TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionNotAuthenticatedNoInternetConnection");
} }
else else
{ {
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionNotAuthenticated"); TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionNotAuthenticated");
} }
TwitchButtonState = AuthenticationButton.SignIn; TwitchButtonState = AuthenticationButton.SignIn;
} }
@@ -155,7 +153,7 @@ namespace VDownload.Core.ViewModels.Authentication
} }
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{ {
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionCannotValidate"); TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionCannotValidate");
TwitchButtonState = AuthenticationButton.SignIn; TwitchButtonState = AuthenticationButton.SignIn;
TwitchButtonEnable = false; TwitchButtonEnable = false;
return; return;
@@ -163,13 +161,13 @@ namespace VDownload.Core.ViewModels.Authentication
if (validationResult.Success) 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; TwitchButtonState = AuthenticationButton.SignOut;
} }
else else
{ {
await _twitchAuthenticationService.DeleteToken(); await _twitchAuthenticationService.DeleteToken();
TwitchDescription = _stringResourcesService.AuthenticationViewResources.Get("TwitchAuthenticationDescriptionAuthenticationInvalid"); TwitchDescription = StringResourcesManager.AuthenticationView.Get("TwitchAuthenticationDescriptionAuthenticationInvalid");
TwitchButtonState = AuthenticationButton.SignIn; TwitchButtonState = AuthenticationButton.SignIn;
} }
} }

View File

@@ -10,10 +10,10 @@ using VDownload.Core.ViewModels.Authentication;
using VDownload.Core.ViewModels.Home; using VDownload.Core.ViewModels.Home;
using VDownload.Core.ViewModels.Settings; using VDownload.Core.ViewModels.Settings;
using VDownload.Services.UI.DictionaryResources; using VDownload.Services.UI.DictionaryResources;
using VDownload.Services.UI.StringResources;
using SimpleToolkit.UI.Models; using SimpleToolkit.UI.Models;
using VDownload.Core.ViewModels.About; using VDownload.Core.ViewModels.About;
using VDownload.Core.ViewModels.Subscriptions; using VDownload.Core.ViewModels.Subscriptions;
using VDownload.Core.Strings;
namespace VDownload.Core.ViewModels namespace VDownload.Core.ViewModels
{ {
@@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels
{ {
#region SERVICES #region SERVICES
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IDictionaryResourcesService _dictionaryResourcesService; protected readonly IDictionaryResourcesService _dictionaryResourcesService;
#endregion #endregion
@@ -53,9 +52,8 @@ namespace VDownload.Core.ViewModels
#region CONSTRUCTORS #region CONSTRUCTORS
public BaseViewModel(IStringResourcesService stringResourcesService, IDictionaryResourcesService dictionaryResourcesService) public BaseViewModel(IDictionaryResourcesService dictionaryResourcesService)
{ {
_stringResourcesService = stringResourcesService;
_dictionaryResourcesService = dictionaryResourcesService; _dictionaryResourcesService = dictionaryResourcesService;
Items = new ReadOnlyObservableCollection<NavigationViewItem> Items = new ReadOnlyObservableCollection<NavigationViewItem>
@@ -64,13 +62,13 @@ namespace VDownload.Core.ViewModels
{ {
new NavigationViewItem() new NavigationViewItem()
{ {
Name = _stringResourcesService.BaseViewResources.Get("HomeNavigationViewItem"), Name = StringResourcesManager.BaseView.Get("HomeNavigationViewItem"),
IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewHome"), IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewHome"),
ViewModel = typeof(HomeViewModel), ViewModel = typeof(HomeViewModel),
}, },
new NavigationViewItem() new NavigationViewItem()
{ {
Name = _stringResourcesService.BaseViewResources.Get("SubscriptionsNavigationViewItem"), Name = StringResourcesManager.BaseView.Get("SubscriptionsNavigationViewItem"),
IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewSubscriptions"), IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewSubscriptions"),
ViewModel = typeof(SubscriptionsViewModel), ViewModel = typeof(SubscriptionsViewModel),
}, },
@@ -82,13 +80,13 @@ namespace VDownload.Core.ViewModels
{ {
new NavigationViewItem() new NavigationViewItem()
{ {
Name = _stringResourcesService.BaseViewResources.Get("AboutNavigationViewItem"), Name = StringResourcesManager.BaseView.Get("AboutNavigationViewItem"),
IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewAbout"), IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewAbout"),
ViewModel = typeof(AboutViewModel), ViewModel = typeof(AboutViewModel),
}, },
new NavigationViewItem() new NavigationViewItem()
{ {
Name = _stringResourcesService.BaseViewResources.Get("AuthenticationNavigationViewItem"), Name = StringResourcesManager.BaseView.Get("AuthenticationNavigationViewItem"),
IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewAuthentication"), IconSource = _dictionaryResourcesService.Get<string>("ImageBaseViewAuthentication"),
ViewModel = typeof(AuthenticationViewModel), ViewModel = typeof(AuthenticationViewModel),
} }

View File

@@ -7,10 +7,10 @@ using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Core.Tasks; using VDownload.Core.Tasks;
using VDownload.Services.Data.Settings; using VDownload.Services.Data.Settings;
using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.StringResources;
namespace VDownload.Core.ViewModels.Home namespace VDownload.Core.ViewModels.Home
{ {
@@ -21,7 +21,6 @@ namespace VDownload.Core.ViewModels.Home
protected readonly IDownloadTaskManager _tasksManager; protected readonly IDownloadTaskManager _tasksManager;
protected readonly IDialogsService _dialogsService; protected readonly IDialogsService _dialogsService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly ISettingsService _settingsService; protected readonly ISettingsService _settingsService;
#endregion #endregion
@@ -41,13 +40,12 @@ namespace VDownload.Core.ViewModels.Home
#region CONSTRUCTORS #region CONSTRUCTORS
public HomeDownloadsViewModel(IDownloadTaskManager tasksManager, IDialogsService dialogsService, IStringResourcesService stringResourcesService, ISettingsService settingsService) public HomeDownloadsViewModel(IDownloadTaskManager tasksManager, IDialogsService dialogsService, ISettingsService settingsService)
{ {
_tasksManager = tasksManager; _tasksManager = tasksManager;
_tasksManager.TaskCollectionChanged += Tasks_CollectionChanged; _tasksManager.TaskCollectionChanged += Tasks_CollectionChanged;
_dialogsService = dialogsService; _dialogsService = dialogsService;
_stringResourcesService = stringResourcesService;
_settingsService = settingsService; _settingsService = settingsService;
_taskListIsEmpty = _tasksManager.Tasks.Count == 0; _taskListIsEmpty = _tasksManager.Tasks.Count == 0;
@@ -73,8 +71,8 @@ namespace VDownload.Core.ViewModels.Home
{ {
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{ {
string title = _stringResourcesService.HomeDownloadsViewResources.Get("DialogErrorTitle"); string title = StringResourcesManager.HomeDownloadsView.Get("DialogErrorTitle");
string message = _stringResourcesService.HomeDownloadsViewResources.Get("DialogErrorMessageNoInternetConnection"); string message = StringResourcesManager.HomeDownloadsView.Get("DialogErrorMessageNoInternetConnection");
await _dialogsService.ShowOk(title, message); await _dialogsService.ShowOk(title, message);
return; return;
} }
@@ -87,8 +85,8 @@ namespace VDownload.Core.ViewModels.Home
NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection
) )
{ {
string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle");
string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage");
DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message);
continueEnqueue = result == DialogResultYesNo.Yes; continueEnqueue = result == DialogResultYesNo.Yes;
} }

View File

@@ -18,9 +18,9 @@ using SimpleToolkit.MVVM;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using VDownload.Services.Utility.Filename; using VDownload.Services.Utility.Filename;
using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.StringResources;
using CommunityToolkit.WinUI.Helpers; using CommunityToolkit.WinUI.Helpers;
using VDownload.Services.Data.Application; using VDownload.Services.Data.Application;
using VDownload.Core.Strings;
namespace VDownload.Core.ViewModels.Home namespace VDownload.Core.ViewModels.Home
{ {
@@ -34,7 +34,6 @@ namespace VDownload.Core.ViewModels.Home
protected readonly IStoragePickerService _storagePickerService; protected readonly IStoragePickerService _storagePickerService;
protected readonly IFilenameService _filenameService; protected readonly IFilenameService _filenameService;
protected readonly IDialogsService _dialogsService; protected readonly IDialogsService _dialogsService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IApplicationDataService _applicationDataService; protected readonly IApplicationDataService _applicationDataService;
#endregion #endregion
@@ -181,14 +180,13 @@ namespace VDownload.Core.ViewModels.Home
#region CONSTRUCTORS #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; _tasksManager = tasksManager;
_settingsService = settingsService; _settingsService = settingsService;
_storagePickerService = storagePickerService; _storagePickerService = storagePickerService;
_filenameService = filenameService; _filenameService = filenameService;
_dialogsService = dialogsService; _dialogsService = dialogsService;
_stringResourcesService = stringResourcesService;
_applicationDataService = applicationDataService; _applicationDataService = applicationDataService;
_removedVideos = new List<VideoViewModel>(); _removedVideos = new List<VideoViewModel>();
@@ -306,8 +304,8 @@ namespace VDownload.Core.ViewModels.Home
NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection
) )
{ {
string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle");
string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage");
DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message);
download = result == DialogResultYesNo.Yes; download = result == DialogResultYesNo.Yes;
} }

View File

@@ -8,13 +8,13 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Core.Tasks; using VDownload.Core.Tasks;
using VDownload.Models; using VDownload.Models;
using VDownload.Services.Data.Application; using VDownload.Services.Data.Application;
using VDownload.Services.Data.Settings; using VDownload.Services.Data.Settings;
using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.StoragePicker; using VDownload.Services.UI.StoragePicker;
using VDownload.Services.UI.StringResources;
using VDownload.Services.Utility.Filename; using VDownload.Services.Utility.Filename;
namespace VDownload.Core.ViewModels.Home namespace VDownload.Core.ViewModels.Home
@@ -29,7 +29,6 @@ namespace VDownload.Core.ViewModels.Home
protected readonly IStoragePickerService _storagePickerService; protected readonly IStoragePickerService _storagePickerService;
protected readonly IFilenameService _filenameService; protected readonly IFilenameService _filenameService;
protected readonly IDialogsService _dialogsService; protected readonly IDialogsService _dialogsService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IApplicationDataService _applicationDataService; protected readonly IApplicationDataService _applicationDataService;
#endregion #endregion
@@ -98,14 +97,13 @@ namespace VDownload.Core.ViewModels.Home
#region CONSTRUCTORS #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; _tasksManager = tasksManager;
_settingsService = settingsService; _settingsService = settingsService;
_storagePickerService = storagePickerService; _storagePickerService = storagePickerService;
_filenameService = filenameService; _filenameService = filenameService;
_dialogsService = dialogsService; _dialogsService = dialogsService;
_stringResourcesService = stringResourcesService;
_applicationDataService = applicationDataService; _applicationDataService = applicationDataService;
} }
@@ -184,8 +182,8 @@ namespace VDownload.Core.ViewModels.Home
NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection
) )
{ {
string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle");
string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage");
DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message);
download = result == DialogResultYesNo.Yes; download = result == DialogResultYesNo.Yes;
} }

View File

@@ -7,13 +7,13 @@ using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Core.Tasks; using VDownload.Core.Tasks;
using VDownload.Models; using VDownload.Models;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
using VDownload.Services.Data.Settings; using VDownload.Services.Data.Settings;
using VDownload.Services.Data.Subscriptions; using VDownload.Services.Data.Subscriptions;
using VDownload.Services.UI.Dialogs; using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.StringResources;
using VDownload.Sources; using VDownload.Sources;
using VDownload.Sources.Common; using VDownload.Sources.Common;
using VDownload.Sources.Twitch.Configuration.Models; using VDownload.Sources.Twitch.Configuration.Models;
@@ -45,7 +45,6 @@ namespace VDownload.Core.ViewModels.Home
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
protected readonly ISettingsService _settingsService; protected readonly ISettingsService _settingsService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly ISearchService _searchService; protected readonly ISearchService _searchService;
protected readonly ISubscriptionsDataService _subscriptionsDataService; protected readonly ISubscriptionsDataService _subscriptionsDataService;
protected readonly IDialogsService _dialogsService; protected readonly IDialogsService _dialogsService;
@@ -116,11 +115,10 @@ namespace VDownload.Core.ViewModels.Home
#region CONSTRUCTORS #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; _configurationService = configurationService;
_settingsService = settingsService; _settingsService = settingsService;
_stringResourcesService = stringResourcesService;
_searchService = searchService; _searchService = searchService;
_subscriptionsDataService = subscriptionsDataService; _subscriptionsDataService = subscriptionsDataService;
_dialogsService = dialogsService; _dialogsService = dialogsService;
@@ -181,7 +179,7 @@ namespace VDownload.Core.ViewModels.Home
StartSearch(); StartSearch();
SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = _stringResourcesService.CommonResources.Get("SubscriptionVideoListName") }; SubscriptionsVideoList subList = new SubscriptionsVideoList { Name = StringResourcesManager.Common.Get("SubscriptionVideoListName") };
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
try try
{ {
@@ -218,14 +216,14 @@ namespace VDownload.Core.ViewModels.Home
if (subList.Count > 0) if (subList.Count > 0)
{ {
OptionBarMessage = $"{_stringResourcesService.HomeViewResources.Get("OptionBarMessageVideosFound")} {subList.Count}"; OptionBarMessage = $"{StringResourcesManager.HomeView.Get("OptionBarMessageVideosFound")} {subList.Count}";
_videoCollectionViewModel.LoadCollection(subList); _videoCollectionViewModel.LoadCollection(subList);
MainContent = _videoCollectionView; MainContent = _videoCollectionView;
} }
else else
{ {
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageVideosNotFound"); OptionBarMessage = StringResourcesManager.HomeView.Get("OptionBarMessageVideosNotFound");
} }
OptionBarSearchNotPending = true; OptionBarSearchNotPending = true;
@@ -285,7 +283,7 @@ namespace VDownload.Core.ViewModels.Home
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); ShowError(StringResourcesManager.Search.Get(ex.StringCode));
return; return;
} }
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
@@ -321,7 +319,7 @@ namespace VDownload.Core.ViewModels.Home
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); ShowError(StringResourcesManager.Search.Get(ex.StringCode));
return; return;
} }
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
@@ -357,8 +355,8 @@ namespace VDownload.Core.ViewModels.Home
NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection NetworkHelper.Instance.ConnectionInformation.IsInternetOnMeteredConnection
) )
{ {
string title = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogTitle"); string title = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogTitle");
string message = _stringResourcesService.CommonResources.Get("StartAtMeteredConnectionDialogMessage"); string message = StringResourcesManager.Common.Get("StartAtMeteredConnectionDialogMessage");
DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message); DialogResultYesNo result = await _dialogsService.ShowYesNo(title, message);
if (result == DialogResultYesNo.No) if (result == DialogResultYesNo.No)
{ {
@@ -417,14 +415,14 @@ namespace VDownload.Core.ViewModels.Home
{ {
OptionBarSearchNotPending = false; OptionBarSearchNotPending = false;
OptionBarLoading = true; OptionBarLoading = true;
OptionBarMessage = _stringResourcesService.HomeViewResources.Get("OptionBarMessageLoading"); OptionBarMessage = StringResourcesManager.HomeView.Get("OptionBarMessageLoading");
} }
protected async void BackToDownload_EventHandler(object sender, EventArgs e) => await Navigation(); 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 #endregion
} }

View File

@@ -6,11 +6,11 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Models; using VDownload.Models;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
using VDownload.Services.Data.Settings; using VDownload.Services.Data.Settings;
using VDownload.Services.UI.StoragePicker; using VDownload.Services.UI.StoragePicker;
using VDownload.Services.UI.StringResources;
namespace VDownload.Core.ViewModels.Settings namespace VDownload.Core.ViewModels.Settings
{ {
@@ -20,7 +20,6 @@ namespace VDownload.Core.ViewModels.Settings
protected readonly ISettingsService _settingsService; protected readonly ISettingsService _settingsService;
protected readonly IConfigurationService _configurationService; protected readonly IConfigurationService _configurationService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IStoragePickerService _storagePickerService; protected readonly IStoragePickerService _storagePickerService;
#endregion #endregion
@@ -176,16 +175,15 @@ namespace VDownload.Core.ViewModels.Settings
#region CONSTRUCTORS #region CONSTRUCTORS
public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStringResourcesService stringResourcesService, IStoragePickerService storagePickerService) public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStoragePickerService storagePickerService)
{ {
_settingsService = settingsService; _settingsService = settingsService;
_configurationService = configurationService; _configurationService = configurationService;
_stringResourcesService = stringResourcesService;
_storagePickerService = storagePickerService; _storagePickerService = storagePickerService;
base.PropertyChanged += PropertyChangedEventHandler; 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 #endregion

View File

@@ -9,10 +9,10 @@ using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Core.ViewModels.Subscriptions.Helpers; using VDownload.Core.ViewModels.Subscriptions.Helpers;
using VDownload.Models; using VDownload.Models;
using VDownload.Services.Data.Subscriptions; using VDownload.Services.Data.Subscriptions;
using VDownload.Services.UI.StringResources;
using VDownload.Sources; using VDownload.Sources;
using VDownload.Sources.Common; using VDownload.Sources.Common;
@@ -23,7 +23,6 @@ namespace VDownload.Core.ViewModels.Subscriptions
#region SERVICES #region SERVICES
protected readonly ISearchService _searchService; protected readonly ISearchService _searchService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly ISubscriptionsDataService _subscriptionsDataService; protected readonly ISubscriptionsDataService _subscriptionsDataService;
#endregion #endregion
@@ -53,10 +52,9 @@ namespace VDownload.Core.ViewModels.Subscriptions
#region CONSTRUCTORS #region CONSTRUCTORS
public SubscriptionsViewModel(ISearchService searchService, IStringResourcesService stringResourcesService, ISubscriptionsDataService subscriptionsDataService) public SubscriptionsViewModel(ISearchService searchService, ISubscriptionsDataService subscriptionsDataService)
{ {
_searchService = searchService; _searchService = searchService;
_stringResourcesService = stringResourcesService;
_subscriptionsDataService = subscriptionsDataService; _subscriptionsDataService = subscriptionsDataService;
_playlists = new ObservableCollection<PlaylistViewModel>(); _playlists = new ObservableCollection<PlaylistViewModel>();
@@ -96,7 +94,7 @@ namespace VDownload.Core.ViewModels.Subscriptions
{ {
if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable) if (!NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{ {
ShowError(_stringResourcesService.SubscriptionsViewResources.Get("NoInternetConnectionError")); ShowError(StringResourcesManager.SubscriptionsView.Get("NoInternetConnectionError"));
return; return;
} }
@@ -109,18 +107,18 @@ namespace VDownload.Core.ViewModels.Subscriptions
} }
catch (MediaSearchException ex) catch (MediaSearchException ex)
{ {
ShowError(_stringResourcesService.SearchResources.Get(ex.StringCode)); ShowError(StringResourcesManager.Search.Get(ex.StringCode));
return; return;
} }
catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException) catch (Exception ex) when (ex is TaskCanceledException || ex is HttpRequestException)
{ {
ShowError(_stringResourcesService.SearchResources.Get("SearchTimeout")); ShowError(StringResourcesManager.Search.Get("SearchTimeout"));
return; return;
} }
if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name)) if (_subscriptionsDataService.Data.Any(x => x.Source == playlist.Source && x.Name == playlist.Name))
{ {
ShowError(_stringResourcesService.SubscriptionsViewResources.Get("DuplicateError")); ShowError(StringResourcesManager.SubscriptionsView.Get("DuplicateError"));
return; return;
} }

View File

@@ -24,7 +24,6 @@
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Dialogs\VDownload.Services.UI.Dialogs.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Dialogs\VDownload.Services.UI.Dialogs.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StoragePicker\VDownload.Services.UI.StoragePicker.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StoragePicker\VDownload.Services.UI.StoragePicker.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.WebView\VDownload.Services.UI.WebView.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.WebView\VDownload.Services.UI.WebView.csproj" />
<ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Filename\VDownload.Services.Utility.Filename.csproj" /> <ProjectReference Include="..\..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Filename\VDownload.Services.Utility.Filename.csproj" />
<ProjectReference Include="..\..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Authentication\VDownload.Sources.Twitch.Authentication.csproj" /> <ProjectReference Include="..\..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Authentication\VDownload.Sources.Twitch.Authentication.csproj" />

View File

@@ -31,13 +31,7 @@ namespace VDownload.Core.Views
{ typeof(AuthenticationViewModel), typeof(AuthenticationView) } { typeof(AuthenticationViewModel), typeof(AuthenticationView) }
}; };
#endregion protected static IServiceProvider _serviceProvider;
#region PROPERTIES
public static IServiceProvider ServiceProvider { protected get; set; }
#endregion #endregion
@@ -45,6 +39,8 @@ namespace VDownload.Core.Views
#region PUBLIC METHODS #region PUBLIC METHODS
public static void Initialize(IServiceProvider serviceProvider) => _serviceProvider = serviceProvider;
public object Convert(object value, Type targetType, object parameter, string language) public object Convert(object value, Type targetType, object parameter, string language)
{ {
if (value is null) if (value is null)
@@ -53,11 +49,11 @@ namespace VDownload.Core.Views
} }
if (value is Type type && _viewModelViewBinding.ContainsKey(type)) if (value is Type type && _viewModelViewBinding.ContainsKey(type))
{ {
return ServiceProvider.GetService(_viewModelViewBinding[type]); return _serviceProvider.GetService(_viewModelViewBinding[type]);
} }
if (_viewModelViewBinding.ContainsKey(value.GetType())) if (_viewModelViewBinding.ContainsKey(value.GetType()))
{ {
return ServiceProvider.GetService(_viewModelViewBinding[value.GetType()]); return _serviceProvider.GetService(_viewModelViewBinding[value.GetType()]);
} }
return null; return null;
} }

View File

@@ -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<T>
{
#region METHODS
Task Initialize(T arg);
#endregion
}
}

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -4,11 +4,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
namespace VDownload.Services.Data.Application namespace VDownload.Services.Data.Application
{ {
public interface IApplicationDataService public interface IApplicationDataService : IInitializableService
{ {
#region PROPERTIES #region PROPERTIES
@@ -73,6 +74,8 @@ namespace VDownload.Services.Data.Application
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize() => await Load();
public async Task Load() public async Task Load()
{ {
if (File.Exists(_filePath)) if (File.Exists(_filePath))

View File

@@ -11,6 +11,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -4,11 +4,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
namespace VDownload.Services.Data.Authentication namespace VDownload.Services.Data.Authentication
{ {
public interface IAuthenticationDataService public interface IAuthenticationDataService : IInitializableService
{ {
#region PROPERTIES #region PROPERTIES
@@ -70,6 +71,8 @@ namespace VDownload.Services.Data.Authentication
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize() => await Load();
public async Task Load() public async Task Load()
{ {
Data = null; Data = null;

View File

@@ -11,6 +11,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -4,11 +4,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
namespace VDownload.Services.Data.Settings namespace VDownload.Services.Data.Settings
{ {
public interface ISettingsService public interface ISettingsService : IInitializableService
{ {
#region PROPERTIES #region PROPERTIES
@@ -73,6 +74,8 @@ namespace VDownload.Services.Data.Settings
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize() => await Load();
public async Task Load() public async Task Load()
{ {
if (File.Exists(_filePath)) if (File.Exists(_filePath))

View File

@@ -13,6 +13,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\VDownload.Models\VDownload.Models.csproj" /> <ProjectReference Include="..\..\..\VDownload.Models\VDownload.Models.csproj" />
<ProjectReference Include="..\..\..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Settings\VDownload.Sources.Twitch.Settings.csproj" /> <ProjectReference Include="..\..\..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Settings\VDownload.Sources.Twitch.Settings.csproj" />
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -2,13 +2,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using VDownload.Services.Data.Configuration; using VDownload.Services.Data.Configuration;
namespace VDownload.Services.Data.Subscriptions namespace VDownload.Services.Data.Subscriptions
{ {
public interface ISubscriptionsDataService public interface ISubscriptionsDataService : IInitializableService
{ {
#region PROPERTIES #region PROPERTIES
@@ -72,6 +74,8 @@ namespace VDownload.Services.Data.Subscriptions
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize() => await Load();
public async Task Load() public async Task Load()
{ {
if (File.Exists(_filePath)) if (File.Exists(_filePath))

View File

@@ -12,6 +12,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\VDownload.Models\VDownload.Models.csproj" /> <ProjectReference Include="..\..\..\VDownload.Models\VDownload.Models.csproj" />
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -6,22 +6,13 @@ using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.UI.StringResources; using VDownload.Core.Strings;
using VDownload.Services.Common;
namespace VDownload.Services.UI.Dialogs namespace VDownload.Services.UI.Dialogs
{ {
public interface IDialogsService public interface IDialogsService : IInitializableService<XamlRoot>
{ {
#region PROPERTIES
XamlRoot DefaultRoot { get; set; }
#endregion
#region METHODS
Task ShowClose(string title, string message); Task ShowClose(string title, string message);
Task<DialogResult> ShowDouble(string title, string message, string primaryButtonText, string secondaryButtonText); Task<DialogResult> ShowDouble(string title, string message, string primaryButtonText, string secondaryButtonText);
Task ShowOk(string title, string message); Task ShowOk(string title, string message);
@@ -30,53 +21,21 @@ namespace VDownload.Services.UI.Dialogs
Task<DialogResult> ShowTriple(string title, string message, string primaryButtonText, string secondaryButtonText, string cancelButtonText); Task<DialogResult> ShowTriple(string title, string message, string primaryButtonText, string secondaryButtonText, string cancelButtonText);
Task<DialogResultYesNo> ShowYesNo(string title, string message); Task<DialogResultYesNo> ShowYesNo(string title, string message);
Task<DialogResultYesNoCancel> ShowYesNoCancel(string title, string message); Task<DialogResultYesNoCancel> ShowYesNoCancel(string title, string message);
#endregion
} }
public class DialogsService : IDialogsService public class DialogsService : IDialogsService
{ {
#region SERVICES
protected readonly IStringResourcesService _stringResourcesService;
#endregion
#region FIELDS #region FIELDS
protected string _okString; protected string _okString = StringResourcesManager.DialogButtons.Get("OK");
protected string _closeString; protected string _closeString = StringResourcesManager.DialogButtons.Get("Close");
protected string _cancelString; protected string _cancelString = StringResourcesManager.DialogButtons.Get("Cancel");
protected string _yesString; protected string _yesString = StringResourcesManager.DialogButtons.Get("Yes");
protected string _noString; protected string _noString = StringResourcesManager.DialogButtons.Get("No");
#endregion protected XamlRoot _root;
#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");
}
#endregion #endregion
@@ -84,6 +43,8 @@ namespace VDownload.Services.UI.Dialogs
#region PUBLIC METHODS #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 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 ShowClose(string title, string message) => await ShowSingle(title, message, _closeString);
public async Task ShowSingle(string title, string message, string buttonText) public async Task ShowSingle(string title, string message, string buttonText)
@@ -138,7 +99,7 @@ namespace VDownload.Services.UI.Dialogs
{ {
Title = title, Title = title,
Content = message, Content = message,
XamlRoot = DefaultRoot XamlRoot = _root
}; };
} }

View File

@@ -15,6 +15,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj" /> <ProjectReference Include="..\..\..\VDownload.Core\VDownload.Core.Strings\VDownload.Core.Strings.csproj" />
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -4,10 +4,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using Windows.Media.Core;
namespace VDownload.Services.UI.DictionaryResources namespace VDownload.Services.UI.DictionaryResources
{ {
public interface IDictionaryResourcesService public interface IDictionaryResourcesService : IInitializableService<ResourceDictionary>
{ {
T Get<T>(string key); T Get<T>(string key);
} }
@@ -16,9 +18,9 @@ namespace VDownload.Services.UI.DictionaryResources
public class DictionaryResourcesService : IDictionaryResourcesService public class DictionaryResourcesService : IDictionaryResourcesService
{ {
#region CONSTRUCTORS #region FIELDS
public DictionaryResourcesService() { } protected ResourceDictionary _resources;
#endregion #endregion
@@ -26,9 +28,11 @@ namespace VDownload.Services.UI.DictionaryResources
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize(ResourceDictionary arg) => await Task.Run(() => _resources = arg);
public T Get<T>(string key) public T Get<T>(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) if (value is not null && value is T cast)
{ {
return cast; return cast;

View File

@@ -15,6 +15,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" /> <ProjectReference Include="..\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,17 +1,19 @@
using Microsoft.Toolkit.Uwp.Notifications; using Microsoft.Toolkit.Uwp.Notifications;
using Microsoft.UI.Xaml;
using Microsoft.Windows.AppNotifications; using Microsoft.Windows.AppNotifications;
using Microsoft.Windows.AppNotifications.Builder; using Microsoft.Windows.AppNotifications.Builder;
using SimpleToolkit.UI.WinUI.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
namespace VDownload.Services.UI.Notifications namespace VDownload.Services.UI.Notifications
{ {
public interface INotificationsService public interface INotificationsService : IInitializableService<Window>
{ {
void Initialize(Action notificationInvoked);
void SendNotification(string title, IEnumerable<string> message); void SendNotification(string title, IEnumerable<string> message);
} }
@@ -19,7 +21,15 @@ namespace VDownload.Services.UI.Notifications
public class NotificationsService : INotificationsService public class NotificationsService : INotificationsService
{ {
#region CONSTRCUTORS #region FIELDS
protected Window _window;
#endregion
#region CONSTRUCTORS
~NotificationsService() ~NotificationsService()
{ {
@@ -32,12 +42,14 @@ namespace VDownload.Services.UI.Notifications
#region PUBLIC METHODS #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(); AppNotificationManager.Default.Register();
} });
public void SendNotification(string title, IEnumerable<string> message) public void SendNotification(string title, IEnumerable<string> message)
{ {
@@ -54,5 +66,13 @@ namespace VDownload.Services.UI.Notifications
} }
#endregion #endregion
#region PRIVATE METHODS
private void NotificationInvoked(AppNotificationManager sender, AppNotificationActivatedEventArgs args) => WindowHelper.ShowWindow(_window);
#endregion
} }
} }

View File

@@ -13,5 +13,10 @@
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" /> <PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" /> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
<PackageReference Include="SimpleToolkit.UI.WinUI.Helpers" Version="1.7.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -3,24 +3,15 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Services.Common;
using Windows.Storage; using Windows.Storage;
using Windows.Storage.Pickers; using Windows.Storage.Pickers;
using WinRT.Interop; using WinRT.Interop;
namespace VDownload.Services.UI.StoragePicker namespace VDownload.Services.UI.StoragePicker
{ {
public interface IStoragePickerService public interface IStoragePickerService : IInitializableService<Window>
{ {
#region PROPERTIES
Window DefaultRoot { get; set; }
#endregion
#region METHODS
Task<string?> OpenDirectory(); Task<string?> OpenDirectory();
Task<string?> OpenDirectory(StoragePickerStartLocation startLocation); Task<string?> OpenDirectory(StoragePickerStartLocation startLocation);
Task<IEnumerable<string>> OpenMultipleFiles(); Task<IEnumerable<string>> OpenMultipleFiles();
@@ -33,17 +24,15 @@ namespace VDownload.Services.UI.StoragePicker
Task<string?> OpenSingleFile(string[] fileTypes, StoragePickerStartLocation startLocation); Task<string?> OpenSingleFile(string[] fileTypes, StoragePickerStartLocation startLocation);
Task<string?> SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType); Task<string?> SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType);
Task<string?> SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType, StoragePickerStartLocation startLocation); Task<string?> SaveFile(FileSavePickerFileTypeChoice[] fileTypes, string defaultFileType, StoragePickerStartLocation startLocation);
#endregion
} }
public class StoragePickerService : IStoragePickerService public class StoragePickerService : IStoragePickerService
{ {
#region PROPERTIES #region FIELDS
public Window DefaultRoot { get; set; } protected Window _root;
#endregion #endregion
@@ -51,6 +40,8 @@ namespace VDownload.Services.UI.StoragePicker
#region PUBLIC METHODS #region PUBLIC METHODS
public async Task Initialize(Window arg) => await Task.Run(() => _root = arg);
public async Task<string?> OpenDirectory() => await OpenDirectory(StoragePickerStartLocation.Unspecified); public async Task<string?> OpenDirectory() => await OpenDirectory(StoragePickerStartLocation.Unspecified);
public async Task<string?> OpenDirectory(StoragePickerStartLocation startLocation) public async Task<string?> OpenDirectory(StoragePickerStartLocation startLocation)
{ {
@@ -111,7 +102,7 @@ namespace VDownload.Services.UI.StoragePicker
protected void InitializePicker(object picker) protected void InitializePicker(object picker)
{ {
var hwnd = WindowNative.GetWindowHandle(DefaultRoot); var hwnd = WindowNative.GetWindowHandle(_root);
InitializeWithWindow.Initialize(picker, hwnd); InitializeWithWindow.Initialize(picker, hwnd);
} }

View File

@@ -13,4 +13,8 @@
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" /> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\VDownload.Services.Common\VDownload.Services.Common.csproj" />
</ItemGroup>
</Project> </Project>

View File

@@ -82,7 +82,11 @@ namespace VDownload.Services.UI.StringResources
#region PRIVATE METHODS #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 #endregion
} }

View File

@@ -53,8 +53,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VDownload.Core", "VDownload
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Models", "VDownload.Models\VDownload.Models.csproj", "{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Models", "VDownload.Models\VDownload.Models.csproj", "{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}"
EndProject 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}" 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 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}" 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 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}" 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 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 EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution 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|x64.Build.0 = Release|Any CPU
{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x86.ActiveCfg = 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 {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.ActiveCfg = Debug|Any CPU
{8DC55331-B9F3-4811-8474-348662963260}.Debug|Any CPU.Build.0 = 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 {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|x64.Build.0 = Release|Any CPU
{3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x86.ActiveCfg = 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 {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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -582,7 +582,6 @@ Global
{711FA7BE-27DA-425D-9777-967F6E519CFF} = {8D94F264-4EE9-4C24-AB77-2CCA36858309} {711FA7BE-27DA-425D-9777-967F6E519CFF} = {8D94F264-4EE9-4C24-AB77-2CCA36858309}
{8E850249-E79D-40E7-B02D-393632DF8B8E} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC} {8E850249-E79D-40E7-B02D-393632DF8B8E} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC}
{64A217AE-4E95-468E-85C3-67C27D689FF4} = {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} {8DC55331-B9F3-4811-8474-348662963260} = {4CC2DC7D-27D2-4F52-89DF-7D45B41BB40F}
{A726FD43-B111-423B-BAF6-D65B4C0E37B5} = {8D94F264-4EE9-4C24-AB77-2CCA36858309} {A726FD43-B111-423B-BAF6-D65B4C0E37B5} = {8D94F264-4EE9-4C24-AB77-2CCA36858309}
{E1D4352C-51AC-4572-8515-0B4E89A2442F} = {8539067C-9968-4AEB-928C-FEDC43989A79} {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} {4647EFB5-A206-4F47-976D-BAED11B52579} = {1020167A-4101-496E-82CF-41B65769DD28}
{4983E15B-3730-4646-A2BD-16B9ECC9E4FF} = {05A45688-7EEF-4656-818A-2477625C3707} {4983E15B-3730-4646-A2BD-16B9ECC9E4FF} = {05A45688-7EEF-4656-818A-2477625C3707}
{3193DABC-87F8-4256-9449-3CF42FEF7098} = {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 EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9FD7B842-C3E2-4FD0-AD8A-C8E619280AB7} SolutionGuid = {9FD7B842-C3E2-4FD0-AD8A-C8E619280AB7}

View File

@@ -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<T> : 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
}
}

View File

@@ -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<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)
{
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<BaseWindow>();
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<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
}
}

View File

@@ -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<LaunchActivatedEventArgs>
{
#region PRIVATE METHODS
protected override async Task HandleInternalAsync(LaunchActivatedEventArgs args)
{
await Task.CompletedTask;
}
#endregion
}
}

View File

@@ -1,12 +1,18 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json; using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Toolkit.Uwp.Notifications; using Microsoft.Toolkit.Uwp.Notifications;
using Microsoft.UI;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.Windows.AppNotifications; using Microsoft.Windows.AppNotifications;
using System; using System;
using System.IO;
using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using VDownload.Activation;
using VDownload.Core.Tasks; using VDownload.Core.Tasks;
using VDownload.Core.ViewModels; using VDownload.Core.ViewModels;
using VDownload.Core.ViewModels.About; using VDownload.Core.ViewModels.About;
@@ -30,7 +36,6 @@ using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.DictionaryResources; using VDownload.Services.UI.DictionaryResources;
using VDownload.Services.UI.Notifications; using VDownload.Services.UI.Notifications;
using VDownload.Services.UI.StoragePicker; using VDownload.Services.UI.StoragePicker;
using VDownload.Services.UI.StringResources;
using VDownload.Services.UI.WebView; using VDownload.Services.UI.WebView;
using VDownload.Services.Utility.Encryption; using VDownload.Services.Utility.Encryption;
using VDownload.Services.Utility.FFmpeg; using VDownload.Services.Utility.FFmpeg;
@@ -47,11 +52,21 @@ namespace VDownload
{ {
public partial class App : Application 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<T>() 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 #endregion
@@ -63,22 +78,36 @@ namespace VDownload
{ {
this.InitializeComponent(); 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); UnhandledException += UnhandledExceptionCatched;
BuildDataServices(services);
BuildUIServices(services);
BuildUtilityServices(services);
BuildSourcesServices(services);
BuildTasksManager(services);
BuildPresentation(services);
_serviceProvider = services.BuildServiceProvider();
} }
#endregion #endregion
@@ -87,27 +116,30 @@ namespace VDownload
#region PRIVATE METHODS #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<IActivationService>().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) protected void BuildCore(IServiceCollection services)
{ {
services.AddSingleton<HttpClient>(); services.AddSingleton<HttpClient>();
} }
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) protected void BuildDataServices(IServiceCollection services)
{ {
services.AddSingleton<IConfigurationService, ConfigurationService>(); services.AddSingleton<IConfigurationService, ConfigurationService>();
@@ -119,7 +151,6 @@ namespace VDownload
protected void BuildUIServices(IServiceCollection services) protected void BuildUIServices(IServiceCollection services)
{ {
services.AddSingleton<IStringResourcesService, StringResourcesService>();
services.AddSingleton<IDictionaryResourcesService, DictionaryResourcesService>(); services.AddSingleton<IDictionaryResourcesService, DictionaryResourcesService>();
services.AddSingleton<IWebViewService, WebViewService>(); services.AddSingleton<IWebViewService, WebViewService>();
services.AddSingleton<IStoragePickerService, StoragePickerService>(); services.AddSingleton<IStoragePickerService, StoragePickerService>();
@@ -178,40 +209,11 @@ namespace VDownload
services.AddTransient<BaseWindow>(); services.AddTransient<BaseWindow>();
} }
protected async Task InitializeServices() protected void BuildActivation(IServiceCollection services)
{ {
IApplicationDataService applicationDataService = _serviceProvider.GetService<IApplicationDataService>(); services.AddTransient<ActivationHandler<LaunchActivatedEventArgs>, DefaultActivationHandler>();
ISettingsService settingsService = _serviceProvider.GetService<ISettingsService>();
IAuthenticationDataService authenticationDataService = _serviceProvider.GetService<IAuthenticationDataService>();
ISubscriptionsDataService subscriptionsDataService = _serviceProvider.GetService<ISubscriptionsDataService>();
Task initViewModelToViewConverterTask = Task.Run(() => ViewModelToViewConverter.ServiceProvider = _serviceProvider);
Task initStoragePickerServiceTask = Task.Run(() => _serviceProvider.GetService<IStoragePickerService>().DefaultRoot = _window);
Task initNotificationsServiceTask = Task.Run(() => _serviceProvider.GetService<INotificationsService>().Initialize(() => WindowHelper.ShowWindow(_window)));
await Task.WhenAll( services.AddSingleton<IActivationService, ActivationService>();
applicationDataService.Load(),
settingsService.Load(),
authenticationDataService.Load(),
subscriptionsDataService.Load(),
initStoragePickerServiceTask,
initViewModelToViewConverterTask,
initNotificationsServiceTask
);
}
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
_window = _serviceProvider.GetService<BaseWindow>();
_window.RootLoaded += Window_RootLoaded;
_window.Activate();
await InitializeServices();
}
protected void Window_RootLoaded(object sender, EventArgs e)
{
IDialogsService dialogsService = _serviceProvider.GetService<IDialogsService>();
dialogsService.DefaultRoot = _window.XamlRoot;
} }
#endregion #endregion

View File

@@ -11,7 +11,7 @@
<Identity <Identity
Name="VDownload" Name="VDownload"
Publisher="CN=mateusz" Publisher="CN=Mateusz Skoczek"
Version="0.0.0.0" /> Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="df3e7de0-430a-4a93-a68b-48c2f3ec497a" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="df3e7de0-430a-4a93-a68b-48c2f3ec497a" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

View File

@@ -1,24 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion> <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<RootNamespace>VDownload</RootNamespace> <RootNamespace>VDownload</RootNamespace>
<ApplicationManifest>app.manifest</ApplicationManifest> <ApplicationManifest>app.manifest</ApplicationManifest>
<Platforms>x86;x64;ARM64</Platforms> <Platforms>x64;ARM64</Platforms>
<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers> <RuntimeIdentifiers>win10-x64;win10-arm64</RuntimeIdentifiers>
<PublishProfile>win10-$(Platform).pubxml</PublishProfile> <PublishProfile>win10-$(Platform).pubxml</PublishProfile>
<UseWinUI>true</UseWinUI> <UseWinUI>true</UseWinUI>
<EnableMsixTooling>true</EnableMsixTooling> <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained> <UseRidGraph>true</UseRidGraph>
<UseRidGraph>true</UseRidGraph> <EnableCoreMrtTooling Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">false</EnableCoreMrtTooling>
<EnableCoreMrtTooling Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">false</EnableCoreMrtTooling> <ApplicationIcon>Assets\Logo\Logo.ico</ApplicationIcon>
<ApplicationIcon>Assets\Logo\Logo.ico</ApplicationIcon> <PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance> <Version>0.0.0</Version>
<Version>0.0.0</Version> <IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion> <WindowsPackageType>None</WindowsPackageType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <EnableMsixTooling>true</EnableMsixTooling>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Content Remove="Assets\BaseView\AuthenticationDark.png" /> <Content Remove="Assets\BaseView\AuthenticationDark.png" />
@@ -168,6 +168,7 @@
<PackageReference Include="CommunityToolkit.WinUI.Converters" Version="8.0.240109" /> <PackageReference Include="CommunityToolkit.WinUI.Converters" Version="8.0.240109" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" /> <PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" /> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
@@ -188,8 +189,12 @@
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\VDownload.Core\VDownload.Core.Strings\VDownload.Core.Strings.csproj" />
<ProjectReference Include="..\VDownload.Core\VDownload.Core.Tasks\VDownload.Core.Tasks.csproj" />
<ProjectReference Include="..\VDownload.Core\VDownload.Core.ViewModels\VDownload.Core.ViewModels.csproj" /> <ProjectReference Include="..\VDownload.Core\VDownload.Core.ViewModels\VDownload.Core.ViewModels.csproj" />
<ProjectReference Include="..\VDownload.Core\VDownload.Core.Views\VDownload.Core.Views.csproj" /> <ProjectReference Include="..\VDownload.Core\VDownload.Core.Views\VDownload.Core.Views.csproj" />
<ProjectReference Include="..\VDownload.Models\VDownload.Models.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Application\VDownload.Services.Data.Application.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Application\VDownload.Services.Data.Application.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Authentication\VDownload.Services.Data.Authentication.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Authentication\VDownload.Services.Data.Authentication.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
@@ -199,14 +204,17 @@
<ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.Notifications\VDownload.Services.UI.Notifications.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StoragePicker\VDownload.Services.UI.StoragePicker.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StoragePicker\VDownload.Services.UI.StoragePicker.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.WebView\VDownload.Services.UI.WebView.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.WebView\VDownload.Services.UI.WebView.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Encryption\VDownload.Services.Utility.Encryption.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Encryption\VDownload.Services.Utility.Encryption.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.FFmpeg\VDownload.Services.Utility.FFmpeg.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.FFmpeg\VDownload.Services.Utility.FFmpeg.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Filename\VDownload.Services.Utility.Filename.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.Filename\VDownload.Services.Utility.Filename.csproj" />
<ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.HttpClient\VDownload.Services.Utility.HttpClient.csproj" /> <ProjectReference Include="..\VDownload.Services\VDownload.Services.Utility\VDownload.Services.Utility.HttpClient\VDownload.Services.Utility.HttpClient.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Common\VDownload.Sources.Common.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Api\VDownload.Sources.Twitch.Api.csproj" /> <ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Api\VDownload.Sources.Twitch.Api.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Authentication\VDownload.Sources.Twitch.Authentication.csproj" /> <ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Authentication\VDownload.Sources.Twitch.Authentication.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Configuration\VDownload.Sources.Twitch.Configuration.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Models\VDownload.Sources.Twitch.Models.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Settings\VDownload.Sources.Twitch.Settings.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch\VDownload.Sources.Twitch.csproj" /> <ProjectReference Include="..\VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch\VDownload.Sources.Twitch.csproj" />
<ProjectReference Include="..\VDownload.Sources\VDownload.Sources\VDownload.Sources.csproj" /> <ProjectReference Include="..\VDownload.Sources\VDownload.Sources\VDownload.Sources.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -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
}
}

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="VDownload.app"/> <assemblyIdentity version="0.0.0.0" name="VDownload.app"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application> <application>