public void Rematch(TurnBasedMatch match, Action <bool, TurnBasedMatch> callback)
        {
            callback = ToOnGameThread(callback);

            FindEqualVersionMatch(match, (success, foundMatch) =>
            {
                if (!success)
                {
                    callback(false, null);
                    return;
                }

                using (var task = mClient.Call <AndroidJavaObject>("rematch", match.MatchId))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        turnBasedMatch =>
                        callback(true, AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatch)));

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        e => callback(false, null));
                }
            });
        }
        private void FindInvitationWithId(string invitationId, Action <Invitation> callback)
        {
            using (var task = mClient.Call <AndroidJavaObject>("loadMatchesByStatus", new int[] { 0, 1, 2, 3 }))
            {
                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                    task,
                    annotatedData =>
                {
                    using (var matchesResponse = annotatedData.Call <AndroidJavaObject>("get"))
                        using (var invitationsBuffer = matchesResponse.Call <AndroidJavaObject>("getInvitations"))
                        {
                            int count = invitationsBuffer.Call <int>("getCount");
                            for (int i = 0; i < count; ++i)
                            {
                                Invitation invitation =
                                    AndroidJavaConverter.ToInvitation(
                                        invitationsBuffer.Call <AndroidJavaObject>("get", (int)i));
                                if (invitation.InvitationId == invitationId)
                                {
                                    callback(invitation);
                                    return;
                                }
                            }
                        }

                    callback(null);
                });

                AndroidTaskUtils.AddOnFailureListener(task, e => callback(null));
            }
        }
예제 #3
0
        internal static TurnBasedMatch ToTurnBasedMatch(AndroidJavaObject turnBasedMatch)
        {
            if (turnBasedMatch == null)
            {
                return(null);
            }

            string matchId = turnBasedMatch.Call <string>("getMatchId");

            byte[]             data       = turnBasedMatch.Call <byte[]>("getData");
            bool               canRematch = turnBasedMatch.Call <bool>("canRematch");
            uint               availableAutomatchSlots = (uint)turnBasedMatch.Call <int>("getAvailableAutoMatchSlots");
            string             selfParticipantId       = turnBasedMatch.Call <string>("getCreatorId");
            List <Participant> participants            = ToParticipantList(turnBasedMatch);
            string             pendingParticipantId    = turnBasedMatch.Call <string>("getPendingParticipantId");

            TurnBasedMatch.MatchStatus     turnStatus  = ToMatchStatus(turnBasedMatch.Call <int>("getStatus"));
            TurnBasedMatch.MatchTurnStatus matchStatus =
                AndroidJavaConverter.ToMatchTurnStatus(turnBasedMatch.Call <int>("getTurnStatus"));
            uint     variant        = (uint)turnBasedMatch.Call <int>("getVariant");
            uint     version        = (uint)turnBasedMatch.Call <int>("getVersion");
            DateTime creationTime   = AndroidJavaConverter.ToDateTime(turnBasedMatch.Call <long>("getCreationTimestamp"));
            DateTime lastUpdateTime =
                AndroidJavaConverter.ToDateTime(turnBasedMatch.Call <long>("getLastUpdatedTimestamp"));

            return(new TurnBasedMatch(matchId, data, canRematch, selfParticipantId, participants,
                                      availableAutomatchSlots, pendingParticipantId, matchStatus, turnStatus, variant, version, creationTime,
                                      lastUpdateTime));
        }
        public void CreateQuickMatch(uint minOpponents, uint maxOpponents, uint variant,
                                     ulong exclusiveBitmask, Action <bool, TurnBasedMatch> callback)
        {
            callback = ToOnGameThread(callback);

            using (var matchConfigClass =
                       new AndroidJavaClass("com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig"))
                using (var matchConfigBuilder = matchConfigClass.CallStatic <AndroidJavaObject>("builder"))
                    using (var autoMatchCriteria = matchConfigClass.CallStatic <AndroidJavaObject>("createAutoMatchCriteria",
                                                                                                   (int)minOpponents, (int)maxOpponents, (long)exclusiveBitmask))
                    {
                        matchConfigBuilder.Call <AndroidJavaObject>("setAutoMatchCriteria", autoMatchCriteria);

                        if (variant != 0)
                        {
                            matchConfigBuilder.Call <AndroidJavaObject>("setVariant", (int)variant);
                        }

                        using (var matchConfig = matchConfigBuilder.Call <AndroidJavaObject>("build"))
                            using (var task = mClient.Call <AndroidJavaObject>("createMatch", matchConfig))
                            {
                                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                                    task,
                                    turnBasedMatch =>
                                    callback(true, AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatch)));

                                AndroidTaskUtils.AddOnFailureListener(task, e => callback(false, null));
                            }
                    }
        }
        public void GetMatch(string matchId, Action <bool, TurnBasedMatch> callback)
        {
            callback = ToOnGameThread(callback);

            using (var task = mClient.Call <AndroidJavaObject>("loadMatch", matchId))
            {
                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                    task,
                    annotatedData =>
                {
                    using (var turnBasedMatch = annotatedData.Call <AndroidJavaObject>("get"))
                    {
                        if (turnBasedMatch == null)
                        {
                            OurUtils.Logger.e(string.Format("Could not find match {0}", matchId));
                            callback(false, null);
                        }
                        else
                        {
                            callback(true, AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatch));
                        }
                    }
                });

                AndroidTaskUtils.AddOnFailureListener(task, e => callback(false, null));
            }
        }
        public void GetAllInvitations(Action <Invitation[]> callback)
        {
            callback = ToOnGameThread(callback);

            using (var task = mClient.Call <AndroidJavaObject>("loadMatchesByStatus", new int[] { 0, 1, 2, 3 }))
            {
                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                    task,
                    annotatedData =>
                {
                    using (var matchesResponse = annotatedData.Call <AndroidJavaObject>("get"))
                        using (var invitationsBuffer = matchesResponse.Call <AndroidJavaObject>("getInvitations"))
                        {
                            int count = invitationsBuffer.Call <int>("getCount");
                            Invitation[] invitations = new Invitation[count];
                            for (int i = 0; i < count; i++)
                            {
                                using (var invitation = invitationsBuffer.Call <AndroidJavaObject>("get", (int)i))
                                {
                                    invitations[i] = AndroidJavaConverter.ToInvitation(invitation);
                                }
                            }

                            callback(invitations);
                        }
                });

                AndroidTaskUtils.AddOnFailureListener(task, e => callback(null));
            }
        }
