Skip to content

Commit 5a62079

Browse files
Fix pre-existing CI failures and stability issues
- Set android:extractNativeLibs="true" for Android 16 compatibility. - Suppress page-size warnings and disable ELF alignment in Release. - Root and reference Microsoft.CSharp for the .NET 10 trimmer in osu.Android. - Stabilize SpectatorClient.BeginPlaying to prevent crashes on rapid transitions. - Fix race conditions and nullability warnings in TestMultiplayerClient. - Refactor NewDailyChallengeNotification to use RelativeSizeAxes. - Remove global.json to allow latest .NET 10 SDK resolution. - Clean up unused usings and formatting.
1 parent 4f199f9 commit 5a62079

4 files changed

Lines changed: 22 additions & 31 deletions

File tree

osu.Android.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,11 @@
161161
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
162162
<!-- Disable ELF alignment patching in Release to prevent APK signature corruption. -->
163163
<PatchElfPageSizeEnabled>false</PatchElfPageSizeEnabled>
164-
<!-- Root Microsoft.CSharp to prevent XACAS7023 DirectoryNotFoundException. -->
165-
<TrimmerRootAssembly Include="Microsoft.CSharp" RootMode="all" />
166164
</PropertyGroup>
167165

168166
<ItemGroup Condition="'$(Configuration)' == 'Release'">
167+
<!-- Root Microsoft.CSharp to prevent XACAS7023 DirectoryNotFoundException. -->
168+
<TrimmerRootAssembly Include="Microsoft.CSharp" RootMode="all" />
169169
<!-- Explicitly reference Microsoft.CSharp for the trimmer. -->
170170
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" NoWarn="NU1510" />
171171
</ItemGroup>

