diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni
index af39a7276f9..f4d767ef8c5 100644
--- a/android/brave_java_resources.gni
+++ b/android/brave_java_resources.gni
@@ -619,6 +619,7 @@ brave_java_resources = [
"java/res/drawable/ic_error_notification.xml",
"java/res/drawable/ic_eth.xml",
"java/res/drawable/ic_eth_24.xml",
+ "java/res/drawable/ic_fingerprint.xml",
"java/res/drawable/ic_guardian.xml",
"java/res/drawable/ic_hearts.xml",
"java/res/drawable/ic_hearts_rewards.xml",
diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/UnlockWalletFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/UnlockWalletFragment.java
index 484e43cb963..1db9af36393 100644
--- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/UnlockWalletFragment.java
+++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/UnlockWalletFragment.java
@@ -16,6 +16,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@@ -37,6 +38,7 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
private Button mUnlockButton;
private TextView mUnlockWalletRestoreButton;
private TextView mUnlockWalletTitle;
+ private ImageView mBiometricUnlockWalletImage;
private KeyringController getKeyringController() {
Activity activity = getActivity();
@@ -60,6 +62,7 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
mUnlockButton = view.findViewById(R.id.btn_unlock);
mUnlockWalletRestoreButton = view.findViewById(R.id.btn_unlock_wallet_restore);
mUnlockWalletTitle = view.findViewById(R.id.unlock_wallet_title);
+ mBiometricUnlockWalletImage = view.findViewById(R.id.iv_biometric_unlock_wallet);
mUnlockButton.setOnClickListener(v -> {
if (TextUtils.isEmpty(mUnlockWalletPassword.getText())) {
@@ -90,6 +93,13 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
onNextPage.gotoRestorePage();
}
});
+
+ mBiometricUnlockWalletImage.setOnClickListener(v -> {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ createBiometricPrompt();
+ }
+ });
+
if (onNextPage != null && onNextPage.showBiometricPrompt()) {
checkOnBiometric();
} else if (onNextPage != null) {
@@ -149,8 +159,10 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
public void onAuthenticationError(int errorCode, CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
+ if (!TextUtils.isEmpty(errString)) {
+ Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT).show();
+ }
// Even though we have an error, we still let to proceed
- Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT).show();
showPasswordRelatedControls();
}
};
@@ -178,5 +190,9 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
mUnlockButton.setVisibility(View.VISIBLE);
mUnlockWalletRestoreButton.setVisibility(View.VISIBLE);
mUnlockWalletTitle.setVisibility(View.VISIBLE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
+ && KeystoreHelper.shouldUseBiometricOnUnlock()) {
+ mBiometricUnlockWalletImage.setVisibility(View.VISIBLE);
+ }
}
}
diff --git a/android/java/res/drawable/ic_fingerprint.xml b/android/java/res/drawable/ic_fingerprint.xml
new file mode 100644
index 00000000000..7d66d3ca179
--- /dev/null
+++ b/android/java/res/drawable/ic_fingerprint.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/android/java/res/layout/fragment_unlock_wallet.xml b/android/java/res/layout/fragment_unlock_wallet.xml
index 419e86db89b..313ad5eceb7 100644
--- a/android/java/res/layout/fragment_unlock_wallet.xml
+++ b/android/java/res/layout/fragment_unlock_wallet.xml
@@ -47,26 +47,46 @@
android:visibility="gone"
android:textSize="18sp"/>
-
+ android:gravity="center"
+ android:orientation="horizontal">
+
+
+
+
+
+
Password
+
+ Biometric unlock
+
Enter password to unlock wallet