예제 #7
0
            private void handleParticipantStatusChanged(AndroidJavaObject room, AndroidJavaObject participantIds)
            {
                mParent.mRoom = room;
                int size = participantIds.Get <int>("size");

                for (int i = 0; i < size; i++)
                {
                    String      participantId = participantIds.Call <String>("get", i);
                    Participant participant   =
                        AndroidJavaConverter.ToParticipant(
                            mParent.mRoom.Call <AndroidJavaObject>("getParticipant", participantId));

                    if (participant.Status != Participant.ParticipantStatus.Declined &&
                        participant.Status != Participant.ParticipantStatus.Left)
                    {
                        continue;
                    }

                    mListener.OnParticipantLeft(participant);

                    var roomStatus = mParent.GetRoomStatus();
                    if (roomStatus != RoomStatus.Connecting && roomStatus != RoomStatus.AutoMatching)
                    {
                        mParent.LeaveRoom();
                    }
                }
            }
예제 #8
0
        public static void ShowInvitationInboxUI(Action <UIStatus, Invitation> cb)
        {
            using (var helperFragment = new AndroidJavaClass(HelperFragmentClass))
                using (var task = helperFragment.CallStatic <AndroidJavaObject>("showInvitationInboxUI",
                                                                                AndroidHelperFragment.GetActivity()))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        result =>
                    {
                        int status = result.Get <int>("status");
                        if ((UIStatus)status != UIStatus.Valid)
                        {
                            cb.Invoke((UIStatus)status, null);
                            return;
                        }

                        using (var invitation = result.Get <AndroidJavaObject>("invitation"))
                        {
                            cb.Invoke((UIStatus)status, AndroidJavaConverter.ToInvitation(invitation));
                        }
                    });

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        exception =>
                    {
                        Debug.Log("ShowInvitationInboxUI failed with exception");
                        cb.Invoke(UIStatus.InternalError, null);
                    });
                }
        }
예제 #9
0
        public void GetAllInvitations(Action <Invitation[]> callback)
        {
            callback = ToOnGameThread(callback);
            using (var task = mInvitationsClient.Call <AndroidJavaObject>("loadInvitations"))
            {
                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                    task,
                    annotatedData =>
                {
                    using (var invitationBuffer = annotatedData.Call <AndroidJavaObject>("get"))
                    {
                        int count = invitationBuffer.Call <int>("getCount");
                        Invitation[] invitations = new Invitation[count];
                        for (int i = 0; i < count; i++)
                        {
                            using (var invitationObject = invitationBuffer.Call <AndroidJavaObject>("get", i))
                            {
                                invitations[i] = AndroidJavaConverter.ToInvitation(invitationObject);
                            }
                        }

                        callback(invitations);
                    }
                });

                AndroidTaskUtils.AddOnFailureListener(
                    task,
                    exception => callback(null));
            }
        }
