[local_auth] Remove FingerprintManager uses and fix deprecations (#6059)

diff --git a/packages/local_auth/local_auth_android/CHANGELOG.md b/packages/local_auth/local_auth_android/CHANGELOG.md
index 7eed97a..f6d9da2 100644
--- a/packages/local_auth/local_auth_android/CHANGELOG.md
+++ b/packages/local_auth/local_auth_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.8
+
+* Removes usages of `FingerprintManager` and other `BiometricManager` deprecated method usages.
+
 ## 1.0.7
 
 * Updates gradle version to 7.2.1.
diff --git a/packages/local_auth/local_auth_android/android/src/main/AndroidManifest.xml b/packages/local_auth/local_auth_android/android/src/main/AndroidManifest.xml
index cb6cb98..63f7507 100644
--- a/packages/local_auth/local_auth_android/android/src/main/AndroidManifest.xml
+++ b/packages/local_auth/local_auth_android/android/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="io.flutter.plugins.localauth">
     <uses-sdk android:targetSdkVersion="29"/>
-    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
+    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
 </manifest>
diff --git a/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java b/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java
index 2b825c6..c30f879 100644
--- a/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java
+++ b/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java
@@ -20,6 +20,7 @@
 import android.view.View;
 import android.widget.TextView;
 import androidx.annotation.NonNull;
+import androidx.biometric.BiometricManager;
 import androidx.biometric.BiometricPrompt;
 import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.DefaultLifecycleObserver;
@@ -90,11 +91,17 @@
             .setConfirmationRequired((Boolean) call.argument("sensitiveTransaction"))
             .setConfirmationRequired((Boolean) call.argument("sensitiveTransaction"));
 
+    int allowedAuthenticators =
+        BiometricManager.Authenticators.BIOMETRIC_WEAK
+            | BiometricManager.Authenticators.BIOMETRIC_STRONG;
+
     if (allowCredentials) {
-      promptBuilder.setDeviceCredentialAllowed(true);
+      allowedAuthenticators |= BiometricManager.Authenticators.DEVICE_CREDENTIAL;
     } else {
       promptBuilder.setNegativeButtonText((String) call.argument("cancelButton"));
     }
+
+    promptBuilder.setAllowedAuthenticators(allowedAuthenticators);
     this.promptInfo = promptBuilder.build();
   }
 
@@ -141,7 +148,6 @@
         break;
       case BiometricPrompt.ERROR_NO_SPACE:
       case BiometricPrompt.ERROR_NO_BIOMETRICS:
