Пример #1
0
        public async Task <FacebookResponse <bool> > LoginAsync(string[] permissions, FacebookPermissionType permissionType = FacebookPermissionType.Read)
        {
            var retVal = IsLoggedIn;
            FacebookActionStatus status = FacebookActionStatus.Error;

            if (!retVal || !HasPermissions(permissions))
            {
                var window = UIApplication.SharedApplication.KeyWindow;
                var vc     = window.RootViewController;
                while (vc.PresentedViewController != null)
                {
                    vc = vc.PresentedViewController;
                }

                LoginManagerLoginResult result = await(permissionType == FacebookPermissionType.Read ? loginManager.LogInWithReadPermissionsAsync(permissions, vc) : loginManager.LogInWithPublishPermissionsAsync(permissions, vc));

                if (result.IsCancelled)
                {
                    retVal = false;
                    status = FacebookActionStatus.Canceled;
                }
                else
                {
                    //result.GrantedPermissions.h
                    retVal = HasPermissions(result.GrantedPermissions.Select(p => $"{p}").ToArray());

                    status = retVal ? FacebookActionStatus.Completed : FacebookActionStatus.Unauthorized;
                }
            }
            else
            {
                status = FacebookActionStatus.Completed;
            }
            var fbArgs = new FBEventArgs <bool>(retVal, status);

            OnLogin(this, fbArgs);

            pendingAction?.Execute();

            pendingAction = null;


            return(new FacebookResponse <bool>(fbArgs));
        }
        public void OnCompleted(JSONObject @object, GraphResponse response)
        {
            try
            {
                if (response.Error != null)
                {
                    System.Diagnostics.Debug.WriteLine(response.Error.ErrorMessage.ToString());
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Error, response.Error.ErrorMessage.ToString());
                    _onUserData?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _userDataTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                }
                else
                {
                    var fieldsString = response.Request.Parameters.GetString("fields");
                    var fields       = fieldsString.Split(',');

                    Dictionary <string, object> userData = new Dictionary <string, object>();

                    for (int i = 0; i < fields.Length; i++)
                    {
                        if (@object.Has(fields[i]))
                        {
                            userData.Add(fields[i], @object.GetString(fields[i]));
                        }
                    }
                    userData.Add("user_id", AccessToken.CurrentAccessToken.UserId);
                    userData.Add("token", AccessToken.CurrentAccessToken.Token);
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(userData, FacebookActionStatus.Completed);
                    _onUserData?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _userDataTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                }
            }
            catch (JSONException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
                var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Error, ex.ToString());
                _onUserData?.Invoke(CrossFacebookClient.Current, fbArgs);
                _userDataTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
            }
        }
        public async Task <FacebookResponse <bool> > LoginAsync(string[] permissions, FacebookPermissionType permissionType = FacebookPermissionType.Read)
        {
            _loginTcs = new TaskCompletionSource <FacebookResponse <bool> >();
            var retVal = IsLoggedIn;

            if (!retVal || !HasPermissions(permissions))
            {
                var activity = CurrentActivity;

                if (!activity.IsFinishing)
                {
                    activity.RunOnUiThread(() =>
                    {
                        if (permissionType == FacebookPermissionType.Read)
                        {
                            LoginManager.Instance.LogInWithReadPermissions(activity, permissions.ToList());
                        }
                        else
                        {
                            LoginManager.Instance.LogInWithPublishPermissions(activity, permissions.ToList());
                        }
                    });
                }
            }
            else
            {
                var fbArgs = new FBEventArgs <bool>(retVal, FacebookActionStatus.Completed);
                _onLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                _loginTcs.TrySetResult(new FacebookResponse <bool>(fbArgs));

                pendingAction?.Execute();

                pendingAction = null;
            }
            return(await _loginTcs.Task);
        }
        void RequestData(Dictionary <string, object> pDictionary)
        {
            //string path,Bundle parameters = null,HttpMethod method = null,string version = null
            string path    = $"{pDictionary["path"]}";
            string version = $"{pDictionary["version"]}";
            Dictionary <string, string> parameters = pDictionary["parameters"] as Dictionary <string, string>;


            FacebookHttpMethod?method = pDictionary["method"] as FacebookHttpMethod?;
            var currentTcs            = _requestTcs;
            var _onEvent   = _onRequestData;
            var httpMethod = HttpMethod.Get;

            if (method != null)
            {
                switch (method)
                {
                case FacebookHttpMethod.Get:
                    httpMethod = HttpMethod.Get;
                    break;

                case FacebookHttpMethod.Post:
                    httpMethod = HttpMethod.Post;
                    _onEvent   = _onPostData;
                    currentTcs = _postTcs;
                    break;

                case FacebookHttpMethod.Delete:
                    httpMethod = HttpMethod.Delete;
                    _onEvent   = _onDeleteData;
                    currentTcs = _deleteTcs;
                    break;
                }
            }

            if (string.IsNullOrEmpty(path))
            {
                var fbResponse = new FBEventArgs <string>(null, FacebookActionStatus.Error, "Graph query path not specified");
                _onEvent?.Invoke(CrossFacebookClient.Current, fbResponse);
                currentTcs?.TrySetResult(new FacebookResponse <string>(fbResponse));
                return;
            }

            if (AccessToken.CurrentAccessToken != null)
            {
                GraphRequest request = new GraphRequest(AccessToken.CurrentAccessToken, path);

                request.Callback   = this;
                request.HttpMethod = httpMethod;

                if (parameters != null)
                {
                    Bundle bundle = new Bundle();
                    foreach (var p in parameters)
                    {
                        if (!string.IsNullOrEmpty(p.Key) && !string.IsNullOrEmpty(p.Value))
                        {
                            bundle.PutString($"{p.Key}", $"{p.Value}");
                        }
                    }
                    request.Parameters = bundle;
                }

                if (!string.IsNullOrEmpty(version))
                {
                    request.Version = version;
                }

                request.ExecuteAsync();
            }
            else
            {
                var fbResponse = new FBEventArgs <string>(null, FacebookActionStatus.Unauthorized, "Facebook operation not authorized, be sure you requested the right permissions");
                _onEvent?.Invoke(CrossFacebookClient.Current, fbResponse);
                currentTcs?.TrySetResult(new FacebookResponse <string>(fbResponse));
            }
        }
        public static void Initialize(Activity activity)
        {
            mLogger          = AppEventsLogger.NewLogger(Android.App.Application.Context as Android.App.Application);
            mCallbackManager = CallbackManagerFactory.Create();
            CurrentActivity  = activity;

            loginCallback = new FacebookCallback <LoginResult>
            {
                HandleSuccess = loginResult =>
                {
                    if (loginResult.AccessToken != null)
                    {
                        var fbArgs = new FBEventArgs <bool>(true, FacebookActionStatus.Completed);
                        _onLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                        _loginTcs?.TrySetResult(new FacebookResponse <bool>(fbArgs));

                        pendingAction?.Execute();

                        pendingAction = null;
                    }
                },
                HandleCancel = () =>
                {
                    var fbArgs = new FBEventArgs <bool>(false, FacebookActionStatus.Canceled, "User cancelled facebook operation");
                    _onLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _loginTcs?.TrySetResult(new FacebookResponse <bool>(fbArgs));
                    //Handle any cancel the user has perform
                    Console.WriteLine("User cancelled facebook login operation");

                    pendingAction?.Execute();

                    pendingAction = null;
                },
                HandleError = loginError =>
                {
                    var fbArgs = new FBEventArgs <bool>(false, FacebookActionStatus.Error, loginError.ToString());
                    _onLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _loginTcs?.TrySetResult(new FacebookResponse <bool>(fbArgs));

                    //Handle any error happends here
                    Console.WriteLine("Operation throws an error: " + loginError.ToString());

                    pendingAction?.Execute();
                    pendingAction = null;
                }
            };


            shareCallback = new FacebookCallback <SharerResult>
            {
                HandleSuccess = shareResult =>
                {
                    Dictionary <string, object> parameters = null;
                    if (shareResult.PostId != null)
                    {
                        parameters = new Dictionary <string, object>();
                        parameters.Add("postId", shareResult.PostId);
                    }
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(parameters, FacebookActionStatus.Completed);
                    _onSharing?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _shareTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                },
                HandleCancel = () =>
                {
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Canceled, "User cancelled facebook operation");
                    _onSharing?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _shareTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                },
                HandleError = shareError =>
                {
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Error, shareError.Message);
                    _onSharing?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _shareTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                }
            };


            gameRequestCallback = new FacebookCallback <GameRequestDialog.Result>
            {
                HandleSuccess = gameRequestResult =>
                {
                    if (!string.IsNullOrEmpty(gameRequestResult.RequestId))
                    {
                        Dictionary <string, object> parameters = new Dictionary <string, object>();

                        parameters.Add("requestId", gameRequestResult.RequestId);
                        var fbArgs = new FBEventArgs <Dictionary <string, object> >(parameters, FacebookActionStatus.Completed);
                        _onGameRequest?.Invoke(CrossFacebookClient.Current, fbArgs);
                        _gameRequestTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                    }
                },
                HandleCancel = () =>
                {
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Canceled, "User cancelled facebook operation");
                    _onGameRequest?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _gameRequestTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                },
                HandleError = gameRequestError =>
                {
                    var fbArgs = new FBEventArgs <Dictionary <string, object> >(null, FacebookActionStatus.Error, gameRequestError.Message);
                    _onGameRequest?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _gameRequestTcs?.TrySetResult(new FacebookResponse <Dictionary <string, object> >(fbArgs));
                }
            };

            LoginManager.Instance.RegisterCallback(mCallbackManager, loginCallback);
        }