예제 #10
0
        public void CreateWithInvitationScreen(uint minOpponents, uint maxOpponents, uint variant,
                                               Action <UIStatus, TurnBasedMatch> callback)
        {
            callback = ToOnGameThread(callback);

            AndroidHelperFragment.ShowTbmpSelectOpponentsUI(minOpponents, maxOpponents,
                                                            (status, result) =>
            {
                if (status != UIStatus.Valid)
                {
                    callback(status, null);
                    return;
                }

                using (var matchConfigClass =
                           new AndroidJavaClass("com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig"))
                    using (var matchConfigBuilder = matchConfigClass.CallStatic <AndroidJavaObject>("builder"))
                    {
                        if (result.MinAutomatchingPlayers > 0)
                        {
                            using (var autoMatchCriteria = matchConfigClass.CallStatic <AndroidJavaObject>(
                                       "createAutoMatchCriteria", result.MinAutomatchingPlayers,
                                       result.MaxAutomatchingPlayers, /* exclusiveBitMask= */ (long)0))
                                using (matchConfigBuilder.Call <AndroidJavaObject>("setAutoMatchCriteria",
                                                                                   autoMatchCriteria))
                                    ;
                        }

                        if (variant != 0)
                        {
                            using (matchConfigBuilder.Call <AndroidJavaObject>("setVariant", (int)variant));
                        }

                        using (var invitedPlayersObject = new AndroidJavaObject("java.util.ArrayList"))
                        {
                            for (int i = 0; i < result.PlayerIdsToInvite.Count; ++i)
                            {
                                invitedPlayersObject.Call <bool>("add", result.PlayerIdsToInvite[i]);
                            }

                            using (matchConfigBuilder.Call <AndroidJavaObject>("addInvitedPlayers", invitedPlayersObject)
                                   );
                        }

                        using (var matchConfig = matchConfigBuilder.Call <AndroidJavaObject>("build"))
                            using (var task = mClient.Call <AndroidJavaObject>("createMatch", matchConfig))
                            {
                                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                                    task,
                                    turnBasedMatch =>
                                    callback(UIStatus.Valid, AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatch)));

                                AndroidTaskUtils.AddOnFailureListener(
                                    task,
                                    exception => callback(UIStatus.InternalError, null));
                            }
                    }
            });
        }
예제 #11
0
        ///<summary></summary>
        /// <seealso cref="GooglePlayGames.BasicApi.IPlayGamesClient.LoadAchievements"/>
        public void LoadAchievements(Action <Achievement[]> callback)
        {
            using (var achievementsClient = getAchievementsClient())
                using (var task = achievementsClient.Call <AndroidJavaObject>("load", /* forceReload= */ false))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        annotatedData =>
                    {
                        using (var achievementBuffer = annotatedData.Call <AndroidJavaObject>("get"))
                        {
                            int count            = achievementBuffer.Call <int>("getCount");
                            Achievement[] result = new Achievement[count];
                            for (int i = 0; i < count; ++i)
                            {
                                Achievement achievement = new Achievement();
                                using (var javaAchievement = achievementBuffer.Call <AndroidJavaObject>("get", i))
                                {
                                    achievement.Id          = javaAchievement.Call <string>("getAchievementId");
                                    achievement.Description = javaAchievement.Call <string>("getDescription");
                                    achievement.Name        = javaAchievement.Call <string>("getName");
                                    achievement.Points      = javaAchievement.Call <ulong>("getXpValue");

                                    long timestamp = javaAchievement.Call <long>("getLastUpdatedTimestamp");
                                    achievement.LastModifiedTime = AndroidJavaConverter.ToDateTime(timestamp);

                                    achievement.RevealedImageUrl = javaAchievement.Call <string>("getRevealedImageUrl");
                                    achievement.UnlockedImageUrl = javaAchievement.Call <string>("getUnlockedImageUrl");
                                    achievement.IsIncremental    =
                                        javaAchievement.Call <int>("getType") == 1 /* TYPE_INCREMENTAL */;
                                    if (achievement.IsIncremental)
                                    {
                                        achievement.CurrentSteps = javaAchievement.Call <int>("getCurrentSteps");
                                        achievement.TotalSteps   = javaAchievement.Call <int>("getTotalSteps");
                                    }

                                    int state = javaAchievement.Call <int>("getState");
                                    achievement.IsUnlocked = state == 0 /* STATE_UNLOCKED */;
                                    achievement.IsRevealed = state == 1 /* STATE_REVEALED */;
                                }

                                result[i] = achievement;
                            }

                            achievementBuffer.Call("release");
                            InvokeCallbackOnGameThread(callback, result);
                        }
                    });

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        exception =>
                    {
                        Debug.Log("LoadAchievements failed");
                        InvokeCallbackOnGameThread(callback, new Achievement[0]);
                    });
                }
        }
