Skip to content

(Wallet) Implement onboarding initial screen and TOC screen #21905

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e9c8014
Add new strings required by initial onboarding screen
simoarpe Jan 30, 2024
a00e146
Add drawable for creating new wallet
simoarpe Jan 30, 2024
0792032
Add drawable to resource file
simoarpe Jan 30, 2024
4fa942f
Implement new wallet card view
simoarpe Jan 30, 2024
8c1c8da
Apply code formatting
simoarpe Jan 30, 2024
e00629d
Implement restore card view
simoarpe Jan 30, 2024
ba3f242
Add gradient background
simoarpe Jan 31, 2024
613c8cc
Implement subtle animation that changes the background gradient
simoarpe Jan 31, 2024
f508852
Add night mode for onboarding screen
simoarpe Jan 31, 2024
82e4dcb
Apply code formatting
simoarpe Jan 31, 2024
0e3cd34
Minor improvements
simoarpe Jan 31, 2024
8037d36
Rename string IDs
simoarpe Feb 1, 2024
9a4a41e
Improve NavigationItem class
simoarpe Feb 1, 2024
f5cba86
Preform refactoring to navigation logic
simoarpe Feb 1, 2024
b2040fd
Include new term and conditions screen
simoarpe Feb 1, 2024
0896bf8
Fix restore state
simoarpe Feb 2, 2024
0db8009
Introduce new style for onboarding buttons
simoarpe Feb 2, 2024
7b0192b
Add remaining text views
simoarpe Feb 2, 2024
638c496
Rename fragment and its layout
simoarpe Feb 2, 2024
19257ee
Apply code formatting
simoarpe Feb 2, 2024
2c286a3
Switch in favor of a relative layout
simoarpe Feb 2, 2024
7956a6e
Add listener to check box views and animate button
simoarpe Feb 5, 2024
162533a
Switch in favor of material CheckBoxes
simoarpe Feb 5, 2024
294ff5f
Add extra padding between checkbox and text
simoarpe Feb 5, 2024
d404c97
Tweak checkbox style
simoarpe Feb 5, 2024
08fbaaa
Make text clickable
simoarpe Feb 5, 2024
3002d0a
Apply code formatting
simoarpe Feb 5, 2024
34b7b39
Fix typo
simoarpe Feb 5, 2024
39e3ad3
Add missing header
simoarpe Feb 5, 2024
45d711d
Remove newlines
simoarpe Feb 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions android/brave_java_resources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,10 @@ brave_java_resources = [
"java/res/drawable-night-nodpi/widget_preview.png",
"java/res/drawable-night/bookmark_empty_state_illustration.xml",
"java/res/drawable-night/history_empty_state_illustration.xml",
"java/res/drawable-night/new_wallet.xml",
"java/res/drawable-night/phone_recent_tab_empty_state_illustration.xml",
"java/res/drawable-night/reading_list_empty_state_illustration.xml",
"java/res/drawable-night/restore_wallet.xml",
"java/res/drawable-night/tablet_recent_tab_empty_state_illustration.xml",
"java/res/drawable-night/tipping_background_success.xml",
"java/res/drawable-nodpi/dylan_malval_sea_min.webp",
Expand Down Expand Up @@ -413,6 +415,7 @@ brave_java_resources = [
"java/res/drawable/crypto_wallet_blue_button.xml",
"java/res/drawable/crypto_wallet_hollow_button.xml",
"java/res/drawable/crypto_wallet_negative_button.xml",
"java/res/drawable/crypto_wallet_onboarding_blue_button.xml",
"java/res/drawable/custodian_text_background.xml",
"java/res/drawable/default_dot.xml",
"java/res/drawable/default_indicator.xml",
Expand Down Expand Up @@ -506,6 +509,7 @@ brave_java_resources = [
"java/res/drawable/ic_close.xml",
"java/res/drawable/ic_close_12.xml",
"java/res/drawable/ic_closing_all_closes_brave.xml",
"java/res/drawable/ic_coinbase.xml",
"java/res/drawable/ic_connect_account.xml",
"java/res/drawable/ic_copy.xml",
"java/res/drawable/ic_crypto_wallets.xml",
Expand Down Expand Up @@ -544,6 +548,7 @@ brave_java_resources = [
"java/res/drawable/ic_media.xml",
"java/res/drawable/ic_menu.xml",
"java/res/drawable/ic_menu_close.xml",
"java/res/drawable/ic_metamask.xml",
"java/res/drawable/ic_new_tab_page.xml",
"java/res/drawable/ic_news.xml",
"java/res/drawable/ic_news_settings.xml",
Expand Down Expand Up @@ -577,6 +582,7 @@ brave_java_resources = [
"java/res/drawable/ic_payout_status_pending.xml",
"java/res/drawable/ic_pending_tx_notification_bg.xml",
"java/res/drawable/ic_pending_tx_notification_icon.xml",
"java/res/drawable/ic_phantom.xml",
"java/res/drawable/ic_phone.xml",
"java/res/drawable/ic_plans.xml",
"java/res/drawable/ic_plus.xml",
Expand Down Expand Up @@ -635,11 +641,16 @@ brave_java_resources = [
"java/res/drawable/info_outline.xml",
"java/res/drawable/modern_toolbar_background_grey_end_segment.xml",
"java/res/drawable/modern_toolbar_background_grey_middle_segment.xml",
"java/res/drawable/new_wallet.xml",
"java/res/drawable/news_button_bg.xml",
"java/res/drawable/news_settings_following_count_bg.xml",
"java/res/drawable/notification_button_rounded_bg.xml",
"java/res/drawable/notification_on_button_background.xml",
"java/res/drawable/notification_rationale_dialog_background.xml",
"java/res/drawable/onboarding_gradient_animation.xml",
"java/res/drawable/onboarding_gradient_background_center.xml",
"java/res/drawable/onboarding_gradient_background_end.xml",
"java/res/drawable/onboarding_gradient_background_start.xml",
"java/res/drawable/orange_rounded_button.xml",
"java/res/drawable/p2p_rewards_inside_background.xml",
"java/res/drawable/progress_indeterminate_orange.xml",
Expand All @@ -654,6 +665,7 @@ brave_java_resources = [
"java/res/drawable/recovery_phrase_bg.xml",
"java/res/drawable/rect_round_corners_12.xml",
"java/res/drawable/rect_up_round_corners_12.xml",
"java/res/drawable/restore_wallet.xml",
"java/res/drawable/rewards_button_orange.xml",
"java/res/drawable/rewards_info_icon.xml",
"java/res/drawable/rewards_logged_out_state_gradient_bg.xml",
Expand Down Expand Up @@ -900,6 +912,7 @@ brave_java_resources = [
"java/res/layout/fragment_sign_message_error.xml",
"java/res/layout/fragment_sign_tx_message.xml",
"java/res/layout/fragment_siwe.xml",
"java/res/layout/fragment_terms_of_use_wallet.xml",
"java/res/layout/fragment_timer_dialog_list_dialog.xml",
"java/res/layout/fragment_timer_dialog_list_dialog_item.xml",
"java/res/layout/fragment_transaction.xml",
Expand Down
1 change: 1 addition & 0 deletions android/brave_java_sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingRecoveryPhraseFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingRestoreWalletFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingSecurePasswordFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingTermsOfUseFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingVerifyRecoveryPhraseFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnNextPage.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.view.menu.MenuBuilder;
import androidx.core.content.ContextCompat;
import androidx.viewpager.widget.ViewPager;
Expand Down Expand Up @@ -42,6 +43,7 @@
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingRecoveryPhraseFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingRestoreWalletFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingSecurePasswordFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingTermsOfUseFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingVerifyRecoveryPhraseFragment;
import org.chromium.chrome.browser.crypto_wallet.listeners.OnNextPage;
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
Expand Down Expand Up @@ -76,6 +78,8 @@ public enum WalletAction {
// Unlock action type triggered when accessing the locked Wallet.
UNLOCK,
// Restore action part of the onboarding flow, triggered when restoring a Wallet.
ONBOARDING_RESTORE,
// Restore action triggered outside onboarding flow on a pre-existing wallet.
RESTORE
}

Expand Down Expand Up @@ -265,7 +269,7 @@ private void setNavigationFragments(@NonNull final WalletAction walletAction) {
UnlockWalletFragment unlockWalletFragment = new UnlockWalletFragment();
navigationItems.add(new NavigationItem(
getResources().getString(R.string.unlock_wallet_title), unlockWalletFragment));
} else if (walletAction == WalletAction.RESTORE) {
} else if (walletAction == WalletAction.ONBOARDING_RESTORE) {
mShowBiometricPrompt = false;
OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
OnboardingRestoreWalletFragment.newInstance();
Expand All @@ -285,38 +289,44 @@ private void setNavigationFragments(@NonNull final WalletAction walletAction) {
private void replaceNavigationFragments(@NonNull final WalletAction walletAction) {
if (mCryptoWalletOnboardingViewPager == null) return;
if (mCryptoWalletOnboardingPagerAdapter == null) return;
if (walletAction == WalletAction.RESTORE) {

final List<NavigationItem> navigationItems = new ArrayList<>();
// Terms of use screen is shown only during onboarding actions.
if (walletAction != WalletAction.RESTORE) {
final OnboardingTermsOfUseFragment onboardingTermsOfUseFragment =
OnboardingTermsOfUseFragment.newInstance();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.before_we_begin),
onboardingTermsOfUseFragment));
}

if (walletAction == WalletAction.ONBOARDING_RESTORE
|| walletAction == WalletAction.RESTORE) {
mShowBiometricPrompt = false;
OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =

final OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
OnboardingRestoreWalletFragment.newInstance();
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItem(
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.restore_crypto_account),
onboardingRestoreWalletFragment),
mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
onboardingRestoreWalletFragment));
addWalletCreationPage(navigationItems, R.string.your_wallet_is_restoring_page_title);

OnboardingCreatingWalletFragment onboardingCreatingWalletFragment =
new OnboardingCreatingWalletFragment();
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItem(
new NavigationItem(
getResources().getString(R.string.your_wallet_is_restoring_page_title),
onboardingCreatingWalletFragment),
mCryptoWalletOnboardingPagerAdapter.getCount());
} else if (walletAction == WalletAction.PASSWORD_CREATION) {
mShowBiometricPrompt = true;
List<NavigationItem> navigationItems = new ArrayList<>();
OnboardingSecurePasswordFragment onboardingSecurePasswordFragment =

final OnboardingSecurePasswordFragment onboardingSecurePasswordFragment =
new OnboardingSecurePasswordFragment();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.secure_your_crypto),
onboardingSecurePasswordFragment));
addWalletCreatingPage(navigationItems);
addWalletCreationPage(navigationItems, R.string.your_wallet_is_creating_page_title);
addBackupWalletSequence(navigationItems, true);
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItems(
navigationItems, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
}

mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItems(
navigationItems, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
mCryptoWalletOnboardingPagerAdapter.notifyDataSetChanged();

mCryptoWalletOnboardingViewPager.setCurrentItem(
Expand Down Expand Up @@ -346,7 +356,7 @@ private void addRemoveSecureFlag(final boolean add) {
}

private void addBackupWalletSequence(
List<NavigationItem> navigationItems, boolean isOnboarding) {
@NonNull final List<NavigationItem> navigationItems, final boolean isOnboarding) {
OnboardingBackupWalletFragment onboardingBackupWalletFragment =
OnboardingBackupWalletFragment.newInstance(isOnboarding);
navigationItems.add(
Expand All @@ -367,13 +377,13 @@ private void addBackupWalletSequence(
onboardingVerifyRecoveryPhraseFragment));
}

private void addWalletCreatingPage(List<NavigationItem> navigationItems) {
private void addWalletCreationPage(
@NonNull final List<NavigationItem> navigationItems, @StringRes int stringId) {
OnboardingCreatingWalletFragment onboardingCreatingWalletFragment =
new OnboardingCreatingWalletFragment();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.your_wallet_is_creating_page_title),
onboardingCreatingWalletFragment));
getResources().getString(stringId), onboardingCreatingWalletFragment));
}

public void showOnboardingLayout() {
Expand Down Expand Up @@ -455,7 +465,8 @@ public void gotoCreationPage() {

@Override
public void gotoRestorePage(boolean isOnboarding) {
replaceNavigationFragments(WalletAction.RESTORE);
replaceNavigationFragments(
isOnboarding ? WalletAction.ONBOARDING_RESTORE : WalletAction.RESTORE);
if (isOnboarding) {
mBraveWalletP3A.reportOnboardingAction(OnboardingAction.START_RESTORE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,28 @@
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CryptoWalletOnboardingPagerAdapter extends FragmentStatePagerAdapter {
private List<NavigationItem> mNavigationItems = new ArrayList<>();
private final List<NavigationItem> mNavigationItems = new ArrayList<>();

public void setNavigationItems(List<NavigationItem> mNavigationItems) {
this.mNavigationItems = mNavigationItems;
public void setNavigationItems(@NonNull final List<NavigationItem> navigationItems) {
mNavigationItems.clear();
mNavigationItems.addAll(navigationItems);
}

public void replaceWithNavigationItem(NavigationItem navigationItem, int index) {
replaceWithNavigationItems(Collections.singletonList(navigationItem), index);
}

public void replaceWithNavigationItems(List<NavigationItem> navigationItems, int index) {
this.mNavigationItems = this.mNavigationItems.subList(0, index);
this.mNavigationItems.addAll(navigationItems);
/**
* Replaces all navigation items starting from a given index.
*
* @param navigationItems Navigation items to add.
* @param index Index pointing to the first item that will be replaced.
*/
public void replaceWithNavigationItems(
@NonNull final List<NavigationItem> navigationItems, final int index) {
// Clear the list from the index (included).
mNavigationItems.subList(index, mNavigationItems.size()).clear();
// Append new navigation items to the list.
mNavigationItems.addAll(navigationItems);
}

public CryptoWalletOnboardingPagerAdapter(FragmentManager fm) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,17 @@
package org.chromium.chrome.browser.crypto_wallet.fragments.onboarding;

import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

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

private boolean mRestartSetupAction;
private boolean mRestartRestoreAction;
private AnimationDrawable mAnimationDrawable;

public OnboardingInitWalletFragment(boolean restartSetupAction, boolean restartRestoreAction) {
mRestartSetupAction = restartSetupAction;
Expand All @@ -59,30 +61,60 @@ public View onCreateView(
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button setupCryptoButton = view.findViewById(R.id.btn_setup_crypto);
setupCryptoButton.setOnClickListener(v -> {
checkOnBraveActivity(true, false);
if (mOnNextPage != null) {
mOnNextPage.gotoCreationPage();
}
});

TextView restoreButton = view.findViewById(R.id.btn_restore);
restoreButton.setOnClickListener(v -> {
checkOnBraveActivity(false, true);
if (mOnNextPage != null) {
mOnNextPage.gotoRestorePage(true);
}
});
PostTask.postTask(TaskTraits.UI_DEFAULT, () -> {
if (mRestartSetupAction) {
setupCryptoButton.performClick();
} else if (mRestartRestoreAction) {
restoreButton.performClick();
}
mRestartSetupAction = false;
mRestartRestoreAction = false;
});
mAnimationDrawable =
(AnimationDrawable)
ContextCompat.getDrawable(
requireContext(), R.drawable.onboarding_gradient_animation);
view.findViewById(R.id.setup_wallet_root).setBackground(mAnimationDrawable);
mAnimationDrawable.setEnterFadeDuration(10);
mAnimationDrawable.setExitFadeDuration(5000);

CardView newWallet = view.findViewById(R.id.new_wallet_card_view);
newWallet.setOnClickListener(
v -> {
checkOnBraveActivity(true, false);
if (mOnNextPage != null) {
// Add a little delay for a smooth ripple effect animation.
PostTask.postDelayedTask(
TaskTraits.UI_DEFAULT, () -> mOnNextPage.gotoCreationPage(), 200);
}
});

CardView restoreWallet = view.findViewById(R.id.restore_wallet_card_view);
restoreWallet.setOnClickListener(
v -> {
checkOnBraveActivity(false, true);
if (mOnNextPage != null) {
// Add a little delay for a smooth ripple effect animation.
PostTask.postDelayedTask(
TaskTraits.UI_DEFAULT,
() -> mOnNextPage.gotoRestorePage(true),
200);
}
});
PostTask.postTask(
TaskTraits.UI_DEFAULT,
() -> {
if (mRestartSetupAction) {
newWallet.performClick();
} else if (mRestartRestoreAction) {
restoreWallet.performClick();
}
mRestartSetupAction = false;
mRestartRestoreAction = false;
});
}

@Override
public void onResume() {
super.onResume();
mAnimationDrawable.start();
}

@Override
public void onPause() {
super.onPause();
mAnimationDrawable.stop();
}

@Override
Expand Down
Loading