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-file-versioning-scheme: MajorMinorPatch
@@ -9,3 +9,10 @@ branches:
increment: Patch
tag: ''
is-release-branch: true
test:
regex: ^features
mode: ContinuousDelivery
increment: Patch
tag: ''
is-release-branch: true
source-branches: []

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>
<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">
<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>
</ItemGroup>
</Project>

View File

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

View File

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

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.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.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.Core.Strings\VDownload.Core.Strings.csproj" />
</ItemGroup>
</Project>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,11 +6,11 @@ using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using VDownload.Core.Strings;
using VDownload.Models;
using VDownload.Services.Data.Configuration;
using VDownload.Services.Data.Settings;
using VDownload.Services.UI.StoragePicker;
using VDownload.Services.UI.StringResources;
namespace VDownload.Core.ViewModels.Settings
{
@@ -20,7 +20,6 @@ namespace VDownload.Core.ViewModels.Settings
protected readonly ISettingsService _settingsService;
protected readonly IConfigurationService _configurationService;
protected readonly IStringResourcesService _stringResourcesService;
protected readonly IStoragePickerService _storagePickerService;
#endregion
@@ -176,16 +175,15 @@ namespace VDownload.Core.ViewModels.Settings
#region CONSTRUCTORS
public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStringResourcesService stringResourcesService, IStoragePickerService storagePickerService)
public SettingsViewModel(ISettingsService settingsService, IConfigurationService configurationService, IStoragePickerService storagePickerService)
{
_settingsService = settingsService;
_configurationService = configurationService;
_stringResourcesService = stringResourcesService;
_storagePickerService = storagePickerService;
base.PropertyChanged += PropertyChangedEventHandler;
_tasksFilenameTemplateTooltip = string.Join('\n', _configurationService.Common.FilenameTemplates.Select(x => _stringResourcesService.FilenameTemplateResources.Get(x.Name)));
_tasksFilenameTemplateTooltip = string.Join('\n', _configurationService.Common.FilenameTemplates.Select(x => StringResourcesManager.FilenameTemplate.Get(x.Name)));
}
#endregion

View File

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

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.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.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.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" />