예제 #12
0
        private LeaderboardScoreData CreateLeaderboardScoreData(
            string leaderboardId,
            LeaderboardCollection collection,
            LeaderboardTimeSpan timespan,
            ResponseStatus status,
            AndroidJavaObject leaderboardScoresJava)
        {
            LeaderboardScoreData leaderboardScoreData = new LeaderboardScoreData(leaderboardId, status);
            var scoresBuffer = leaderboardScoresJava.Call <AndroidJavaObject>("getScores");
            int count        = scoresBuffer.Call <int>("getCount");

            for (int i = 0; i < count; ++i)
            {
                using (var leaderboardScore = scoresBuffer.Call <AndroidJavaObject>("get", i))
                {
                    long            timestamp = leaderboardScore.Call <long>("getTimestampMillis");
                    System.DateTime date      = AndroidJavaConverter.ToDateTime(timestamp);

                    ulong  rank          = (ulong)leaderboardScore.Call <long>("getRank");
                    string scoreHolderId = "";
                    using (var scoreHolder = leaderboardScore.Call <AndroidJavaObject>("getScoreHolder"))
                    {
                        scoreHolderId = scoreHolder.Call <string>("getPlayerId");
                    }

                    ulong  score    = (ulong)leaderboardScore.Call <long>("getRawScore");
                    string metadata = leaderboardScore.Call <string>("getScoreTag");

                    leaderboardScoreData.AddScore(new PlayGamesScore(date, leaderboardId,
                                                                     rank, scoreHolderId, score, metadata));
                }
            }

            leaderboardScoreData.NextPageToken = new ScorePageToken(scoresBuffer, leaderboardId, collection,
                                                                    timespan, ScorePageDirection.Forward);
            leaderboardScoreData.PrevPageToken = new ScorePageToken(scoresBuffer, leaderboardId, collection,
                                                                    timespan, ScorePageDirection.Backward);

            using (var leaderboard = leaderboardScoresJava.Call <AndroidJavaObject>("getLeaderboard"))
                using (var variants = leaderboard.Call <AndroidJavaObject>("getVariants"))
                    using (var variant = variants.Call <AndroidJavaObject>("get", 0))
                    {
                        leaderboardScoreData.Title = leaderboard.Call <string>("getDisplayName");
                        if (variant.Call <bool>("hasPlayerInfo"))
                        {
                            System.DateTime date     = AndroidJavaConverter.ToDateTime(0);
                            ulong           rank     = (ulong)variant.Call <long>("getPlayerRank");
                            ulong           score    = (ulong)variant.Call <long>("getRawPlayerScore");
                            string          metadata = variant.Call <string>("getPlayerScoreTag");
                            leaderboardScoreData.PlayerScore = new PlayGamesScore(date, leaderboardId,
                                                                                  rank, mUser.id, score, metadata);
                        }

                        leaderboardScoreData.ApproximateCount = (ulong)variant.Call <long>("getNumScores");
                    }

            return(leaderboardScoreData);
        }
예제 #13
0
 public void onPeersDisconnected(AndroidJavaObject room, AndroidJavaObject participantIds)
 {
     if (mParent.GetRoomStatus() == RoomStatus.Active)
     {
         mParent.mRoom = room;
         mParent.mListener.OnPeersDisconnected(AndroidJavaConverter.ToStringList(participantIds).ToArray());
     }
     else
     {
         handleConnectedSetChanged(room);
     }
 }
        private void InternalSend(List <string> recipientEndpointIds, byte[] payload)
        {
            Misc.CheckNotNull(recipientEndpointIds);
            Misc.CheckNotNull(payload);

            using (var payloadClass = new AndroidJavaClass("com.google.android.gms.nearby.connection.Payload"))
                using (var payloadObject = payloadClass.CallStatic <AndroidJavaObject>("fromBytes", payload))
                    using (var task = mClient.Call <AndroidJavaObject>("sendPayload",
                                                                       AndroidJavaConverter.ToJavaStringList(recipientEndpointIds),
                                                                       payloadObject))
                        ;
        }
        private List <TurnBasedMatch> CreateTurnBasedMatchList(AndroidJavaObject turnBasedMatchBuffer)
        {
            List <TurnBasedMatch> turnBasedMatches = new List <TurnBasedMatch>();
            int count = turnBasedMatchBuffer.Call <int>("getCount");

            for (int i = 0; i < count; ++i)
            {
                TurnBasedMatch match =
                    AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatchBuffer.Call <AndroidJavaObject>("get", (int)i));
                turnBasedMatches.Add(match);
            }

            return(turnBasedMatches);
        }
예제 #16
0
        internal static IUserProfile[] playersBufferToArray(AndroidJavaObject playersBuffer)
        {
            int count = playersBuffer.Call <int>("getCount");

            IUserProfile[] users = new IUserProfile[count];
            for (int i = 0; i < count; ++i)
            {
                using (var player = playersBuffer.Call <AndroidJavaObject>("get", i)) {
                    users[i] = AndroidJavaConverter.ToPlayerProfile(player);
                }
            }

            playersBuffer.Call("release");
            return(users);
        }
