Skip to content

Commit be25b71

Browse files
authored
(Wallet) Implement onboarding initial screen and TOC screen (#21905)
Implements new initial onboarding screen and new terms of use screen.
1 parent 6bba2b4 commit be25b71

27 files changed

+877
-172
lines changed

android/brave_java_resources.gni

+13
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,10 @@ brave_java_resources = [
144144
"java/res/drawable-night-nodpi/widget_preview.png",
145145
"java/res/drawable-night/bookmark_empty_state_illustration.xml",
146146
"java/res/drawable-night/history_empty_state_illustration.xml",
147+
"java/res/drawable-night/new_wallet.xml",
147148
"java/res/drawable-night/phone_recent_tab_empty_state_illustration.xml",
148149
"java/res/drawable-night/reading_list_empty_state_illustration.xml",
150+
"java/res/drawable-night/restore_wallet.xml",
149151
"java/res/drawable-night/tablet_recent_tab_empty_state_illustration.xml",
150152
"java/res/drawable-night/tipping_background_success.xml",
151153
"java/res/drawable-nodpi/dylan_malval_sea_min.webp",
@@ -413,6 +415,7 @@ brave_java_resources = [
413415
"java/res/drawable/crypto_wallet_blue_button.xml",
414416
"java/res/drawable/crypto_wallet_hollow_button.xml",
415417
"java/res/drawable/crypto_wallet_negative_button.xml",
418+
"java/res/drawable/crypto_wallet_onboarding_blue_button.xml",
416419
"java/res/drawable/custodian_text_background.xml",
417420
"java/res/drawable/default_dot.xml",
418421
"java/res/drawable/default_indicator.xml",
@@ -506,6 +509,7 @@ brave_java_resources = [
506509
"java/res/drawable/ic_close.xml",
507510
"java/res/drawable/ic_close_12.xml",
508511
"java/res/drawable/ic_closing_all_closes_brave.xml",
512+
"java/res/drawable/ic_coinbase.xml",
509513
"java/res/drawable/ic_connect_account.xml",
510514
"java/res/drawable/ic_copy.xml",
511515
"java/res/drawable/ic_crypto_wallets.xml",
@@ -549,6 +553,7 @@ brave_java_resources = [
549553
"java/res/drawable/ic_media.xml",
550554
"java/res/drawable/ic_menu.xml",
551555
"java/res/drawable/ic_menu_close.xml",
556+
"java/res/drawable/ic_metamask.xml",
552557
"java/res/drawable/ic_new_tab_page.xml",
553558
"java/res/drawable/ic_news.xml",
554559
"java/res/drawable/ic_news_settings.xml",
@@ -582,6 +587,7 @@ brave_java_resources = [
582587
"java/res/drawable/ic_payout_status_pending.xml",
583588
"java/res/drawable/ic_pending_tx_notification_bg.xml",
584589
"java/res/drawable/ic_pending_tx_notification_icon.xml",
590+
"java/res/drawable/ic_phantom.xml",
585591
"java/res/drawable/ic_phone.xml",
586592
"java/res/drawable/ic_plans.xml",
587593
"java/res/drawable/ic_plus.xml",
@@ -643,11 +649,16 @@ brave_java_resources = [
643649
"java/res/drawable/leo_plan_upgrade_now_bg.xml",
644650
"java/res/drawable/modern_toolbar_background_grey_end_segment.xml",
645651
"java/res/drawable/modern_toolbar_background_grey_middle_segment.xml",
652+
"java/res/drawable/new_wallet.xml",
646653
"java/res/drawable/news_button_bg.xml",
647654
"java/res/drawable/news_settings_following_count_bg.xml",
648655
"java/res/drawable/notification_button_rounded_bg.xml",
649656
"java/res/drawable/notification_on_button_background.xml",
650657
"java/res/drawable/notification_rationale_dialog_background.xml",
658+
"java/res/drawable/onboarding_gradient_animation.xml",
659+
"java/res/drawable/onboarding_gradient_background_center.xml",
660+
"java/res/drawable/onboarding_gradient_background_end.xml",
661+
"java/res/drawable/onboarding_gradient_background_start.xml",
651662
"java/res/drawable/orange_rounded_button.xml",
652663
"java/res/drawable/p2p_rewards_inside_background.xml",
653664
"java/res/drawable/progress_indeterminate_orange.xml",
@@ -662,6 +673,7 @@ brave_java_resources = [
662673
"java/res/drawable/recovery_phrase_bg.xml",
663674
"java/res/drawable/rect_round_corners_12.xml",
664675
"java/res/drawable/rect_up_round_corners_12.xml",
676+
"java/res/drawable/restore_wallet.xml",
665677
"java/res/drawable/rewards_button_orange.xml",
666678
"java/res/drawable/rewards_info_icon.xml",
667679
"java/res/drawable/rewards_logged_out_state_gradient_bg.xml",
@@ -908,6 +920,7 @@ brave_java_resources = [
908920
"java/res/layout/fragment_sign_message_error.xml",
909921
"java/res/layout/fragment_sign_tx_message.xml",
910922
"java/res/layout/fragment_siwe.xml",
923+
"java/res/layout/fragment_terms_of_use_wallet.xml",
911924
"java/res/layout/fragment_timer_dialog_list_dialog.xml",
912925
"java/res/layout/fragment_timer_dialog_list_dialog_item.xml",
913926
"java/res/layout/fragment_transaction.xml",

android/brave_java_sources.gni

+1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ brave_java_sources = [
168168
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingRecoveryPhraseFragment.java",
169169
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingRestoreWalletFragment.java",
170170
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingSecurePasswordFragment.java",
171+
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingTermsOfUseFragment.java",
171172
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingVerifyRecoveryPhraseFragment.java",
172173
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnNextPage.java",
173174
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java",

android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java

+35-24
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.widget.ImageView;
1414

1515
import androidx.annotation.NonNull;
16+
import androidx.annotation.StringRes;
1617
import androidx.appcompat.view.menu.MenuBuilder;
1718
import androidx.core.content.ContextCompat;
1819
import androidx.viewpager.widget.ViewPager;
@@ -42,6 +43,7 @@
4243
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingRecoveryPhraseFragment;
4344
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingRestoreWalletFragment;
4445
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingSecurePasswordFragment;
46+
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingTermsOfUseFragment;
4547
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingVerifyRecoveryPhraseFragment;
4648
import org.chromium.chrome.browser.crypto_wallet.listeners.OnNextPage;
4749
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
@@ -76,6 +78,8 @@ public enum WalletAction {
7678
// Unlock action type triggered when accessing the locked Wallet.
7779
UNLOCK,
7880
// Restore action part of the onboarding flow, triggered when restoring a Wallet.
81+
ONBOARDING_RESTORE,
82+
// Restore action triggered outside onboarding flow on a pre-existing wallet.
7983
RESTORE
8084
}
8185

@@ -265,7 +269,7 @@ private void setNavigationFragments(@NonNull final WalletAction walletAction) {
265269
UnlockWalletFragment unlockWalletFragment = new UnlockWalletFragment();
266270
navigationItems.add(new NavigationItem(
267271
getResources().getString(R.string.unlock_wallet_title), unlockWalletFragment));
268-
} else if (walletAction == WalletAction.RESTORE) {
272+
} else if (walletAction == WalletAction.ONBOARDING_RESTORE) {
269273
mShowBiometricPrompt = false;
270274
OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
271275
OnboardingRestoreWalletFragment.newInstance();
@@ -285,38 +289,44 @@ private void setNavigationFragments(@NonNull final WalletAction walletAction) {
285289
private void replaceNavigationFragments(@NonNull final WalletAction walletAction) {
286290
if (mCryptoWalletOnboardingViewPager == null) return;
287291
if (mCryptoWalletOnboardingPagerAdapter == null) return;
288-
if (walletAction == WalletAction.RESTORE) {
292+
293+
final List<NavigationItem> navigationItems = new ArrayList<>();
294+
// Terms of use screen is shown only during onboarding actions.
295+
if (walletAction != WalletAction.RESTORE) {
296+
final OnboardingTermsOfUseFragment onboardingTermsOfUseFragment =
297+
OnboardingTermsOfUseFragment.newInstance();
298+
navigationItems.add(
299+
new NavigationItem(
300+
getResources().getString(R.string.before_we_begin),
301+
onboardingTermsOfUseFragment));
302+
}
303+
304+
if (walletAction == WalletAction.ONBOARDING_RESTORE
305+
|| walletAction == WalletAction.RESTORE) {
289306
mShowBiometricPrompt = false;
290-
OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
307+
308+
final OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
291309
OnboardingRestoreWalletFragment.newInstance();
292-
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItem(
310+
navigationItems.add(
293311
new NavigationItem(
294312
getResources().getString(R.string.restore_crypto_account),
295-
onboardingRestoreWalletFragment),
296-
mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
313+
onboardingRestoreWalletFragment));
314+
addWalletCreationPage(navigationItems, R.string.your_wallet_is_restoring_page_title);
297315

298-
OnboardingCreatingWalletFragment onboardingCreatingWalletFragment =
299-
new OnboardingCreatingWalletFragment();
300-
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItem(
301-
new NavigationItem(
302-
getResources().getString(R.string.your_wallet_is_restoring_page_title),
303-
onboardingCreatingWalletFragment),
304-
mCryptoWalletOnboardingPagerAdapter.getCount());
305316
} else if (walletAction == WalletAction.PASSWORD_CREATION) {
306317
mShowBiometricPrompt = true;
307-
List<NavigationItem> navigationItems = new ArrayList<>();
308-
OnboardingSecurePasswordFragment onboardingSecurePasswordFragment =
318+
319+
final OnboardingSecurePasswordFragment onboardingSecurePasswordFragment =
309320
new OnboardingSecurePasswordFragment();
310321
navigationItems.add(
311322
new NavigationItem(
312323
getResources().getString(R.string.secure_your_crypto),
313324
onboardingSecurePasswordFragment));
314-
addWalletCreatingPage(navigationItems);
325+
addWalletCreationPage(navigationItems, R.string.your_wallet_is_creating_page_title);
315326
addBackupWalletSequence(navigationItems, true);
316-
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItems(
317-
navigationItems, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
318327
}
319-
328+
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItems(
329+
navigationItems, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
320330
mCryptoWalletOnboardingPagerAdapter.notifyDataSetChanged();
321331

322332
mCryptoWalletOnboardingViewPager.setCurrentItem(
@@ -346,7 +356,7 @@ private void addRemoveSecureFlag(final boolean add) {
346356
}
347357

348358
private void addBackupWalletSequence(
349-
List<NavigationItem> navigationItems, boolean isOnboarding) {
359+
@NonNull final List<NavigationItem> navigationItems, final boolean isOnboarding) {
350360
OnboardingBackupWalletFragment onboardingBackupWalletFragment =
351361
OnboardingBackupWalletFragment.newInstance(isOnboarding);
352362
navigationItems.add(
@@ -367,13 +377,13 @@ private void addBackupWalletSequence(
367377
onboardingVerifyRecoveryPhraseFragment));
368378
}
369379

370-
private void addWalletCreatingPage(List<NavigationItem> navigationItems) {
380+
private void addWalletCreationPage(
381+
@NonNull final List<NavigationItem> navigationItems, @StringRes int stringId) {
371382
OnboardingCreatingWalletFragment onboardingCreatingWalletFragment =
372383
new OnboardingCreatingWalletFragment();
373384
navigationItems.add(
374385
new NavigationItem(
375-
getResources().getString(R.string.your_wallet_is_creating_page_title),
376-
onboardingCreatingWalletFragment));
386+
getResources().getString(stringId), onboardingCreatingWalletFragment));
377387
}
378388

379389
public void showOnboardingLayout() {
@@ -455,7 +465,8 @@ public void gotoCreationPage() {
455465

456466
@Override
457467
public void gotoRestorePage(boolean isOnboarding) {
458-
replaceNavigationFragments(WalletAction.RESTORE);
468+
replaceNavigationFragments(
469+
isOnboarding ? WalletAction.ONBOARDING_RESTORE : WalletAction.RESTORE);
459470
if (isOnboarding) {
460471
mBraveWalletP3A.reportOnboardingAction(OnboardingAction.START_RESTORE);
461472
}

android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoWalletOnboardingPagerAdapter.java

+16-11
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,28 @@
1414
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
1515

1616
import java.util.ArrayList;
17-
import java.util.Collections;
1817
import java.util.List;
1918

2019
public class CryptoWalletOnboardingPagerAdapter extends FragmentStatePagerAdapter {
21-
private List<NavigationItem> mNavigationItems = new ArrayList<>();
20+
private final List<NavigationItem> mNavigationItems = new ArrayList<>();
2221

23-
public void setNavigationItems(List<NavigationItem> mNavigationItems) {
24-
this.mNavigationItems = mNavigationItems;
22+
public void setNavigationItems(@NonNull final List<NavigationItem> navigationItems) {
23+
mNavigationItems.clear();
24+
mNavigationItems.addAll(navigationItems);
2525
}
2626

27-
public void replaceWithNavigationItem(NavigationItem navigationItem, int index) {
28-
replaceWithNavigationItems(Collections.singletonList(navigationItem), index);
29-
}
30-
31-
public void replaceWithNavigationItems(List<NavigationItem> navigationItems, int index) {
32-
this.mNavigationItems = this.mNavigationItems.subList(0, index);
33-
this.mNavigationItems.addAll(navigationItems);
27+
/**
28+
* Replaces all navigation items starting from a given index.
29+
*
30+
* @param navigationItems Navigation items to add.
31+
* @param index Index pointing to the first item that will be replaced.
32+
*/
33+
public void replaceWithNavigationItems(
34+
@NonNull final List<NavigationItem> navigationItems, final int index) {
35+
// Clear the list from the index (included).
36+
mNavigationItems.subList(index, mNavigationItems.size()).clear();
37+
// Append new navigation items to the list.
38+
mNavigationItems.addAll(navigationItems);
3439
}
3540

3641
public CryptoWalletOnboardingPagerAdapter(FragmentManager fm) {

android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingInitWalletFragment.java

+58-26
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
package org.chromium.chrome.browser.crypto_wallet.fragments.onboarding;
77

88
import android.content.Intent;
9+
import android.graphics.drawable.AnimationDrawable;
910
import android.os.Build;
1011
import android.os.Bundle;
1112
import android.view.LayoutInflater;
1213
import android.view.View;
1314
import android.view.ViewGroup;
14-
import android.widget.Button;
15-
import android.widget.TextView;
1615

1716
import androidx.annotation.NonNull;
1817
import androidx.annotation.Nullable;
18+
import androidx.cardview.widget.CardView;
19+
import androidx.core.content.ContextCompat;
1920
import androidx.fragment.app.FragmentActivity;
2021

2122
import org.chromium.base.Log;
@@ -35,6 +36,7 @@ public class OnboardingInitWalletFragment extends BaseOnboardingWalletFragment {
3536

3637
private boolean mRestartSetupAction;
3738
private boolean mRestartRestoreAction;
39+
private AnimationDrawable mAnimationDrawable;
3840

3941
public OnboardingInitWalletFragment(boolean restartSetupAction, boolean restartRestoreAction) {
4042
mRestartSetupAction = restartSetupAction;
@@ -59,30 +61,60 @@ public View onCreateView(
5961
@Override
6062
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
6163
super.onViewCreated(view, savedInstanceState);
62-
Button setupCryptoButton = view.findViewById(R.id.btn_setup_crypto);
63-
setupCryptoButton.setOnClickListener(v -> {
64-
checkOnBraveActivity(true, false);
65-
if (mOnNextPage != null) {
66-
mOnNextPage.gotoCreationPage();
67-
}
68-
});
69-
70-
TextView restoreButton = view.findViewById(R.id.btn_restore);
71-
restoreButton.setOnClickListener(v -> {
72-
checkOnBraveActivity(false, true);
73-
if (mOnNextPage != null) {
74-
mOnNextPage.gotoRestorePage(true);
75-
}
76-
});
77-
PostTask.postTask(TaskTraits.UI_DEFAULT, () -> {
78-
if (mRestartSetupAction) {
79-
setupCryptoButton.performClick();
80-
} else if (mRestartRestoreAction) {
81-
restoreButton.performClick();
82-
}
83-
mRestartSetupAction = false;
84-
mRestartRestoreAction = false;
85-
});
64+
mAnimationDrawable =
65+
(AnimationDrawable)
66+
ContextCompat.getDrawable(
67+
requireContext(), R.drawable.onboarding_gradient_animation);
68+
view.findViewById(R.id.setup_wallet_root).setBackground(mAnimationDrawable);
69+
mAnimationDrawable.setEnterFadeDuration(10);
70+
mAnimationDrawable.setExitFadeDuration(5000);
71+
72+
CardView newWallet = view.findViewById(R.id.new_wallet_card_view);
73+
newWallet.setOnClickListener(
74+
v -> {
75+
checkOnBraveActivity(true, false);
76+
if (mOnNextPage != null) {
77+
// Add a little delay for a smooth ripple effect animation.
78+
PostTask.postDelayedTask(
79+
TaskTraits.UI_DEFAULT, () -> mOnNextPage.gotoCreationPage(), 200);
80+
}
81+
});
82+
83+
CardView restoreWallet = view.findViewById(R.id.restore_wallet_card_view);
84+
restoreWallet.setOnClickListener(
85+
v -> {
86+
checkOnBraveActivity(false, true);
87+
if (mOnNextPage != null) {
88+
// Add a little delay for a smooth ripple effect animation.
89+
PostTask.postDelayedTask(
90+
TaskTraits.UI_DEFAULT,
91+
() -> mOnNextPage.gotoRestorePage(true),
92+
200);
93+
}
94+
});
95+
PostTask.postTask(
96+
TaskTraits.UI_DEFAULT,
97+
() -> {
98+
if (mRestartSetupAction) {
99+
newWallet.performClick();
100+
} else if (mRestartRestoreAction) {
101+
restoreWallet.performClick();
102+
}
103+
mRestartSetupAction = false;
104+
mRestartRestoreAction = false;
105+
});
106+
}
107+
108+
@Override
109+
public void onResume() {
110+
super.onResume();
111+
mAnimationDrawable.start();
112+
}
113+
114+
@Override
115+
public void onPause() {
116+
super.onPause();
117+
mAnimationDrawable.stop();
86118
}
87119

88120
@Override

0 commit comments

Comments
 (0)