-        if (promptInfo.isDeviceCredentialAllowed()) return;
         if (call.argument("useErrorDialogs")) {
           showGoToSettingsDialog(
               (String) call.argument("biometricRequired"),
diff --git a/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java b/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
index 3c5ecad..e8632c4 100644
--- a/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
+++ b/packages/local_auth/local_auth_android/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
@@ -11,7 +11,6 @@
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.Intent;
-import android.hardware.fingerprint.FingerprintManager;
 import android.os.Build;
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
@@ -42,14 +41,14 @@
   private static final String CHANNEL_NAME = "plugins.flutter.io/local_auth_android";
   private static final int LOCK_REQUEST_CODE = 221;
   private Activity activity;
-  private final AtomicBoolean authInProgress = new AtomicBoolean(false);
   private AuthenticationHelper authHelper;
 
+  @VisibleForTesting final AtomicBoolean authInProgress = new AtomicBoolean(false);
+
   // These are null when not using v2 embedding.
   private MethodChannel channel;
   private Lifecycle lifecycle;
   private BiometricManager biometricManager;
-  private FingerprintManager fingerprintManager;
   private KeyguardManager keyguardManager;
   private Result lockRequestResult;
   private final PluginRegistry.ActivityResultListener resultListener =
@@ -147,79 +146,45 @@
     }
 
     authInProgress.set(true);
-    AuthCompletionHandler completionHandler =
-        new AuthCompletionHandler() {
-          @Override
-          public void onSuccess() {
-            authenticateSuccess(result);
-          }
+    AuthCompletionHandler completionHandler = createAuthCompletionHandler(result);
 
-          @Override
-          public void onFailure() {
-            authenticateFail(result);
-          }
-
-          @Override
-          public void onError(String code, String error) {
-            if (authInProgress.compareAndSet(true, false)) {
-              result.error(code, error, null);
-            }
-          }
-        };
-
-    // if is biometricOnly try biometric prompt - might not work
     boolean isBiometricOnly = call.argument("biometricOnly");
-    if (isBiometricOnly) {
-      if (!canAuthenticateWithBiometrics()) {
-        if (!hasBiometricHardware()) {
-          completionHandler.onError("NoHardware", "No biometric hardware found");
+    boolean allowCredentials = !isBiometricOnly && canAuthenticateWithDeviceCredential();
+
+    sendAuthenticationRequest(call, completionHandler, allowCredentials);
+    return;
+  }
+
+  @VisibleForTesting
+  public AuthCompletionHandler createAuthCompletionHandler(final Result result) {
+    return new AuthCompletionHandler() {
+      @Override
+      public void onSuccess() {
+        authenticateSuccess(result);
+      }
+
+      @Override
+      public void onFailure() {
+        authenticateFail(result);
+      }
+
+      @Override
+      public void onError(String code, String error) {
+        if (authInProgress.compareAndSet(true, false)) {
+          result.error(code, error, null);
         }
-        completionHandler.onError("NotEnrolled", "No biometrics enrolled on this device.");
-        return;
       }
-      authHelper =
-          new AuthenticationHelper(
-              lifecycle, (FragmentActivity) activity, call, completionHandler, false);
-      authHelper.authenticate();
-      return;
-    }
+    };
+  }
 
-    // API 29 and above
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-      authHelper =
-          new AuthenticationHelper(
-              lifecycle, (FragmentActivity) activity, call, completionHandler, true);
-      authHelper.authenticate();
-      return;
-    }
+  @VisibleForTesting
+  public void sendAuthenticationRequest(
+      MethodCall call, AuthCompletionHandler completionHandler, boolean allowCredentials) {
+    authHelper =
+        new AuthenticationHelper(
+            lifecycle, (FragmentActivity) activity, call, completionHandler, allowCredentials);
 
-    // API 23 - 28 with fingerprint
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && fingerprintManager != null) {
-      if (fingerprintManager.hasEnrolledFingerprints()) {
-        authHelper =
-            new AuthenticationHelper(
-                lifecycle, (FragmentActivity) activity, call, completionHandler, false);
-        authHelper.authenticate();
-        return;
-      }
-    }
-
-    // API 23 or higher with device credentials
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-        && keyguardManager != null
-        && keyguardManager.isDeviceSecure()) {
-      String title = call.argument("signInTitle");
-      String reason = call.argument("localizedReason");
-      Intent authIntent = keyguardManager.createConfirmDeviceCredentialIntent(title, reason);
-
-      // save result for async response
-      lockRequestResult = result;
-      activity.startActivityForResult(authIntent, LOCK_REQUEST_CODE);
-      return;
-    }
-
-    // Unable to authenticate
-    result.error("NotSupported", "This device does not support required security features", null);
+    authHelper.authenticate();
   }
 
   private void authenticateSuccess(Result result) {
@@ -270,7 +235,8 @@
     }
   }
 
