public IObservable <string> GetGoogleToken()
        {
            ensureApiClientExists();

            return(logOutIfNeeded().SelectMany(getGoogleToken));

            IObservable <Unit> logOutIfNeeded()
            {
                if (!googleApiClient.IsConnected)
                {
                    return(Observable.Return(Unit.Default));
                }

                var logoutSubject  = new Subject <Unit>();
                var logoutCallback = new LogOutCallback(() => logoutSubject.CompleteWith(Unit.Default));

                Auth.GoogleSignInApi
                .SignOut(googleApiClient)
                .SetResultCallback(logoutCallback);

                return(logoutSubject.AsObservable());
            }

            IObservable <string> getGoogleToken(Unit _)
            {
                lock (lockable)
                {
                    if (isLoggingIn)
                    {
                        return(loginSubject.AsObservable());
                    }

                    isLoggingIn  = true;
                    loginSubject = new Subject <string>();

                    if (googleApiClient.IsConnected)
                    {
                        login();
                        return(loginSubject.AsObservable());
                    }

                    googleApiClient.Connect();
                    return(loginSubject.AsObservable());
                }
            }
        }
예제 #2
0
        public IObservable <Unit> LogOutIfNeeded()
        {
            logoutSubject = new Subject <Unit>();

            if (googleApiClient.IsConnected)
            {
                var logoutCallback = new LogOutCallback(() =>
                {
                    logoutSubject.OnNext(Unit.Default);
                    logoutSubject.OnCompleted();
                });
                Auth.GoogleSignInApi.SignOut(googleApiClient).SetResultCallback(logoutCallback);
                return(logoutSubject.AsObservable());
            }
            else
            {
                return(Observable.Return(Unit.Default));
            }
        }