[local_auth] Refactor package to make use of new platform interface and native implementations (#4701)

diff --git a/packages/local_auth/local_auth/AUTHORS b/packages/local_auth/local_auth/AUTHORS
index 493a0b4..d569469 100644
--- a/packages/local_auth/local_auth/AUTHORS
+++ b/packages/local_auth/local_auth/AUTHORS
@@ -64,3 +64,4 @@
 Anton Borries <mail@antonborri.es>
 Alex Li <google@alexv525.com>
 Rahul Raj <64.rahulraj@gmail.com>
+Bodhi Mulders <info@bemacized.net>
diff --git a/packages/local_auth/local_auth/CHANGELOG.md b/packages/local_auth/local_auth/CHANGELOG.md
index 1ca9fe1..deac871 100644
--- a/packages/local_auth/local_auth/CHANGELOG.md
+++ b/packages/local_auth/local_auth/CHANGELOG.md
@@ -1,7 +1,42 @@
-## NEXT
+## 2.0.0
 
+* Migrates plugin to federated architecture.
 * Adds OS version support information to README.
-* Switches over to default method implementation in new platform interface.
+* BREAKING CHANGE: Deprecated method `authenticateWithBiometrics` has been removed.
+  Use `authenticate` instead.
+* BREAKING CHANGE: Enum `BiometricType` has been expanded with options for `strong` and `weak`,
+  and applications should be updated to handle these accordingly. 
+* BREAKING CHANGE: Parameters of `authenticate` have been changed.
+  
+  Example:
+  ```dart  
+  // Old way of calling `authenticate`.
+  Future<bool> authenticate(
+    localizedReason: 'localized reason',
+    useErrorDialogs: true,
+    stickyAuth: false,
+    androidAuthStrings: const AndroidAuthMessages(),
+    iOSAuthStrings: const IOSAuthMessages(),
+    sensitiveTransaction: true,
+    biometricOnly: false,
+  );
+  // New way of calling `authenticate`.
+  Future<bool> authenticate(
+    localizedReason: 'localized reason',
+    authMessages: const <AuthMessages>[
+      IOSAuthMessages(),
+      AndroidAuthMessages()
+    ],
+    options: const AuthenticationOptions(
+      useErrorDialogs: true,
+      stickyAuth: false,
+      sensitiveTransaction: true,
+      biometricOnly: false,
+    ),
+  );
+  ```
+
+
 
 ## 1.1.11
 
diff --git a/packages/local_auth/local_auth/example/lib/main.dart b/packages/local_auth/local_auth/example/lib/main.dart
index a9604b3..92ad7cf 100644
--- a/packages/local_auth/local_auth/example/lib/main.dart
+++ b/packages/local_auth/local_auth/example/lib/main.dart
@@ -79,9 +79,12 @@
         _authorized = 'Authenticating';
       });
       authenticated = await auth.authenticate(
-          localizedReason: 'Let OS determine authentication method',
+        localizedReason: 'Let OS determine authentication method',
+        options: const AuthenticationOptions(
           useErrorDialogs: true,
-          stickyAuth: true);
+          stickyAuth: true,
+        ),
+      );
       setState(() {
         _isAuthenticating = false;
       });
