Skip to content

Commit 5a2ffc9

Browse files
committed
Merge branch 'main' into dean/app-buttons
2 parents ef8284f + 119e52a commit 5a2ffc9

File tree

7 files changed

+81
-2
lines changed

7 files changed

+81
-2
lines changed

App/App.xaml.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using Microsoft.Windows.AppLifecycle;
2323
using Serilog;
2424
using LaunchActivatedEventArgs = Microsoft.UI.Xaml.LaunchActivatedEventArgs;
25+
using Microsoft.Windows.AppNotifications;
2526

2627
namespace Coder.Desktop.App;
2728

@@ -74,6 +75,7 @@ public App()
7475
services.AddOptions<MutagenControllerConfig>()
7576
.Bind(builder.Configuration.GetSection(MutagenControllerConfigSection));
7677
services.AddSingleton<ISyncSessionController, MutagenController>();
78+
services.AddSingleton<IUserNotifier, UserNotifier>();
7779

7880
// SignInWindow views and view models
7981
services.AddTransient<SignInViewModel>();
@@ -194,10 +196,14 @@ public void OnActivated(object? sender, AppActivationArguments args)
194196
_logger.LogWarning("URI activation with null data");
195197
return;
196198
}
197-
198199
HandleURIActivation(protoArgs.Uri);
199200
break;
200201

202+
case ExtendedActivationKind.AppNotification:
203+
var notificationArgs = (args.Data as AppNotificationActivatedEventArgs)!;
204+
HandleNotification(null, notificationArgs);
205+
break;
206+
201207
default:
202208
_logger.LogWarning("activation for {kind}, which is unhandled", args.Kind);
203209
break;
@@ -210,6 +216,12 @@ public void HandleURIActivation(Uri uri)
210216
_logger.LogInformation("handling URI activation for {path}", uri.AbsolutePath);
211217
}
212218

219+
public void HandleNotification(AppNotificationManager? sender, AppNotificationActivatedEventArgs args)
220+
{
221+
// right now, we don't do anything other than log
222+
_logger.LogInformation("handled notification activation");
223+
}
224+
213225
private static void AddDefaultConfig(IConfigurationBuilder builder)
214226
{
215227
var logPath = Path.Combine(

App/Program.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.UI.Dispatching;
66
using Microsoft.UI.Xaml;
77
using Microsoft.Windows.AppLifecycle;
8+
using Microsoft.Windows.AppNotifications;
89
using WinRT;
910

1011
namespace Coder.Desktop.App;
@@ -28,9 +29,9 @@ private static void Main(string[] args)
2829
{
2930
ComWrappersSupport.InitializeComWrappers();
3031
var mainInstance = GetMainInstance();
32+
var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
3133
if (!mainInstance.IsCurrent)
3234
{
33-
var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
3435
mainInstance.RedirectActivationToAsync(activationArgs).AsTask().Wait();
3536
return;
3637
}
@@ -58,6 +59,15 @@ private static void Main(string[] args)
5859

5960
// redirections via RedirectActivationToAsync above get routed to the App
6061
mainInstance.Activated += app.OnActivated;
62+
var notificationManager = AppNotificationManager.Default;
63+
notificationManager.NotificationInvoked += app.HandleNotification;
64+
notificationManager.Register();
65+
if (activationArgs.Kind != ExtendedActivationKind.Launch)
66+
{
67+
// this means we were activated without having already launched, so handle
68+
// the activation as well.
69+
app.OnActivated(null, activationArgs);
70+
}
6171
});
6272
}
6373
catch (Exception e)

App/Services/UserNotifier.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Microsoft.Windows.AppNotifications;
4+
using Microsoft.Windows.AppNotifications.Builder;
5+
6+
namespace Coder.Desktop.App.Services;
7+
8+
public interface IUserNotifier : IAsyncDisposable
9+
{
10+
public Task ShowErrorNotification(string title, string message);
11+
}
12+
13+
public class UserNotifier : IUserNotifier
14+
{
15+
private readonly AppNotificationManager _notificationManager = AppNotificationManager.Default;
16+
17+
public ValueTask DisposeAsync()
18+
{
19+
return ValueTask.CompletedTask;
20+
}
21+
22+
public Task ShowErrorNotification(string title, string message)
23+
{
24+
var builder = new AppNotificationBuilder().AddText(title).AddText(message);
25+
_notificationManager.Show(builder.BuildNotification());
26+
return Task.CompletedTask;
27+
}
28+
}
29+

App/Utils/TitleBarIcon.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using Microsoft.UI;
3+
using Microsoft.UI.Windowing;
4+
using Microsoft.UI.Xaml;
5+
using Microsoft.UI.Xaml.Controls.Primitives;
6+
using WinRT.Interop;
7+
8+
namespace Coder.Desktop.App.Utils
9+
{
10+
public static class TitleBarIcon
11+
{
12+
public static void SetTitlebarIcon(Window window)
13+
{
14+
var hwnd = WindowNative.GetWindowHandle(window);
15+
var windowId = Win32Interop.GetWindowIdFromWindow(hwnd);
16+
AppWindow.GetFromWindowId(windowId).SetIcon("coder.ico");
17+
}
18+
}
19+
}

App/Views/DirectoryPickerWindow.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.UI.Xaml.Media;
1010
using WinRT.Interop;
1111
using WinUIEx;
12+
using Coder.Desktop.App.Utils;
1213

1314
namespace Coder.Desktop.App.Views;
1415

@@ -17,6 +18,8 @@ public sealed partial class DirectoryPickerWindow : WindowEx
1718
public DirectoryPickerWindow(DirectoryPickerViewModel viewModel)
1819
{
1920
InitializeComponent();
21+
TitleBarIcon.SetTitlebarIcon(this);
22+
2023
SystemBackdrop = new DesktopAcrylicBackdrop();
2124

2225
viewModel.Initialize(this, DispatcherQueue);

App/Views/FileSyncListWindow.xaml.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Coder.Desktop.App.Views.Pages;
33
using Microsoft.UI.Xaml.Media;
44
using WinUIEx;
5+
using Coder.Desktop.App.Utils;
56

67
namespace Coder.Desktop.App.Views;
78

@@ -13,11 +14,14 @@ public FileSyncListWindow(FileSyncListViewModel viewModel)
1314
{
1415
ViewModel = viewModel;
1516
InitializeComponent();
17+
TitleBarIcon.SetTitlebarIcon(this);
18+
1619
SystemBackdrop = new DesktopAcrylicBackdrop();
1720

1821
ViewModel.Initialize(this, DispatcherQueue);
1922
RootFrame.Content = new FileSyncListMainPage(ViewModel);
2023

2124
this.CenterOnScreen();
2225
}
26+
2327
}

App/Views/SignInWindow.xaml.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.UI.Windowing;
88
using Microsoft.UI.Xaml;
99
using Microsoft.UI.Xaml.Media;
10+
using Coder.Desktop.App.Utils;
1011

1112
namespace Coder.Desktop.App.Views;
1213

@@ -23,6 +24,7 @@ public sealed partial class SignInWindow : Window
2324
public SignInWindow(SignInViewModel viewModel)
2425
{
2526
InitializeComponent();
27+
TitleBarIcon.SetTitlebarIcon(this);
2628
SystemBackdrop = new DesktopAcrylicBackdrop();
2729
RootFrame.SizeChanged += RootFrame_SizeChanged;
2830

0 commit comments

Comments
 (0)