/* * This file is part of Stack Wallet. * * Copyright (c) 2023 Cypher Stack * All Rights Reserved. * The code is distributed under GPLv3 license, see LICENSE file for details. * Generated by Cypher Stack on 2023-05-26 * */ import 'dart:io'; import 'package:local_auth/local_auth.dart'; import 'package:local_auth_android/local_auth_android.dart'; import 'logger.dart'; class Biometrics { static const integrationTestFlag = bool.fromEnvironment("IS_INTEGRATION_TEST"); const Biometrics(); Future authenticate({ required String cancelButtonText, required String localizedReason, required String title, }) async { if (!(Platform.isIOS || Platform.isAndroid)) { Logging.instance.log( "Tried to use Biometrics.authenticate() on a platform that is not Android or iOS! ...returning false.", level: LogLevel.Error, ); return false; } if (integrationTestFlag) { Logging.instance.log( "Tried to use Biometrics.authenticate() during integration testing. Returning false.", level: LogLevel.Warning, ); return false; } final LocalAuthentication localAuth = LocalAuthentication(); final canCheckBiometrics = await localAuth.canCheckBiometrics; final isDeviceSupported = await localAuth.isDeviceSupported(); //todo: check if print needed // debugPrint("canCheckBiometrics: $canCheckBiometrics"); // debugPrint("isDeviceSupported: $isDeviceSupported"); if (canCheckBiometrics && isDeviceSupported) { final List availableSystems = await localAuth.getAvailableBiometrics(); //todo: check if print needed // debugPrint("availableSystems: $availableSystems"); //TODO properly handle caught exceptions if (availableSystems.contains(BiometricType.strong)) { try { final bool didAuthenticate = await localAuth.authenticate( localizedReason: localizedReason, options: const AuthenticationOptions( stickyAuth: true, biometricOnly: true, ), authMessages: [ AndroidAuthMessages( biometricHint: "", cancelButton: cancelButtonText, signInTitle: title, ), ], ); if (didAuthenticate) { return true; } } catch (e) { Logging.instance.log( "local_auth exception caught in Biometrics.authenticate(), e: $e", level: LogLevel.Error, ); } } // if (Platform.isIOS) { // if (availableSystems.contains(BiometricType.face)) { // try { // final bool didAuthenticate = await localAuth.authenticate( // localizedReason: localizedReason, // options: const AuthenticationOptions( // stickyAuth: true, // biometricOnly: true, // ), // ); // // if (didAuthenticate) { // return true; // } // } catch (e) { // Logging.instance.log( // "local_auth exception caught in Biometrics.authenticate(), e: $e", // level: LogLevel.Error, // ); // } // } else if (availableSystems.contains(BiometricType.fingerprint)) { // try { // final bool didAuthenticate = await localAuth.authenticate( // localizedReason: localizedReason, // options: const AuthenticationOptions( // stickyAuth: true, // biometricOnly: true, // ), // ); // // if (didAuthenticate) { // return true; // } // } catch (e) { // Logging.instance.log( // "local_auth exception caught in Biometrics.authenticate(), e: $e", // level: LogLevel.Error, // ); // } // } // } else if (Platform.isAndroid) { // if (availableSystems.contains(BiometricType.fingerprint)) { // try { // final bool didAuthenticate = await localAuth.authenticate( // localizedReason: localizedReason, // options: const AuthenticationOptions( // stickyAuth: true, // biometricOnly: true, // ), // authMessages: [ // AndroidAuthMessages( // biometricHint: "", // cancelButton: cancelButtonText, // signInTitle: title, // ), // ], // ); // // if (didAuthenticate) { // return true; // } // } catch (e) { // Logging.instance.log( // "local_auth exception caught in Biometrics.authenticate(), e: $e", // level: LogLevel.Error, // ); // } // } // } } // authentication failed return false; } }