diff --git a/build/PatchElfPageSize.targets b/build/PatchElfPageSize.targets
index 9be15f4da475..003209930eae 100644
--- a/build/PatchElfPageSize.targets
+++ b/build/PatchElfPageSize.targets
@@ -269,6 +269,6 @@ finally
<_NuGetNativeLibs Include="$(NuGetPackageRoot)/**/runtimes/android-*/native/*.so" />
-
+
diff --git a/osu.Android.props b/osu.Android.props
index 9ad425da8662..7d5474ea97d2 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -13,10 +13,12 @@
the patch in some build orderings. This suppression is harmless since we do fix them. -->
false
+
+
@@ -24,7 +26,20 @@
true
true
true
+
+ false
+ true
+ partial
+
+
+
+
+
+
+
+
+
+
true
+
+
+
+
+
+ native
+
+
+ native
+
+
+
diff --git a/osu.Android/AndroidManifest.xml b/osu.Android/AndroidManifest.xml
index bb3cb2c56d07..b0e837ed958c 100644
--- a/osu.Android/AndroidManifest.xml
+++ b/osu.Android/AndroidManifest.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/osu.Game.Rulesets.Catch.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Catch.Tests.Android/AndroidManifest.xml
index 16be596df96b..7b91d6c42d64 100644
--- a/osu.Game.Rulesets.Catch.Tests.Android/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Catch.Tests.Android/AndroidManifest.xml
@@ -2,5 +2,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml
index c308a3d4a3e4..9e73f565bdab 100644
--- a/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Mania.Tests.Android/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml
index 93b0d73e85c8..542eb77b90fa 100644
--- a/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Osu.Tests.Android/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml b/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml
index f8213d7936e5..e1f74ce665c2 100644
--- a/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Taiko.Tests.Android/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Tests.Android/AndroidManifest.xml b/osu.Game.Tests.Android/AndroidManifest.xml
index 48fa69445873..04b18b98ca15 100644
--- a/osu.Game.Tests.Android/AndroidManifest.xml
+++ b/osu.Game.Tests.Android/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game/Online/Spectator/SpectatorClient.cs b/osu.Game/Online/Spectator/SpectatorClient.cs
index f245e8cf3a27..a48902ec0538 100644
--- a/osu.Game/Online/Spectator/SpectatorClient.cs
+++ b/osu.Game/Online/Spectator/SpectatorClient.cs
@@ -214,8 +214,10 @@ public void BeginPlaying(long? scoreToken, GameplayState state, Score score)
Schedule(() =>
{
if (isPlaying)
- throw new InvalidOperationException($"Cannot invoke {nameof(BeginPlaying)} when already playing");
-
+ {
+ Logger.Log($"Cannot invoke {nameof(BeginPlaying)} when already playing. Ignoring.");
+ return;
+ }
isPlaying = true;
// transfer state at point of beginning play
diff --git a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
index 4faea505b930..99700ebd805d 100644
--- a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
+++ b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
@@ -432,7 +432,9 @@ public async Task SendUserMatchRequest(int userId, MatchUserRequest request)
break;
case StopCountdownRequest stopCountdown:
- await StopCountdown(ServerRoom.ActiveCountdowns.First(c => c.ID == stopCountdown.ID)).ConfigureAwait(false);
+ var countdownToRemove = ServerRoom.ActiveCountdowns.FirstOrDefault(c => c.ID == stopCountdown.ID);
+ if (countdownToRemove != null)
+ await StopCountdown(countdownToRemove).ConfigureAwait(false);
break;
case RollRequest rollRequest:
@@ -487,7 +489,10 @@ public async Task StopCountdown(MultiplayerCountdown countdown)
Debug.Assert(ServerRoom != null);
Debug.Assert(LocalUser != null);
- ServerRoom.ActiveCountdowns.Remove(ServerRoom.ActiveCountdowns.First(c => c.ID == countdown.ID));
+ var existing = ServerRoom.ActiveCountdowns.FirstOrDefault(c => c.ID == countdown.ID);
+
+ if (existing != null)
+ ServerRoom.ActiveCountdowns.Remove(existing);
await ((IMultiplayerClient)this).MatchEvent(clone(new CountdownStoppedEvent(countdown.ID))).ConfigureAwait(false);
}