mirror of
https://github.com/ppy/osu.git
synced 2025-02-14 22:03:18 +08:00
Merge branch 'master' into update-framework
This commit is contained in:
commit
8f7f6881d3
@ -30,18 +30,16 @@ namespace osu.Desktop.Updater
|
|||||||
private static readonly Logger logger = Logger.GetLogger("updater");
|
private static readonly Logger logger = Logger.GetLogger("updater");
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(NotificationOverlay notification, OsuGameBase game)
|
private void load(NotificationOverlay notification)
|
||||||
{
|
{
|
||||||
notificationOverlay = notification;
|
notificationOverlay = notification;
|
||||||
|
|
||||||
if (game.IsDeployedBuild)
|
Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger));
|
||||||
{
|
|
||||||
Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger));
|
|
||||||
Schedule(() => Task.Run(() => checkForUpdateAsync()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null)
|
protected override async Task PerformUpdateCheck() => await checkForUpdateAsync();
|
||||||
|
|
||||||
|
private async Task checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null)
|
||||||
{
|
{
|
||||||
// should we schedule a retry on completion of this check?
|
// should we schedule a retry on completion of this check?
|
||||||
bool scheduleRecheck = true;
|
bool scheduleRecheck = true;
|
||||||
@ -83,7 +81,7 @@ namespace osu.Desktop.Updater
|
|||||||
|
|
||||||
// could fail if deltas are unavailable for full update path (https://github.com/Squirrel/Squirrel.Windows/issues/959)
|
// could fail if deltas are unavailable for full update path (https://github.com/Squirrel/Squirrel.Windows/issues/959)
|
||||||
// try again without deltas.
|
// try again without deltas.
|
||||||
checkForUpdateAsync(false, notification);
|
await checkForUpdateAsync(false, notification);
|
||||||
scheduleRecheck = false;
|
scheduleRecheck = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -102,7 +100,7 @@ namespace osu.Desktop.Updater
|
|||||||
if (scheduleRecheck)
|
if (scheduleRecheck)
|
||||||
{
|
{
|
||||||
// check again in 30 minutes.
|
// check again in 30 minutes.
|
||||||
Scheduler.AddDelayed(() => checkForUpdateAsync(), 60000 * 30);
|
Scheduler.AddDelayed(async () => await checkForUpdateAsync(), 60000 * 30);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ using osu.Game.Graphics.UserInterface;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens;
|
using osu.Game.Screens;
|
||||||
using osu.Game.Screens.Menu;
|
using osu.Game.Screens.Menu;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
@ -100,6 +101,8 @@ namespace osu.Game.Tests.Visual.Navigation
|
|||||||
|
|
||||||
public new BeatmapManager BeatmapManager => base.BeatmapManager;
|
public new BeatmapManager BeatmapManager => base.BeatmapManager;
|
||||||
|
|
||||||
|
public new ScoreManager ScoreManager => base.ScoreManager;
|
||||||
|
|
||||||
public new SettingsPanel Settings => base.Settings;
|
public new SettingsPanel Settings => base.Settings;
|
||||||
|
|
||||||
public new MusicController MusicController => base.MusicController;
|
public new MusicController MusicController => base.MusicController;
|
||||||
|
155
osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs
Normal file
155
osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Screens;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Rulesets.Mania;
|
||||||
|
using osu.Game.Rulesets.Osu;
|
||||||
|
using osu.Game.Scoring;
|
||||||
|
using osu.Game.Screens.Menu;
|
||||||
|
using osu.Game.Screens.Play;
|
||||||
|
using osu.Game.Screens.Ranking;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Visual.Navigation
|
||||||
|
{
|
||||||
|
public class TestScenePresentScore : OsuGameTestScene
|
||||||
|
{
|
||||||
|
private BeatmapSetInfo beatmap;
|
||||||
|
|
||||||
|
[SetUpSteps]
|
||||||
|
public new void SetUpSteps()
|
||||||
|
{
|
||||||
|
AddStep("import beatmap", () =>
|
||||||
|
{
|
||||||
|
var difficulty = new BeatmapDifficulty();
|
||||||
|
var metadata = new BeatmapMetadata
|
||||||
|
{
|
||||||
|
Artist = "SomeArtist",
|
||||||
|
AuthorString = "SomeAuthor",
|
||||||
|
Title = "import"
|
||||||
|
};
|
||||||
|
|
||||||
|
beatmap = Game.BeatmapManager.Import(new BeatmapSetInfo
|
||||||
|
{
|
||||||
|
Hash = Guid.NewGuid().ToString(),
|
||||||
|
OnlineBeatmapSetID = 1,
|
||||||
|
Metadata = metadata,
|
||||||
|
Beatmaps = new List<BeatmapInfo>
|
||||||
|
{
|
||||||
|
new BeatmapInfo
|
||||||
|
{
|
||||||
|
OnlineBeatmapID = 1 * 1024,
|
||||||
|
Metadata = metadata,
|
||||||
|
BaseDifficulty = difficulty,
|
||||||
|
Ruleset = new OsuRuleset().RulesetInfo
|
||||||
|
},
|
||||||
|
new BeatmapInfo
|
||||||
|
{
|
||||||
|
OnlineBeatmapID = 1 * 2048,
|
||||||
|
Metadata = metadata,
|
||||||
|
BaseDifficulty = difficulty,
|
||||||
|
Ruleset = new OsuRuleset().RulesetInfo
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}).Result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestFromMainMenu([Values] ScorePresentType type)
|
||||||
|
{
|
||||||
|
var firstImport = importScore(1);
|
||||||
|
var secondimport = importScore(3);
|
||||||
|
|
||||||
|
presentAndConfirm(firstImport, type);
|
||||||
|
returnToMenu();
|
||||||
|
presentAndConfirm(secondimport, type);
|
||||||
|
returnToMenu();
|
||||||
|
returnToMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestFromMainMenuDifferentRuleset([Values] ScorePresentType type)
|
||||||
|
{
|
||||||
|
var firstImport = importScore(1);
|
||||||
|
var secondimport = importScore(3, new ManiaRuleset().RulesetInfo);
|
||||||
|
|
||||||
|
presentAndConfirm(firstImport, type);
|
||||||
|
returnToMenu();
|
||||||
|
presentAndConfirm(secondimport, type);
|
||||||
|
returnToMenu();
|
||||||
|
returnToMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestFromSongSelect([Values] ScorePresentType type)
|
||||||
|
{
|
||||||
|
var firstImport = importScore(1);
|
||||||
|
presentAndConfirm(firstImport, type);
|
||||||
|
|
||||||
|
var secondimport = importScore(3);
|
||||||
|
presentAndConfirm(secondimport, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestFromSongSelectDifferentRuleset([Values] ScorePresentType type)
|
||||||
|
{
|
||||||
|
var firstImport = importScore(1);
|
||||||
|
presentAndConfirm(firstImport, type);
|
||||||
|
|
||||||
|
var secondimport = importScore(3, new ManiaRuleset().RulesetInfo);
|
||||||
|
presentAndConfirm(secondimport, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void returnToMenu()
|
||||||
|
{
|
||||||
|
AddStep("return to menu", () => Game.ScreenStack.CurrentScreen.Exit());
|
||||||
|
AddUntilStep("wait for menu", () => Game.ScreenStack.CurrentScreen is MainMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Func<ScoreInfo> importScore(int i, RulesetInfo ruleset = null)
|
||||||
|
{
|
||||||
|
ScoreInfo imported = null;
|
||||||
|
AddStep($"import score {i}", () =>
|
||||||
|
{
|
||||||
|
imported = Game.ScoreManager.Import(new ScoreInfo
|
||||||
|
{
|
||||||
|
Hash = Guid.NewGuid().ToString(),
|
||||||
|
OnlineScoreID = i,
|
||||||
|
Beatmap = beatmap.Beatmaps.First(),
|
||||||
|
Ruleset = ruleset ?? new OsuRuleset().RulesetInfo
|
||||||
|
}).Result;
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert($"import {i} succeeded", () => imported != null);
|
||||||
|
|
||||||
|
return () => imported;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void presentAndConfirm(Func<ScoreInfo> getImport, ScorePresentType type)
|
||||||
|
{
|
||||||
|
AddStep("present score", () => Game.PresentScore(getImport(), type));
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ScorePresentType.Results:
|
||||||
|
AddUntilStep("wait for results", () => Game.ScreenStack.CurrentScreen is ResultsScreen);
|
||||||
|
AddUntilStep("correct score displayed", () => ((ResultsScreen)Game.ScreenStack.CurrentScreen).Score.ID == getImport().ID);
|
||||||
|
AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Ruleset.ID);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ScorePresentType.Gameplay:
|
||||||
|
AddUntilStep("wait for player loader", () => Game.ScreenStack.CurrentScreen is ReplayPlayerLoader);
|
||||||
|
AddUntilStep("correct score displayed", () => ((ReplayPlayerLoader)Game.ScreenStack.CurrentScreen).Score.ID == getImport().ID);
|
||||||
|
AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Ruleset.ID);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,6 @@ using osu.Game.Graphics.Containers;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Input;
|
using osu.Game.Input;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
using osu.Game.Screens.Play;
|
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
using osu.Game.Online.Chat;
|
using osu.Game.Online.Chat;
|
||||||
using osu.Game.Skinning;
|
using osu.Game.Skinning;
|
||||||
@ -43,6 +42,8 @@ using osuTK.Graphics;
|
|||||||
using osu.Game.Overlays.Volume;
|
using osu.Game.Overlays.Volume;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
|
using osu.Game.Screens.Play;
|
||||||
|
using osu.Game.Screens.Ranking;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Game.Updater;
|
using osu.Game.Updater;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
@ -360,7 +361,7 @@ namespace osu.Game
|
|||||||
/// Present a score's replay immediately.
|
/// Present a score's replay immediately.
|
||||||
/// The user should have already requested this interactively.
|
/// The user should have already requested this interactively.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void PresentScore(ScoreInfo score)
|
public void PresentScore(ScoreInfo score, ScorePresentType presentType = ScorePresentType.Results)
|
||||||
{
|
{
|
||||||
// The given ScoreInfo may have missing properties if it was retrieved from online data. Re-retrieve it from the database
|
// The given ScoreInfo may have missing properties if it was retrieved from online data. Re-retrieve it from the database
|
||||||
// to ensure all the required data for presenting a replay are present.
|
// to ensure all the required data for presenting a replay are present.
|
||||||
@ -392,9 +393,19 @@ namespace osu.Game
|
|||||||
|
|
||||||
PerformFromScreen(screen =>
|
PerformFromScreen(screen =>
|
||||||
{
|
{
|
||||||
|
Ruleset.Value = databasedScore.ScoreInfo.Ruleset;
|
||||||
Beatmap.Value = BeatmapManager.GetWorkingBeatmap(databasedBeatmap);
|
Beatmap.Value = BeatmapManager.GetWorkingBeatmap(databasedBeatmap);
|
||||||
|
|
||||||
screen.Push(new ReplayPlayerLoader(databasedScore));
|
switch (presentType)
|
||||||
|
{
|
||||||
|
case ScorePresentType.Gameplay:
|
||||||
|
screen.Push(new ReplayPlayerLoader(databasedScore));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ScorePresentType.Results:
|
||||||
|
screen.Push(new SoloResultsScreen(databasedScore.ScoreInfo));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}, validScreens: new[] { typeof(PlaySongSelect) });
|
}, validScreens: new[] { typeof(PlaySongSelect) });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,6 +622,9 @@ namespace osu.Game
|
|||||||
|
|
||||||
loadComponentSingleFile(screenshotManager, Add);
|
loadComponentSingleFile(screenshotManager, Add);
|
||||||
|
|
||||||
|
// dependency on notification overlay, dependent by settings overlay
|
||||||
|
loadComponentSingleFile(CreateUpdateManager(), Add, true);
|
||||||
|
|
||||||
// overlay elements
|
// overlay elements
|
||||||
loadComponentSingleFile(beatmapListing = new BeatmapListingOverlay(), overlayContent.Add, true);
|
loadComponentSingleFile(beatmapListing = new BeatmapListingOverlay(), overlayContent.Add, true);
|
||||||
loadComponentSingleFile(dashboard = new DashboardOverlay(), overlayContent.Add, true);
|
loadComponentSingleFile(dashboard = new DashboardOverlay(), overlayContent.Add, true);
|
||||||
@ -643,7 +657,6 @@ namespace osu.Game
|
|||||||
chatOverlay.State.ValueChanged += state => channelManager.HighPollRate.Value = state.NewValue == Visibility.Visible;
|
chatOverlay.State.ValueChanged += state => channelManager.HighPollRate.Value = state.NewValue == Visibility.Visible;
|
||||||
|
|
||||||
Add(externalLinkOpener = new ExternalLinkOpener());
|
Add(externalLinkOpener = new ExternalLinkOpener());
|
||||||
Add(CreateUpdateManager()); // dependency on notification overlay
|
|
||||||
|
|
||||||
// side overlays which cancel each other.
|
// side overlays which cancel each other.
|
||||||
var singleDisplaySideOverlays = new OverlayContainer[] { Settings, notifications };
|
var singleDisplaySideOverlays = new OverlayContainer[] { Settings, notifications };
|
||||||
@ -1000,4 +1013,10 @@ namespace osu.Game
|
|||||||
Exit();
|
Exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ScorePresentType
|
||||||
|
{
|
||||||
|
Results,
|
||||||
|
Gameplay
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,26 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Threading.Tasks;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Overlays.Settings.Sections.Maintenance;
|
using osu.Game.Overlays.Settings.Sections.Maintenance;
|
||||||
|
using osu.Game.Updater;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Settings.Sections.General
|
namespace osu.Game.Overlays.Settings.Sections.General
|
||||||
{
|
{
|
||||||
public class UpdateSettings : SettingsSubsection
|
public class UpdateSettings : SettingsSubsection
|
||||||
{
|
{
|
||||||
|
[Resolved(CanBeNull = true)]
|
||||||
|
private UpdateManager updateManager { get; set; }
|
||||||
|
|
||||||
protected override string Header => "Updates";
|
protected override string Header => "Updates";
|
||||||
|
|
||||||
|
private SettingsButton checkForUpdatesButton;
|
||||||
|
|
||||||
[BackgroundDependencyLoader(true)]
|
[BackgroundDependencyLoader(true)]
|
||||||
private void load(Storage storage, OsuConfigManager config, OsuGame game)
|
private void load(Storage storage, OsuConfigManager config, OsuGame game)
|
||||||
{
|
{
|
||||||
@ -23,6 +30,19 @@ namespace osu.Game.Overlays.Settings.Sections.General
|
|||||||
Bindable = config.GetBindable<ReleaseStream>(OsuSetting.ReleaseStream),
|
Bindable = config.GetBindable<ReleaseStream>(OsuSetting.ReleaseStream),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (updateManager?.CanCheckForUpdate == true)
|
||||||
|
{
|
||||||
|
Add(checkForUpdatesButton = new SettingsButton
|
||||||
|
{
|
||||||
|
Text = "Check for updates",
|
||||||
|
Action = () =>
|
||||||
|
{
|
||||||
|
checkForUpdatesButton.Enabled.Value = false;
|
||||||
|
Task.Run(updateManager.CheckForUpdateAsync).ContinueWith(t => Schedule(() => checkForUpdatesButton.Enabled.Value = true));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (RuntimeInfo.IsDesktop)
|
if (RuntimeInfo.IsDesktop)
|
||||||
{
|
{
|
||||||
Add(new SettingsButton
|
Add(new SettingsButton
|
||||||
|
@ -16,7 +16,10 @@ namespace osu.Game.Scoring
|
|||||||
{
|
{
|
||||||
ScoreInfo = score;
|
ScoreInfo = score;
|
||||||
|
|
||||||
var replayFilename = score.Files.First(f => f.Filename.EndsWith(".osr", StringComparison.InvariantCultureIgnoreCase)).FileInfo.StoragePath;
|
var replayFilename = score.Files.FirstOrDefault(f => f.Filename.EndsWith(".osr", StringComparison.InvariantCultureIgnoreCase))?.FileInfo.StoragePath;
|
||||||
|
|
||||||
|
if (replayFilename == null)
|
||||||
|
return;
|
||||||
|
|
||||||
using (var stream = store.GetStream(replayFilename))
|
using (var stream = store.GetStream(replayFilename))
|
||||||
Replay = new DatabasedLegacyScoreDecoder(rulesets, beatmaps).Parse(stream).Replay;
|
Replay = new DatabasedLegacyScoreDecoder(rulesets, beatmaps).Parse(stream).Replay;
|
||||||
|
@ -9,7 +9,7 @@ namespace osu.Game.Screens.Play
|
|||||||
{
|
{
|
||||||
public class ReplayPlayerLoader : PlayerLoader
|
public class ReplayPlayerLoader : PlayerLoader
|
||||||
{
|
{
|
||||||
private readonly ScoreInfo scoreInfo;
|
public readonly ScoreInfo Score;
|
||||||
|
|
||||||
public ReplayPlayerLoader(Score score)
|
public ReplayPlayerLoader(Score score)
|
||||||
: base(() => new ReplayPlayer(score))
|
: base(() => new ReplayPlayer(score))
|
||||||
@ -17,14 +17,14 @@ namespace osu.Game.Screens.Play
|
|||||||
if (score.Replay == null)
|
if (score.Replay == null)
|
||||||
throw new ArgumentException($"{nameof(score)} must have a non-null {nameof(score.Replay)}.", nameof(score));
|
throw new ArgumentException($"{nameof(score)} must have a non-null {nameof(score.Replay)}.", nameof(score));
|
||||||
|
|
||||||
scoreInfo = score.ScoreInfo;
|
Score = score.ScoreInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnEntering(IScreen last)
|
public override void OnEntering(IScreen last)
|
||||||
{
|
{
|
||||||
// these will be reverted thanks to PlayerLoader's lease.
|
// these will be reverted thanks to PlayerLoader's lease.
|
||||||
Mods.Value = scoreInfo.Mods;
|
Mods.Value = Score.Mods;
|
||||||
Ruleset.Value = scoreInfo.Ruleset;
|
Ruleset.Value = Score.Ruleset;
|
||||||
|
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ namespace osu.Game.Screens.Ranking
|
|||||||
switch (State.Value)
|
switch (State.Value)
|
||||||
{
|
{
|
||||||
case DownloadState.LocallyAvailable:
|
case DownloadState.LocallyAvailable:
|
||||||
game?.PresentScore(Model.Value);
|
game?.PresentScore(Model.Value, ScorePresentType.Gameplay);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DownloadState.NotDownloaded:
|
case DownloadState.NotDownloaded:
|
||||||
|
@ -28,12 +28,9 @@ namespace osu.Game.Updater
|
|||||||
private void load(OsuGameBase game)
|
private void load(OsuGameBase game)
|
||||||
{
|
{
|
||||||
version = game.Version;
|
version = game.Version;
|
||||||
|
|
||||||
if (game.IsDeployedBuild)
|
|
||||||
Schedule(() => Task.Run(checkForUpdateAsync));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void checkForUpdateAsync()
|
protected override async Task PerformUpdateCheck()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Threading.Tasks;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
@ -16,6 +17,13 @@ namespace osu.Game.Updater
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class UpdateManager : CompositeDrawable
|
public class UpdateManager : CompositeDrawable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Whether this UpdateManager should be or is capable of checking for updates.
|
||||||
|
/// </summary>
|
||||||
|
public bool CanCheckForUpdate => game.IsDeployedBuild &&
|
||||||
|
// only implementations will actually check for updates.
|
||||||
|
GetType() != typeof(UpdateManager);
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private OsuConfigManager config { get; set; }
|
private OsuConfigManager config { get; set; }
|
||||||
|
|
||||||
@ -29,7 +37,10 @@ namespace osu.Game.Updater
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
|
Schedule(() => Task.Run(CheckForUpdateAsync));
|
||||||
|
|
||||||
var version = game.Version;
|
var version = game.Version;
|
||||||
|
|
||||||
var lastVersion = config.Get<string>(OsuSetting.Version);
|
var lastVersion = config.Get<string>(OsuSetting.Version);
|
||||||
|
|
||||||
if (game.IsDeployedBuild && version != lastVersion)
|
if (game.IsDeployedBuild && version != lastVersion)
|
||||||
@ -44,6 +55,28 @@ namespace osu.Game.Updater
|
|||||||
config.Set(OsuSetting.Version, version);
|
config.Set(OsuSetting.Version, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly object updateTaskLock = new object();
|
||||||
|
|
||||||
|
private Task updateCheckTask;
|
||||||
|
|
||||||
|
public async Task CheckForUpdateAsync()
|
||||||
|
{
|
||||||
|
if (!CanCheckForUpdate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Task waitTask;
|
||||||
|
|
||||||
|
lock (updateTaskLock)
|
||||||
|
waitTask = (updateCheckTask ??= PerformUpdateCheck());
|
||||||
|
|
||||||
|
await waitTask;
|
||||||
|
|
||||||
|
lock (updateTaskLock)
|
||||||
|
updateCheckTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Task PerformUpdateCheck() => Task.CompletedTask;
|
||||||
|
|
||||||
private class UpdateCompleteNotification : SimpleNotification
|
private class UpdateCompleteNotification : SimpleNotification
|
||||||
{
|
{
|
||||||
private readonly string version;
|
private readonly string version;
|
||||||
|
Loading…
Reference in New Issue
Block a user