1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-12 21:38:38 +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 IMainWindowService _mainWindowService;
private readonly IUpdateService _updateService;
private CancellationTokenSource? _cancellationTokenSource;
public WindowsUpdateNotificationProvider(IMainWindowService mainWindowService,
IUpdateService updateService,
@ -46,15 +47,15 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
await InstallRelease(releaseId, releaseVersion);
else if (action == "view-changes")
ViewRelease(releaseId);
else if (action == "cancel")
_cancellationTokenSource?.Cancel();
else if (action == "restart-for-update")
_updateService.RestartForUpdate(false);
}
public async Task ShowNotification(string releaseId, string releaseVersion)
public void ShowNotification(string releaseId, string releaseVersion)
{
new ToastContentBuilder()
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
GetBuilderForRelease(releaseId, releaseVersion)
.AddText("Update available")
.AddText($"Artemis version {releaseVersion} has been released")
.AddButton(new ToastButton()
@ -89,9 +90,7 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
ReleaseInstaller installer = _getReleaseInstaller(releaseId);
void InstallerOnPropertyChanged(object? sender, PropertyChangedEventArgs e) => UpdateInstallProgress(releaseId, installer);
new ToastContentBuilder()
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
GetBuilderForRelease(releaseId, releaseVersion)
.AddAudio(new ToastAudio {Silent = true})
.AddText("Installing Artemis update")
.AddVisualChild(new AdaptiveProgressBar()
@ -104,19 +103,32 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
.Show(t =>
{
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);
_cancellationTokenSource = new CancellationTokenSource();
installer.PropertyChanged += InstallerOnPropertyChanged;
await installer.InstallAsync(CancellationToken.None);
installer.PropertyChanged -= InstallerOnPropertyChanged;
try
{
await installer.InstallAsync(_cancellationTokenSource.Token);
}
catch (Exception)
{
if (_cancellationTokenSource.IsCancellationRequested)
return;
throw;
}
finally
{
installer.PropertyChanged -= InstallerOnPropertyChanged;
}
// Queue an update in case the user interrupts the process after everything has been prepared
_updateService.QueueUpdate();
new ToastContentBuilder()
.AddArgument("releaseId", releaseId)
.AddArgument("releaseVersion", releaseVersion)
GetBuilderForRelease(releaseId, releaseVersion)
.AddAudio(new ToastAudio {Silent = true})
.AddText("Update ready")
.AddText($"Artemis version {releaseVersion} is ready to be applied")
@ -127,10 +139,15 @@ public class WindowsUpdateNotificationProvider : IUpdateNotificationProvider
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()
{

View File

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

View File

@ -4,5 +4,5 @@ namespace Artemis.UI.Services.Updating;
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 />
public async Task ShowNotification(string releaseId, string releaseVersion)
public void ShowNotification(string releaseId, string releaseVersion)
{
if (_mainWindowService.IsMainWindowOpen)
ShowInAppNotification(releaseId, releaseVersion);

View File

@ -84,9 +84,9 @@ public class UpdateService : IUpdateService
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)
@ -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 (!_autoInstall.Value)
await ShowUpdateNotification(CachedLatestRelease);
ShowUpdateNotification(CachedLatestRelease);
else
await AutoInstallUpdate(CachedLatestRelease);