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