From 8005b7348883a98287c37423e430fa4b21c68505 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Thu, 15 Aug 2024 13:47:15 +0200 Subject: [PATCH] (Wallet) Connect unlock action from WebUI to native unlock (#24992) When Wallet is locked, show a new page that will open native unlock screen when double tapped. --- ...BraveWalletProviderDelegateImplHelper.java | 17 ++++++- .../fragments/BaseWalletNextPageFragment.java | 4 +- .../brave_wallet_provider_delegate_impl.cc | 4 ++ .../brave_wallet_provider_delegate_impl.h | 1 + ...ve_wallet_provider_delegate_impl_helper.cc | 6 ++- ...ave_wallet_provider_delegate_impl_helper.h | 3 ++ ...t_provider_delegate_impl_helper_android.cc | 5 ++ .../android/android_wallet_page_handler.cc | 4 ++ .../android/android_wallet_page_handler.h | 1 + .../page_handler/wallet_page_handler.cc | 6 ++- .../page_handler/wallet_page_handler.h | 1 + .../browser/brave_wallet_constants.h | 3 ++ .../browser/brave_wallet_provider_delegate.h | 1 + .../brave_wallet/common/brave_wallet.mojom | 3 ++ .../components/desktop/lock-screen/index.tsx | 48 +++++++++++++++---- .../components/desktop/lock-screen/style.ts | 31 +++++++++++- components/brave_wallet_ui/stories/locale.ts | 3 ++ components/resources/wallet_strings.grdp | 2 + .../BrowserViewController/BVC+Wallet.swift | 4 ++ ...ave_wallet_provider_delegate_ios+private.h | 1 + .../brave_wallet_provider_delegate_ios.h | 1 + .../brave_wallet_provider_delegate_ios.mm | 4 ++ ui/webui/resources/BUILD.gn | 1 + 23 files changed, 138 insertions(+), 16 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/BraveWalletProviderDelegateImplHelper.java b/android/java/org/chromium/chrome/browser/crypto_wallet/BraveWalletProviderDelegateImplHelper.java index afe9e17eaf3..1f0ef9d4221 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/BraveWalletProviderDelegateImplHelper.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/BraveWalletProviderDelegateImplHelper.java @@ -17,6 +17,9 @@ import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.settings.BraveWalletPreferences; import org.chromium.content_public.browser.WebContents; +/** + * @noinspection unused + */ @JNINamespace("brave_wallet") public class BraveWalletProviderDelegateImplHelper { private static final String TAG = "BraveWalletProvider"; @@ -27,7 +30,17 @@ public class BraveWalletProviderDelegateImplHelper { BraveActivity activity = BraveActivity.getBraveActivity(); activity.showWalletPanel(false); } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "showPanel " + e); + Log.e(TAG, "showPanel", e); + } + } + + @CalledByNative + public static void unlockWallet() { + try { + BraveActivity activity = BraveActivity.getBraveActivity(); + activity.openBraveWallet(false, false, false); + } catch (BraveActivity.BraveActivityNotFoundException e) { + Log.e(TAG, "unlockWallet", e); } } @@ -47,7 +60,7 @@ public class BraveWalletProviderDelegateImplHelper { BraveActivity activity = BraveActivity.getBraveActivity(); activity.showWalletOnboarding(); } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "showWalletOnboarding " + e); + Log.e(TAG, "showWalletOnboarding", e); } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/BaseWalletNextPageFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/BaseWalletNextPageFragment.java index 9e4778c7c5b..bb5482384c9 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/BaseWalletNextPageFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/BaseWalletNextPageFragment.java @@ -222,7 +222,9 @@ public abstract class BaseWalletNextPageFragment extends Fragment { super.onAuthenticationError(errorCode, errString); final Context context = getContext(); - if (!TextUtils.isEmpty(errString) && context != null) { + // Error code 10 is when the user taps back to dismiss the dialog, + // there's no need to show a toast to log this action. + if (!TextUtils.isEmpty(errString) && context != null && errorCode != 10) { Toast.makeText(context, errString, Toast.LENGTH_SHORT).show(); } showBiometricAuthenticationButton(biometricUnlockButton); diff --git a/browser/brave_wallet/brave_wallet_provider_delegate_impl.cc b/browser/brave_wallet/brave_wallet_provider_delegate_impl.cc index e5fbb5cf4b5..5f9417e7030 100644 --- a/browser/brave_wallet/brave_wallet_provider_delegate_impl.cc +++ b/browser/brave_wallet/brave_wallet_provider_delegate_impl.cc @@ -89,6 +89,10 @@ void BraveWalletProviderDelegateImpl::ShowWalletBackup() { ::brave_wallet::ShowWalletBackup(); } +void BraveWalletProviderDelegateImpl::UnlockWallet() { + ::brave_wallet::UnlockWallet(); +} + void BraveWalletProviderDelegateImpl::WalletInteractionDetected() { ::brave_wallet::WalletInteractionDetected(web_contents_); } diff --git a/browser/brave_wallet/brave_wallet_provider_delegate_impl.h b/browser/brave_wallet/brave_wallet_provider_delegate_impl.h index 963949f3fd2..9cfee4934e7 100644 --- a/browser/brave_wallet/brave_wallet_provider_delegate_impl.h +++ b/browser/brave_wallet/brave_wallet_provider_delegate_impl.h @@ -40,6 +40,7 @@ class BraveWalletProviderDelegateImpl : public BraveWalletProviderDelegate, bool IsTabVisible() override; void ShowPanel() override; void ShowWalletBackup() override; + void UnlockWallet() override; void WalletInteractionDetected() override; void ShowWalletOnboarding() override; void ShowAccountCreation(mojom::CoinType type) override; diff --git a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.cc b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.cc index 8afe53764ea..35dc956cb90 100644 --- a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.cc +++ b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.cc @@ -34,7 +34,11 @@ void ShowPanel(content::WebContents* web_contents) { } void ShowWalletBackup() { - NOTREACHED_IN_MIGRATION(); + NOTREACHED(); +} + +void UnlockWallet() { + NOTREACHED(); } void ShowWalletOnboarding(content::WebContents* web_contents) { diff --git a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.h b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.h index c6aa3c607c1..47b570ce51b 100644 --- a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.h +++ b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper.h @@ -24,6 +24,9 @@ void ShowPanel(content::WebContents* web_contents); // Show native Brave Wallet backup UI - Used only by Android. void ShowWalletBackup(); +// Show native Brave Wallet unlock screen - Used only by Android. +void UnlockWallet(); + // Show wallet onboarding page. void ShowWalletOnboarding(content::WebContents* web_contents); diff --git a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper_android.cc b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper_android.cc index 58ba4bcef00..651c357c7c5 100644 --- a/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper_android.cc +++ b/browser/brave_wallet/brave_wallet_provider_delegate_impl_helper_android.cc @@ -28,6 +28,11 @@ void ShowWalletBackup() { Java_BraveWalletProviderDelegateImplHelper_showWalletBackup(env); } +void UnlockWallet() { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_BraveWalletProviderDelegateImplHelper_unlockWallet(env); +} + void ShowWalletOnboarding(content::WebContents*) { JNIEnv* env = base::android::AttachCurrentThread(); Java_BraveWalletProviderDelegateImplHelper_showWalletOnboarding(env); diff --git a/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.cc b/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.cc index 5817719384b..a16479d6c30 100644 --- a/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.cc +++ b/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.cc @@ -30,3 +30,7 @@ void AndroidWalletPageHandler::ShowApprovePanelUI() { void AndroidWalletPageHandler::ShowWalletBackupUI() { ::brave_wallet::ShowWalletBackup(); } + +void AndroidWalletPageHandler::UnlockWalletUI() { + ::brave_wallet::UnlockWallet(); +} diff --git a/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.h b/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.h index 76f094377ed..afba03c2872 100644 --- a/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.h +++ b/browser/ui/webui/brave_wallet/android/android_wallet_page_handler.h @@ -25,6 +25,7 @@ class AndroidWalletPageHandler : WalletPageHandler { void ShowApprovePanelUI() override; void ShowWalletBackupUI() override; + void UnlockWalletUI() override; private: raw_ptr const webui_controller_; diff --git a/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.cc b/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.cc index e128cf4468a..55539d7942b 100644 --- a/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.cc +++ b/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.cc @@ -29,5 +29,9 @@ void WalletPageHandler::ShowApprovePanelUI() { } void WalletPageHandler::ShowWalletBackupUI() { - NOTREACHED_IN_MIGRATION(); + NOTREACHED(); +} + +void WalletPageHandler::UnlockWalletUI() { + NOTREACHED(); } diff --git a/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.h b/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.h index 802b108a056..587b30bfe2c 100644 --- a/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.h +++ b/browser/ui/webui/brave_wallet/page_handler/wallet_page_handler.h @@ -27,6 +27,7 @@ class WalletPageHandler : public brave_wallet::mojom::PageHandler { void ShowApprovePanelUI() override; void ShowWalletBackupUI() override; + void UnlockWalletUI() override; private: raw_ptr profile_ = nullptr; // NOT OWNED diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index 684f86e4926..ab391147024 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -485,6 +485,9 @@ inline constexpr webui::LocalizedString kLocalizedStrings[] = { {"braveWalletLockScreenButton", IDS_BRAVE_WALLET_LOCK_SCREEN_BUTTON}, {"braveWalletLockScreenError", IDS_BRAVE_WALLET_LOCK_SCREEN_ERROR}, {"braveWalletUnlockWallet", IDS_BRAVE_WALLET_UNLOCK_WALLET}, + {"braveWalletDoubleTapScreen", IDS_BRAVE_WALLET_DOUBLE_TAP_SCREEN}, + {"braveWalletUnlockAndroidDescription", + IDS_BRAVE_WALLET_UNLOCK_ANDROID_DESCRIPTION}, {"braveWalletWalletPopupSettings", IDS_BRAVE_WALLET_WALLET_POPUP_SETTINGS}, {"braveWalletWalletPopupLock", IDS_BRAVE_WALLET_WALLET_POPUP_LOCK}, {"braveWalletWalletPopupBackup", IDS_BRAVE_WALLET_WALLET_POPUP_BACKUP}, diff --git a/components/brave_wallet/browser/brave_wallet_provider_delegate.h b/components/brave_wallet/browser/brave_wallet_provider_delegate.h index 646a491e7fe..130da587efe 100644 --- a/components/brave_wallet/browser/brave_wallet_provider_delegate.h +++ b/components/brave_wallet/browser/brave_wallet_provider_delegate.h @@ -31,6 +31,7 @@ class BraveWalletProviderDelegate { virtual bool IsTabVisible() = 0; virtual void ShowPanel() = 0; virtual void ShowWalletBackup() = 0; + virtual void UnlockWallet() = 0; virtual void WalletInteractionDetected() = 0; virtual void ShowWalletOnboarding() = 0; virtual void ShowAccountCreation(mojom::CoinType type) = 0; diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index 48296ec4e36..76584369e25 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -322,6 +322,9 @@ interface PageHandler { // Android only - Used by the brave://wallet page to open up the backup UI. ShowWalletBackupUI(); + + // Android only - Used by the brave://wallet page to open up the unlock UI. + UnlockWalletUI(); }; enum AssetPriceTimeframe { diff --git a/components/brave_wallet_ui/components/desktop/lock-screen/index.tsx b/components/brave_wallet_ui/components/desktop/lock-screen/index.tsx index 856f322f2d3..3ac00618c9f 100644 --- a/components/brave_wallet_ui/components/desktop/lock-screen/index.tsx +++ b/components/brave_wallet_ui/components/desktop/lock-screen/index.tsx @@ -21,6 +21,7 @@ import { openWalletRouteTab } from '../../../utils/routes-utils' import { UISelectors } from '../../../common/selectors' import { useSafeUISelector } from '../../../common/hooks/use-safe-selector' import { useUnlockWalletMutation } from '../../../common/slices/api.slice' +import getWalletAPIProxy from '../../../common/async/bridge' // Components import { PasswordInput } from '../../shared/password-input/password-input-v2' @@ -33,9 +34,11 @@ import { PageIcon, InputColumn, UnlockButton, - InputLabel + InputLabel, + DoubleTapIcon, + AndroidLockScreenWrapper } from './style' -import { VerticalSpace, Row } from '../../shared/style' +import { VerticalSpace, Row, Text } from '../../shared/style' export const LockScreen = () => { // redux @@ -97,9 +100,36 @@ export const LockScreen = () => { } }, [history, isPanel]) + const onDoubleTap = (e: React.MouseEvent) => { + // Event detail is two for double clicks. + if (e.detail === 2) { + getWalletAPIProxy().pageHandler?.unlockWalletUI() + } + } + const isAndroid = loadTimeData.getBoolean('isAndroid') || false // render + if (isAndroid) { + return ( + + + + {getLocale('braveWalletDoubleTapScreen')} + + + {getLocale('braveWalletUnlockAndroidDescription')} + + + ) + } + return ( @@ -138,14 +168,12 @@ export const LockScreen = () => { > {getLocale('braveWalletLockScreenButton')} - {!isAndroid && ( - - )} + ) diff --git a/components/brave_wallet_ui/components/desktop/lock-screen/style.ts b/components/brave_wallet_ui/components/desktop/lock-screen/style.ts index a6003def51b..47220c95168 100644 --- a/components/brave_wallet_ui/components/desktop/lock-screen/style.ts +++ b/components/brave_wallet_ui/components/desktop/lock-screen/style.ts @@ -3,6 +3,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this file, // you can obtain one at https://mozilla.org/MPL/2.0/. import styled from 'styled-components' +import Icon from '@brave/leo/react/icon' import * as leo from '@brave/leo/tokens/css/variables' import Button from '@brave/leo/react/button' @@ -13,7 +14,7 @@ import { } from '../../../assets/svg-icons/unlock-wallet-icons' // Shared Styles -import { Text, Column } from '../../shared/style' +import { Text, Column, WalletButton } from '../../shared/style' export const StyledWrapper = styled.div` display: flex; @@ -66,3 +67,31 @@ export const UnlockButton = styled(Button)` width: 100%; margin-bottom: 12px; ` + +export const AndroidLockScreenWrapper = styled(WalletButton)` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: none; + background-color: none; + border: none; + outline: none; + margin: 0px; + padding: 12px; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + gap: 8px; + z-index: 100; + position: absolute; +` + +export const DoubleTapIcon = styled(Icon).attrs({ + name: 'finger-double-tap' +})` + --leo-icon-size: 72px; + color: ${leo.color.icon.interactive}; + margin-bottom: 16px; +` diff --git a/components/brave_wallet_ui/stories/locale.ts b/components/brave_wallet_ui/stories/locale.ts index 7780e1e5296..bf9eed9484e 100644 --- a/components/brave_wallet_ui/stories/locale.ts +++ b/components/brave_wallet_ui/stories/locale.ts @@ -353,6 +353,9 @@ provideStrings({ braveWalletLockScreenButton: 'Unlock', braveWalletLockScreenError: 'Incorrect password', braveWalletUnlockWallet: 'Unlock Wallet', + braveWalletDoubleTapScreen: 'Double tap screen to continue', + braveWalletUnlockAndroidDescription: + 'Your wallet is locked for your security. Unlock wallet to continue.', // Wallet More Popup braveWalletWalletPopupSettings: 'Settings', diff --git a/components/resources/wallet_strings.grdp b/components/resources/wallet_strings.grdp index 187f3b02d1a..ca795c3636b 100644 --- a/components/resources/wallet_strings.grdp +++ b/components/resources/wallet_strings.grdp @@ -214,6 +214,8 @@ Unlock Incorrect password Unlock Wallet + Double tap screen to continue + Your wallet is locked for your security. Unlock wallet to continue. Settings Lock wallet Backup Wallet diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Wallet.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Wallet.swift index fec41790e67..449bc608f77 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Wallet.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+Wallet.swift @@ -342,6 +342,10 @@ extension Tab: BraveWalletProviderDelegate { // No usage for iOS } + func unlockWallet() { + // No usage for iOS + } + func showWalletOnboarding() { showPanel() } diff --git a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios+private.h b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios+private.h index 18d67e012ec..f8b4d40fd67 100644 --- a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios+private.h +++ b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios+private.h @@ -32,6 +32,7 @@ class BraveWalletProviderDelegateBridge url::Origin GetOrigin() const override; void ShowWalletOnboarding() override; void ShowWalletBackup() override; + void UnlockWallet() override; void ShowAccountCreation(mojom::CoinType type) override; void RequestPermissions(mojom::CoinType type, const std::vector& accounts, diff --git a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.h b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.h index 4bbfdf9f227..3fc43618fbb 100644 --- a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.h +++ b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.h @@ -25,6 +25,7 @@ OBJC_EXPORT - (void)walletInteractionDetected; - (void)showWalletOnboarding; - (void)showWalletBackup; +- (void)unlockWallet; - (void)showAccountCreation:(BraveWalletCoinType)type; - (void)requestPermissions:(BraveWalletCoinType)type accounts:(NSArray*)accounts diff --git a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.mm b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.mm index a63edda5b4b..fb885914bff 100644 --- a/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.mm +++ b/ios/browser/api/brave_wallet/brave_wallet_provider_delegate_ios.mm @@ -40,6 +40,10 @@ void BraveWalletProviderDelegateBridge::ShowWalletBackup() { [bridge_ showWalletBackup]; } +void BraveWalletProviderDelegateBridge::UnlockWallet() { + [bridge_ unlockWallet]; +} + void BraveWalletProviderDelegateBridge::ShowAccountCreation( mojom::CoinType type) { [bridge_ showAccountCreation:static_cast(type)]; diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index cf870a48028..6126f9b1d6e 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn @@ -227,6 +227,7 @@ leo_icons = [ "file.svg", "filter.svg", "filter-settings.svg", + "finger-double-tap.svg", "flash.svg", "flashdrive.svg", "folder-exchange.svg",