From bfad59fa7a609acaaabbacb3ee29390e2747b275 Mon Sep 17 00:00:00 2001 From: FelixSe Date: Tue, 31 Jul 2018 21:13:29 +0200 Subject: [PATCH] Added option to start SystemTray on windows startup --- .../TrayProcessCommunicationServiceTests.cs | 33 +--- .../ApplicationDataContainerAdapter.cs | 7 +- FluentTerminal.App.Services/Constants.cs | 9 + .../FluentTerminal.App.Services.csproj | 11 ++ .../IStartupTaskService.cs | 12 ++ .../ITrayProcessCommunicationService.cs | 2 +- .../TrayProcessCommunicationService.cs | 3 +- .../Settings/GeneralPageViewModel.cs | 161 +++++++++++++----- .../SettingsViewModel.cs | 4 +- FluentTerminal.App/App.xaml.cs | 16 +- FluentTerminal.App/FluentTerminal.App.csproj | 4 +- FluentTerminal.App/Package.appxmanifest | 9 +- .../Services/StartupTaskService.cs | 47 +++++ .../Views/SettingsPages/GeneralSettings.xaml | 10 +- .../SettingsPages/GeneralSettings.xaml.cs | 1 + .../Enums/StartupTaskStatus.cs | 14 ++ .../FluentTerminal.SystemTray.csproj | 4 + FluentTerminal.SystemTray/Program.cs | 26 ++- .../Services/ToggleWindowService.cs | 8 +- 19 files changed, 291 insertions(+), 90 deletions(-) rename {FluentTerminal.App => FluentTerminal.App.Services}/Adapters/ApplicationDataContainerAdapter.cs (94%) create mode 100644 FluentTerminal.App.Services/Constants.cs create mode 100644 FluentTerminal.App.Services/IStartupTaskService.cs create mode 100644 FluentTerminal.App/Services/StartupTaskService.cs create mode 100644 FluentTerminal.Models/Enums/StartupTaskStatus.cs diff --git a/FluentTerminal.App.Services.Test/TrayProcessCommunicationServiceTests.cs b/FluentTerminal.App.Services.Test/TrayProcessCommunicationServiceTests.cs index 6eec2b5..ebc627e 100644 --- a/FluentTerminal.App.Services.Test/TrayProcessCommunicationServiceTests.cs +++ b/FluentTerminal.App.Services.Test/TrayProcessCommunicationServiceTests.cs @@ -43,30 +43,13 @@ namespace FluentTerminal.App.Services.Test var terminalSize = _fixture.Create(); var shellProfile = _fixture.Create(); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); var result = await trayProcessCommunicationService.CreateTerminal(terminalSize, shellProfile); result.Should().BeEquivalentTo(response); } - [Fact] - public async Task Initialize_Default_SendsSetToggleWindowKeyBindingsRequest() - { - var settingsService = new Mock(); - var keyBindings = _fixture.CreateMany(3); - settingsService.Setup(x => x.GetKeyBindings()).Returns(new Dictionary> - { - [Command.ToggleWindow] = keyBindings.ToList() - }); - var appServiceConnection = new Mock(); - var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); - - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); - - appServiceConnection.Verify(x => x.SendMessageAsync(It.Is>(d => d[MessageKeys.Type] == nameof(SetToggleWindowKeyBindingsRequest))), Times.Once); - } - [Fact] public async Task ResizeTerminal_Default_SendsResizeTerminalRequest() { @@ -80,7 +63,7 @@ namespace FluentTerminal.App.Services.Test }); var appServiceConnection = new Mock(); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); await trayProcessCommunicationService.ResizeTerminal(terminalId, terminalSize); @@ -100,7 +83,7 @@ namespace FluentTerminal.App.Services.Test }); var appServiceConnection = new Mock(); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); await trayProcessCommunicationService.WriteText(terminalId, text); @@ -119,7 +102,7 @@ namespace FluentTerminal.App.Services.Test }); var appServiceConnection = new Mock(); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); await trayProcessCommunicationService.CloseTerminal(terminalId); @@ -127,7 +110,7 @@ namespace FluentTerminal.App.Services.Test } [Fact] - public async Task OnMessageReceived_TerminalExitedRequest_InvokesTerminalExitedEvent() + public void OnMessageReceived_TerminalExitedRequest_InvokesTerminalExitedEvent() { var terminalId = _fixture.Create(); var receivedTerminalId = 0; @@ -149,7 +132,7 @@ namespace FluentTerminal.App.Services.Test }); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); var appServiceConnection = new Mock(); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); trayProcessCommunicationService.TerminalExited += (s, e) => { terminalExitedEventCalled = true; @@ -163,7 +146,7 @@ namespace FluentTerminal.App.Services.Test } [Fact] - public async Task OnMessageReceived_DisplayTerminalOutputRequest_InvokesCorrectOutputHandler() + public void OnMessageReceived_DisplayTerminalOutputRequest_InvokesCorrectOutputHandler() { var terminalId = _fixture.Create(); var output = _fixture.Create(); @@ -186,7 +169,7 @@ namespace FluentTerminal.App.Services.Test }); var trayProcessCommunicationService = new TrayProcessCommunicationService(settingsService.Object); var appServiceConnection = new Mock(); - await trayProcessCommunicationService.Initialize(appServiceConnection.Object); + trayProcessCommunicationService.Initialize(appServiceConnection.Object); trayProcessCommunicationService.SubscribeForTerminalOutput(terminalId, o => { receivedOutput = o; diff --git a/FluentTerminal.App/Adapters/ApplicationDataContainerAdapter.cs b/FluentTerminal.App.Services/Adapters/ApplicationDataContainerAdapter.cs similarity index 94% rename from FluentTerminal.App/Adapters/ApplicationDataContainerAdapter.cs rename to FluentTerminal.App.Services/Adapters/ApplicationDataContainerAdapter.cs index c638541..215dc89 100644 --- a/FluentTerminal.App/Adapters/ApplicationDataContainerAdapter.cs +++ b/FluentTerminal.App.Services/Adapters/ApplicationDataContainerAdapter.cs @@ -1,11 +1,10 @@ -using FluentTerminal.App.Services; -using Newtonsoft.Json; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using Windows.Storage; -namespace FluentTerminal.App.Adapters +namespace FluentTerminal.App.Services.Adapters { public class ApplicationDataContainerAdapter : IApplicationDataContainer { @@ -55,4 +54,4 @@ namespace FluentTerminal.App.Adapters _applicationDataContainer.Values[name] = JsonConvert.SerializeObject(value); } } -} \ No newline at end of file +} diff --git a/FluentTerminal.App.Services/Constants.cs b/FluentTerminal.App.Services/Constants.cs new file mode 100644 index 0000000..2d967be --- /dev/null +++ b/FluentTerminal.App.Services/Constants.cs @@ -0,0 +1,9 @@ +namespace FluentTerminal.App.Services +{ + public static class Constants + { + public const string ThemesContainerName = "Themes"; + public const string KeyBindingsContainerName = "KeyBindings"; + public const string ShellProfilesContainerName = "ShellProfiles"; + } +} diff --git a/FluentTerminal.App.Services/FluentTerminal.App.Services.csproj b/FluentTerminal.App.Services/FluentTerminal.App.Services.csproj index be1356e..1a56c1d 100644 --- a/FluentTerminal.App.Services/FluentTerminal.App.Services.csproj +++ b/FluentTerminal.App.Services/FluentTerminal.App.Services.csproj @@ -21,4 +21,15 @@ + + + $(MSBuildProgramFiles32)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd + False + + + $(MSBuildProgramFiles32)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.UniversalApiContract\5.0.0.0\Windows.Foundation.UniversalApiContract.winmd + False + + + diff --git a/FluentTerminal.App.Services/IStartupTaskService.cs b/FluentTerminal.App.Services/IStartupTaskService.cs new file mode 100644 index 0000000..3693ad5 --- /dev/null +++ b/FluentTerminal.App.Services/IStartupTaskService.cs @@ -0,0 +1,12 @@ +using FluentTerminal.Models.Enums; +using System.Threading.Tasks; + +namespace FluentTerminal.App.Services +{ + public interface IStartupTaskService + { + Task DisableStartupTask(); + Task EnableStartupTask(); + Task GetStatus(); + } +} diff --git a/FluentTerminal.App.Services/ITrayProcessCommunicationService.cs b/FluentTerminal.App.Services/ITrayProcessCommunicationService.cs index 8afa216..ca1ebc7 100644 --- a/FluentTerminal.App.Services/ITrayProcessCommunicationService.cs +++ b/FluentTerminal.App.Services/ITrayProcessCommunicationService.cs @@ -9,7 +9,7 @@ namespace FluentTerminal.App.Services { event EventHandler TerminalExited; - Task Initialize(IAppServiceConnection appServiceConnection); + void Initialize(IAppServiceConnection appServiceConnection); Task CreateTerminal(TerminalSize size, ShellProfile shellProfile); diff --git a/FluentTerminal.App.Services/Implementation/TrayProcessCommunicationService.cs b/FluentTerminal.App.Services/Implementation/TrayProcessCommunicationService.cs index d2ed676..8086d60 100644 --- a/FluentTerminal.App.Services/Implementation/TrayProcessCommunicationService.cs +++ b/FluentTerminal.App.Services/Implementation/TrayProcessCommunicationService.cs @@ -37,11 +37,10 @@ namespace FluentTerminal.App.Services.Implementation return JsonConvert.DeserializeObject(responseMessage[MessageKeys.Content]); } - public Task Initialize(IAppServiceConnection appServiceConnection) + public void Initialize(IAppServiceConnection appServiceConnection) { _appServiceConnection = appServiceConnection; _appServiceConnection.MessageReceived += OnMessageReceived; - return UpdateToggleWindowKeyBindings(); } private void OnMessageReceived(object sender, IDictionary e) diff --git a/FluentTerminal.App.ViewModels/Settings/GeneralPageViewModel.cs b/FluentTerminal.App.ViewModels/Settings/GeneralPageViewModel.cs index cc7d7f3..78dcaae 100644 --- a/FluentTerminal.App.ViewModels/Settings/GeneralPageViewModel.cs +++ b/FluentTerminal.App.ViewModels/Settings/GeneralPageViewModel.cs @@ -9,23 +9,61 @@ namespace FluentTerminal.App.ViewModels.Settings { public class GeneralPageViewModel : ViewModelBase { + private readonly ApplicationSettings _applicationSettings; private readonly IDefaultValueProvider _defaultValueProvider; private readonly IDialogService _dialogService; private readonly ISettingsService _settingsService; - private readonly ApplicationSettings _applicationSettings; + private readonly IStartupTaskService _startupTaskService; + private bool _canEnableStartupTask; private bool _editingNewTerminalLocation; private bool _editingTabsPosition; + private bool _startupTaskEnabled; + private string _startupTaskErrorMessage; - public GeneralPageViewModel(ISettingsService settingsService, IDialogService dialogService, IDefaultValueProvider defaultValueProvider) + public GeneralPageViewModel(ISettingsService settingsService, IDialogService dialogService, IDefaultValueProvider defaultValueProvider, IStartupTaskService startupTaskService) { _settingsService = settingsService; _dialogService = dialogService; _defaultValueProvider = defaultValueProvider; + _startupTaskService = startupTaskService; + _applicationSettings = _settingsService.GetApplicationSettings(); RestoreDefaultsCommand = new RelayCommand(async () => await RestoreDefaults().ConfigureAwait(false)); } + public async Task OnNavigatedTo() + { + var startupTaskStatus = await _startupTaskService.GetStatus(); + SetStartupTaskPropertiesForStatus(startupTaskStatus); + } + + public bool AlwaysShowTabs + { + get => _applicationSettings.AlwaysShowTabs; + set + { + if (_applicationSettings.AlwaysShowTabs != value) + { + _applicationSettings.AlwaysShowTabs = value; + _settingsService.SaveApplicationSettings(_applicationSettings); + RaisePropertyChanged(); + } + } + } + + public bool BottomIsSelected + { + get => TabsPosition == TabsPosition.Bottom; + set => TabsPosition = TabsPosition.Bottom; + } + + public bool CanEnableStartupTask + { + get => _canEnableStartupTask; + set => Set(ref _canEnableStartupTask, value); + } + public bool ConfirmClosingTabs { get => _applicationSettings.ConfirmClosingTabs; @@ -54,34 +92,6 @@ namespace FluentTerminal.App.ViewModels.Settings } } - public bool UnderlineSelectedTab - { - get => _applicationSettings.UnderlineSelectedTab; - set - { - if (_applicationSettings.UnderlineSelectedTab != value) - { - _applicationSettings.UnderlineSelectedTab = value; - _settingsService.SaveApplicationSettings(_applicationSettings); - RaisePropertyChanged(); - } - } - } - - public bool AlwaysShowTabs - { - get => _applicationSettings.AlwaysShowTabs; - set - { - if (_applicationSettings.AlwaysShowTabs != value) - { - _applicationSettings.AlwaysShowTabs = value; - _settingsService.SaveApplicationSettings(_applicationSettings); - RaisePropertyChanged(); - } - } - } - public NewTerminalLocation NewTerminalLocation { get => _applicationSettings.NewTerminalLocation; @@ -102,18 +112,32 @@ namespace FluentTerminal.App.ViewModels.Settings public RelayCommand RestoreDefaultsCommand { get; } + public bool StartupTaskEnabled + { + get => _startupTaskEnabled; + set + { + if (_startupTaskEnabled != value) + { + _startupTaskEnabled = value; + RaisePropertyChanged(nameof(StartupTaskEnabled)); + SetStartupTaskState(value); + } + } + } + + public string StartupTaskErrorMessage + { + get => _startupTaskErrorMessage; + set => Set(ref _startupTaskErrorMessage, value); + } + public bool TabIsSelected { get => NewTerminalLocation == NewTerminalLocation.Tab; set => NewTerminalLocation = NewTerminalLocation.Tab; } - public bool WindowIsSelected - { - get => NewTerminalLocation == NewTerminalLocation.Window; - set => NewTerminalLocation = NewTerminalLocation.Window; - } - public TabsPosition TabsPosition { get => _applicationSettings.TabsPosition; @@ -138,10 +162,24 @@ namespace FluentTerminal.App.ViewModels.Settings set => TabsPosition = TabsPosition.Top; } - public bool BottomIsSelected + public bool UnderlineSelectedTab { - get => TabsPosition == TabsPosition.Bottom; - set => TabsPosition = TabsPosition.Bottom; + get => _applicationSettings.UnderlineSelectedTab; + set + { + if (_applicationSettings.UnderlineSelectedTab != value) + { + _applicationSettings.UnderlineSelectedTab = value; + _settingsService.SaveApplicationSettings(_applicationSettings); + RaisePropertyChanged(); + } + } + } + + public bool WindowIsSelected + { + get => NewTerminalLocation == NewTerminalLocation.Window; + set => NewTerminalLocation = NewTerminalLocation.Window; } private async Task RestoreDefaults() @@ -158,5 +196,50 @@ namespace FluentTerminal.App.ViewModels.Settings AlwaysShowTabs = defaults.AlwaysShowTabs; } } + + private void SetStartupTaskPropertiesForStatus(StartupTaskStatus startupTaskStatus) + { + switch (startupTaskStatus) + { + case StartupTaskStatus.Enabled: + StartupTaskEnabled = true; + StartupTaskErrorMessage = string.Empty; + CanEnableStartupTask = true; + break; + + case StartupTaskStatus.Disabled: + StartupTaskEnabled = false; + StartupTaskErrorMessage = string.Empty; + CanEnableStartupTask = true; + break; + + case StartupTaskStatus.DisabledByUser: + StartupTaskEnabled = false; + StartupTaskErrorMessage = "Disabled by user. Please reactivate it in the Startup tab of the Task Manager."; + CanEnableStartupTask = false; + break; + + case StartupTaskStatus.DisabledByPolicy: + StartupTaskEnabled = false; + StartupTaskErrorMessage = "Disabled by policy."; + CanEnableStartupTask = false; + break; + } + } + + private async Task SetStartupTaskState(bool enabled) + { + StartupTaskStatus status; + if (enabled) + { + status = await _startupTaskService.EnableStartupTask(); + } + else + { + _startupTaskService.DisableStartupTask(); + status = await _startupTaskService.GetStatus(); + } + SetStartupTaskPropertiesForStatus(status); + } } } \ No newline at end of file diff --git a/FluentTerminal.App.ViewModels/SettingsViewModel.cs b/FluentTerminal.App.ViewModels/SettingsViewModel.cs index 80f6754..afb6844 100644 --- a/FluentTerminal.App.ViewModels/SettingsViewModel.cs +++ b/FluentTerminal.App.ViewModels/SettingsViewModel.cs @@ -8,10 +8,10 @@ namespace FluentTerminal.App.ViewModels public class SettingsViewModel : ViewModelBase { public SettingsViewModel(ISettingsService settingsService, IDefaultValueProvider defaultValueProvider, IDialogService dialogService, - ITrayProcessCommunicationService trayProcessCommunicationService, IThemeParserFactory themeParserFactory, ISystemFontService systemFontService, IFileSystemService fileSystemService) + ITrayProcessCommunicationService trayProcessCommunicationService, IThemeParserFactory themeParserFactory, ISystemFontService systemFontService, IFileSystemService fileSystemService, IStartupTaskService startupTaskService) { KeyBindings = new KeyBindingsPageViewModel(settingsService, dialogService, defaultValueProvider, trayProcessCommunicationService); - General = new GeneralPageViewModel(settingsService, dialogService, defaultValueProvider); + General = new GeneralPageViewModel(settingsService, dialogService, defaultValueProvider, startupTaskService); Shell = new ProfilesPageViewModel(settingsService, dialogService, defaultValueProvider, fileSystemService); Terminal = new TerminalPageViewModel(settingsService, dialogService, defaultValueProvider, systemFontService); Themes = new ThemesPageViewModel(settingsService, dialogService, defaultValueProvider, themeParserFactory, fileSystemService); diff --git a/FluentTerminal.App/App.xaml.cs b/FluentTerminal.App/App.xaml.cs index fce47f6..730692a 100644 --- a/FluentTerminal.App/App.xaml.cs +++ b/FluentTerminal.App/App.xaml.cs @@ -2,6 +2,7 @@ using FluentTerminal.App.Adapters; using FluentTerminal.App.Dialogs; using FluentTerminal.App.Services; +using FluentTerminal.App.Services.Adapters; using FluentTerminal.App.Services.Dialogs; using FluentTerminal.App.Services.Implementation; using FluentTerminal.App.ViewModels; @@ -29,10 +30,6 @@ namespace FluentTerminal.App { public sealed partial class App : Application { - public const string ThemesContainerName = "Themes"; - public const string KeyBindingsContainerName = "KeyBindings"; - public const string ShellProfilesContainerName = "ShellProfiles"; - public TaskCompletionSource _trayReady = new TaskCompletionSource(); private readonly ISettingsService _settingsService; private readonly ITrayProcessCommunicationService _trayProcessCommunicationService; @@ -55,9 +52,9 @@ namespace FluentTerminal.App { LocalSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings), RoamingSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings), - KeyBindings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)), - ShellProfiles = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)), - Themes = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(ThemesContainerName, ApplicationDataCreateDisposition.Always)) + KeyBindings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)), + ShellProfiles = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)), + Themes = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always)) }; var builder = new ContainerBuilder(); @@ -79,6 +76,7 @@ namespace FluentTerminal.App builder.RegisterType().As().InstancePerDependency(); builder.RegisterType().As().InstancePerDependency(); builder.RegisterType().As().InstancePerDependency(); + builder.RegisterType().As().SingleInstance(); builder.RegisterInstance(applicationDataContainers); _container = builder.Build(); @@ -296,10 +294,10 @@ namespace FluentTerminal.App private async Task StartSystemTray() { - var launch = FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync().AsTask(); + var launch = FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("AppLaunchedParameterGroup").AsTask(); var clearCache = WebView.ClearTemporaryWebDataAsync().AsTask(); await Task.WhenAll(launch, clearCache, _trayReady.Task).ConfigureAwait(true); - await _trayProcessCommunicationService.Initialize(_appServiceConnection).ConfigureAwait(true); + _trayProcessCommunicationService.Initialize(_appServiceConnection); } } } \ No newline at end of file diff --git a/FluentTerminal.App/FluentTerminal.App.csproj b/FluentTerminal.App/FluentTerminal.App.csproj index 30ecce7..76d1654 100644 --- a/FluentTerminal.App/FluentTerminal.App.csproj +++ b/FluentTerminal.App/FluentTerminal.App.csproj @@ -104,7 +104,6 @@ PackageReference - @@ -127,6 +126,7 @@ + @@ -177,6 +177,8 @@ + + diff --git a/FluentTerminal.App/Package.appxmanifest b/FluentTerminal.App/Package.appxmanifest index c49df9d..910a457 100644 --- a/FluentTerminal.App/Package.appxmanifest +++ b/FluentTerminal.App/Package.appxmanifest @@ -26,7 +26,11 @@ - + + + + + @@ -35,6 +39,9 @@ + + + diff --git a/FluentTerminal.App/Services/StartupTaskService.cs b/FluentTerminal.App/Services/StartupTaskService.cs new file mode 100644 index 0000000..fd9042a --- /dev/null +++ b/FluentTerminal.App/Services/StartupTaskService.cs @@ -0,0 +1,47 @@ +using FluentTerminal.Models.Enums; +using System; +using System.Threading.Tasks; +using Windows.ApplicationModel; + +namespace FluentTerminal.App.Services +{ + public class StartupTaskService : IStartupTaskService + { + public const string StartupTaskname = "FluentTerminalStartupTask"; + + public async Task GetStatus() + { + var startupTask = await StartupTask.GetAsync(StartupTaskname); + return ConvertState(startupTask.State); + } + + public async Task EnableStartupTask() + { + var startupTask = await StartupTask.GetAsync(StartupTaskname); + var newState = await startupTask.RequestEnableAsync(); + return ConvertState(newState); + } + + public async Task DisableStartupTask() + { + var startupTask = await StartupTask.GetAsync(StartupTaskname); + startupTask.Disable(); + } + + private StartupTaskStatus ConvertState(StartupTaskState state) + { + switch (state) + { + case StartupTaskState.Disabled: + return StartupTaskStatus.Disabled; + case StartupTaskState.DisabledByUser: + return StartupTaskStatus.DisabledByUser; + case StartupTaskState.Enabled: + return StartupTaskStatus.Enabled; + case StartupTaskState.DisabledByPolicy: + return StartupTaskStatus.DisabledByPolicy; + } + throw new NotImplementedException(); + } + } +} diff --git a/FluentTerminal.App/Views/SettingsPages/GeneralSettings.xaml b/FluentTerminal.App/Views/SettingsPages/GeneralSettings.xaml index 16814ae..3f770d2 100644 --- a/FluentTerminal.App/Views/SettingsPages/GeneralSettings.xaml +++ b/FluentTerminal.App/Views/SettingsPages/GeneralSettings.xaml @@ -35,7 +35,15 @@ - + + + + + {A1AD7385-F92E-46AC-A349-43DC99B1E72D} + FluentTerminal.App.Services + {5EA40453-A0AA-449E-8406-D6EA51D7E70E} FluentTerminal.Models diff --git a/FluentTerminal.SystemTray/Program.cs b/FluentTerminal.SystemTray/Program.cs index 59d0aad..b0608a3 100644 --- a/FluentTerminal.SystemTray/Program.cs +++ b/FluentTerminal.SystemTray/Program.cs @@ -1,4 +1,7 @@ using Autofac; +using FluentTerminal.App.Services; +using FluentTerminal.App.Services.Adapters; +using FluentTerminal.App.Services.Implementation; using FluentTerminal.SystemTray.Services; using GlobalHotKey; using System; @@ -6,6 +9,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Threading; +using Windows.Storage; namespace FluentTerminal.SystemTray { @@ -14,7 +18,7 @@ namespace FluentTerminal.SystemTray private const string MutexName = "FluentTerminalMutex"; [STAThread] - public static void Main() + public static void Main(string[] args) { if (!Mutex.TryOpenExisting(MutexName, out Mutex mutex)) { @@ -23,8 +27,18 @@ namespace FluentTerminal.SystemTray Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + var applicationDataContainers = new ApplicationDataContainers + { + LocalSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings), + RoamingSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings), + KeyBindings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)), + ShellProfiles = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)), + Themes = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always)) + }; + var containerBuilder = new ContainerBuilder(); + containerBuilder.RegisterInstance(applicationDataContainers); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType().SingleInstance(); @@ -32,14 +46,20 @@ namespace FluentTerminal.SystemTray containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType().SingleInstance(); + containerBuilder.RegisterType().As(); + containerBuilder.RegisterType().As(); containerBuilder.RegisterInstance(Dispatcher.CurrentDispatcher).SingleInstance(); var container = containerBuilder.Build(); var appCommunicationService = container.Resolve(); - appCommunicationService.StartAppServiceConnection(); - Task.Run(() => CheckForNewVersion(container.Resolve(), container.Resolve())); + if (args.Length > 0 && args[2] == "appLaunched") + { + appCommunicationService.StartAppServiceConnection(); + } + + Task.Run(() => CheckForNewVersion(container.Resolve(), container.Resolve())); Application.Run(container.Resolve()); mutex.Close(); diff --git a/FluentTerminal.SystemTray/Services/ToggleWindowService.cs b/FluentTerminal.SystemTray/Services/ToggleWindowService.cs index f721ecf..2e2b3ec 100644 --- a/FluentTerminal.SystemTray/Services/ToggleWindowService.cs +++ b/FluentTerminal.SystemTray/Services/ToggleWindowService.cs @@ -1,4 +1,5 @@ -using FluentTerminal.Models; +using FluentTerminal.App.Services; +using FluentTerminal.Models; using FluentTerminal.Models.Enums; using GlobalHotKey; using System; @@ -22,13 +23,16 @@ namespace FluentTerminal.SystemTray.Services private bool _disposedValue; private readonly List _hotKeys; - public ToggleWindowService(Dispatcher dispatcher, HotKeyManager hotKeyManager, NotificationService notificationService) + public ToggleWindowService(Dispatcher dispatcher, HotKeyManager hotKeyManager, NotificationService notificationService, ISettingsService settingsService) { _dispatcher = dispatcher; _notificationService = notificationService; _hotKeyManager = hotKeyManager; _hotKeys = new List(); _hotKeyManager.KeyPressed += OnKeyPressed; + + var keyBindings = settingsService.GetKeyBindings()[Command.ToggleWindow]; + SetHotKeys(keyBindings); } public void Dispose()