private void AddOnFailureListenerWithSignOut(AndroidJavaObject task, Action <AndroidJavaObject> callback) { AndroidTaskUtils.AddOnFailureListener( task, exception => { var statusCode = exception.Call <int>("getStatusCode"); if (statusCode == /* CommonStatusCodes.SignInRequired */ 4 || statusCode == /* GamesClientStatusCodes.CLIENT_RECONNECT_REQUIRED */ 26502) { mAndroidClient.SignOut(); } callback(exception); }); }
public void CreateWithInvitationScreen(uint minOpponents, uint maxOpponents, uint variant, RealTimeMultiplayerListener listener) { var listenerOnGameThread = new OnGameThreadForwardingListener(listener); lock (mSessionLock) { if (GetRoomStatus() == RoomStatus.Active) { OurUtils.Logger.e("Received attempt to create a new room without cleaning up the old one."); listenerOnGameThread.OnRoomConnected(false); return; } AndroidHelperFragment.ShowRtmpSelectOpponentsUI(minOpponents, maxOpponents, (status, result) => { if (status == UIStatus.NotAuthorized) { mAndroidClient.SignOut((() => { listenerOnGameThread.OnRoomConnected(false); CleanSession(); })); return; } if (status != UIStatus.Valid) { listenerOnGameThread.OnRoomConnected(false); CleanSession(); return; } using (var roomConfigClass = new AndroidJavaClass("com.google.android.gms.games.multiplayer.realtime.RoomConfig")) using (var roomUpdateCallback = new AndroidJavaObject( "com.google.games.bridge.RoomUpdateCallbackProxy", new RoomUpdateCallbackProxy(/* parent= */ this, listenerOnGameThread))) using (var roomConfigBuilder = roomConfigClass.CallStatic <AndroidJavaObject>("builder", roomUpdateCallback)) { if (result.MinAutomatchingPlayers > 0) { using (var autoMatchCriteria = roomConfigClass.CallStatic <AndroidJavaObject>( "createAutoMatchCriteria", result.MinAutomatchingPlayers, result.MaxAutomatchingPlayers, /* exclusiveBitMask= */ (long)0)) using (roomConfigBuilder.Call <AndroidJavaObject>("setAutoMatchCriteria", autoMatchCriteria)) ; } if (variant != 0) { using (roomConfigBuilder.Call <AndroidJavaObject>("setVariant", (int)variant)); } using (var messageReceivedListener = new AndroidJavaObject( "com.google.games.bridge.RealTimeMessageReceivedListenerProxy", new MessageReceivedListenerProxy(listenerOnGameThread))) using (roomConfigBuilder.Call <AndroidJavaObject>("setOnMessageReceivedListener", messageReceivedListener)) ; using (var roomStatusUpdateCallback = new AndroidJavaObject("com.google.games.bridge.RoomStatusUpdateCallbackProxy", new RoomStatusUpdateCallbackProxy(this, listenerOnGameThread))) using (roomConfigBuilder.Call <AndroidJavaObject>("setRoomStatusUpdateCallback", roomStatusUpdateCallback)) ; using (roomConfigBuilder.Call <AndroidJavaObject>("addPlayersToInvite", AndroidJavaConverter.ToJavaStringList(result.PlayerIdsToInvite))) { mRoomConfig = roomConfigBuilder.Call <AndroidJavaObject>("build"); } mListener = listenerOnGameThread; } // the min number to start is the number of automatched + the number of named invitations + // the local player. mMinPlayersToStart = result.MinAutomatchingPlayers + result.PlayerIdsToInvite.Count + 1; using (var task = mRtmpClient.Call <AndroidJavaObject>("create", mRoomConfig)) { AndroidTaskUtils.AddOnFailureListener( task, exception => { listenerOnGameThread.OnRoomConnected(false); CleanSession(); }); } }); } }