-  private ArrayList<String> getEnrolledBiometrics() {
+  @VisibleForTesting
+  public ArrayList<String> getEnrolledBiometrics() {
     ArrayList<String> biometrics = new ArrayList<>();
     if (activity == null || activity.isFinishing()) {
       return biometrics;
@@ -286,19 +252,28 @@
     return biometrics;
   }
 
-  private boolean isDeviceSupported() {
+  @VisibleForTesting
+  public boolean isDeviceSupported() {
     if (keyguardManager == null) return false;
     return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && keyguardManager.isDeviceSecure());
   }
 
   private boolean canAuthenticateWithBiometrics() {
     if (biometricManager == null) return false;
-    return biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS;
+    return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
+        == BiometricManager.BIOMETRIC_SUCCESS;
   }
 
   private boolean hasBiometricHardware() {
     if (biometricManager == null) return false;
-    return biometricManager.canAuthenticate() != BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE;
+    return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
+        != BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE;
+  }
+
+  private boolean canAuthenticateWithDeviceCredential() {
+    if (biometricManager == null) return false;
+    return biometricManager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL)
+        == BiometricManager.BIOMETRIC_SUCCESS;
   }
 
   private void isDeviceSupported(Result result) {
@@ -320,10 +295,6 @@
     Context context = activity.getBaseContext();
     biometricManager = BiometricManager.from(activity);
     keyguardManager = (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-      fingerprintManager =
-          (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
-    }
   }
 
   @Override
diff --git a/packages/local_auth/local_auth_android/android/src/test/java/io/flutter/plugins/localauth/LocalAuthTest.java b/packages/local_auth/local_auth_android/android/src/test/java/io/flutter/plugins/localauth/LocalAuthTest.java
index 5fbda46..0eaf312 100644
--- a/packages/local_auth/local_auth_android/android/src/test/java/io/flutter/plugins/localauth/LocalAuthTest.java
+++ b/packages/local_auth/local_auth_android/android/src/test/java/io/flutter/plugins/localauth/LocalAuthTest.java
@@ -4,16 +4,23 @@
 
 package io.flutter.plugins.localauth;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
+import android.app.NativeActivity;
 import android.content.Context;
 import androidx.biometric.BiometricManager;
+import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.Lifecycle;
 import io.flutter.embedding.engine.FlutterEngine;
 import io.flutter.embedding.engine.dart.DartExecutor;
@@ -22,12 +29,140 @@
 import io.flutter.embedding.engine.plugins.lifecycle.HiddenLifecycleReference;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugins.localauth.AuthenticationHelper.AuthCompletionHandler;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 
 public class LocalAuthTest {
   @Test
+  public void authenticate_returnsErrorWhenAuthInProgress() {
+    final LocalAuthPlugin plugin = new LocalAuthPlugin();
+    plugin.authInProgress.set(true);
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    plugin.onMethodCall(new MethodCall("authenticate", null), mockResult);
+    verify(mockResult).error("auth_in_progress", "Authentication in progress", null);
+  }
+
+  @Test
+  public void authenticate_returnsErrorWithNoForegroundActivity() {
+    final LocalAuthPlugin plugin = new LocalAuthPlugin();
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    plugin.onMethodCall(new MethodCall("authenticate", null), mockResult);
+    verify(mockResult)
+        .error("no_activity", "local_auth plugin requires a foreground activity", null);
+  }
+
+  @Test
+  public void authenticate_returnsErrorWhenActivityNotFragmentActivity() {
+    final LocalAuthPlugin plugin = new LocalAuthPlugin();
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(NativeActivity.class)));
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    plugin.onMethodCall(new MethodCall("authenticate", null), mockResult);
+    verify(mockResult)
+        .error(
+            "no_fragment_activity",
+            "local_auth plugin requires activity to be a FragmentActivity.",
+            null);
+  }
+
+  @Test
+  public void authenticate_returnsErrorWhenDeviceNotSupported() {
+    final LocalAuthPlugin plugin = new LocalAuthPlugin();
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(FragmentActivity.class)));
+    plugin.onMethodCall(new MethodCall("authenticate", null), mockResult);
+    assertFalse(plugin.authInProgress.get());
+    verify(mockResult).error("NotAvailable", "Required security features not enabled", null);
+  }
+
+  @Test
+  public void authenticate_properlyConfiguresBiometricOnlyAuthenticationRequest() {
+    final LocalAuthPlugin plugin = spy(new LocalAuthPlugin());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(FragmentActivity.class)));
+    when(plugin.isDeviceSupported()).thenReturn(true);
+
+    final BiometricManager mockBiometricManager = mock(BiometricManager.class);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    plugin.setBiometricManager(mockBiometricManager);
+
+    ArgumentCaptor<Boolean> allowCredentialsCaptor = ArgumentCaptor.forClass(Boolean.class);
+    doNothing()
+        .when(plugin)
+        .sendAuthenticationRequest(
+            any(MethodCall.class),
+            any(AuthCompletionHandler.class),
+            allowCredentialsCaptor.capture());
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    HashMap<String, Object> arguments = new HashMap<>();
+    arguments.put("biometricOnly", true);
+
+    plugin.onMethodCall(new MethodCall("authenticate", arguments), mockResult);
+    assertFalse(allowCredentialsCaptor.getValue());
+  }
+
+  @Test
+  public void authenticate_properlyConfiguresBiometricAndDeviceCredentialAuthenticationRequest() {
+    final LocalAuthPlugin plugin = spy(new LocalAuthPlugin());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(FragmentActivity.class)));
+    when(plugin.isDeviceSupported()).thenReturn(true);
+
+    final BiometricManager mockBiometricManager = mock(BiometricManager.class);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    plugin.setBiometricManager(mockBiometricManager);
+
+    ArgumentCaptor<Boolean> allowCredentialsCaptor = ArgumentCaptor.forClass(Boolean.class);
+    doNothing()
+        .when(plugin)
+        .sendAuthenticationRequest(
+            any(MethodCall.class),
+            any(AuthCompletionHandler.class),
+            allowCredentialsCaptor.capture());
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    HashMap<String, Object> arguments = new HashMap<>();
+    arguments.put("biometricOnly", false);
+
+    plugin.onMethodCall(new MethodCall("authenticate", arguments), mockResult);
+    assertTrue(allowCredentialsCaptor.getValue());
+  }
+
+  @Test
+  public void authenticate_properlyConfiguresDeviceCredentialOnlyAuthenticationRequest() {
+    final LocalAuthPlugin plugin = spy(new LocalAuthPlugin());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(FragmentActivity.class)));
+    when(plugin.isDeviceSupported()).thenReturn(true);
+
+    final BiometricManager mockBiometricManager = mock(BiometricManager.class);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
+        .thenReturn(BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    plugin.setBiometricManager(mockBiometricManager);
+
+    ArgumentCaptor<Boolean> allowCredentialsCaptor = ArgumentCaptor.forClass(Boolean.class);
+    doNothing()
+        .when(plugin)
+        .sendAuthenticationRequest(
+            any(MethodCall.class),
+            any(AuthCompletionHandler.class),
+            allowCredentialsCaptor.capture());
+    final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
+    HashMap<String, Object> arguments = new HashMap<>();
+    arguments.put("biometricOnly", false);
+
+    plugin.onMethodCall(new MethodCall("authenticate", arguments), mockResult);
+    assertTrue(allowCredentialsCaptor.getValue());
+  }
+
+  @Test
   public void isDeviceSupportedReturnsFalse() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
