// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.Services { using System; using System.Diagnostics; using System.Linq; using System.Windows; using Windows.UI.Notifications; using HandBrakeWPF.Services.Interfaces; using Microsoft.Toolkit.Uwp.Notifications; /// /// Docs: https://docs.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/send-local-toast?tabs=desktop /// public class NotificationService : INotificationService { private readonly IUserSettingService userSettingService; private ToastNotifierCompat notifier; private bool isInitialised; private int id; public NotificationService(IUserSettingService userSettingService) { userSettingService.SettingChanged += this.UserSettingService_SettingChanged; this.userSettingService = userSettingService; this.Setup(); } private void UserSettingService_SettingChanged(object sender, HandBrakeWPF.EventArgs.SettingChangedEventArgs e) { if (e.Key == UserSettingConstants.NotifyOnEncodeDone || e.Key == UserSettingConstants.NotifyOnQueueDone) { this.Setup(); } } public bool SendNotification(string header, string content) { try { this.id += 1; ToastContentBuilder toast = new ToastContentBuilder().AddArgument("tag", this.id.ToString()) .AddText(header); if (!string.IsNullOrEmpty(content)) { toast.AddText(content); } ToastNotification notification = new ToastNotification(toast.GetXml()); notification.ExpirationTime = DateTime.Now.AddDays(1); notification.Group = "HandBrake"; notification.Tag = this.id.ToString(); if (this.notifier != null) { notifier.Show(notification); } return true; } catch (Exception exc) { Debug.WriteLine(exc); return false; } } public void Shutdown() { try { // Clear the history when HandBrake Closes. This information is not likely to be useful anymore. ToastNotificationManagerCompat.History.Clear(); } catch (Exception exc) { Debug.WriteLine(exc); } } public void Uninstall() { try { // Useful utility to allow users to remove HandBrake from Windows Settings. this.notifier = null; ToastNotificationManagerCompat.Uninstall(); isInitialised = false; } catch (Exception exc) { Debug.WriteLine(exc); } } private void Setup() { bool encode = this.userSettingService.GetUserSetting(UserSettingConstants.NotifyOnEncodeDone); bool queue = this.userSettingService.GetUserSetting(UserSettingConstants.NotifyOnQueueDone); if (encode || queue) { if (isInitialised) { return; } try { this.notifier = ToastNotificationManagerCompat.CreateToastNotifier(); isInitialised = true; ToastNotificationManagerCompat.OnActivated += toastArgs => { // Obtain the arguments from the notification ToastArguments args = ToastArguments.Parse(toastArgs.Argument); // Remove any notifications that are clicked System.Collections.Generic.KeyValuePair tag = args.FirstOrDefault(); if (!string.IsNullOrEmpty(tag.Value)) { try { ToastNotificationManagerCompat.History.Remove(tag.Value); } catch (Exception exc) { Debug.WriteLine(exc); } } // Need to dispatch to UI thread if performing UI operations Application.Current.Dispatcher.Invoke(delegate { Window w = Application.Current.MainWindow; if (w != null) { w.WindowState = WindowState.Normal; w.BringIntoView(); } }); }; } catch (Exception exc) { try { this.userSettingService.SetUserSetting(UserSettingConstants.NotifyOnEncodeDone, false); this.userSettingService.SetUserSetting(UserSettingConstants.NotifyOnQueueDone, false); this.Uninstall(); } catch (Exception exc2) { Debug.WriteLine(exc2); } Debug.WriteLine(exc); } } } } }