View File

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

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.Text;
using System.Threading.Tasks;
using VDownload.Services.Common;
using VDownload.Services.Data.Configuration;
namespace VDownload.Services.Data.Application
{
public interface IApplicationDataService
public interface IApplicationDataService : IInitializableService
{
#region PROPERTIES
@@ -73,6 +74,8 @@ namespace VDownload.Services.Data.Application
#region PUBLIC METHODS
public async Task Initialize() => await Load();
public async Task Load()
{
if (File.Exists(_filePath))

View File

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

View File

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

View File

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

View File

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

View File

@@ -13,6 +13,7 @@
<ItemGroup>
<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.Services.Common\VDownload.Services.Common.csproj" />
<ProjectReference Include="..\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
</ItemGroup>

View File

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

View File

@@ -12,6 +12,7 @@
<ItemGroup>
<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" />
</ItemGroup>

View File

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

View File

@@ -15,6 +15,7 @@
</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>
</Project>

View File

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

View File

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

View File

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

View File

@@ -13,5 +13,10 @@
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000" />
<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>
</Project>

View File

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

View File

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

View File

@@ -82,7 +82,11 @@ namespace VDownload.Services.UI.StringResources
#region PRIVATE METHODS
protected StringResources BuildResource(string resourceName) => new StringResources(ResourceLoader.GetForViewIndependentUse($"{_configurationService.Common.StringResourcesAssembly}/{resourceName}"));
protected StringResources BuildResource(string resourceName)
{
ResourceLoader loader = new ResourceLoader($"{_configurationService.Common.StringResourcesAssembly}/{resourceName}");
return new StringResources(loader);
}
#endregion
}

View File

@@ -53,8 +53,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VDownload.Core", "VDownload
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Models", "VDownload.Models\VDownload.Models.csproj", "{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.UI.StringResources", "VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.StringResources\VDownload.Services.UI.StringResources.csproj", "{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.UI.DictionaryResources", "VDownload.Services\VDownload.Services.UI\VDownload.Services.UI.DictionaryResources\VDownload.Services.UI.DictionaryResources.csproj", "{8DC55331-B9F3-4811-8474-348662963260}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Sources.Twitch.Settings", "VDownload.Sources\VDownload.Sources.Twitch\VDownload.Sources.Twitch.Settings\VDownload.Sources.Twitch.Settings.csproj", "{A726FD43-B111-423B-BAF6-D65B4C0E37B5}"
@@ -73,7 +71,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Utility.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Data.Application", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Application\VDownload.Services.Data.Application.csproj", "{4983E15B-3730-4646-A2BD-16B9ECC9E4FF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VDownload.Services.Data.Subscriptions", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Subscriptions\VDownload.Services.Data.Subscriptions.csproj", "{3193DABC-87F8-4256-9449-3CF42FEF7098}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Data.Subscriptions", "VDownload.Services\VDownload.Services.Data\VDownload.Services.Data.Subscriptions\VDownload.Services.Data.Subscriptions.csproj", "{3193DABC-87F8-4256-9449-3CF42FEF7098}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VDownload.Services.Common", "VDownload.Services\VDownload.Services.Common\VDownload.Services.Common.csproj", "{267F5A31-1257-4820-9FE5-C11D26CC3C55}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -381,22 +381,6 @@ Global
{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x64.Build.0 = Release|Any CPU
{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x86.ActiveCfg = Release|Any CPU
{16B56EA9-C218-4A8E-B3DE-29F200EF2EE2}.Release|x86.Build.0 = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|ARM64.Build.0 = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x64.ActiveCfg = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x64.Build.0 = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x86.ActiveCfg = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Debug|x86.Build.0 = Debug|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|Any CPU.Build.0 = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|ARM64.ActiveCfg = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|ARM64.Build.0 = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x64.ActiveCfg = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x64.Build.0 = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x86.ActiveCfg = Release|Any CPU
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E}.Release|x86.Build.0 = Release|Any CPU
{8DC55331-B9F3-4811-8474-348662963260}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8DC55331-B9F3-4811-8474-348662963260}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8DC55331-B9F3-4811-8474-348662963260}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -557,6 +541,22 @@ Global
{3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x64.Build.0 = Release|Any CPU
{3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x86.ActiveCfg = Release|Any CPU
{3193DABC-87F8-4256-9449-3CF42FEF7098}.Release|x86.Build.0 = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|Any CPU.Build.0 = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|ARM64.Build.0 = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x64.ActiveCfg = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x64.Build.0 = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x86.ActiveCfg = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Debug|x86.Build.0 = Debug|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|Any CPU.ActiveCfg = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|Any CPU.Build.0 = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|ARM64.ActiveCfg = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|ARM64.Build.0 = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x64.ActiveCfg = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x64.Build.0 = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x86.ActiveCfg = Release|Any CPU
{267F5A31-1257-4820-9FE5-C11D26CC3C55}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -582,7 +582,6 @@ Global
{711FA7BE-27DA-425D-9777-967F6E519CFF} = {8D94F264-4EE9-4C24-AB77-2CCA36858309}
{8E850249-E79D-40E7-B02D-393632DF8B8E} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC}
{64A217AE-4E95-468E-85C3-67C27D689FF4} = {9A8EB967-1EAB-439E-8FDB-B9ACAC6499EC}
{6F6CA153-1AC6-454A-ACDC-2C706E2A437E} = {4CC2DC7D-27D2-4F52-89DF-7D45B41BB40F}
{8DC55331-B9F3-4811-8474-348662963260} = {4CC2DC7D-27D2-4F52-89DF-7D45B41BB40F}
{A726FD43-B111-423B-BAF6-D65B4C0E37B5} = {8D94F264-4EE9-4C24-AB77-2CCA36858309}
{E1D4352C-51AC-4572-8515-0B4E89A2442F} = {8539067C-9968-4AEB-928C-FEDC43989A79}
@@ -593,6 +592,7 @@ Global
{4647EFB5-A206-4F47-976D-BAED11B52579} = {1020167A-4101-496E-82CF-41B65769DD28}
{4983E15B-3730-4646-A2BD-16B9ECC9E4FF} = {05A45688-7EEF-4656-818A-2477625C3707}
{3193DABC-87F8-4256-9449-3CF42FEF7098} = {05A45688-7EEF-4656-818A-2477625C3707}
{267F5A31-1257-4820-9FE5-C11D26CC3C55} = {8D351DB0-74E6-4C1E-A123-34D6BBBD5585}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9FD7B842-C3E2-4FD0-AD8A-C8E619280AB7}

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.Json;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Toolkit.Uwp.Notifications;
using Microsoft.UI;
using Microsoft.UI.Xaml;
using Microsoft.Windows.AppNotifications;
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using VDownload.Activation;
using VDownload.Core.Tasks;
using VDownload.Core.ViewModels;
using VDownload.Core.ViewModels.About;
@@ -30,7 +36,6 @@ using VDownload.Services.UI.Dialogs;
using VDownload.Services.UI.DictionaryResources;
using VDownload.Services.UI.Notifications;
using VDownload.Services.UI.StoragePicker;
using VDownload.Services.UI.StringResources;
using VDownload.Services.UI.WebView;
using VDownload.Services.Utility.Encryption;
using VDownload.Services.Utility.FFmpeg;
@@ -47,11 +52,21 @@ namespace VDownload
{
public partial class App : Application
{
#region FIELDS
#region PROPERTIES
protected IServiceProvider _serviceProvider;
public static BaseWindow Window { get; protected set; }
protected BaseWindow _window;
public static T GetService<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
@@ -63,22 +78,36 @@ namespace VDownload
{
this.InitializeComponent();
Host = Microsoft.Extensions.Hosting.Host
.CreateDefaultBuilder()
.UseContentRoot(AppContext.BaseDirectory)
.ConfigureAppConfiguration((builder) =>
{
builder.Sources.Add(new JsonConfigurationSource
{
Path = "configuration.json"
});
})
.ConfigureLogging((builder) =>
{
builder.AddConsole();
})
.ConfigureServices((context, services) =>
{
BuildCore(services);
IServiceCollection services = new ServiceCollection();
BuildDataServices(services);
BuildUIServices(services);
BuildUtilityServices(services);
BuildSourcesServices(services);
BuildCore(services);
BuildTasksManager(services);
BuildPresentation(services);
BuildActivation(services);
})
.Build();
BuildConfiguration(services);
BuildDataServices(services);
BuildUIServices(services);
BuildUtilityServices(services);
BuildSourcesServices(services);
BuildTasksManager(services);
BuildPresentation(services);
_serviceProvider = services.BuildServiceProvider();
UnhandledException += UnhandledExceptionCatched;
}
#endregion
@@ -87,27 +116,30 @@ namespace VDownload
#region PRIVATE METHODS
#region EVENT HANDLERS
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
base.OnLaunched(args);
File.AppendAllText("C:\\Users\\mateusz\\Desktop\\test.txt", "testlaunched\n");
await GetService<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)
{
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)
{
services.AddSingleton<IConfigurationService, ConfigurationService>();
@@ -119,7 +151,6 @@ namespace VDownload
protected void BuildUIServices(IServiceCollection services)
{
services.AddSingleton<IStringResourcesService, StringResourcesService>();
services.AddSingleton<IDictionaryResourcesService, DictionaryResourcesService>();
services.AddSingleton<IWebViewService, WebViewService>();
services.AddSingleton<IStoragePickerService, StoragePickerService>();
@@ -178,40 +209,11 @@ namespace VDownload
services.AddTransient<BaseWindow>();
}
protected async Task InitializeServices()
protected void BuildActivation(IServiceCollection services)
{
IApplicationDataService applicationDataService = _serviceProvider.GetService<IApplicationDataService>();
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)));
services.AddTransient<ActivationHandler<LaunchActivatedEventArgs>, DefaultActivationHandler>();
await Task.WhenAll(
applicationDataService.Load(),
settingsService.Load(),
authenticationDataService.Load(),
subscriptionsDataService.Load(),
initStoragePickerServiceTask,
initViewModelToViewConverterTask,
initNotificationsServiceTask
);
}
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
_window = _serviceProvider.GetService<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;
services.AddSingleton<IActivationService, ActivationService>();
}
#endregion

View File

@@ -11,7 +11,7 @@
<Identity
Name="VDownload"
Publisher="CN=mateusz"
Publisher="CN=Mateusz Skoczek"
Version="0.0.0.0" />
<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">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<RootNamespace>VDownload</RootNamespace>
<ApplicationManifest>app.manifest</ApplicationManifest>
<Platforms>x86;x64;ARM64</Platforms>
<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
<PublishProfile>win10-$(Platform).pubxml</PublishProfile>
<UseWinUI>true</UseWinUI>
<EnableMsixTooling>true</EnableMsixTooling>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
<UseRidGraph>true</UseRidGraph>
<EnableCoreMrtTooling Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">false</EnableCoreMrtTooling>
<ApplicationIcon>Assets\Logo\Logo.ico</ApplicationIcon>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
<Version>0.0.0</Version>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<RootNamespace>VDownload</RootNamespace>
<ApplicationManifest>app.manifest</ApplicationManifest>
<Platforms>x64;ARM64</Platforms>
<RuntimeIdentifiers>win10-x64;win10-arm64</RuntimeIdentifiers>
<PublishProfile>win10-$(Platform).pubxml</PublishProfile>
<UseWinUI>true</UseWinUI>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
<UseRidGraph>true</UseRidGraph>
<EnableCoreMrtTooling Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">false</EnableCoreMrtTooling>
<ApplicationIcon>Assets\Logo\Logo.ico</ApplicationIcon>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
<Version>0.0.0</Version>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<WindowsPackageType>None</WindowsPackageType>
<EnableMsixTooling>true</EnableMsixTooling>
</PropertyGroup>
<ItemGroup>
<Content Remove="Assets\BaseView\AuthenticationDark.png" />
@@ -168,6 +168,7 @@
<PackageReference Include="CommunityToolkit.WinUI.Converters" Version="8.0.240109" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" 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.WindowsAppSDK" Version="1.5.240227000" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
@@ -188,8 +189,12 @@
</None>
</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.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.Authentication\VDownload.Services.Data.Authentication.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.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.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.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.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.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.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\VDownload.Sources.csproj" />
</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"?>
<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">
<application>
@@ -13,4 +13,4 @@
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>
</assembly>