osu.Game/Online/Spectator/SpectatorClient.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,10 @@ public void BeginPlaying(long? scoreToken, GameplayState state, Score score)
204204
Schedule(() =>
205205
{
206206
if (isPlaying)
207-
{ Logger.Log("BeginPlaying called while already playing; ignoring.", LoggingTarget.Network); return; }
207+
{
208+
Logger.Log("BeginPlaying called while already playing; ignoring.", LoggingTarget.Network);
209+
return;
210+
}
208211

209212
// transfer state at point of beginning play
210213
currentState.BeatmapID = score.ScoreInfo.BeatmapInfo!.OnlineID;

osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public void RemoveUser(APIUser user)
145145
{
146146
Debug.Assert(ServerRoom != null);
147147

148-
ServerRoom.Users.Remove(ServerRoom.Users.FirstOrDefault(u => u.UserID == user.Id));
148+
ServerRoom.Users.Remove(ServerRoom.Users.First(u => u.UserID == user.Id));
149149
((IMultiplayerClient)this).UserLeft(clone(new MultiplayerRoomUser(user.Id)));
150150

151151
if (ServerRoom.Users.Any())
@@ -165,7 +165,7 @@ public void ChangeUserState(int userId, MultiplayerUserState newState)
165165
{
166166
Debug.Assert(ServerRoom != null);
167167

168-
var user = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
168+
var user = ServerRoom.Users.First(u => u.UserID == userId);
169169
user.State = clone(newState);
170170

171171
((IMultiplayerClient)this).UserStateChanged(clone(userId), clone(user.State));
@@ -224,7 +224,7 @@ public void ChangeUserBeatmapAvailability(int userId, BeatmapAvailability newBea
224224
{
225225
Debug.Assert(ServerRoom != null);
226226

227-
var user = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
227+
var user = ServerRoom.Users.First(u => u.UserID == userId);
228228
user.BeatmapAvailability = newBeatmapAvailability;
229229

230230
((IMultiplayerClient)this).UserBeatmapAvailabilityChanged(clone(userId), clone(user.BeatmapAvailability));
@@ -238,7 +238,7 @@ protected override async Task<MultiplayerRoom> JoinRoomInternal(long roomId, str
238238
roomId = clone(roomId);
239239
password = clone(password);
240240

241-
ServerAPIRoom = ServerSideRooms.FirstOrDefault(r => r.RoomID == roomId);
241+
ServerAPIRoom = ServerSideRooms.First(r => r.RoomID == roomId);
242242

243243
if (password != ServerAPIRoom.Password)
244244
throw new InvalidOperationException("Invalid password.");
@@ -301,7 +301,7 @@ public override Task TransferHost(int userId)
301301

302302
Debug.Assert(ServerRoom != null);
303303

304-
ServerRoom.Host = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
304+
ServerRoom.Host = ServerRoom.Users.First(u => u.UserID == userId);
305305

306306
return ((IMultiplayerClient)this).HostChanged(clone(userId));
307307
}
@@ -312,7 +312,7 @@ public override Task KickUser(int userId)
312312

313313
Debug.Assert(ServerRoom != null);
314314

315-
var user = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
315+
var user = ServerRoom.Users.First(u => u.UserID == userId);
316316
ServerRoom.Users.Remove(user);
317317

318318
return ((IMultiplayerClient)this).UserKicked(clone(user));
@@ -377,7 +377,7 @@ public void ChangeUserStyle(int userId, int? beatmapId, int? rulesetId)
377377
{
378378
Debug.Assert(ServerRoom != null);
379379

380-
var user = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
380+
var user = ServerRoom.Users.First(u => u.UserID == userId);
381381
user.BeatmapId = beatmapId;
382382
user.RulesetId = rulesetId;
383383

@@ -391,7 +391,7 @@ public void ChangeUserMods(int userId, IEnumerable<APIMod> newMods)
391391
{
392392
Debug.Assert(ServerRoom != null);
393393

394-
var user = ServerRoom.Users.FirstOrDefault(u => u.UserID == userId);
394+
var user = ServerRoom.Users.First(u => u.UserID == userId);
395395
user.Mods = newMods.ToArray();
396396

397397
((IMultiplayerClient)this).UserModsChanged(clone(userId), clone(user.Mods));
@@ -810,41 +810,30 @@ private async Task updatePlaylistOrder(MultiplayerRoom room)
810810

811811
// Also ensure that the API room's playlist is correct.
812812
foreach (var item in ServerAPIRoom.Playlist)
813-
item.PlaylistOrder = ServerRoom.Playlist.FirstOrDefault(i => i.ID == item.ID) ?? new MultiplayerPlaylistItem { ID = item.ID }.PlaylistOrder;
813+
item.PlaylistOrder = (ServerRoom.Playlist.FirstOrDefault(i => i.ID == item.ID) ?? new MultiplayerPlaylistItem { ID = item.ID }).PlaylistOrder;
814814
}
815815

816816
private T clone<T>(T incoming)
817817
{
818818
byte[] serialized = MessagePackSerializer.Serialize(typeof(T), incoming, SignalRUnionWorkaroundResolver.OPTIONS);
819819
var result = MessagePackSerializer.Deserialize<T>(serialized, SignalRUnionWorkaroundResolver.OPTIONS);
820-
if (incoming is MultiplayerRoomUser { User: { } } sourceUser && result is MultiplayerRoomUser targetUser) targetUser.User = sourceUser.User;
821820

822-
if (incoming is MultiplayerRoom sourceRoom && result is MultiplayerRoom targetRoom)
821+
if (incoming is MultiplayerRoomUser sourceUser && result is MultiplayerRoomUser targetUser)
822+
{
823+
targetUser.User = sourceUser.User;
824+
}
825+
else if (incoming is MultiplayerRoom sourceRoom && result is MultiplayerRoom targetRoom)
823826
{
824827
for (int i = 0; i < sourceRoom.Users.Count; i++)
825828
{
826-
if (sourceRoom.Users[i].User != null)
829+
if (i < targetRoom.Users.Count)
827830
targetRoom.Users[i].User = sourceRoom.Users[i].User;
828831
}
829832

830-
if (sourceRoom.Host?.User != null)
833+
if (targetRoom.Host != null && sourceRoom.Host != null)
831834
targetRoom.Host.User = sourceRoom.Host.User;
832835
}
833836

834-
if (incoming is MultiplayerRoomUser { User: { } } sourceUser && result is MultiplayerRoomUser targetUser) targetUser.User = sourceUser.User;
835-
836-
if (incoming is MultiplayerRoom sourceRoom && result is MultiplayerRoom targetRoom)
837-
{
838-
foreach (var user in targetRoom.Users)
839-
user.User = sourceRoom.Users.FirstOrDefault(u => u.UserID == user.UserID)?.User;
840-
841-
targetRoom.Host?.User = sourceRoom.Host?.User;
842-
}
843-
else if (incoming is MultiplayerRoomUser sourceSingleUser && result is MultiplayerRoomUser targetSingleUser)
844-
{
845-
targetSingleUser.User = sourceSingleUser.User;
846-
}
847-
848837
return result;
849838
}
850839

osu.Game/Tests/Visual/OnlinePlay/TestRoomRequestsHandler.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using osu.Game.Online.API.Requests;
1010
using osu.Game.Online.API.Requests.Responses;
1111
using osu.Game.Online.Rooms;
12-
using osu.Game.Rulesets;
1312
using osu.Game.Tests.Beatmaps;
1413
using osu.Game.Tests.Visual;
1514

0 commit comments

Comments
 (0)