// 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.Diagnostics.CodeAnalysis;
using Microsoft.PowerToys.Settings.UI.Services;
using Microsoft.PowerToys.Settings.UI.ViewModels;
using Windows.Data.Json;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Automation.Peers;
using Windows.UI.Xaml.Controls;
using WinUI = Microsoft.UI.Xaml.Controls;
namespace Microsoft.PowerToys.Settings.UI.Views
{
///
/// Root page.
///
public sealed partial class ShellPage : UserControl
{
///
/// Declaration for the ipc callback function.
///
/// message.
public delegate void IPCMessageCallback(string msg);
///
/// Declaration for the opening oobe window callback function.
///
public delegate void OobeOpeningCallback();
///
/// Gets or sets a shell handler to be used to update contents of the shell dynamically from page within the frame.
///
public static ShellPage ShellHandler { get; set; }
///
/// Gets or sets iPC default callback function.
///
public static IPCMessageCallback DefaultSndMSGCallback { get; set; }
///
/// Gets or sets iPC callback function for restart as admin.
///
public static IPCMessageCallback SndRestartAsAdminMsgCallback { get; set; }
///
/// Gets or sets iPC callback function for checking updates.
///
public static IPCMessageCallback CheckForUpdatesMsgCallback { get; set; }
///
/// Gets or sets callback function for opening oobe window
///
public static OobeOpeningCallback OpenOobeWindowCallback { get; set; }
///
/// Gets view model.
///
public ShellViewModel ViewModel { get; } = new ShellViewModel();
///
/// Gets a collection of functions that handle IPC responses.
///
public List> IPCResponseHandleList { get; } = new List>();
public static bool IsElevated { get; set; }
public static bool IsUserAnAdmin { get; set; }
///
/// Initializes a new instance of the class.
/// Shell page constructor.
///
public ShellPage()
{
InitializeComponent();
DataContext = ViewModel;
ShellHandler = this;
ViewModel.Initialize(shellFrame, navigationView, KeyboardAccelerators);
shellFrame.Navigate(typeof(GeneralPage));
}
public static int SendDefaultIPCMessage(string msg)
{
DefaultSndMSGCallback?.Invoke(msg);
return 0;
}
public static int SendCheckForUpdatesIPCMessage(string msg)
{
CheckForUpdatesMsgCallback?.Invoke(msg);
return 0;
}
public static int SendRestartAdminIPCMessage(string msg)
{
SndRestartAsAdminMsgCallback?.Invoke(msg);
return 0;
}
///
/// Set Default IPC Message callback function.
///
/// delegate function implementation.
public static void SetDefaultSndMessageCallback(IPCMessageCallback implementation)
{
DefaultSndMSGCallback = implementation;
}
///
/// Set restart as admin IPC callback function.
///
/// delegate function implementation.
public static void SetRestartAdminSndMessageCallback(IPCMessageCallback implementation)
{
SndRestartAsAdminMsgCallback = implementation;
}
///
/// Set check for updates IPC callback function.
///
/// delegate function implementation.
public static void SetCheckForUpdatesMessageCallback(IPCMessageCallback implementation)
{
CheckForUpdatesMsgCallback = implementation;
}
///
/// Set oobe opening callback function
///
/// delegate function implementation.
public static void SetOpenOobeCallback(OobeOpeningCallback implementation)
{
OpenOobeWindowCallback = implementation;
}
public static void SetElevationStatus(bool isElevated)
{
IsElevated = isElevated;
}
public static void SetIsUserAnAdmin(bool isAdmin)
{
IsUserAnAdmin = isAdmin;
}
public static void Navigate(Type type)
{
NavigationService.Navigate(type);
}
public void Refresh()
{
shellFrame.Navigate(typeof(GeneralPage));
}
private void OobeButton_Click(object sender, RoutedEventArgs e)
{
OpenOobeWindowCallback();
}
private bool navigationViewInitialStateProcessed; // avoid announcing initial state of the navigation pane.
[SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "Params are required for event handler signature requirements.")]
#pragma warning disable CA1822 // Mark members as static
private void NavigationView_PaneOpened(Microsoft.UI.Xaml.Controls.NavigationView sender, object args)
{
if (!navigationViewInitialStateProcessed)
{
navigationViewInitialStateProcessed = true;
return;
}
var peer = FrameworkElementAutomationPeer.FromElement(sender);
if (peer == null)
{
peer = FrameworkElementAutomationPeer.CreatePeerForElement(sender);
}
if (AutomationPeer.ListenerExists(AutomationEvents.MenuOpened))
{
var loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
peer.RaiseNotificationEvent(
AutomationNotificationKind.ActionCompleted,
AutomationNotificationProcessing.ImportantMostRecent,
loader.GetString("Shell_NavigationMenu_Announce_Open"),
"navigationMenuPaneOpened");
}
}
[SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "Params are required for event handler signature requirements.")]
private void NavigationView_PaneClosed(Microsoft.UI.Xaml.Controls.NavigationView sender, object args)
{
if (!navigationViewInitialStateProcessed)
{
navigationViewInitialStateProcessed = true;
return;
}
var peer = FrameworkElementAutomationPeer.FromElement(sender);
if (peer == null)
{
peer = FrameworkElementAutomationPeer.CreatePeerForElement(sender);
}
if (AutomationPeer.ListenerExists(AutomationEvents.MenuClosed))
{
var loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
peer.RaiseNotificationEvent(
AutomationNotificationKind.ActionCompleted,
AutomationNotificationProcessing.ImportantMostRecent,
loader.GetString("Shell_NavigationMenu_Announce_Collapse"),
"navigationMenuPaneClosed");
}
}
private void OOBEItem_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
OpenOobeWindowCallback();
}
private async void FeedbackItem_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
await Windows.System.Launcher.LaunchUriAsync(new Uri("https://aka.ms/powerToysGiveFeedback"));
}
}
}