1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Improve cancelling builds

This commit is contained in:
Robert 2023-02-26 15:22:02 +01:00
parent 67a4672c66
commit 7aa9fa1a36
5 changed files with 40 additions and 25 deletions

View File

@ -20,6 +20,7 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
private readonly Func<IScreen, SettingsViewModel> _getSettingsViewModel; private readonly Func<IScreen, SettingsViewModel> _getSettingsViewModel;
private readonly IMainWindowService _mainWindowService; private readonly IMainWindowService _mainWindowService;
private readonly IUpdateService _updateService; private readonly IUpdateService _updateService;
private CancellationTokenSource? _cancellationTokenSource;
public WindowsUpdateNotificationProvider(IMainWindowService mainWindowService, public WindowsUpdateNotificationProvider(IMainWindowService mainWindowService,
IUpdateService updateService, IUpdateService updateService,
@ -46,15 +47,15 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
await InstallRelease(releaseId, releaseVersion); await InstallRelease(releaseId, releaseVersion);
else if (action == "view-changes") else if (action == "view-changes")
ViewRelease(releaseId); ViewRelease(releaseId);
else if (action == "cancel")
_cancellationTokenSource?.Cancel();
else if (action == "restart-for-update") else if (action == "restart-for-update")
_updateService.RestartForUpdate(false); _updateService.RestartForUpdate(false);
} }
public async Task ShowNotification(string releaseId, string releaseVersion) public void ShowNotification(string releaseId, string releaseVersion)
{ {
new ToastContentBuilder() GetBuilderForRelease(releaseId, releaseVersion)
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
.AddText("Update available") .AddText("Update available")
.AddText($"Artemis version {releaseVersion} has been released") .AddText($"Artemis version {releaseVersion} has been released")
.AddButton(new ToastButton() .AddButton(new ToastButton()
@ -89,9 +90,7 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
ReleaseInstaller installer = _getReleaseInstaller(releaseId); ReleaseInstaller installer = _getReleaseInstaller(releaseId);
void InstallerOnPropertyChanged(object? sender, PropertyChangedEventArgs e) => UpdateInstallProgress(releaseId, installer); void InstallerOnPropertyChanged(object? sender, PropertyChangedEventArgs e) => UpdateInstallProgress(releaseId, installer);
new ToastContentBuilder() GetBuilderForRelease(releaseId, releaseVersion)
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
.AddAudio(new ToastAudio {Silent = true}) .AddAudio(new ToastAudio {Silent = true})
.AddText("Installing Artemis update") .AddText("Installing Artemis update")
.AddVisualChild(new AdaptiveProgressBar() .AddVisualChild(new AdaptiveProgressBar()
@ -104,19 +103,32 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
.Show(t => .Show(t =>
{ {
t.Tag = releaseId; t.Tag = releaseId;
t.Data = GetInstallerNotificationData(installer); t.Data = GetDataForInstaller(installer);
}); });
// Wait for Windows animations to catch up to us, we fast!
await Task.Delay(2000); await Task.Delay(2000);
_cancellationTokenSource = new CancellationTokenSource();
installer.PropertyChanged += InstallerOnPropertyChanged; installer.PropertyChanged += InstallerOnPropertyChanged;
await installer.InstallAsync(CancellationToken.None); try
{
await installer.InstallAsync(_cancellationTokenSource.Token);
}
catch (Exception)
{
if (_cancellationTokenSource.IsCancellationRequested)
return;
throw;
}
finally
{
installer.PropertyChanged -= InstallerOnPropertyChanged; installer.PropertyChanged -= InstallerOnPropertyChanged;
}
// Queue an update in case the user interrupts the process after everything has been prepared
_updateService.QueueUpdate(); _updateService.QueueUpdate();
new ToastContentBuilder() GetBuilderForRelease(releaseId, releaseVersion)
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
.AddAudio(new ToastAudio {Silent = true}) .AddAudio(new ToastAudio {Silent = true})
.AddText("Update ready") .AddText("Update ready")
.AddText($"Artemis version {releaseVersion} is ready to be applied") .AddText($"Artemis version {releaseVersion} is ready to be applied")
@ -127,10 +139,15 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
private void UpdateInstallProgress(string releaseId, ReleaseInstaller installer) private void UpdateInstallProgress(string releaseId, ReleaseInstaller installer)
{ {
ToastNotificationManagerCompat.CreateToastNotifier().Update(GetInstallerNotificationData(installer), releaseId); ToastNotificationManagerCompat.CreateToastNotifier().Update(GetDataForInstaller(installer), releaseId);
} }
private NotificationData GetInstallerNotificationData(ReleaseInstaller installer) private ToastContentBuilder GetBuilderForRelease(string releaseId, string releaseVersion)
{
return new ToastContentBuilder().AddArgument("releaseId", releaseId).AddArgument("releaseVersion", releaseVersion);
}
private NotificationData GetDataForInstaller(ReleaseInstaller installer)
{ {
NotificationData data = new() NotificationData data = new()
{ {

View File

@ -159,12 +159,10 @@ public class ReleaseViewModel : ActivatableViewModelBase
_updateService.QueueUpdate(); _updateService.QueueUpdate();
InstallationFinished = true; InstallationFinished = true;
} }
catch (TaskCanceledException)
{
// ignored
}
catch (Exception e) catch (Exception e)
{ {
if (_installerCts.IsCancellationRequested)
return;
_windowService.ShowExceptionDialog("Failed to install update", e); _windowService.ShowExceptionDialog("Failed to install update", e);
} }
finally finally

View File

@ -4,5 +4,5 @@ namespace Artemis.UI.Services.Updating;
public interface IUpdateNotificationProvider public interface IUpdateNotificationProvider
{ {
Task ShowNotification(string releaseId, string releaseVersion); void ShowNotification(string releaseId, string releaseVersion);
} }

View File

@ -56,7 +56,7 @@ public class InAppUpdateNotificationProvider : IUpdateNotificationProvider
} }
/// <inheritdoc /> /// <inheritdoc />
public async Task ShowNotification(string releaseId, string releaseVersion) public void ShowNotification(string releaseId, string releaseVersion)
{ {
if (_mainWindowService.IsMainWindowOpen) if (_mainWindowService.IsMainWindowOpen)
ShowInAppNotification(releaseId, releaseVersion); ShowInAppNotification(releaseId, releaseVersion);

View File

@ -84,9 +84,9 @@ public class UpdateService : IUpdateService
Utilities.ApplyUpdate(false); Utilities.ApplyUpdate(false);
} }
private async Task ShowUpdateNotification(IGetNextRelease_NextPublishedRelease release) private void ShowUpdateNotification(IGetNextRelease_NextPublishedRelease release)
{ {
await _updateNotificationProvider.Value.ShowNotification(release.Id, release.Version); _updateNotificationProvider.Value.ShowNotification(release.Id, release.Version);
} }
private async Task AutoInstallUpdate(IGetNextRelease_NextPublishedRelease release) private async Task AutoInstallUpdate(IGetNextRelease_NextPublishedRelease release)
@ -146,7 +146,7 @@ public class UpdateService : IUpdateService
// If the window is open show the changelog, don't auto-update while the user is busy // If the window is open show the changelog, don't auto-update while the user is busy
if (!_autoInstall.Value) if (!_autoInstall.Value)
await ShowUpdateNotification(CachedLatestRelease); ShowUpdateNotification(CachedLatestRelease);
else else
await AutoInstallUpdate(CachedLatestRelease); await AutoInstallUpdate(CachedLatestRelease);