예제 #17
0
        ///<summary></summary>
        /// <seealso cref="GooglePlayGames.BasicApi.IPlayGamesClient.LoadScores"/>
        public void LoadScores(string leaderboardId, LeaderboardStart start,
                               int rowCount, LeaderboardCollection collection,
                               LeaderboardTimeSpan timeSpan,
                               Action <LeaderboardScoreData> callback)
        {
            using (var client = getLeaderboardsClient())
            {
                string loadScoresMethod =
                    start == LeaderboardStart.TopScores ? "loadTopScores" : "loadPlayerCenteredScores";
                using (var task = client.Call <AndroidJavaObject>(
                           loadScoresMethod,
                           leaderboardId,
                           AndroidJavaConverter.ToLeaderboardVariantTimeSpan(timeSpan),
                           AndroidJavaConverter.ToLeaderboardVariantCollection(collection),
                           rowCount))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        annotatedData =>
                    {
                        using (var leaderboardScores = annotatedData.Call <AndroidJavaObject>("get"))
                        {
                            InvokeCallbackOnGameThread(callback, CreateLeaderboardScoreData(
                                                           leaderboardId,
                                                           collection,
                                                           timeSpan,
                                                           annotatedData.Call <bool>("isStale")
                                        ? ResponseStatus.SuccessWithStale
                                        : ResponseStatus.Success,
                                                           leaderboardScores));
                            leaderboardScores.Call("release");
                        }
                    });

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        exception =>
                    {
                        Debug.Log("LoadScores failed");
                        InvokeCallbackOnGameThread(callback,
                                                   new LeaderboardScoreData(leaderboardId, ResponseStatus.InternalError));
                    });
                }
            }
        }
예제 #18
0
        internal static Invitation ToInvitation(AndroidJavaObject invitation)
        {
            string invitationId      = invitation.Call <string>("getInvitationId");
            int    invitationType    = invitation.Call <int>("getInvitationType");
            int    variant           = invitation.Call <int>("getVariant");
            long   creationTimestamp = invitation.Call <long>("getCreationTimestamp");

            System.DateTime creationTime = AndroidJavaConverter.ToDateTime(creationTimestamp);
            using (var participant = invitation.Call <AndroidJavaObject>("getInviter"))
            {
                return(new Invitation(
                           AndroidJavaConverter.FromInvitationType(invitationType),
                           invitationId,
                           AndroidJavaConverter.ToParticipant(participant),
                           variant,
                           creationTime));
            }
        }
예제 #19
0
        public Participant GetParticipant(string participantId)
        {
            if (GetRoomStatus() != RoomStatus.Active)
            {
                return(null);
            }

            try
            {
                using (var participant = mRoom.Call <AndroidJavaObject>("getParticipant", participantId))
                {
                    return(AndroidJavaConverter.ToParticipant(participant));
                }
            }
            catch (Exception e)
            {
                return(null);
            }
        }
예제 #20
0
        internal static List <Participant> ToParticipantList(AndroidJavaObject turnBasedMatch)
        {
            using (var participantsObject = turnBasedMatch.Call <AndroidJavaObject>("getParticipantIds"))
            {
                List <Participant> participants = new List <Participant>();
                int size = participantsObject.Call <int>("size");

                for (int i = 0; i < size; i++)
                {
                    string participantId = participantsObject.Call <string>("get", i);
                    using (var participantObject =
                               turnBasedMatch.Call <AndroidJavaObject>("getParticipant", participantId))
                    {
                        participants.Add(AndroidJavaConverter.ToParticipant(participantObject));
                    }
                }

                return(participants);
            }
        }
예제 #21
0
        private void FindInvitation(string invitationId, Action <bool> fail, Action <Invitation> callback)
        {
            using (var task = mInvitationsClient.Call <AndroidJavaObject>("loadInvitations"))
            {
                AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                    task,
                    annotatedData =>
                {
                    using (var invitationBuffer = annotatedData.Call <AndroidJavaObject>("get"))
                    {
                        int count = invitationBuffer.Call <int>("getCount");
                        for (int i = 0; i < count; i++)
                        {
                            Invitation invitation;
                            using (var invitationObject = invitationBuffer.Call <AndroidJavaObject>("get", i))
                            {
                                invitation = AndroidJavaConverter.ToInvitation(invitationObject);
                            }

                            if (invitation.InvitationId == invitationId)
                            {
                                callback(invitation);
                                return;
                            }
                        }

                        OurUtils.Logger.e("Invitation with ID " + invitationId + " couldn't be found");
                        fail(true);
                    }
                });

                AndroidTaskUtils.AddOnFailureListener(
                    task,
                    exception =>
                {
                    OurUtils.Logger.e("Couldn't load invitations.");
                    fail(true);
                });
            }
        }
