diff --git a/osu.Game/Localisation/GeneralSettingsStrings.cs b/osu.Game/Localisation/GeneralSettingsStrings.cs
index 42623f4632fc..83a3af574c80 100644
--- a/osu.Game/Localisation/GeneralSettingsStrings.cs
+++ b/osu.Game/Localisation/GeneralSettingsStrings.cs
@@ -44,6 +44,11 @@ public static class GeneralSettingsStrings
///
public static LocalisableString CheckUpdate => new TranslatableString(getKey(@"check_update"), @"Check for updates");
+ ///
+ /// "Checking for updates"
+ ///
+ public static LocalisableString CheckingForUpdates => new TranslatableString(getKey(@"checking_for_updates"), @"Checking for updates");
+
///
/// "Open osu! folder"
///
diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
index 82cc952e5379..261103173ea3 100644
--- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
@@ -4,7 +4,6 @@
using System.Threading.Tasks;
using osu.Framework;
using osu.Framework.Allocation;
-using osu.Framework.Extensions;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Localisation;
using osu.Framework.Logging;
@@ -13,6 +12,7 @@
using osu.Framework.Statistics;
using osu.Game.Configuration;
using osu.Game.Localisation;
+using osu.Game.Online.Multiplayer;
using osu.Game.Overlays.Notifications;
using osu.Game.Overlays.Settings.Sections.Maintenance;
using osu.Game.Updater;
@@ -36,8 +36,11 @@ public partial class UpdateSettings : SettingsSubsection
[Resolved]
private Storage storage { get; set; } = null!;
+ [Resolved]
+ private OsuGame? game { get; set; }
+
[BackgroundDependencyLoader]
- private void load(OsuConfigManager config, OsuGame? game)
+ private void load(OsuConfigManager config)
{
Add(new SettingsEnumDropdown
{
@@ -50,23 +53,7 @@ private void load(OsuConfigManager config, OsuGame? game)
Add(checkForUpdatesButton = new SettingsButton
{
Text = GeneralSettingsStrings.CheckUpdate,
- Action = () =>
- {
- checkForUpdatesButton.Enabled.Value = false;
- Task.Run(updateManager.CheckForUpdateAsync).ContinueWith(task => Schedule(() =>
- {
- if (!task.GetResultSafely())
- {
- notifications?.Post(new SimpleNotification
- {
- Text = GeneralSettingsStrings.RunningLatestRelease(game!.Version),
- Icon = FontAwesome.Solid.CheckCircle,
- });
- }
-
- checkForUpdatesButton.Enabled.Value = true;
- }));
- }
+ Action = () => checkForUpdates().FireAndForget()
});
}
@@ -94,6 +81,44 @@ private void load(OsuConfigManager config, OsuGame? game)
}
}
+ private async Task checkForUpdates()
+ {
+ if (updateManager == null || game == null)
+ return;
+
+ checkForUpdatesButton.Enabled.Value = false;
+
+ var checkingNotification = new ProgressNotification
+ {
+ Text = GeneralSettingsStrings.CheckingForUpdates,
+ };
+ notifications?.Post(checkingNotification);
+
+ try
+ {
+ bool foundUpdate = await updateManager.CheckForUpdateAsync().ConfigureAwait(true);
+
+ if (!foundUpdate)
+ {
+ notifications?.Post(new SimpleNotification
+ {
+ Text = GeneralSettingsStrings.RunningLatestRelease(game.Version),
+ Icon = FontAwesome.Solid.CheckCircle,
+ });
+ }
+ }
+ catch
+ {
+ }
+ finally
+ {
+ // This sequence allows the notification to be immediately dismissed.
+ checkingNotification.State = ProgressNotificationState.Cancelled;
+ checkingNotification.Close(false);
+ checkForUpdatesButton.Enabled.Value = true;
+ }
+ }
+
private void exportLogs()
{
ProgressNotification notification = new ProgressNotification