@@ -109,11 +112,14 @@
         _authorized = 'Authenticating';
       });
       authenticated = await auth.authenticate(
-          localizedReason:
-              'Scan your fingerprint (or face or whatever) to authenticate',
+        localizedReason:
+            'Scan your fingerprint (or face or whatever) to authenticate',
+        options: const AuthenticationOptions(
           useErrorDialogs: true,
           stickyAuth: true,
-          biometricOnly: true);
+          biometricOnly: true,
+        ),
+      );
       setState(() {
         _isAuthenticating = false;
         _authorized = 'Authenticating';
diff --git a/packages/local_auth/local_auth/lib/auth_strings.dart b/packages/local_auth/local_auth/lib/auth_strings.dart
deleted file mode 100644
index 585742a..0000000
--- a/packages/local_auth/local_auth/lib/auth_strings.dart
+++ /dev/null
@@ -1,164 +0,0 @@
-// 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.
-
-// This is a temporary ignore to allow us to land a new set of linter rules in a
-// series of manageable patches instead of one gigantic PR. It disables some of
-// the new lints that are already failing on this plugin, for this plugin. It
-// should be deleted and the failing lints addressed as soon as possible.
-// ignore_for_file: public_member_api_docs
-
-import 'package:intl/intl.dart';
-import 'package:local_auth_platform_interface/types/auth_messages.dart';
-
-/// Android side authentication messages.
-///
-/// Provides default values for all messages.
-class AndroidAuthMessages extends AuthMessages {
-  const AndroidAuthMessages({
-    this.biometricHint,
-    this.biometricNotRecognized,
-    this.biometricRequiredTitle,
-    this.biometricSuccess,
-    this.cancelButton,
-    this.deviceCredentialsRequiredTitle,
-    this.deviceCredentialsSetupDescription,
-    this.goToSettingsButton,
-    this.goToSettingsDescription,
-    this.signInTitle,
-  });
-
-  final String? biometricHint;
-  final String? biometricNotRecognized;
-  final String? biometricRequiredTitle;
-  final String? biometricSuccess;
-  final String? cancelButton;
-  final String? deviceCredentialsRequiredTitle;
-  final String? deviceCredentialsSetupDescription;
-  final String? goToSettingsButton;
-  final String? goToSettingsDescription;
-  final String? signInTitle;
-
-  @override
-  Map<String, String> get args {
-    return <String, String>{
-      'biometricHint': biometricHint ?? androidBiometricHint,
-      'biometricNotRecognized':
-          biometricNotRecognized ?? androidBiometricNotRecognized,
-      'biometricSuccess': biometricSuccess ?? androidBiometricSuccess,
-      'biometricRequired':
-          biometricRequiredTitle ?? androidBiometricRequiredTitle,
-      'cancelButton': cancelButton ?? androidCancelButton,
-      'deviceCredentialsRequired': deviceCredentialsRequiredTitle ??
-          androidDeviceCredentialsRequiredTitle,
-      'deviceCredentialsSetupDescription': deviceCredentialsSetupDescription ??
-          androidDeviceCredentialsSetupDescription,
-      'goToSetting': goToSettingsButton ?? goToSettings,
-      'goToSettingDescription':
-          goToSettingsDescription ?? androidGoToSettingsDescription,
-      'signInTitle': signInTitle ?? androidSignInTitle,
-    };
-  }
-}
-
-/// iOS side authentication messages.
-///
-/// Provides default values for all messages.
-class IOSAuthMessages extends AuthMessages {
-  const IOSAuthMessages({
-    this.lockOut,
-    this.goToSettingsButton,
-    this.goToSettingsDescription,
-    this.cancelButton,
-    this.localizedFallbackTitle,
-  });
-
-  final String? lockOut;
-  final String? goToSettingsButton;
-  final String? goToSettingsDescription;
-  final String? cancelButton;
-  final String? localizedFallbackTitle;
-
-  @override
-  Map<String, String> get args {
-    return <String, String>{
-      'lockOut': lockOut ?? iOSLockOut,
-      'goToSetting': goToSettingsButton ?? goToSettings,
-      'goToSettingDescriptionIOS':
-          goToSettingsDescription ?? iOSGoToSettingsDescription,
-      'okButton': cancelButton ?? iOSOkButton,
-      if (localizedFallbackTitle != null)
-        'localizedFallbackTitle': localizedFallbackTitle!,
-    };
-  }
-}
-
-// Strings for local_authentication plugin. Currently supports English.
-// Intl.message must be string literals.
-String get androidBiometricHint => Intl.message('Verify identity',
-    desc:
-        'Hint message advising the user how to authenticate with biometrics. It is '
-        'used on Android side. Maximum 60 characters.');
-
-String get androidBiometricNotRecognized =>
-    Intl.message('Not recognized. Try again.',
-        desc: 'Message to let the user know that authentication was failed. It '
-            'is used on Android side. Maximum 60 characters.');
-
-String get androidBiometricSuccess => Intl.message('Success',
-    desc: 'Message to let the user know that authentication was successful. It '
-        'is used on Android side. Maximum 60 characters.');
-
-String get androidCancelButton => Intl.message('Cancel',
-    desc: 'Message showed on a button that the user can click to leave the '
-        'current dialog. It is used on Android side. Maximum 30 characters.');
-
-String get androidSignInTitle => Intl.message('Authentication required',
-    desc: 'Message showed as a title in a dialog which indicates the user '
-        'that they need to scan biometric to continue. It is used on '
-        'Android side. Maximum 60 characters.');
-
-String get androidBiometricRequiredTitle => Intl.message('Biometric required',
-    desc: 'Message showed as a title in a dialog which indicates the user '
-        'has not set up biometric authentication on their device. It is used on Android'
-        ' side. Maximum 60 characters.');
-
-String get androidDeviceCredentialsRequiredTitle => Intl.message(
-    'Device credentials required',
-    desc: 'Message showed as a title in a dialog which indicates the user '
-        'has not set up credentials authentication on their device. It is used on Android'
-        ' side. Maximum 60 characters.');
-
-String get androidDeviceCredentialsSetupDescription => Intl.message(
-    'Device credentials required',
-    desc: 'Message advising the user to go to the settings and configure '
-        'device credentials on their device. It shows in a dialog on Android side.');
-
-String get goToSettings => Intl.message('Go to settings',
-    desc: 'Message showed on a button that the user can click to go to '
-        'settings pages from the current dialog. It is used on both Android '
-        'and iOS side. Maximum 30 characters.');
-
-String get androidGoToSettingsDescription => Intl.message(
-    'Biometric authentication is not set up on your device. Go to '
-    '\'Settings > Security\' to add biometric authentication.',
-    desc: 'Message advising the user to go to the settings and configure '
-        'biometric on their device. It shows in a dialog on Android side.');
-
-String get iOSLockOut => Intl.message(
-    'Biometric authentication is disabled. Please lock and unlock your screen to '
-    'enable it.',
-    desc:
-        'Message advising the user to re-enable biometrics on their device. It '
-        'shows in a dialog on iOS side.');
-
-String get iOSGoToSettingsDescription => Intl.message(
-    'Biometric authentication is not set up on your device. Please either enable '
-    'Touch ID or Face ID on your phone.',
-    desc:
-        'Message advising the user to go to the settings and configure Biometrics '
-        'for their device. It shows in a dialog on iOS side.');
-
-String get iOSOkButton => Intl.message('OK',
-    desc: 'Message showed on a button that the user can click to leave the '
-        'current dialog. It is used on iOS side. Maximum 30 characters.');
diff --git a/packages/local_auth/local_auth/lib/local_auth.dart b/packages/local_auth/local_auth/lib/local_auth.dart
index 32818b3..7c42fed 100644
--- a/packages/local_auth/local_auth/lib/local_auth.dart
+++ b/packages/local_auth/local_auth/lib/local_auth.dart
@@ -2,144 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// This is a temporary ignore to allow us to land a new set of linter rules in a
-// series of manageable patches instead of one gigantic PR. It disables some of
-// the new lints that are already failing on this plugin, for this plugin. It
-// should be deleted and the failing lints addressed as soon as possible.
-// ignore_for_file: public_member_api_docs
-
-import 'dart:async';
-
-import 'package:flutter/foundation.dart' show visibleForTesting;
-import 'package:flutter/services.dart';
-import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
-import 'package:platform/platform.dart';
-import 'auth_strings.dart';
-
-export 'package:local_auth_platform_interface/types/biometric_type.dart';
-
-Platform _platform = const LocalPlatform();
-
-@visibleForTesting
-void setMockPathProviderPlatform(Platform platform) {
-  _platform = platform;
-}
-
-/// A Flutter plugin for authenticating the user identity locally.
-class LocalAuthentication {
-  /// The `authenticateWithBiometrics` method has been deprecated.
-  /// Use `authenticate` with `biometricOnly: true` instead.
-  @Deprecated('Use `authenticate` with `biometricOnly: true` instead')
-  Future<bool> authenticateWithBiometrics({
-    required String localizedReason,
-    bool useErrorDialogs = true,
-    bool stickyAuth = false,
-    AndroidAuthMessages androidAuthStrings = const AndroidAuthMessages(),
-    IOSAuthMessages iOSAuthStrings = const IOSAuthMessages(),
-    bool sensitiveTransaction = true,
-  }) =>
-      LocalAuthPlatform.instance.authenticate(
-        localizedReason: localizedReason,
-        authMessages: <AuthMessages>[iOSAuthStrings, androidAuthStrings],
-        options: AuthenticationOptions(
-          useErrorDialogs: useErrorDialogs,
-          stickyAuth: stickyAuth,
-          sensitiveTransaction: sensitiveTransaction,
-          biometricOnly: true,
-        ),
-      );
-
-  /// Authenticates the user with biometrics available on the device while also
-  /// allowing the user to use device authentication - pin, pattern, passcode.
-  ///
-  /// Returns true, if the user successfully authenticated, false otherwise.
-  ///
-  /// [localizedReason] is the message to show to user while prompting them
-  /// for authentication. This is typically along the lines of: 'Please scan
-  /// your finger to access MyApp.'. This must not be empty.
-  ///
-  /// [useErrorDialogs] = true means the system will attempt to handle user
-  /// fixable issues encountered while authenticating. For instance, if
-  /// fingerprint reader exists on the phone but there's no fingerprint
-  /// registered, the plugin will attempt to take the user to settings to add
-  /// one. Anything that is not user fixable, such as no biometric sensor on
-  /// device, will be returned as a [PlatformException].
-  ///
-  /// [stickyAuth] is used when the application goes into background for any
-  /// reason while the authentication is in progress. Due to security reasons,
-  /// the authentication has to be stopped at that time. If stickyAuth is set
-  /// to true, authentication resumes when the app is resumed. If it is set to
-  /// false (default), then as soon as app is paused a failure message is sent
-  /// back to Dart and it is up to the client app to restart authentication or
-  /// do something else.
-  ///
-  /// Construct [AndroidAuthStrings] and [IOSAuthStrings] if you want to
-  /// customize messages in the dialogs.
-  ///
-  /// Setting [sensitiveTransaction] to true enables platform specific
-  /// precautions. For instance, on face unlock, Android opens a confirmation
-  /// dialog after the face is recognized to make sure the user meant to unlock
-  /// their phone.
-  ///
-  /// Setting [biometricOnly] to true prevents authenticates from using non-biometric
-  /// local authentication such as pin, passcode, and passcode.
-  ///
-  /// Throws an [PlatformException] if there were technical problems with local
-  /// authentication (e.g. lack of relevant hardware). This might throw
-  /// [PlatformException] with error code [otherOperatingSystem] on the iOS
-  /// simulator.
-  Future<bool> authenticate({
-    required String localizedReason,
-    bool useErrorDialogs = true,
-    bool stickyAuth = false,
-    AndroidAuthMessages androidAuthStrings = const AndroidAuthMessages(),
-    IOSAuthMessages iOSAuthStrings = const IOSAuthMessages(),
-    bool sensitiveTransaction = true,
-    bool biometricOnly = false,
-  }) {
-    return LocalAuthPlatform.instance.authenticate(
-      localizedReason: localizedReason,
-      authMessages: <AuthMessages>[iOSAuthStrings, androidAuthStrings],
-      options: AuthenticationOptions(
-        useErrorDialogs: useErrorDialogs,
-        stickyAuth: stickyAuth,
-        sensitiveTransaction: sensitiveTransaction,
-        biometricOnly: biometricOnly,
-      ),
-    );
-  }
-
-  /// Returns true if auth was cancelled successfully.
-  /// This api only works for Android.
-  /// Returns false if there was some error or no auth in progress.
-  ///
-  /// Returns [Future] bool true or false:
-  Future<bool> stopAuthentication() async {
-    if (_platform.isAndroid) {
-      return LocalAuthPlatform.instance.stopAuthentication();
-    }
-    return true;
-  }
-
-  /// Returns true if device is capable of checking biometrics
-  ///
-  /// Returns a [Future] bool true or false:
-  Future<bool> get canCheckBiometrics =>
-      LocalAuthPlatform.instance.deviceSupportsBiometrics();
-
-  /// Returns true if device is capable of checking biometrics or is able to
-  /// fail over to device credentials.
-  ///
-  /// Returns a [Future] bool true or false:
-  Future<bool> isDeviceSupported() async =>
-      LocalAuthPlatform.instance.isDeviceSupported();
-
-  /// Returns a list of enrolled biometrics
-  ///
-  /// Returns a [Future] List<BiometricType> with the following possibilities:
-  /// - BiometricType.face
-  /// - BiometricType.fingerprint
-  /// - BiometricType.iris (not yet implemented)
-  Future<List<BiometricType>> getAvailableBiometrics() =>
-      LocalAuthPlatform.instance.getEnrolledBiometrics();
-}
+export 'package:local_auth/src/local_auth.dart' show LocalAuthentication;
+export 'package:local_auth_platform_interface/types/auth_options.dart'
+    show AuthenticationOptions;
+export 'package:local_auth_platform_interface/types/biometric_type.dart'
+    show BiometricType;
diff --git a/packages/local_auth/local_auth/lib/src/local_auth.dart b/packages/local_auth/local_auth/lib/src/local_auth.dart
new file mode 100644
index 0000000..508e2b1
--- /dev/null
+++ b/packages/local_auth/local_auth/lib/src/local_auth.dart
@@ -0,0 +1,77 @@
+// 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.
+
+// This is a temporary ignore to allow us to land a new set of linter rules in a
+// series of manageable patches instead of one gigantic PR. It disables some of
+// the new lints that are already failing on this plugin, for this plugin. It
+// should be deleted and the failing lints addressed as soon as possible.
+// ignore_for_file: public_member_api_docs
+
+import 'dart:async';
+
+import 'package:flutter/services.dart';
+import 'package:local_auth/src/types/error_codes.dart';
+import 'package:local_auth_android/local_auth_android.dart';
+import 'package:local_auth_ios/local_auth_ios.dart';
+import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
+import 'package:local_auth_platform_interface/types/auth_messages.dart';
+import 'package:local_auth_platform_interface/types/biometric_type.dart';
+
+/// A Flutter plugin for authenticating the user identity locally.
+class LocalAuthentication {
+  /// Authenticates the user with biometrics available on the device while also
+  /// allowing the user to use device authentication - pin, pattern, passcode.
+  ///
+  /// Returns true if the user successfully authenticated, false otherwise.
+  ///
+  /// [localizedReason] is the message to show to user while prompting them
+  /// for authentication. This is typically along the lines of: 'Authenticate
+  /// to access MyApp.'. This must not be empty.
+  ///
+  /// Provide [authMessages] if you want to
+  /// customize messages in the dialogs.
+  ///
+  /// Provide [options] for configuring further authentication related options.
+  ///
+  /// Throws a [PlatformException] if there were technical problems with local
+  /// authentication (e.g. lack of relevant hardware). This might throw
+  /// [PlatformException] with error code [otherOperatingSystem] on the iOS
+  /// simulator.
+  Future<bool> authenticate(
+      {required String localizedReason,
+      Iterable<AuthMessages> authMessages = const <AuthMessages>[
+        IOSAuthMessages(),
+        AndroidAuthMessages()
+      ],
+      AuthenticationOptions options = const AuthenticationOptions()}) {
+    return LocalAuthPlatform.instance.authenticate(
+      localizedReason: localizedReason,
+      authMessages: authMessages,
+      options: options,
+    );
+  }
+
+  /// Cancels any in-progress authentication, returning true if auth was
+  /// cancelled successfully.
+  ///
+  /// This API is not supported by all platforms.
+  /// Returns false if there was some error, no authentication in progress,
+  /// or the current platform lacks support.
+  Future<bool> stopAuthentication() async {
+    return LocalAuthPlatform.instance.stopAuthentication();
+  }
+
+  /// Returns true if device is capable of checking biometrics.
+  Future<bool> get canCheckBiometrics =>
+      LocalAuthPlatform.instance.deviceSupportsBiometrics();
+
+  /// Returns true if device is capable of checking biometrics or is able to
+  /// fail over to device credentials.
+  Future<bool> isDeviceSupported() async =>
+      LocalAuthPlatform.instance.isDeviceSupported();
+
+  /// Returns a list of enrolled biometrics.
+  Future<List<BiometricType>> getAvailableBiometrics() =>
+      LocalAuthPlatform.instance.getEnrolledBiometrics();
+}
diff --git a/packages/local_auth/local_auth/lib/error_codes.dart b/packages/local_auth/local_auth/lib/src/types/error_codes.dart
similarity index 93%
rename from packages/local_auth/local_auth/lib/error_codes.dart
rename to packages/local_auth/local_auth/lib/src/types/error_codes.dart
index bcf15b7..3426099 100644
--- a/packages/local_auth/local_auth/lib/error_codes.dart
+++ b/packages/local_auth/local_auth/lib/src/types/error_codes.dart
@@ -15,7 +15,7 @@
 /// Indicates the device does not have a Touch ID/fingerprint scanner.
 const String notAvailable = 'NotAvailable';
 
-/// Indicates the device operating system is not iOS or Android.
+/// Indicates the device operating system is unsupported.
 const String otherOperatingSystem = 'OtherOperatingSystem';
 
 /// Indicates the API lock out due to too many attempts.
diff --git a/packages/local_auth/local_auth/pubspec.yaml b/packages/local_auth/local_auth/pubspec.yaml
index baf5d46..fa055fa 100644
--- a/packages/local_auth/local_auth/pubspec.yaml
+++ b/packages/local_auth/local_auth/pubspec.yaml
@@ -3,11 +3,7 @@
   authentication via fingerprint, touch ID, face ID, passcode, pin, or pattern.
 repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/local_auth
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
-version: 1.1.11
-
-# Temporarily disable publishing to allow moving Android and iOS
-# implementations.
-publish_to: none
+version: 2.0.0
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -24,15 +20,10 @@
 dependencies:
   flutter:
     sdk: flutter
-  flutter_plugin_android_lifecycle: ^2.0.1
   intl: ^0.17.0
-# Temporary path dependencies to allow moving Android and iOS implementations.
-  local_auth_android:
-    path: ../local_auth_android
-  local_auth_ios:
-    path: ../local_auth_ios
+  local_auth_android: ^1.0.0
+  local_auth_ios: ^1.0.1
   local_auth_platform_interface: ^1.0.1
-  platform: ^3.0.0
 
 dev_dependencies:
   flutter_driver:
@@ -42,3 +33,4 @@
   integration_test:
     sdk: flutter
   mockito: ^5.1.0
+  plugin_platform_interface: ^2.1.2
diff --git a/packages/local_auth/local_auth/test/local_auth_test.dart b/packages/local_auth/local_auth/test/local_auth_test.dart
index b92297d..d3f92df 100644
--- a/packages/local_auth/local_auth/test/local_auth_test.dart
+++ b/packages/local_auth/local_auth/test/local_auth_test.dart
@@ -4,13 +4,14 @@
 
 import 'package:flutter/widgets.dart';
 import 'package:flutter_test/flutter_test.dart';
-import 'package:local_auth/auth_strings.dart';
 import 'package:local_auth/local_auth.dart';
+import 'package:local_auth/src/local_auth.dart';
+import 'package:local_auth_android/local_auth_android.dart';
+import 'package:local_auth_ios/local_auth_ios.dart';
 import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
 import 'package:local_auth_platform_interface/types/auth_messages.dart';
 import 'package:local_auth_platform_interface/types/auth_options.dart';
 import 'package:mockito/mockito.dart';
-import 'package:platform/platform.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
 
 void main() {
@@ -24,24 +25,6 @@
     LocalAuthPlatform.instance = mockLocalAuthPlatform;
   });
 
-  test('authenticateWithBiometrics calls platform implementation', () {
-    when(mockLocalAuthPlatform.authenticate(
-      localizedReason: anyNamed('localizedReason'),
-      authMessages: anyNamed('authMessages'),
-      options: anyNamed('options'),
-    )).thenAnswer((_) async => true);
-    localAuthentication.authenticateWithBiometrics(
-        localizedReason: 'Test Reason');
-    verify(mockLocalAuthPlatform.authenticate(
-      localizedReason: 'Test Reason',
-      authMessages: <AuthMessages>[
-        const IOSAuthMessages(),
-        const AndroidAuthMessages(),
-      ],
-      options: const AuthenticationOptions(biometricOnly: true),
-    )).called(1);
-  });
-
   test('authenticate calls platform implementation', () {
     when(mockLocalAuthPlatform.authenticate(
       localizedReason: anyNamed('localizedReason'),
@@ -73,20 +56,13 @@
     verify(mockLocalAuthPlatform.getEnrolledBiometrics()).called(1);
   });
 
-  test('stopAuthentication calls platform implementation on Android', () {
+  test('stopAuthentication calls platform implementation', () {
     when(mockLocalAuthPlatform.stopAuthentication())
         .thenAnswer((_) async => true);
-    setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android'));
     localAuthentication.stopAuthentication();
     verify(mockLocalAuthPlatform.stopAuthentication()).called(1);
   });
 
-  test('stopAuthentication does not call platform implementation on iOS', () {
-    setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios'));
-    localAuthentication.stopAuthentication();
-    verifyNever(mockLocalAuthPlatform.stopAuthentication());
-  });
-
   test('canCheckBiometrics returns correct result', () async {
     when(mockLocalAuthPlatform.deviceSupportsBiometrics())
         .thenAnswer((_) async => false);
@@ -110,11 +86,8 @@
 
   @override
   Future<bool> authenticate({
-    String? localizedReason,
-    Iterable<AuthMessages>? authMessages = const <AuthMessages>[
-      IOSAuthMessages(),
-      AndroidAuthMessages()
-    ],
+    required String? localizedReason,
+    required Iterable<AuthMessages>? authMessages,
     AuthenticationOptions? options = const AuthenticationOptions(),
   }) =>
       super.noSuchMethod(