예제 #22
0
        private List <Participant> GetParticipantList()
        {
            if (mRoom == null)
            {
                return(new List <Participant>());
            }

            List <Participant> participants = new List <Participant>();

            using (var participantsObject = mRoom.Call <AndroidJavaObject>("getParticipants"))
            {
                int size = participantsObject.Call <int>("size");
                for (int i = 0; i < size; i++)
                {
                    using (var participant = participantsObject.Call <AndroidJavaObject>("get", i))
                    {
                        participants.Add(AndroidJavaConverter.ToParticipant(participant));
                    }
                }
            }

            return(participants);
        }
        public void AcceptInvitation(string invitationId, Action <bool, TurnBasedMatch> callback)
        {
            callback = ToOnGameThread(callback);

            FindInvitationWithId(invitationId, invitation =>
            {
                if (invitation == null)
                {
                    OurUtils.Logger.e("Could not find invitation with id " + invitationId);
                    callback(false, null);
                    return;
                }

                using (var task = mClient.Call <AndroidJavaObject>("acceptInvitation", invitationId))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        turnBasedMatch =>
                        callback(true, AndroidJavaConverter.ToTurnBasedMatch(turnBasedMatch)));

                    AndroidTaskUtils.AddOnFailureListener(task, e => callback(false, null));
                }
            });
        }
예제 #24
0
        internal static Participant ToParticipant(AndroidJavaObject participant)
        {
            string displayName   = participant.Call <string>("getDisplayName");
            string participantId = participant.Call <string>("getParticipantId");

            Participant.ParticipantStatus status =
                AndroidJavaConverter.FromParticipantStatus(participant.Call <int>("getStatus"));
            bool   connectedToRoom = participant.Call <bool>("isConnectedToRoom");
            Player player          = null;

            try
            {
                using (var playerObject = participant.Call <AndroidJavaObject>("getPlayer"))
                {
                    player = ToPlayer(playerObject);
                }
            }
            catch (Exception)
            {
                // Unity throws exception for returned null
            }

            return(new Participant(displayName, participantId, status, player, connectedToRoom));
        }
예제 #25
0
        public static void ShowLeaderboardUI(string leaderboardId, LeaderboardTimeSpan timeSpan, Action <UIStatus> cb)
        {
            using (var helperFragment = new AndroidJavaClass(HelperFragmentClass))
                using (var task = helperFragment.CallStatic <AndroidJavaObject>("showLeaderboardUi",
                                                                                GetActivity(), leaderboardId,
                                                                                AndroidJavaConverter.ToLeaderboardVariantTimeSpan(timeSpan)))
                {
                    AndroidTaskUtils.AddOnSuccessListener <int>(
                        task,
                        uiCode =>
                    {
                        Logger.d("ShowLeaderboardUI result " + uiCode);
                        cb.Invoke((UIStatus)uiCode);
                    });

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        exception =>
                    {
                        Logger.e("ShowLeaderboardUI failed with exception");
                        cb.Invoke(UIStatus.InternalError);
                    });
                }
        }
예제 #26
0
        ///<summary></summary>
        /// <seealso cref="GooglePlayGames.BasicApi.IPlayGamesClient.LoadMoreScores"/>
        public void LoadMoreScores(ScorePageToken token, int rowCount,
                                   Action <LeaderboardScoreData> callback)
        {
            using (var client = getLeaderboardsClient())
                using (var task = client.Call <AndroidJavaObject>("loadMoreScores",
                                                                  token.InternalObject, rowCount, AndroidJavaConverter.ToPageDirection(token.Direction)))
                {
                    AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                        task,
                        annotatedData =>
                    {
                        using (var leaderboardScores = annotatedData.Call <AndroidJavaObject>("get"))
                        {
                            InvokeCallbackOnGameThread(callback, CreateLeaderboardScoreData(
                                                           token.LeaderboardId,
                                                           token.Collection,
                                                           token.TimeSpan,
                                                           annotatedData.Call <bool>("isStale")
                                    ? ResponseStatus.SuccessWithStale
                                    : ResponseStatus.Success,
                                                           leaderboardScores));
                            leaderboardScores.Call("release");
                        }
                    });

                    AndroidTaskUtils.AddOnFailureListener(
                        task,
                        exception =>
                    {
                        Debug.Log("LoadMoreScores failed");
                        InvokeCallbackOnGameThread(callback,
                                                   new LeaderboardScoreData(token.LeaderboardId, ResponseStatus.InternalError));
                    });
                }
        }
예제 #27
0
 public void onInvitationReceived(AndroidJavaObject invitation)
 {
     mInvitationDelegate.Invoke(AndroidJavaConverter.ToInvitation(invitation), /* shouldAutoAccept= */
                                false);
 }