@@ -40,7 +175,7 @@
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
-    when(mockBiometricManager.canAuthenticate())
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
         .thenReturn(BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED);
     plugin.setBiometricManager(mockBiometricManager);
     plugin.onMethodCall(new MethodCall("deviceSupportsBiometrics", null), mockResult);
@@ -52,7 +187,8 @@
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
-    when(mockBiometricManager.canAuthenticate()).thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
+        .thenReturn(BiometricManager.BIOMETRIC_SUCCESS);
     plugin.setBiometricManager(mockBiometricManager);
     plugin.onMethodCall(new MethodCall("deviceSupportsBiometrics", null), mockResult);
     verify(mockResult).success(true);
@@ -63,7 +199,7 @@
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
-    when(mockBiometricManager.canAuthenticate())
+    when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
         .thenReturn(BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE);
     plugin.setBiometricManager(mockBiometricManager);
     plugin.onMethodCall(new MethodCall("deviceSupportsBiometrics", null), mockResult);
@@ -87,6 +223,7 @@
 
     Context mockContext = mock(Context.class);
     when(mockActivity.getBaseContext()).thenReturn(mockContext);
+    when(mockActivity.getApplicationContext()).thenReturn(mockContext);
 
     final HiddenLifecycleReference mockLifecycleReference = mock(HiddenLifecycleReference.class);
     when(mockActivityBinding.getLifecycle()).thenReturn(mockLifecycleReference);
@@ -124,7 +261,7 @@
   public void getEnrolledBiometrics_shouldReturnError_whenFinishingActivity() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
-    final Activity mockActivity = buildMockActivity();
+    final Activity mockActivity = buildMockActivityWithContext(mock(Activity.class));
     when(mockActivity.isFinishing()).thenReturn(true);
     setPluginActivity(plugin, mockActivity);
 
@@ -136,7 +273,7 @@
   @Test
   public void getEnrolledBiometrics_shouldReturnEmptyList_withoutHardwarePresent() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
-    setPluginActivity(plugin, buildMockActivity());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(Activity.class)));
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
     when(mockBiometricManager.canAuthenticate(anyInt()))
@@ -150,7 +287,7 @@
   @Test
   public void getEnrolledBiometrics_shouldReturnEmptyList_withNoMethodsEnrolled() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
-    setPluginActivity(plugin, buildMockActivity());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(Activity.class)));
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
     when(mockBiometricManager.canAuthenticate(anyInt()))
@@ -164,7 +301,7 @@
   @Test
   public void getEnrolledBiometrics_shouldOnlyAddEnrolledBiometrics() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
-    setPluginActivity(plugin, buildMockActivity());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(Activity.class)));
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
     when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
@@ -186,7 +323,7 @@
   @Test
   public void getEnrolledBiometrics_shouldAddStrongBiometrics() {
     final LocalAuthPlugin plugin = new LocalAuthPlugin();
-    setPluginActivity(plugin, buildMockActivity());
+    setPluginActivity(plugin, buildMockActivityWithContext(mock(Activity.class)));
     final MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
     final BiometricManager mockBiometricManager = mock(BiometricManager.class);
     when(mockBiometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK))
@@ -206,8 +343,7 @@
             });
   }
 
-  private Activity buildMockActivity() {
-    final Activity mockActivity = mock(Activity.class);
+  private Activity buildMockActivityWithContext(Activity mockActivity) {
     final Context mockContext = mock(Context.class);
     when(mockActivity.getBaseContext()).thenReturn(mockContext);
     when(mockActivity.getApplicationContext()).thenReturn(mockContext);
diff --git a/packages/local_auth/local_auth_android/pubspec.yaml b/packages/local_auth/local_auth_android/pubspec.yaml
index 3987d8e..cfa4970 100644
--- a/packages/local_auth/local_auth_android/pubspec.yaml
+++ b/packages/local_auth/local_auth_android/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Android implementation of the local_auth plugin.
 repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/local_auth_android
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
-version: 1.0.7
+version: 1.0.8
 
 environment:
   sdk: ">=2.14.0 <3.0.0"