252 lines
9.6 KiB
C#
252 lines
9.6 KiB
C#
using Google.Apis.YouTube.v3.Data;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using Windows.ApplicationModel;
|
|
using Windows.ApplicationModel.Activation;
|
|
using Windows.ApplicationModel.Background;
|
|
using Windows.Globalization;
|
|
using Windows.Storage;
|
|
using Windows.System;
|
|
using Windows.System.Power;
|
|
using Windows.UI.Notifications;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using Windows.UI.Xaml.Navigation;
|
|
|
|
namespace FoxTube
|
|
{
|
|
/// <summary>
|
|
/// Provides application-specific behavior to supplement the default Application class.
|
|
/// </summary>
|
|
sealed partial class App : Application
|
|
{
|
|
/// <summary>
|
|
/// Initializes the singleton application object. This is the first line of authored code
|
|
/// executed, and as such is the logical equivalent of main() or WinMain().
|
|
/// </summary>
|
|
public App()
|
|
{
|
|
SettingsStorage.LoadData();
|
|
|
|
switch (SettingsStorage.Theme)
|
|
{
|
|
case 0:
|
|
RequestedTheme = ApplicationTheme.Light;
|
|
break;
|
|
case 1:
|
|
RequestedTheme = ApplicationTheme.Dark;
|
|
break;
|
|
}
|
|
|
|
ApplicationLanguages.PrimaryLanguageOverride = SettingsStorage.Language;
|
|
InitializeComponent();
|
|
Suspending += OnSuspending;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoked when the application is launched normally by the end user. Other entry points
|
|
/// will be used such as when the application is launched to open a specific file.
|
|
/// </summary>
|
|
/// <param name="e">Details about the launch request and process.</param>
|
|
protected override void OnLaunched(LaunchActivatedEventArgs e)
|
|
{
|
|
Frame rootFrame = Window.Current.Content as Frame;
|
|
|
|
// Do not repeat app initialization when the Window already has content,
|
|
// just ensure that the window is active
|
|
if (rootFrame == null)
|
|
{
|
|
// Create a Frame to act as the navigation context and navigate to the first page
|
|
rootFrame = new Frame();
|
|
|
|
rootFrame.NavigationFailed += OnNavigationFailed;
|
|
|
|
// Place the frame in the current Window
|
|
Window.Current.Content = rootFrame;
|
|
}
|
|
|
|
if (e.PrelaunchActivated == false)
|
|
{
|
|
if (rootFrame.Content == null)
|
|
{
|
|
// When the navigation stack isn't restored navigate to the first page,
|
|
// configuring the new page by passing required information as a navigation
|
|
// parameter
|
|
rootFrame.Navigate(typeof(MainPage), e.Arguments);
|
|
}
|
|
// Ensure the current window is active
|
|
Window.Current.Activate();
|
|
}
|
|
|
|
ActivateToastBackgoundTask();
|
|
ActivateBackgoundTask();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes background task for processing toast notifications' clicks
|
|
/// </summary>
|
|
public async void ActivateToastBackgoundTask()
|
|
{
|
|
const string taskName = "FoxtubeToastBackground";
|
|
if (BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals(taskName)))
|
|
return;
|
|
|
|
var backgroundRequest = await BackgroundExecutionManager.RequestAccessAsync();
|
|
var saverRequest = PowerManager.EnergySaverStatus;
|
|
if (backgroundRequest == BackgroundAccessStatus.DeniedBySystemPolicy || backgroundRequest == BackgroundAccessStatus.DeniedByUser)
|
|
return;
|
|
|
|
BackgroundTaskBuilder builder = new BackgroundTaskBuilder() { Name = taskName };
|
|
builder.SetTrigger(new ToastNotificationActionTrigger());
|
|
|
|
BackgroundTaskRegistration registration = builder.Register();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes background task for checking user's subscriptions and poping toast notifications when new video is uploaded
|
|
/// </summary>
|
|
public async void ActivateBackgoundTask()
|
|
{
|
|
const string taskName = "FoxtubeBackgound";
|
|
if (BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals(taskName)))
|
|
return;
|
|
|
|
var backgroundRequest = await BackgroundExecutionManager.RequestAccessAsync();
|
|
var saverRequest = PowerManager.EnergySaverStatus;
|
|
if (backgroundRequest == BackgroundAccessStatus.DeniedBySystemPolicy || backgroundRequest == BackgroundAccessStatus.DeniedByUser || saverRequest == EnergySaverStatus.On)
|
|
return;
|
|
|
|
BackgroundTaskBuilder builder = new BackgroundTaskBuilder()
|
|
{
|
|
Name = taskName,
|
|
IsNetworkRequested = true,
|
|
TaskEntryPoint = "FoxTube.Background.BackgroundProcessor"
|
|
};
|
|
builder.SetTrigger(new TimeTrigger(15, false));
|
|
|
|
BackgroundTaskRegistration registration = builder.Register();
|
|
}
|
|
|
|
protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
|
|
{
|
|
var deferral = args.TaskInstance.GetDeferral();
|
|
base.OnBackgroundActivated(args);
|
|
|
|
if (args.TaskInstance.Task.Name == "FoxtubeToastBackground" && args.TaskInstance.TriggerDetails is ToastNotificationActionTriggerDetail details)
|
|
{
|
|
string[] arguments = details.Argument.Split('|');
|
|
|
|
switch (arguments[0])
|
|
{
|
|
case "later":
|
|
try
|
|
{
|
|
if (!SecretsVault.IsAuthorized)
|
|
SecretsVault.CheckAuthorization(false);
|
|
if (!SecretsVault.IsAuthorized)
|
|
throw new Exception("Not authenticated");
|
|
|
|
PlaylistItem item = new PlaylistItem()
|
|
{
|
|
Snippet = new PlaylistItemSnippet()
|
|
{
|
|
ResourceId = new ResourceId()
|
|
{
|
|
Kind = "youtube#video",
|
|
VideoId = arguments[1]
|
|
},
|
|
PlaylistId = "WL"
|
|
}
|
|
};
|
|
|
|
await SecretsVault.Service.PlaylistItems.Insert(item, "snippet").ExecuteAsync();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.WriteLine(e.Message);
|
|
}
|
|
break;
|
|
case "download":
|
|
await Launcher.LaunchFileAsync(await StorageFile.GetFileFromPathAsync(arguments[1]));
|
|
break;
|
|
}
|
|
}
|
|
|
|
deferral.Complete();
|
|
}
|
|
|
|
protected override void OnActivated(IActivatedEventArgs e)
|
|
{
|
|
base.OnActivated(e);
|
|
|
|
Frame rootFrame = Window.Current.Content as Frame;
|
|
|
|
if (rootFrame == null)
|
|
{
|
|
rootFrame = new Frame();
|
|
rootFrame.NavigationFailed += OnNavigationFailed;
|
|
|
|
Window.Current.Content = rootFrame;
|
|
}
|
|
|
|
if (rootFrame.Content == null)
|
|
{
|
|
rootFrame.Navigate(typeof(MainPage));
|
|
}
|
|
|
|
Window.Current.Activate();
|
|
|
|
if (e is ToastNotificationActivatedEventArgs)
|
|
{
|
|
string[] args = (e as ToastNotificationActivatedEventArgs).Argument.Split('|');
|
|
switch (args[0])
|
|
{
|
|
case "changelog":
|
|
case "inbox":
|
|
Methods.MainPage.GoToDeveloper(args[1]);
|
|
break;
|
|
|
|
case "video":
|
|
Methods.MainPage.GoToVideo(args[1]);
|
|
break;
|
|
|
|
case "channel":
|
|
Methods.MainPage.GoToChannel(args[1]);
|
|
break;
|
|
case "download":
|
|
Methods.MainPage.GoToDownloads();
|
|
break;
|
|
case "dcancel":
|
|
DownloadAgent.Remove(args[1]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoked when Navigation to a certain page fails
|
|
/// </summary>
|
|
/// <param name="sender">The Frame which failed navigation</param>
|
|
/// <param name="e">Details about the navigation failure</param>
|
|
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
|
|
{
|
|
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoked when application execution is being suspended. Application state is saved
|
|
/// without knowing whether the application will be terminated or resumed with the contents
|
|
/// of memory still intact.
|
|
/// </summary>
|
|
/// <param name="sender">The source of the suspend request.</param>
|
|
/// <param name="e">Details about the suspend request.</param>
|
|
private void OnSuspending(object sender, SuspendingEventArgs e)
|
|
{
|
|
var deferral = e.SuspendingOperation.GetDeferral();
|
|
DownloadAgent.QuitPrompt();
|
|
deferral.Complete();
|
|
}
|
|
}
|
|
}
|