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:
parent
67a4672c66
commit
7aa9fa1a36
@ -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
|
||||||
installer.PropertyChanged -= InstallerOnPropertyChanged;
|
{
|
||||||
|
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();
|
_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()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user