예제 #28
0
        ///<summary></summary>
        /// <seealso cref="GooglePlayGames.BasicApi.IPlayGamesClient.LoadUsers"/>
        public void LoadUsers(string[] userIds, Action <IUserProfile[]> callback)
        {
            if (!IsAuthenticated())
            {
                InvokeCallbackOnGameThread(callback, new IUserProfile[0]);
                return;
            }

            using (var playersClient = getPlayersClient())
            {
                object         countLock   = new object();
                int            count       = userIds.Length;
                int            resultCount = 0;
                IUserProfile[] users       = new IUserProfile[count];
                for (int i = 0; i < count; ++i)
                {
                    using (var task = playersClient.Call <AndroidJavaObject>("loadPlayer", userIds[i]))
                    {
                        AndroidTaskUtils.AddOnSuccessListener <AndroidJavaObject>(
                            task,
                            annotatedData =>
                        {
                            using (var player = annotatedData.Call <AndroidJavaObject>("get"))
                            {
                                string playerId = player.Call <string>("getPlayerId");
                                for (int j = 0; j < count; ++j)
                                {
                                    if (playerId == userIds[j])
                                    {
                                        users[j] = AndroidJavaConverter.ToPlayer(player);
                                        break;
                                    }
                                }

                                lock (countLock)
                                {
                                    ++resultCount;
                                    if (resultCount == count)
                                    {
                                        InvokeCallbackOnGameThread(callback, users);
                                    }
                                }
                            }
                        });

                        AndroidTaskUtils.AddOnFailureListener(
                            task,
                            exception =>
                        {
                            Debug.Log("LoadUsers failed for index " + i);
                            lock (countLock)
                            {
                                ++resultCount;
                                if (resultCount == count)
                                {
                                    InvokeCallbackOnGameThread(callback, users);
                                }
                            }
                        });
                    }
                }
            }
        }
예제 #29
0
        ///<summary></summary>
        /// <seealso cref="GooglePlayGames.BasicApi.IPlayGamesClient.Authenticate"/>
        public void Authenticate(Action <bool, string> callback, bool silent)
        {
            lock (AuthStateLock)
            {
                // If the user is already authenticated, just fire the callback, we don't need
                // any additional work.
                if (mAuthState == AuthState.Authenticated)
                {
                    InvokeCallbackOnGameThread(callback, true, null);
                    return;
                }
            }

            InitializeTokenClient();

            Debug.Log("Starting Auth with token client.");
            mTokenClient.FetchTokens(silent, (int result) =>
            {
                bool succeed = result == 0 /* CommonStatusCodes.SUCCEED */;
                InitializeGameServices();
                if (succeed)
                {
                    using (var signInTasks = new AndroidJavaObject("java.util.ArrayList"))
                    {
                        if (mInvitationDelegate != null)
                        {
                            mInvitationCallback = new AndroidJavaObject(
                                "com.google.games.bridge.InvitationCallbackProxy",
                                new InvitationCallbackProxy(mInvitationDelegate));
                            using (var invitationsClient = getInvitationsClient())
                                using (var taskRegisterCallback =
                                           invitationsClient.Call <AndroidJavaObject>("registerInvitationCallback",
                                                                                      mInvitationCallback))
                                {
                                    signInTasks.Call <bool>("add", taskRegisterCallback);
                                }
                        }

                        AndroidJavaObject taskGetPlayer =
                            getPlayersClient().Call <AndroidJavaObject>("getCurrentPlayer");
                        AndroidJavaObject taskGetActivationHint =
                            getGamesClient().Call <AndroidJavaObject>("getActivationHint");
                        AndroidJavaObject taskIsCaptureSupported =
                            getVideosClient().Call <AndroidJavaObject>("isCaptureSupported");

                        if (!mConfiguration.IsHidingPopups)
                        {
                            AndroidJavaObject taskSetViewForPopups;
                            using (var popupView = AndroidHelperFragment.GetDefaultPopupView())
                            {
                                taskSetViewForPopups =
                                    getGamesClient().Call <AndroidJavaObject>("setViewForPopups", popupView);
                            }

                            signInTasks.Call <bool>("add", taskSetViewForPopups);
                        }

                        signInTasks.Call <bool>("add", taskGetPlayer);
                        signInTasks.Call <bool>("add", taskGetActivationHint);
                        signInTasks.Call <bool>("add", taskIsCaptureSupported);

                        using (var tasks = new AndroidJavaClass(TasksClassName))
                            using (var allTask = tasks.CallStatic <AndroidJavaObject>("whenAll", signInTasks))
                            {
                                AndroidTaskUtils.AddOnCompleteListener <AndroidJavaObject>(
                                    allTask,
                                    completeTask =>
                                {
                                    if (completeTask.Call <bool>("isSuccessful"))
                                    {
                                        using (var resultObject = taskGetPlayer.Call <AndroidJavaObject>("getResult"))
                                        {
                                            mUser = AndroidJavaConverter.ToPlayer(resultObject);
                                        }

                                        var account = mTokenClient.GetAccount();
                                        lock (GameServicesLock)
                                        {
                                            mSavedGameClient = new AndroidSavedGameClient(account);
                                            mEventsClient    = new AndroidEventsClient(account);
                                            bool isCaptureSupported;
                                            using (var resultObject =
                                                       taskIsCaptureSupported.Call <AndroidJavaObject>("getResult"))
                                            {
                                                isCaptureSupported = resultObject.Call <bool>("booleanValue");
                                            }

                                            mVideoClient     = new AndroidVideoClient(isCaptureSupported, account);
                                            mRealTimeClient  = new AndroidRealTimeMultiplayerClient(this, account);
                                            mTurnBasedClient = new AndroidTurnBasedMultiplayerClient(this, account);
                                            mTurnBasedClient.RegisterMatchDelegate(mConfiguration.MatchDelegate);
                                        }

                                        mAuthState = AuthState.Authenticated;
                                        InvokeCallbackOnGameThread(callback, true, "Authentication succeeded");
                                        GooglePlayGames.OurUtils.Logger.d("Authentication succeeded");
                                        try
                                        {
                                            using (var activationHint =
                                                       taskGetActivationHint.Call <AndroidJavaObject>("getResult"))
                                            {
                                                if (mInvitationDelegate != null)
                                                {
                                                    try
                                                    {
                                                        using (var invitationObject =
                                                                   activationHint.Call <AndroidJavaObject>("getParcelable",
                                                                                                           "invitation" /* Multiplayer.EXTRA_INVITATION */))
                                                        {
                                                            Invitation invitation =
                                                                AndroidJavaConverter.ToInvitation(invitationObject);
                                                            mInvitationDelegate(invitation, /* shouldAutoAccept= */
                                                                                true);
                                                        }
                                                    }
                                                    catch (Exception)
                                                    {
                                                        // handle null return
                                                    }
                                                }


                                                if (mTurnBasedClient.MatchDelegate != null)
                                                {
                                                    try
                                                    {
                                                        using (var matchObject =
                                                                   activationHint.Call <AndroidJavaObject>("getParcelable",
                                                                                                           "turn_based_match" /* Multiplayer#EXTRA_TURN_BASED_MATCH */)
                                                               )
                                                        {
                                                            TurnBasedMatch turnBasedMatch =
                                                                AndroidJavaConverter.ToTurnBasedMatch(matchObject);
                                                            mTurnBasedClient.MatchDelegate(
                                                                turnBasedMatch, /* shouldAutoLaunch= */ true);
                                                        }
                                                    }
                                                    catch (Exception)
                                                    {
                                                    }
                                                }
                                            }
                                        }
                                        catch (Exception)
                                        {
                                            // handle null return
                                        }

                                        LoadAchievements(ignore => { });
                                    }
                                    else
                                    {
                                        SignOut();
                                        InvokeCallbackOnGameThread(callback, false, "Authentication failed");
                                        GooglePlayGames.OurUtils.Logger.d("Authentication failed");
                                    }
                                }
                                    );
                            }
                    }
                }
                else
                {
                    lock (AuthStateLock)
                    {
                        if (result == 16 /* CommonStatusCodes.CANCELED */)
                        {
                            InvokeCallbackOnGameThread(callback, false, "Authentication canceled");
                            GooglePlayGames.OurUtils.Logger.d("Authentication canceled");
                        }
                        else if (result == 8 /* CommonStatusCodes.DEVELOPER_ERROR */)
                        {
                            InvokeCallbackOnGameThread(callback, false, "Authentication failed - developer error");
                            GooglePlayGames.OurUtils.Logger.d("Authentication failed - developer error");
                        }
                        else
                        {
                            InvokeCallbackOnGameThread(callback, false, "Authentication failed");
                            GooglePlayGames.OurUtils.Logger.d("Authentication failed");
                        }
                    }
                }
            });
        }
