resolveWithBiometric method

  1. @override
Future<({bool authenticated, bool isConfigured, bool isSupported})> resolveWithBiometric(
  1. String reasonMessage, {
  2. required String signInTitle,
  3. required String cancelButtonMessage,
  4. bool fallbackToPin = false,
})
override

Implementation

@override
Future<({bool authenticated, bool isConfigured, bool isSupported})>
resolveWithBiometric(
  String reasonMessage, {
  required String signInTitle,
  required String cancelButtonMessage,
  bool fallbackToPin = false,
}) async {
  try {
    final result = await _biometricAuthService.getData();

    if (result.isBiometricAuthSupported) {
      if (result.isBiometricAuthConfigured) {
        final biometricAuthData = await _biometricIdentityService
            .authenticate(
              reasonMessage,
              signInTitle: signInTitle,
              cancelButtonMessage: cancelButtonMessage,
            );

        return await biometricAuthData.fold(
          (l) async {
            return (
              authenticated: false,
              isConfigured: true,
              isSupported: true,
            );
          },
          (r) async {
            await _biometricAuthService.setData(
              result.copyWith(
                hasDeclinedBioMetricAuth: false,
                hasDeclinedPinCodeAuth: false,
                isBiometricAuthConfigured: true,
                isBiometricAuthSupported: true,
                lastAuthenticated: DateTime.now(),
              ),
            );

            return (
              authenticated: true,
              isConfigured: true,
              isSupported: true,
            );
          },
        );
      } else {
        final setupResult = await setupBiometric(
          reasonMessage,
          signInTitle: signInTitle,
          cancelButtonMessage: cancelButtonMessage,
          fallbackToPin: fallbackToPin,
        );

        return (
          authenticated: setupResult.ok,
          isConfigured: setupResult.ok && setupResult.isAvailable,
          isSupported: setupResult.isAvailable,
        );
      }
    } else {
      return (authenticated: false, isConfigured: false, isSupported: false);
    }
  } on BiometricAuthException catch (e) {
    if (e is BiometricNotSupportedException ||
        e is BiometricTypeNotAvailableException) {
      await _biometricAuthService.setData(
        BiometricAuthData(
          hasDeclinedBioMetricAuth: false,
          hasDeclinedPinCodeAuth: false,
          isBiometricAuthConfigured: false,
          isBiometricAuthSupported: false,
        ),
      );

      return (authenticated: false, isConfigured: false, isSupported: false);
    } else {
      return (authenticated: false, isConfigured: true, isSupported: true);
    }
  }
}