// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.PowerToys.Settings.UI.Activation; using Windows.ApplicationModel.Activation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Microsoft.PowerToys.Settings.UI.Services { // For more information on understanding and extending activation flow see // https://github.com/Microsoft/WindowsTemplateStudio/blob/master/docs/activation.md internal class ActivationService { private readonly App app; private readonly Type defaultNavItem; private Lazy shell; private object lastActivationArgs; public ActivationService(App app, Type defaultNavItem, Lazy shell = null) { this.app = app; this.shell = shell; this.defaultNavItem = defaultNavItem; } public async Task ActivateAsync(object activationArgs) { if (IsInteractive(activationArgs)) { // Initialize services that you need before app activation // take into account that the splash screen is shown while this code runs. await InitializeAsync().ConfigureAwait(false); // Do not repeat app initialization when the Window already has content, // just ensure that the window is active if (Window.Current.Content == null) { // Create a Shell or Frame to act as the navigation context Window.Current.Content = shell?.Value ?? new Frame(); } } // Depending on activationArgs one of ActivationHandlers or DefaultActivationHandler // will navigate to the first page await HandleActivationAsync(activationArgs).ConfigureAwait(false); lastActivationArgs = activationArgs; if (IsInteractive(activationArgs)) { // Ensure the current window is active Window.Current.Activate(); // Tasks after activation await StartupAsync().ConfigureAwait(false); } } private static async Task InitializeAsync() { await Task.CompletedTask.ConfigureAwait(false); } private async Task HandleActivationAsync(object activationArgs) { var activationHandler = GetActivationHandlers() .FirstOrDefault(h => h.CanHandle(activationArgs)); if (activationHandler != null) { await activationHandler.HandleAsync(activationArgs).ConfigureAwait(false); } if (IsInteractive(activationArgs)) { var defaultHandler = new DefaultActivationHandler(defaultNavItem); if (defaultHandler.CanHandle(activationArgs)) { await defaultHandler.HandleAsync(activationArgs).ConfigureAwait(false); } } } private static async Task StartupAsync() { await Task.CompletedTask.ConfigureAwait(false); } private static IEnumerable GetActivationHandlers() { yield break; } private static bool IsInteractive(object args) { return args is IActivatedEventArgs; } } }