예제 #30
0
        public void CreateWithInvitationScreen(uint minOpponents, uint maxOpponents, uint variant,
                                               RealTimeMultiplayerListener listener)
        {
            lock (mSessionLock)
            {
                if (GetRoomStatus() == RoomStatus.Active)
                {
                    OurUtils.Logger.e("Received attempt to create a new room without cleaning up the old one.");
                    listener.OnRoomConnected(false);
                    return;
                }

                AndroidHelperFragment.ShowRtmpSelectOpponentsUI(minOpponents, maxOpponents,
                                                                (status, result) =>
                {
                    if (status != UIStatus.Valid)
                    {
                        listener.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, listener)))
                            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(listener)))
                                    using (roomConfigBuilder.Call <AndroidJavaObject>("setOnMessageReceivedListener",
                                                                                      messageReceivedListener))
                                        ;

                                using (var roomStatusUpdateCallback =
                                           new AndroidJavaObject("com.google.games.bridge.RoomStatusUpdateCallbackProxy",
                                                                 new RoomStatusUpdateCallbackProxy(this, listener)))
                                    using (roomConfigBuilder.Call <AndroidJavaObject>("setRoomStatusUpdateCallback",
                                                                                      roomStatusUpdateCallback))
                                        ;

                                using (roomConfigBuilder.Call <AndroidJavaObject>("addPlayersToInvite",
                                                                                  AndroidJavaConverter.ToJavaStringList(result.PlayerIdsToInvite)))
                                {
                                    mRoomConfig = roomConfigBuilder.Call <AndroidJavaObject>("build");
                                }

                                mListener = listener;
                            }

                    // 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 =>
                        {
                            listener.OnRoomConnected(false);
                            CleanSession();
                        });
                    }
                });
            }
        }