// 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 (this.IsInteractive(activationArgs)) { // Initialize services that you need before app activation // take into account that the splash screen is shown while this code runs. await this.InitializeAsync(); // 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 = this.shell?.Value ?? new Frame(); } } // Depending on activationArgs one of ActivationHandlers or DefaultActivationHandler // will navigate to the first page await this.HandleActivationAsync(activationArgs); this.lastActivationArgs = activationArgs; if (this.IsInteractive(activationArgs)) { // Ensure the current window is active Window.Current.Activate(); // Tasks after activation await this.StartupAsync(); } } private async Task InitializeAsync() { await Task.CompletedTask; } private async Task HandleActivationAsync(object activationArgs) { var activationHandler = this.GetActivationHandlers() .FirstOrDefault(h => h.CanHandle(activationArgs)); if (activationHandler != null) { await activationHandler.HandleAsync(activationArgs); } if (this.IsInteractive(activationArgs)) { var defaultHandler = new DefaultActivationHandler(this.defaultNavItem); if (defaultHandler.CanHandle(activationArgs)) { await defaultHandler.HandleAsync(activationArgs); } } } private async Task StartupAsync() { await Task.CompletedTask; } private IEnumerable GetActivationHandlers() { yield break; } private bool IsInteractive(object args) { return args is IActivatedEventArgs; } } }