Пример #6
0
        void RequestData(Dictionary <string, object> pDictionary)
        {
            string path    = $"{pDictionary["method"]}";
            string version = $"{pDictionary["version"]}";
            Dictionary <string, string> paramDict = pDictionary["parameters"] as Dictionary <string, string>;
            FacebookHttpMethod?         method    = pDictionary["method"] as FacebookHttpMethod?;
            var currentTcs = _requestTcs;
            var onEvent    = OnRequestData;
            var httpMethod = "GET";

            if (method != null)
            {
                switch (method)
                {
                case FacebookHttpMethod.Get:
                    httpMethod = "GET";
                    break;

                case FacebookHttpMethod.Post:
                    httpMethod = "POST";
                    onEvent    = OnPostData;
                    currentTcs = _postTcs;
                    break;

                case FacebookHttpMethod.Delete:
                    httpMethod = "DELETE";
                    onEvent    = OnDeleteData;
                    currentTcs = _deleteTcs;
                    break;
                }
            }

            if (string.IsNullOrEmpty(path))
            {
                var fbResponse = new FBEventArgs <string>(null, FacebookActionStatus.Error, "Graph query path not specified");
                onEvent?.Invoke(CrossFacebookClient.Current, fbResponse);
                currentTcs?.TrySetResult(new FacebookResponse <string>(fbResponse));
                return;
            }



            NSMutableDictionary parameters = null;

            if (paramDict != null)
            {
                parameters = new NSMutableDictionary();
                foreach (var p in paramDict)
                {
                    var key = $"{p}";
                    parameters.Add(new NSString(key), new NSString($"{paramDict[key]}"));
                }
            }

            var graphRequest      = string.IsNullOrEmpty(version)?new GraphRequest(path, parameters, httpMethod): new GraphRequest(path, parameters, AccessToken.CurrentAccessToken.TokenString, version, httpMethod);
            var requestConnection = new GraphRequestConnection();

            requestConnection.AddRequest(graphRequest, (connection, result, error) =>
            {
                if (error == null)
                {
                    var fbResponse = new FBEventArgs <string>(result.ToString(), FacebookActionStatus.Completed);
                    onEvent?.Invoke(CrossFacebookClient.Current, fbResponse);
                    currentTcs?.TrySetResult(new FacebookResponse <string>(fbResponse));
                }
                else
                {
                    var fbResponse = new FBEventArgs <string>(null, FacebookActionStatus.Error, $" Facebook operation failed - {error.Code} - {error.Description}");
                    onEvent?.Invoke(CrossFacebookClient.Current, fbResponse);
                    currentTcs?.TrySetResult(new FacebookResponse <string>(fbResponse));
                }
            });
            requestConnection.Start();
        }
 public FacebookResponse(FBEventArgs <T> evtArgs)
 {
     Data    = evtArgs.Data;
     Status  = evtArgs.Status;
     Message = evtArgs.Message;
 }
        public async Task <FacebookResponse <bool> > LoginAsync(string[] permissions, FacebookPermissionType permissionType = FacebookPermissionType.Read)
        {
            _loginTcs = new TaskCompletionSource <FacebookResponse <bool> >();
            var retVal = IsLoginSessionActive;
            FacebookActionStatus status = FacebookActionStatus.Error;

            if (!HasPermissions(permissions))
            {
                var window = UIApplication.SharedApplication.KeyWindow;
                var vc     = window.RootViewController;
                while (vc.PresentedViewController != null)
                {
                    vc = vc.PresentedViewController;
                }

                loginManager.LogIn(permissions, vc, (result, error) =>
                {
                    if (error == null)
                    {
                        if (result.IsCancelled)
                        {
                            retVal = false;
                            status = FacebookActionStatus.Canceled;
                        }
                        else
                        {
                            retVal = HasPermissions(result.GrantedPermissions.Select(p => $"{p}").ToArray());

                            NSUserDefaults.StandardUserDefaults.SetString(result.Token.TokenString, FBAccessTokenKey);
                            NSUserDefaults.StandardUserDefaults.SetValueForKey(result.Token.ExpirationDate, FBAccessTokenExpirationDateKey);
                            NSUserDefaults.StandardUserDefaults.SetString(result.Token.UserId, FBUserIdKey);
                            NSUserDefaults.StandardUserDefaults.Synchronize();

                            status = retVal ? FacebookActionStatus.Completed : FacebookActionStatus.Unauthorized;
                        }
                    }
                    else
                    {
                        retVal = false;
                        status = FacebookActionStatus.Error;
                    }



                    var fbArgs = new FBEventArgs <bool>(retVal, status);
                    OnLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                    _loginTcs?.TrySetResult(new FacebookResponse <bool>(fbArgs));

                    pendingAction?.Execute();

                    pendingAction = null;
                });
            }
            else
            {
                var fbArgs = new FBEventArgs <bool>(retVal, FacebookActionStatus.Completed);
                OnLogin?.Invoke(CrossFacebookClient.Current, fbArgs);
                _loginTcs?.TrySetResult(new FacebookResponse <bool>(fbArgs));

                pendingAction?.Execute();

                pendingAction = null;
            }

            return(await _loginTcs.Task);
        }