public async Task <bool> TryAutoSignInAsync()
        {
            try {
                ProcessLoginResponse processResponse = null;

                if (!_settingsManager.AutoSignIn || _settingsManager.Email.IsNullOrWhiteSpace())
                {
                    Log.Debug("no AutoSignIn or Email is missing");
                    return(false);
                }

                var token = await _credentialsService.LoadJsonAsync(_settingsManager.ServerUrl.ToUri(), _settingsManager.Email);

                if (token != null)
                {
                    Log.Debug("Attempting to AutoSignIn");
                    try {
                        var teamId        = _webviewUserSettingsService?.TryGetTeamId(_sessionService.SolutionName);
                        var loginResponse = await _codeStreamAgent.LoginViaTokenAsync(token, _settingsManager.Team, teamId);

                        processResponse = ProcessLoginError(loginResponse);
                        Log.Debug($"{nameof(processResponse)} Success={processResponse?.Success}");
                        if (!processResponse.Success)
                        {
                            if (!processResponse.ErrorMessage.IsNullOrWhiteSpace() &&
                                Enum.TryParse(processResponse.ErrorMessage, out LoginResult loginResult) && loginResult != LoginResult.VERSION_UNSUPPORTED)
                            {
                                await _credentialsService.DeleteAsync(_settingsManager.ServerUrl.ToUri(), _settingsManager.Email);
                            }
                            return(false);
                        }
                        else
                        {
                            return(true);
                        }
                    }
                    catch (Exception ex) {
                        Log.Warning(ex, $"{nameof(TryAutoSignInAsync)}");
                    }
                }
                else
                {
                    Log.Debug("Missing token");
                }

                return(false);
            }
            catch (Exception ex) {
                Log.Error(ex, nameof(TryAutoSignInAsync));
            }

            return(false);
        }
        private ProcessLoginResponse ProcessLoginError(JToken loginResponse)
        {
            var response = new ProcessLoginResponse();
            var error    = GetError(loginResponse);

            if (error != null)
            {
                response.ErrorMessage = error?.Value <string>();
            }
            else if (loginResponse != null)
            {
                response.Success = true;
            }

            return(response);
        }
        private ProcessLoginResponse ProcessLogin(JToken loginResponse)
        {
            var response = new ProcessLoginResponse();
            var error    = GetError(loginResponse);

            if (error != null)
            {
                //string errorResponse;
                //if (Enum.TryParse(error.ToString(), out LoginResult loginResult)) {
                //	// this is now handled in the webview
                //	//if (loginResult == LoginResult.VERSION_UNSUPPORTED) {
                //	//	await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
                //	//	InfoBarProvider.Instance.ShowInfoBar($"This version of {Application.Name} is no longer supported. Please upgrade to the latest version.");
                //	//}
                //	errorResponse = loginResult.ToString();
                //}
                //else {
                //	errorResponse = error.ToString();
                //}
                //Log.Warning(errorResponse);
                response.ErrorMessage = error?.Value <string>();
            }
            else if (loginResponse != null)
            {
                response.Email = GetEmail(loginResponse).ToString();

                // don't want all the data in state -- some is sensitive
                var state     = GetState(loginResponse);
                var stateLite = JObject.FromObject(new { });
                stateLite["capabilities"] = state["capabilities"];
                stateLite["teamId"]       = state["teamId"];
                stateLite["userId"]       = state["userId"];
                stateLite["email"]        = state["email"];

                _sessionService.SetUser(CreateUser(loginResponse), stateLite);
                response.Success = true;
            }

            return(response);
        }
        public bool CompleteSigninAsync(JToken loginResponse)
        {
            ProcessLoginResponse processResponse = null;

            try {
                try {
                    processResponse = ProcessLogin(loginResponse);
                }
                catch (Exception ex) {
                    Log.Error(ex, $"{nameof(CompleteSigninAsync)}");
                }

                if (processResponse?.Success == true)
                {
                    OnSuccessAsync(loginResponse, processResponse.Email);
                }
            }
            catch (Exception ex) {
                Log.Error(ex, nameof(CompleteSigninAsync));
            }

            return(processResponse?.Success == true);
        }