[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"