diff --git a/osu.Android.props b/osu.Android.props
index 6744590f0d..2c5e54d4f5 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -63,6 +63,6 @@
-
+
diff --git a/osu.Desktop/OsuGameDesktop.cs b/osu.Desktop/OsuGameDesktop.cs
index 18f0cd1f80..761f52f961 100644
--- a/osu.Desktop/OsuGameDesktop.cs
+++ b/osu.Desktop/OsuGameDesktop.cs
@@ -1,4 +1,4 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
@@ -38,9 +38,9 @@ namespace osu.Desktop
if (Host is DesktopGameHost desktopHost)
return new StableStorage(desktopHost);
}
- catch (Exception e)
+ catch (Exception)
{
- Logger.Error(e, "Error while searching for stable install");
+ Logger.Log("Could not find a stable install", LoggingTarget.Runtime, LogLevel.Important);
}
return null;
@@ -52,11 +52,7 @@ namespace osu.Desktop
if (!noVersionOverlay)
{
- LoadComponentAsync(versionManager = new VersionManager { Depth = int.MinValue }, v =>
- {
- Add(v);
- v.Show();
- });
+ LoadComponentAsync(versionManager = new VersionManager { Depth = int.MinValue }, Add);
if (RuntimeInfo.OS == RuntimeInfo.Platform.Windows)
Add(new SquirrelUpdateManager());
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
index 6bc19ee3b5..24a437c20e 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SliderBody.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
protected Path Path => path;
- public float PathRadius
+ public virtual float PathRadius
{
get => path.PathRadius;
set => path.PathRadius = value;
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
index a3d3893c8b..0590ca1d96 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
@@ -24,6 +24,20 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
public double? SnakedStart { get; private set; }
public double? SnakedEnd { get; private set; }
+ public override float PathRadius
+ {
+ get => base.PathRadius;
+ set
+ {
+ if (base.PathRadius == value)
+ return;
+
+ base.PathRadius = value;
+
+ Refresh();
+ }
+ }
+
public override Vector2 PathOffset => snakedPathOffset;
///
diff --git a/osu.Game.Tests/Visual/Background/TestSceneUserDimContainer.cs b/osu.Game.Tests/Visual/Background/TestSceneUserDimContainer.cs
index dc4ceed59e..f114559114 100644
--- a/osu.Game.Tests/Visual/Background/TestSceneUserDimContainer.cs
+++ b/osu.Game.Tests/Visual/Background/TestSceneUserDimContainer.cs
@@ -17,7 +17,6 @@ using osu.Framework.Platform;
using osu.Framework.Screens;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
-using osu.Game.Database;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
@@ -51,26 +50,14 @@ namespace osu.Game.Tests.Visual.Background
private DummySongSelect songSelect;
private TestPlayerLoader playerLoader;
private TestPlayer player;
- private DatabaseContextFactory factory;
private BeatmapManager manager;
private RulesetStore rulesets;
[BackgroundDependencyLoader]
private void load(GameHost host, AudioManager audio)
{
- factory = new DatabaseContextFactory(LocalStorage);
- factory.ResetDatabase();
-
- using (var usage = factory.Get())
- usage.Migrate();
-
- factory.ResetDatabase();
-
- using (var usage = factory.Get())
- usage.Migrate();
-
- Dependencies.Cache(rulesets = new RulesetStore(factory));
- Dependencies.Cache(manager = new BeatmapManager(LocalStorage, factory, rulesets, null, audio, host, Beatmap.Default));
+ Dependencies.Cache(rulesets = new RulesetStore(ContextFactory));
+ Dependencies.Cache(manager = new BeatmapManager(LocalStorage, ContextFactory, rulesets, null, audio, host, Beatmap.Default));
Dependencies.Cache(new OsuConfigManager(LocalStorage));
manager.Import(TestResources.GetTestBeatmapForImport()).Wait();
diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
index f3255814f2..680250a226 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
@@ -15,7 +15,6 @@ using osu.Framework.MathUtils;
using osu.Framework.Platform;
using osu.Framework.Screens;
using osu.Game.Beatmaps;
-using osu.Game.Database;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu;
@@ -35,7 +34,6 @@ namespace osu.Game.Tests.Visual.SongSelect
private RulesetStore rulesets;
private WorkingBeatmap defaultBeatmap;
- private DatabaseContextFactory factory;
public override IReadOnlyList RequiredTypes => new[]
{
@@ -74,28 +72,11 @@ namespace osu.Game.Tests.Visual.SongSelect
private TestSongSelect songSelect;
- protected override void Dispose(bool isDisposing)
- {
- factory.ResetDatabase();
- base.Dispose(isDisposing);
- }
-
[BackgroundDependencyLoader]
private void load(GameHost host, AudioManager audio)
{
- factory = new DatabaseContextFactory(LocalStorage);
- factory.ResetDatabase();
-
- using (var usage = factory.Get())
- usage.Migrate();
-
- factory.ResetDatabase();
-
- using (var usage = factory.Get())
- usage.Migrate();
-
- Dependencies.Cache(rulesets = new RulesetStore(factory));
- Dependencies.Cache(manager = new BeatmapManager(LocalStorage, factory, rulesets, null, audio, host, defaultBeatmap = Beatmap.Default));
+ Dependencies.Cache(rulesets = new RulesetStore(ContextFactory));
+ Dependencies.Cache(manager = new BeatmapManager(LocalStorage, ContextFactory, rulesets, null, audio, host, defaultBeatmap = Beatmap.Default));
Beatmap.SetDefault();
}
diff --git a/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentMatch.cs b/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentMatch.cs
index f329623703..e65b708fea 100644
--- a/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentMatch.cs
+++ b/osu.Game.Tournament.Tests/Components/TestSceneDrawableTournamentMatch.cs
@@ -5,14 +5,13 @@ using System;
using System.Collections.Generic;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Tests.Visual;
using osu.Game.Tournament.Components;
using osu.Game.Tournament.Models;
using osu.Game.Tournament.Screens.Ladder.Components;
namespace osu.Game.Tournament.Tests.Components
{
- public class TestSceneDrawableTournamentMatch : OsuTestScene
+ public class TestSceneDrawableTournamentMatch : TournamentTestScene
{
public override IReadOnlyList RequiredTypes => new[]
{
diff --git a/osu.Game.Tournament.Tests/LadderTestScene.cs b/osu.Game.Tournament.Tests/LadderTestScene.cs
index b49341d0d1..dae0721023 100644
--- a/osu.Game.Tournament.Tests/LadderTestScene.cs
+++ b/osu.Game.Tournament.Tests/LadderTestScene.cs
@@ -1,13 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using NUnit.Framework;
using osu.Framework.Allocation;
-using osu.Game.Tests.Visual;
using osu.Game.Tournament.Models;
namespace osu.Game.Tournament.Tests
{
- public abstract class LadderTestScene : OsuTestScene
+ [TestFixture]
+ public abstract class LadderTestScene : TournamentTestScene
{
[Resolved]
protected LadderInfo Ladder { get; private set; }
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
index 201736f38a..9de00818a5 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneGameplayScreen.cs
@@ -2,13 +2,12 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Game.Tests.Visual;
using osu.Game.Tournament.Components;
using osu.Game.Tournament.Screens.Gameplay;
namespace osu.Game.Tournament.Tests.Screens
{
- public class TestSceneGameplayScreen : OsuTestScene
+ public class TestSceneGameplayScreen : TournamentTestScene
{
[Cached]
private TournamentMatchChatDisplay chat = new TournamentMatchChatDisplay();
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
index f3e65919eb..2277302e98 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneScheduleScreen.cs
@@ -2,12 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Game.Tests.Visual;
using osu.Game.Tournament.Screens.Schedule;
namespace osu.Game.Tournament.Tests.Screens
{
- public class TestSceneScheduleScreen : OsuTestScene
+ public class TestSceneScheduleScreen : TournamentTestScene
{
[BackgroundDependencyLoader]
private void load()
diff --git a/osu.Game.Tournament.Tests/Screens/TestSceneShowcaseScreen.cs b/osu.Game.Tournament.Tests/Screens/TestSceneShowcaseScreen.cs
index edf1477b06..8c43e25416 100644
--- a/osu.Game.Tournament.Tests/Screens/TestSceneShowcaseScreen.cs
+++ b/osu.Game.Tournament.Tests/Screens/TestSceneShowcaseScreen.cs
@@ -2,12 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Game.Tests.Visual;
using osu.Game.Tournament.Screens.Showcase;
namespace osu.Game.Tournament.Tests.Screens
{
- public class TestSceneShowcaseScreen : OsuTestScene
+ public class TestSceneShowcaseScreen : TournamentTestScene
{
[BackgroundDependencyLoader]
private void load()
diff --git a/osu.Game.Tournament.Tests/TestSceneTournamentSceneManager.cs b/osu.Game.Tournament.Tests/TestSceneTournamentSceneManager.cs
index 378614343a..4d134ce4af 100644
--- a/osu.Game.Tournament.Tests/TestSceneTournamentSceneManager.cs
+++ b/osu.Game.Tournament.Tests/TestSceneTournamentSceneManager.cs
@@ -3,11 +3,10 @@
using osu.Framework.Allocation;
using osu.Framework.Platform;
-using osu.Game.Tests.Visual;
namespace osu.Game.Tournament.Tests
{
- public class TestSceneTournamentSceneManager : OsuTestScene
+ public class TestSceneTournamentSceneManager : TournamentTestScene
{
[BackgroundDependencyLoader]
private void load(Storage storage)
diff --git a/osu.Game.Tournament.Tests/TournamentTestScene.cs b/osu.Game.Tournament.Tests/TournamentTestScene.cs
new file mode 100644
index 0000000000..18ac3230da
--- /dev/null
+++ b/osu.Game.Tournament.Tests/TournamentTestScene.cs
@@ -0,0 +1,28 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Testing;
+using osu.Game.Tests.Visual;
+
+namespace osu.Game.Tournament.Tests
+{
+ public abstract class TournamentTestScene : OsuTestScene
+ {
+ protected override ITestSceneTestRunner CreateRunner() => new TournamentTestSceneTestRunner();
+
+ public class TournamentTestSceneTestRunner : TournamentGameBase, ITestSceneTestRunner
+ {
+ private TestSceneTestRunner.TestRunner runner;
+
+ protected override void LoadAsyncComplete()
+ {
+ // this has to be run here rather than LoadComplete because
+ // TestScene.cs is checking the IsLoaded state (on another thread) and expects
+ // the runner to be loaded at that point.
+ Add(runner = new TestSceneTestRunner.TestRunner());
+ }
+
+ public void RunTestBlocking(TestScene test) => runner.RunTestBlocking(test);
+ }
+ }
+}
diff --git a/osu.Game.Tournament/TournamentGameBase.cs b/osu.Game.Tournament/TournamentGameBase.cs
index 06fb52da77..dbfa70704b 100644
--- a/osu.Game.Tournament/TournamentGameBase.cs
+++ b/osu.Game.Tournament/TournamentGameBase.cs
@@ -9,15 +9,20 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
using osu.Framework.Input;
using osu.Framework.IO.Stores;
using osu.Framework.Platform;
using osu.Game.Beatmaps;
+using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.API.Requests;
using osu.Game.Tournament.IPC;
using osu.Game.Tournament.Models;
+using osuTK.Graphics;
using osuTK.Input;
namespace osu.Game.Tournament
@@ -35,6 +40,8 @@ namespace osu.Game.Tournament
private Bindable windowSize;
private FileBasedIPC ipc;
+ private Drawable heightWarning;
+
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
return dependencies = new DependencyContainer(base.CreateChildDependencies(parent));
@@ -53,6 +60,12 @@ namespace osu.Game.Tournament
this.storage = storage;
windowSize = frameworkConfig.GetBindable(FrameworkSetting.WindowedSize);
+ windowSize.BindValueChanged(size => ScheduleAfterChildren(() =>
+ {
+ var minWidth = (int)(size.NewValue.Height / 9f * 16 + 400);
+
+ heightWarning.Alpha = size.NewValue.Width < minWidth ? 1 : 0;
+ }), true);
readBracket();
@@ -61,16 +74,43 @@ namespace osu.Game.Tournament
dependencies.CacheAs(ipc = new FileBasedIPC());
Add(ipc);
- Add(new OsuButton
+ AddRange(new[]
{
- Text = "Save Changes",
- Width = 140,
- Height = 50,
- Depth = float.MinValue,
- Anchor = Anchor.BottomRight,
- Origin = Anchor.BottomRight,
- Padding = new MarginPadding(10),
- Action = SaveChanges,
+ new OsuButton
+ {
+ Text = "Save Changes",
+ Width = 140,
+ Height = 50,
+ Depth = float.MinValue,
+ Anchor = Anchor.BottomRight,
+ Origin = Anchor.BottomRight,
+ Padding = new MarginPadding(10),
+ Action = SaveChanges,
+ },
+ heightWarning = new Container
+ {
+ Masking = true,
+ CornerRadius = 5,
+ Depth = float.MinValue,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ AutoSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ Colour = Color4.Red,
+ RelativeSizeAxes = Axes.Both,
+ },
+ new SpriteText
+ {
+ Text = "Please make the window wider",
+ Font = OsuFont.Default.With(weight: "bold"),
+ Colour = Color4.White,
+ Padding = new MarginPadding(20)
+ }
+ }
+ },
});
}
@@ -195,18 +235,6 @@ namespace osu.Game.Tournament
base.LoadComplete();
}
- protected override void Update()
- {
- base.Update();
- var minWidth = (int)(windowSize.Value.Height / 9f * 16 + 400);
-
- if (windowSize.Value.Width < minWidth)
- {
- // todo: can be removed after ppy/osu-framework#1975
- windowSize.Value = Host.Window.ClientSize = new Size(minWidth, windowSize.Value.Height);
- }
- }
-
protected virtual void SaveChanges()
{
foreach (var r in ladder.Rounds)
diff --git a/osu.Game/Graphics/Containers/OsuScrollContainer.cs b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
index 53092ddc9e..8fc8dec9fd 100644
--- a/osu.Game/Graphics/Containers/OsuScrollContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuScrollContainer.cs
@@ -27,11 +27,12 @@ namespace osu.Game.Graphics.Containers
private bool shouldPerformRightMouseScroll(MouseButtonEvent e) => RightMouseScrollbar && e.Button == MouseButton.Right;
- private void scrollToRelative(float value) => ScrollTo(Clamp((value - Scrollbar.DrawSize[ScrollDim] / 2) / Scrollbar.Size[ScrollDim]), true, DistanceDecayOnRightMouseScrollbar);
+ private void scrollFromMouseEvent(MouseEvent e) =>
+ ScrollTo(Clamp(ToLocalSpace(e.ScreenSpaceMousePosition)[ScrollDim] / DrawSize[ScrollDim]) * Content.DrawSize[ScrollDim], true, DistanceDecayOnRightMouseScrollbar);
- private bool mouseScrollBarDragging;
+ private bool rightMouseDragging;
- protected override bool IsDragging => base.IsDragging || mouseScrollBarDragging;
+ protected override bool IsDragging => base.IsDragging || rightMouseDragging;
public OsuScrollContainer(Direction scrollDirection = Direction.Vertical)
: base(scrollDirection)
@@ -42,7 +43,7 @@ namespace osu.Game.Graphics.Containers
{
if (shouldPerformRightMouseScroll(e))
{
- scrollToRelative(e.MousePosition[ScrollDim]);
+ scrollFromMouseEvent(e);
return true;
}
@@ -51,9 +52,9 @@ namespace osu.Game.Graphics.Containers
protected override bool OnDrag(DragEvent e)
{
- if (mouseScrollBarDragging)
+ if (rightMouseDragging)
{
- scrollToRelative(e.MousePosition[ScrollDim]);
+ scrollFromMouseEvent(e);
return true;
}
@@ -64,7 +65,7 @@ namespace osu.Game.Graphics.Containers
{
if (shouldPerformRightMouseScroll(e))
{
- mouseScrollBarDragging = true;
+ rightMouseDragging = true;
return true;
}
@@ -73,9 +74,9 @@ namespace osu.Game.Graphics.Containers
protected override bool OnDragEnd(DragEndEvent e)
{
- if (mouseScrollBarDragging)
+ if (rightMouseDragging)
{
- mouseScrollBarDragging = false;
+ rightMouseDragging = false;
return true;
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 9358a412d9..e71dd67bf2 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -265,7 +265,16 @@ namespace osu.Game
{
// 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.
- var databasedScoreInfo = ScoreManager.Query(s => s.OnlineScoreID == score.OnlineScoreID);
+ var databasedScoreInfo = score.OnlineScoreID != null
+ ? ScoreManager.Query(s => s.OnlineScoreID == score.OnlineScoreID)
+ : ScoreManager.Query(s => s.Hash == score.Hash);
+
+ if (databasedScoreInfo == null)
+ {
+ Logger.Log("The requested score could not be found locally.", LoggingTarget.Information);
+ return;
+ }
+
var databasedScore = ScoreManager.GetScore(databasedScoreInfo);
if (databasedScore.Replay == null)
diff --git a/osu.Game/Overlays/Settings/Sections/SkinSection.cs b/osu.Game/Overlays/Settings/Sections/SkinSection.cs
index 5d7542ca2b..35be930a2e 100644
--- a/osu.Game/Overlays/Settings/Sections/SkinSection.cs
+++ b/osu.Game/Overlays/Settings/Sections/SkinSection.cs
@@ -107,6 +107,8 @@ namespace osu.Game.Overlays.Settings.Sections
private class SkinDropdownControl : DropdownControl
{
protected override string GenerateItemText(SkinInfo item) => item.ToString();
+
+ protected override DropdownMenu CreateMenu() => base.CreateMenu().With(m => m.MaxHeight = 200);
}
}
}
diff --git a/osu.Game/Scoring/Legacy/LegacyScoreParser.cs b/osu.Game/Scoring/Legacy/LegacyScoreParser.cs
index 0fdbd56c92..2e4b4b3a9a 100644
--- a/osu.Game/Scoring/Legacy/LegacyScoreParser.cs
+++ b/osu.Game/Scoring/Legacy/LegacyScoreParser.cs
@@ -80,6 +80,9 @@ namespace osu.Game.Scoring.Legacy
else if (version >= 20121008)
scoreInfo.OnlineScoreID = sr.ReadInt32();
+ if (scoreInfo.OnlineScoreID <= 0)
+ scoreInfo.OnlineScoreID = null;
+
if (compressedReplay?.Length > 0)
{
using (var replayInStream = new MemoryStream(compressedReplay))
diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs
index 9b3c15aa91..27d72f3950 100644
--- a/osu.Game/Tests/Visual/OsuTestScene.cs
+++ b/osu.Game/Tests/Visual/OsuTestScene.cs
@@ -15,6 +15,7 @@ using osu.Framework.Platform;
using osu.Framework.Testing;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
+using osu.Game.Database;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Tests.Beatmaps;
@@ -43,6 +44,9 @@ namespace osu.Game.Tests.Visual
private readonly Lazy localStorage;
protected Storage LocalStorage => localStorage.Value;
+ private readonly Lazy contextFactory;
+ protected DatabaseContextFactory ContextFactory => contextFactory.Value;
+
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
// This is the earliest we can get OsuGameBase, which is used by the dummy working beatmap to find textures
@@ -59,6 +63,14 @@ namespace osu.Game.Tests.Visual
protected OsuTestScene()
{
localStorage = new Lazy(() => new NativeStorage($"{GetType().Name}-{Guid.NewGuid()}"));
+ contextFactory = new Lazy(() =>
+ {
+ var factory = new DatabaseContextFactory(LocalStorage);
+ factory.ResetDatabase();
+ using (var usage = factory.Get())
+ usage.Migrate();
+ return factory;
+ });
}
[Resolved]
@@ -85,6 +97,9 @@ namespace osu.Game.Tests.Visual
if (beatmap?.Value.TrackLoaded == true)
beatmap.Value.Track.Stop();
+ if (contextFactory.IsValueCreated)
+ contextFactory.Value.ResetDatabase();
+
if (localStorage.IsValueCreated)
{
try
diff --git a/osu.Game/Utils/RavenLogger.cs b/osu.Game/Utils/RavenLogger.cs
index 7f4faa60ae..16178e63bd 100644
--- a/osu.Game/Utils/RavenLogger.cs
+++ b/osu.Game/Utils/RavenLogger.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Net;
using System.Threading.Tasks;
using osu.Framework.Logging;
using SharpRaven;
@@ -36,31 +37,50 @@ namespace osu.Game.Utils
if (exception != null)
{
- if (exception is IOException ioe)
- {
- // disk full exceptions, see https://stackoverflow.com/a/9294382
- const int hr_error_handle_disk_full = unchecked((int)0x80070027);
- const int hr_error_disk_full = unchecked((int)0x80070070);
-
- if (ioe.HResult == hr_error_handle_disk_full || ioe.HResult == hr_error_disk_full)
- return;
- }
+ if (!shouldSubmitException(exception))
+ return;
// since we let unhandled exceptions go ignored at times, we want to ensure they don't get submitted on subsequent reports.
if (lastException != null &&
lastException.Message == exception.Message && exception.StackTrace.StartsWith(lastException.StackTrace))
- {
return;
- }
lastException = exception;
- queuePendingTask(raven.CaptureAsync(new SentryEvent(exception)));
+ queuePendingTask(raven.CaptureAsync(new SentryEvent(exception) { Message = entry.Message }));
}
else
raven.AddTrail(new Breadcrumb(entry.Target.ToString(), BreadcrumbType.Navigation) { Message = entry.Message });
};
}
+ private bool shouldSubmitException(Exception exception)
+ {
+ switch (exception)
+ {
+ case IOException ioe:
+ // disk full exceptions, see https://stackoverflow.com/a/9294382
+ const int hr_error_handle_disk_full = unchecked((int)0x80070027);
+ const int hr_error_disk_full = unchecked((int)0x80070070);
+
+ if (ioe.HResult == hr_error_handle_disk_full || ioe.HResult == hr_error_disk_full)
+ return false;
+
+ break;
+
+ case WebException we:
+ switch (we.Status)
+ {
+ // more statuses may need to be blocked as we come across them.
+ case WebExceptionStatus.Timeout:
+ return false;
+ }
+
+ break;
+ }
+
+ return true;
+ }
+
private void queuePendingTask(Task task)
{
lock (tasks) tasks.Add(task);
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 0b2baa982b..472f6e9d65 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 55d1afa645..0a19eac2b5 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -105,8 +105,8 @@
-
-
+
+