private Invitation ConvertInvitation(AndroidJavaObject invObj) { Logger.d("Converting Android invitation to our Invitation object."); string invitationId = invObj.Call <string>("getInvitationId"); int invType = invObj.Call <int>("getInvitationType"); Participant inviter; using (AndroidJavaObject inviterObj = invObj.Call <AndroidJavaObject>("getInviter")) { inviter = JavaUtil.ConvertParticipant(inviterObj); } int variant = invObj.Call <int>("getVariant"); Invitation.InvType type; switch (invType) { case JavaConsts.INVITATION_TYPE_REAL_TIME: type = Invitation.InvType.RealTime; break; case JavaConsts.INVITATION_TYPE_TURN_BASED: type = Invitation.InvType.TurnBased; break; default: Logger.e("Unknown invitation type " + invType); type = Invitation.InvType.Unknown; break; } Invitation result = new Invitation(type, invitationId, inviter, variant); Logger.d("Converted invitation: " + result.ToString()); return(result); }
public static TurnBasedMatch ConvertMatch(string playerId, AndroidJavaObject matchObj) { List <AndroidJavaObject> list = new List <AndroidJavaObject>(); Logger.d("AndroidTbmpClient.ConvertMatch, playerId=" + playerId); List <Participant> list2 = new List <Participant>(); string matchId = matchObj.Call <string>("getMatchId", new object[0]); AndroidJavaObject androidJavaObject = JavaUtil.CallNullSafeObjectMethod(matchObj, "getData", new object[0]); list.Add(androidJavaObject); byte[] data = JavaUtil.ConvertByteArray(androidJavaObject); bool canRematch = matchObj.Call <bool>("canRematch", new object[0]); int availableAutomatchSlots = matchObj.Call <int>("getAvailableAutoMatchSlots", new object[0]); string selfParticipantId = matchObj.Call <string>("getParticipantId", new object[] { playerId }); AndroidJavaObject androidJavaObject2 = matchObj.Call <AndroidJavaObject>("getParticipantIds", new object[0]); list.Add(androidJavaObject2); int num = androidJavaObject2.Call <int>("size", new object[0]); for (int i = 0; i < num; i++) { string text = androidJavaObject2.Call <string>("get", new object[] { i }); AndroidJavaObject androidJavaObject3 = matchObj.Call <AndroidJavaObject>("getParticipant", new object[] { text }); list.Add(androidJavaObject3); Participant item = JavaUtil.ConvertParticipant(androidJavaObject3); list2.Add(item); } string pendingParticipantId = matchObj.Call <string>("getPendingParticipantId", new object[0]); TurnBasedMatch.MatchTurnStatus turnStatus = JavaUtil.ConvertTurnStatus(matchObj.Call <int>("getTurnStatus", new object[0])); TurnBasedMatch.MatchStatus matchStatus = JavaUtil.ConvertMatchStatus(matchObj.Call <int>("getStatus", new object[0])); int variant = matchObj.Call <int>("getVariant", new object[0]); foreach (AndroidJavaObject current in list) { if (current != null) { current.Dispose(); } } list2.Sort(); return(new TurnBasedMatch(matchId, data, canRematch, selfParticipantId, list2, availableAutomatchSlots, pendingParticipantId, turnStatus, matchStatus, variant)); }
private Invitation ConvertInvitation(AndroidJavaObject invObj) { Logger.d("Converting Android invitation to our Invitation object."); string invId = invObj.Call <string>("getInvitationId", new object[0]); int num = invObj.Call <int>("getInvitationType", new object[0]); Participant inviter; using (AndroidJavaObject androidJavaObject = invObj.Call <AndroidJavaObject>("getInviter", new object[0])) { inviter = JavaUtil.ConvertParticipant(androidJavaObject); } int variant = invObj.Call <int>("getVariant", new object[0]); int num2 = num; Invitation.InvType invType; if (num2 != 0) { if (num2 != 1) { Logger.e("Unknown invitation type " + num); invType = Invitation.InvType.Unknown; } else { invType = Invitation.InvType.TurnBased; } } else { invType = Invitation.InvType.RealTime; } Invitation invitation = new Invitation(invType, invId, inviter, variant); Logger.d("Converted invitation: " + invitation.ToString()); return(invitation); }
public static TurnBasedMatch ConvertMatch(string playerId, AndroidJavaObject matchObj) { List <AndroidJavaObject> toDispose = new List <AndroidJavaObject>(); Logger.d("AndroidTbmpClient.ConvertMatch, playerId=" + playerId); string matchId; byte[] data; bool canRematch; int availableAutomatchSlots; string selfParticipantId; List <Participant> participants = new List <Participant>(); string pendingParticipantId; TurnBasedMatch.MatchTurnStatus turnStatus; TurnBasedMatch.MatchStatus matchStatus; int variant; matchId = matchObj.Call <string>("getMatchId"); AndroidJavaObject dataObj = JavaUtil.CallNullSafeObjectMethod(matchObj, "getData"); toDispose.Add(dataObj); data = JavaUtil.ConvertByteArray(dataObj); canRematch = matchObj.Call <bool>("canRematch"); availableAutomatchSlots = matchObj.Call <int>("getAvailableAutoMatchSlots"); selfParticipantId = matchObj.Call <string>("getParticipantId", playerId); AndroidJavaObject participantIds = matchObj.Call <AndroidJavaObject>("getParticipantIds"); toDispose.Add(participantIds); int participantCount = participantIds.Call <int>("size"); for (int i = 0; i < participantCount; i++) { string thisId = participantIds.Call <string>("get", i); AndroidJavaObject thisPart = matchObj.Call <AndroidJavaObject>("getParticipant", thisId); toDispose.Add(thisPart); Participant p = JavaUtil.ConvertParticipant(thisPart); participants.Add(p); } pendingParticipantId = matchObj.Call <string>("getPendingParticipantId"); turnStatus = JavaUtil.ConvertTurnStatus(matchObj.Call <int>("getTurnStatus")); matchStatus = JavaUtil.ConvertMatchStatus(matchObj.Call <int>("getStatus")); variant = matchObj.Call <int>("getVariant"); // cleanup foreach (AndroidJavaObject obj in toDispose) { if (obj != null) { obj.Dispose(); } } // participants should be sorted by participant ID participants.Sort(); return(new TurnBasedMatch(matchId, data, canRematch, selfParticipantId, participants, availableAutomatchSlots, pendingParticipantId, turnStatus, matchStatus, variant)); }
// called from UI thread private void UpdateRoom() { List <AndroidJavaObject> toDispose = new List <AndroidJavaObject>(); Logger.d("UpdateRoom: Updating our cached data about the room."); string roomId = mRoom.Call <string>("getRoomId"); Logger.d("UpdateRoom: room id: " + roomId); Logger.d("UpdateRoom: querying for my player ID."); string playerId = mClient.GHManager.CallGmsApi <string>("games.Games", "Players", "getCurrentPlayerId"); Logger.d("UpdateRoom: my player ID is: " + playerId); Logger.d("UpdateRoom: querying for my participant ID in the room."); string myPartId = mRoom.Call <string>("getParticipantId", playerId); Logger.d("UpdateRoom: my participant ID is: " + myPartId); AndroidJavaObject participantIds = mRoom.Call <AndroidJavaObject>("getParticipantIds"); toDispose.Add(participantIds); int participantCount = participantIds.Call <int>("size"); Logger.d("UpdateRoom: # participants: " + participantCount); List <Participant> connectedParticipants = new List <Participant>(); List <Participant> allParticipants = new List <Participant>(); mSelf = null; for (int i = 0; i < participantCount; i++) { Logger.d("UpdateRoom: querying participant #" + i); string thisId = participantIds.Call <string>("get", i); Logger.d("UpdateRoom: participant #" + i + " has id: " + thisId); AndroidJavaObject thisPart = mRoom.Call <AndroidJavaObject>("getParticipant", thisId); toDispose.Add(thisPart); Participant p = JavaUtil.ConvertParticipant(thisPart); allParticipants.Add(p); if (p.ParticipantId.Equals(myPartId)) { Logger.d("Participant is SELF."); mSelf = p; } if (p.IsConnectedToRoom) { connectedParticipants.Add(p); } } if (mSelf == null) { Logger.e("List of room participants did not include self, " + " participant id: " + myPartId + ", player id: " + playerId); // stopgap: mSelf = new Participant("?", myPartId, Participant.ParticipantStatus.Unknown, new GooglePlayGames.BasicApi.Multiplayer.Player("?", playerId), false); } connectedParticipants.Sort(); allParticipants.Sort(); string[] newlyConnected; string[] newlyDisconnected; // lock the list because it's read by the game thread lock (mParticipantListsLock) { newlyConnected = SubtractParticipants(connectedParticipants, mConnectedParticipants); newlyDisconnected = SubtractParticipants(mConnectedParticipants, connectedParticipants); // IMPORTANT: we treat mConnectedParticipants as an immutable list; we give // away references to it to the callers of our API, so anyone out there might // be holding a reference to it and reading it from any thread. // This is why, instead of modifying it in place, we assign a NEW list to it. mConnectedParticipants = connectedParticipants; mAllParticipants = allParticipants; Logger.d("UpdateRoom: participant list now has " + mConnectedParticipants.Count + " participants."); } // cleanup Logger.d("UpdateRoom: cleanup."); foreach (AndroidJavaObject obj in toDispose) { obj.Dispose(); } Logger.d("UpdateRoom: newly connected participants: " + newlyConnected.Length); Logger.d("UpdateRoom: newly disconnected participants: " + newlyDisconnected.Length); // only deliver peers connected/disconnected events if have delivered OnRoomConnected if (mDeliveredRoomConnected) { if (newlyConnected.Length > 0 && mRtmpListener != null) { Logger.d("UpdateRoom: calling OnPeersConnected callback"); mRtmpListener.OnPeersConnected(newlyConnected); } if (newlyDisconnected.Length > 0 && mRtmpListener != null) { Logger.d("UpdateRoom: calling OnPeersDisconnected callback"); mRtmpListener.OnPeersDisconnected(newlyDisconnected); } } // did the developer request to leave the room? if (mLeaveRoomRequested) { Clear("deferred leave-room request"); } // is it time to report progress during room setup? if (!mDeliveredRoomConnected) { DeliverRoomSetupProgressUpdate(); } }
private void UpdateRoom() { List <AndroidJavaObject> list = new List <AndroidJavaObject>(); Logger.d("UpdateRoom: Updating our cached data about the room."); string str = this.mRoom.Call <string>("getRoomId", new object[0]); Logger.d("UpdateRoom: room id: " + str); Logger.d("UpdateRoom: querying for my player ID."); string text = this.mClient.GHManager.CallGmsApi <string>("games.Games", "Players", "getCurrentPlayerId", new object[0]); Logger.d("UpdateRoom: my player ID is: " + text); Logger.d("UpdateRoom: querying for my participant ID in the room."); string text2 = this.mRoom.Call <string>("getParticipantId", new object[] { text }); Logger.d("UpdateRoom: my participant ID is: " + text2); AndroidJavaObject androidJavaObject = this.mRoom.Call <AndroidJavaObject>("getParticipantIds", new object[0]); list.Add(androidJavaObject); int num = androidJavaObject.Call <int>("size", new object[0]); Logger.d("UpdateRoom: # participants: " + num); List <Participant> list2 = new List <Participant>(); List <Participant> list3 = new List <Participant>(); this.mSelf = null; for (int i = 0; i < num; i++) { Logger.d("UpdateRoom: querying participant #" + i); string text3 = androidJavaObject.Call <string>("get", new object[] { i }); Logger.d(string.Concat(new object[] { "UpdateRoom: participant #", i, " has id: ", text3 })); AndroidJavaObject androidJavaObject2 = this.mRoom.Call <AndroidJavaObject>("getParticipant", new object[] { text3 }); list.Add(androidJavaObject2); Participant participant = JavaUtil.ConvertParticipant(androidJavaObject2); list3.Add(participant); if (participant.ParticipantId.Equals(text2)) { Logger.d("Participant is SELF."); this.mSelf = participant; } if (participant.IsConnectedToRoom) { list2.Add(participant); } } if (this.mSelf == null) { Logger.e("List of room participants did not include self, participant id: " + text2 + ", player id: " + text); this.mSelf = new Participant("?", text2, Participant.ParticipantStatus.Unknown, new Player("?", text), false); } list2.Sort(); list3.Sort(); object obj = this.mParticipantListsLock; string[] array; string[] array2; lock (obj) { array = this.SubtractParticipants(list2, this.mConnectedParticipants); array2 = this.SubtractParticipants(this.mConnectedParticipants, list2); this.mConnectedParticipants = list2; this.mAllParticipants = list3; Logger.d("UpdateRoom: participant list now has " + this.mConnectedParticipants.Count + " participants."); } Logger.d("UpdateRoom: cleanup."); foreach (AndroidJavaObject current in list) { current.Dispose(); } Logger.d("UpdateRoom: newly connected participants: " + array.Length); Logger.d("UpdateRoom: newly disconnected participants: " + array2.Length); if (this.mDeliveredRoomConnected) { if (array.Length > 0 && this.mRtmpListener != null) { Logger.d("UpdateRoom: calling OnPeersConnected callback"); this.mRtmpListener.OnPeersConnected(array); } if (array2.Length > 0 && this.mRtmpListener != null) { Logger.d("UpdateRoom: calling OnPeersDisconnected callback"); this.mRtmpListener.OnPeersDisconnected(array2); } } if (this.mLeaveRoomRequested) { this.Clear("deferred leave-room request"); } if (!this.mDeliveredRoomConnected) { this.DeliverRoomSetupProgressUpdate(); } }