blob: b3b0a653b514f544b05f69c502a599c2ebae9774 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/services.dart';
import 'local_auth_platform_interface.dart';
const MethodChannel _channel = MethodChannel('plugins.flutter.io/local_auth');
/// The default interface implementation acting as a placeholder for
/// the native implementation to be set.
///
/// This implementation is not used by any of the implementations in this
/// repository, and exists only for backward compatibility with any
/// clients that were relying on internal details of the method channel
/// in the pre-federated plugin.
class DefaultLocalAuthPlatform extends LocalAuthPlatform {
@override
Future<bool> authenticate({
required String localizedReason,
required Iterable<AuthMessages> authMessages,
AuthenticationOptions options = const AuthenticationOptions(),
}) async {
assert(localizedReason.isNotEmpty);
final Map<String, Object> args = <String, Object>{
'localizedReason': localizedReason,
'useErrorDialogs': options.useErrorDialogs,
'stickyAuth': options.stickyAuth,
'sensitiveTransaction': options.sensitiveTransaction,
'biometricOnly': options.biometricOnly,
};
for (final AuthMessages messages in authMessages) {
args.addAll(messages.args);
}
return (await _channel.invokeMethod<bool>('authenticate', args)) ?? false;
}
@override
Future<List<BiometricType>> getEnrolledBiometrics() async {
final List<String> result = (await _channel.invokeListMethod<String>(
'getAvailableBiometrics',
)) ??
<String>[];
final List<BiometricType> biometrics = <BiometricType>[];
for (final String value in result) {
switch (value) {
case 'face':
biometrics.add(BiometricType.face);
break;
case 'fingerprint':
biometrics.add(BiometricType.fingerprint);
break;
case 'iris':
biometrics.add(BiometricType.iris);
break;
case 'undefined':
// Sentinel value for the case when nothing is enrolled, but hardware
// support for biometrics is available.
break;
}
}
return biometrics;
}
@override
Future<bool> deviceSupportsBiometrics() async {
final List<String> availableBiometrics =
(await _channel.invokeListMethod<String>(
'getAvailableBiometrics',
)) ??
<String>[];
// If anything, including the 'undefined' sentinel, is returned, then there
// is device support for biometrics.
return availableBiometrics.isNotEmpty;
}
@override
Future<bool> isDeviceSupported() async =>
(await _channel.invokeMethod<bool>('isDeviceSupported')) ?? false;
@override
Future<bool> stopAuthentication() async =>
await _channel.invokeMethod<bool>('stopAuthentication') ?? false;
}