private void SetResultSafe(FingerprintAuthenticationResult result)
 {
     if (!(_taskCompletionSource.Task.IsCanceled || _taskCompletionSource.Task.IsCompleted || _taskCompletionSource.Task.IsFaulted))
     {
         _taskCompletionSource.SetResult(result);
     }
 }
        protected override async Task<FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            var result = new FingerprintAuthenticationResult();
            SetupContextProperties(authRequestConfig);

            Tuple<bool, NSError> resTuple;
            using (cancellationToken.Register(CancelAuthentication))
            {
                resTuple = await _context.EvaluatePolicyAsync(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, authRequestConfig.Reason);
            }

            if (resTuple.Item1)
            {
                result.Status = FingerprintAuthenticationResultStatus.Succeeded;
            }
            else
            {
                switch ((LAStatus)(int)resTuple.Item2.Code)
                {
                    case LAStatus.AuthenticationFailed:
                        var description = resTuple.Item2.Description;
                        if (description != null && description.Contains("retry limit exceeded"))
                        {
                            result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                        }
                        else
                        {
                            result.Status = FingerprintAuthenticationResultStatus.Failed;
                        }
                        break;

                    case LAStatus.UserCancel:
                    case LAStatus.AppCancel:
                        result.Status = FingerprintAuthenticationResultStatus.Canceled;
                        break;

                    case LAStatus.UserFallback:
                        result.Status = FingerprintAuthenticationResultStatus.FallbackRequested;
                        break;

                    case LAStatus.TouchIDLockout:
                        result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                        break;

                    default:
                        result.Status = FingerprintAuthenticationResultStatus.UnknownError;
                        break;
                }

                result.ErrorMessage = resTuple.Item2.LocalizedDescription;
            }

            CreateNewContext();
            return result;
        }
예제 #3
0
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         await Navigation.PushAsync(new SecretView());
     }
     else
     {
         lblStatus.Text = $"{result.Status}: {result.ErrorMessage}";
     }
 }
        public override void OnAuthenticationError(FingerprintState errorCode, ICharSequence errString)
        {
            base.OnAuthenticationError(errorCode, errString);
            var message = errString != null ? errString.ToString() : string.Empty;
            var result = new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.Failed, ErrorMessage = message };

            if (errorCode == FingerprintState.ErrorLockout)
            {
                result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
            }

            SetResultSafe(result);
        }
 // https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html
 public override void OnAuthenticationSucceeded(FingerprintManager.AuthenticationResult res)
 {
     base.OnAuthenticationSucceeded(res);
     var result = new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.Succeeded };
     SetResultSafe(result);
 }
        private async void Dismiss(FingerprintAuthenticationResult result, bool animation = true)
        {
            if (animation)
            {
                await AnimateResultAsync(result.Status);
            }

            _resultTaskCompletionSource.SetResult(result);
            Dismiss();
        }