diff --git a/osu.Android.props b/osu.Android.props
index 8fd761691c..cae8a946a3 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,7 +51,7 @@
-
+
diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
index 2b38c4f936..9fa0eab548 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using JetBrains.Annotations;
using NUnit.Framework;
@@ -11,6 +12,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
+using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Graphics.Sprites;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Catch;
@@ -19,6 +21,7 @@ using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Legacy;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Rulesets.Taiko;
using osu.Game.Screens.Select;
using osuTK;
@@ -141,6 +144,29 @@ namespace osu.Game.Tests.Visual.SongSelect
selectBeatmap(createLongMetadata());
}
+ [Test]
+ public void TestBPMUpdates()
+ {
+ const float bpm = 120;
+ IBeatmap beatmap = createTestBeatmap(new OsuRuleset().RulesetInfo);
+ beatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 60 * 1000 / bpm });
+
+ OsuModDoubleTime doubleTime = null;
+
+ selectBeatmap(beatmap);
+ checkDisplayedBPM(bpm);
+
+ AddStep("select DT", () => SelectedMods.Value = new[] { doubleTime = new OsuModDoubleTime() });
+ checkDisplayedBPM(bpm * 1.5f);
+
+ AddStep("change DT rate", () => doubleTime.SpeedChange.Value = 2);
+ checkDisplayedBPM(bpm * 2);
+
+ void checkDisplayedBPM(float target) =>
+ AddUntilStep($"displayed bpm is {target}", () => this.ChildrenOfType().Any(
+ label => label.Statistic.Name == "BPM" && label.Statistic.Content == target.ToString(CultureInfo.InvariantCulture)));
+ }
+
private void selectBeatmap([CanBeNull] IBeatmap b)
{
Container containerBefore = null;
diff --git a/osu.Game/Rulesets/RulesetStore.cs b/osu.Game/Rulesets/RulesetStore.cs
index 1f12f3dfeb..a9e04a02b5 100644
--- a/osu.Game/Rulesets/RulesetStore.cs
+++ b/osu.Game/Rulesets/RulesetStore.cs
@@ -30,7 +30,12 @@ namespace osu.Game.Rulesets
// On android in release configuration assemblies are loaded from the apk directly into memory.
// We cannot read assemblies from cwd, so should check loaded assemblies instead.
loadFromAppDomain();
- loadFromDisk();
+
+ // This null check prevents Android from attempting to load the rulesets from disk,
+ // as the underlying path "AppContext.BaseDirectory", despite being non-nullable, it returns null on android.
+ // See https://github.com/xamarin/xamarin-android/issues/3489.
+ if (RuntimeInfo.StartupDirectory != null)
+ loadFromDisk();
// the event handler contains code for resolving dependency on the game assembly for rulesets located outside the base game directory.
// It needs to be attached to the assembly lookup event before the actual call to loadUserRulesets() else rulesets located out of the base game directory will fail
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 297a16dd1d..d40e21cd5e 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -71,6 +71,7 @@ namespace osu.Game.Screens.Select
private void load()
{
ruleset.BindValueChanged(_ => updateDisplay());
+ mods.BindValueChanged(_ => updateDisplay());
}
private const double animation_duration = 800;
@@ -449,8 +450,11 @@ namespace osu.Game.Screens.Select
{
public LocalisableString TooltipText { get; }
+ internal BeatmapStatistic Statistic { get; }
+
public InfoLabel(BeatmapStatistic statistic)
{
+ Statistic = statistic;
TooltipText = statistic.Name;
AutoSizeAxes = Axes.Both;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 0abd9adf77..bac99a098d 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -37,7 +37,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index d03985a0c2..f3ecc90bea 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -71,7 +71,7 @@
-
+