Skip to content

Commit 0b268a2

Browse files
authored
(Wallet) Implement new password creation screen (#22459)
🔐 Implements new password creation screen following Figma design.
1 parent 940323e commit 0b268a2

20 files changed

+700
-222
lines changed

android/brave_java_resources.gni

+7
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,11 @@ brave_java_resources = [
628628
"java/res/drawable/onboarding_gradient_background_start.xml",
629629
"java/res/drawable/orange_rounded_button.xml",
630630
"java/res/drawable/p2p_rewards_inside_background.xml",
631+
"java/res/drawable/password_match.xml",
632+
"java/res/drawable/progress_bar_medium.xml",
633+
"java/res/drawable/progress_bar_strong.xml",
634+
"java/res/drawable/progress_bar_weak.xml",
635+
"java/res/drawable/progress_bar_weak.xml",
631636
"java/res/drawable/progress_indeterminate_orange.xml",
632637
"java/res/drawable/quick_action_search_and_bookmark_widget_background.xml",
633638
"java/res/drawable/quick_action_search_and_bookmark_widget_bookmark_bg.xml",
@@ -720,6 +725,7 @@ brave_java_resources = [
720725
"java/res/drawable/wallet_toolbar_panel_gradient_bg.xml",
721726
"java/res/drawable/wallet_top_banner_bg.xml",
722727
"java/res/drawable/wallet_verify_button.xml",
728+
"java/res/drawable/warning_circle_filled.xml",
723729
"java/res/drawable/web_notification_small_icon_background.xml",
724730
"java/res/drawable/white_rounded_holo_button_thin.xml",
725731
"java/res/layout-land/brave_shields_stats_row.xml",
@@ -900,6 +906,7 @@ brave_java_resources = [
900906
"java/res/layout/ntp_image_credit.xml",
901907
"java/res/layout/ntp_non_disruptive_banner.xml",
902908
"java/res/layout/optin_layout.xml",
909+
"java/res/layout/password_strength_meter_layout.xml",
903910
"java/res/layout/qa_code_check.xml",
904911
"java/res/layout/qa_command_line.xml",
905912
"java/res/layout/quick_action_search_and_bookmark_widget_layout.xml",

android/brave_java_sources.gni

+1
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ brave_java_sources = [
197197
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/HeightWrappingViewPager.java",
198198
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/LockableNestedScrollView.java",
199199
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/NonSwipeableViewPager.java",
200+
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/PasswordStrengthMeterView.java",
200201
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/VerticalViewPager.java",
201202
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/ArrowColorDrawable.java",
202203
"../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/PopupWindowTooltip.java",

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

+10-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.chromium.chrome.browser.crypto_wallet.activities;
77

8+
import android.annotation.SuppressLint;
89
import android.content.Intent;
910
import android.view.Menu;
1011
import android.view.MenuItem;
@@ -15,7 +16,7 @@
1516
import androidx.annotation.NonNull;
1617
import androidx.annotation.StringRes;
1718
import androidx.appcompat.view.menu.MenuBuilder;
18-
import androidx.viewpager.widget.ViewPager;
19+
import androidx.viewpager2.widget.ViewPager2;
1920

2021
import com.google.android.material.appbar.MaterialToolbar;
2122

@@ -87,7 +88,7 @@ public enum WalletAction {
8788
private View mCryptoOnboardingLayout;
8889
private ImageView mOnboardingCloseButton;
8990
private ImageView mOnboardingBackButton;
90-
private ViewPager mCryptoWalletOnboardingViewPager;
91+
private ViewPager2 mCryptoWalletOnboardingViewPager;
9192
private ModalDialogManager mModalDialogManager;
9293
private CryptoWalletOnboardingPagerAdapter mCryptoWalletOnboardingPagerAdapter;
9394
private boolean mShowBiometricPrompt;
@@ -147,11 +148,11 @@ protected void triggerLayoutInflation() {
147148

148149
mCryptoOnboardingLayout = findViewById(R.id.crypto_onboarding_layout);
149150
mCryptoWalletOnboardingViewPager = findViewById(R.id.crypto_wallet_onboarding_viewpager);
150-
mCryptoWalletOnboardingPagerAdapter =
151-
new CryptoWalletOnboardingPagerAdapter(getSupportFragmentManager());
151+
mCryptoWalletOnboardingViewPager.setUserInputEnabled(false);
152+
mCryptoWalletOnboardingPagerAdapter = new CryptoWalletOnboardingPagerAdapter(this);
152153
mCryptoWalletOnboardingViewPager.setAdapter(mCryptoWalletOnboardingPagerAdapter);
153154
mCryptoWalletOnboardingViewPager.setOffscreenPageLimit(
154-
mCryptoWalletOnboardingPagerAdapter.getCount() - 1);
155+
mCryptoWalletOnboardingPagerAdapter.getItemCount() - 1);
155156

156157
mOnboardingCloseButton = findViewById(R.id.onboarding_close_button);
157158
mOnboardingCloseButton.setOnClickListener(v -> finish());
@@ -207,6 +208,7 @@ public ModalDialogManager getModalDialogManager() {
207208
};
208209
}
209210

211+
@SuppressLint("NotifyDataSetChanged")
210212
private void setNavigationFragments(@NonNull final WalletAction walletAction) {
211213
List<NavigationItem> navigationItems = new ArrayList<>();
212214
mShowBiometricPrompt = true;
@@ -240,6 +242,7 @@ private void setNavigationFragments(@NonNull final WalletAction walletAction) {
240242
addRemoveSecureFlag(true);
241243
}
242244

245+
@SuppressLint("NotifyDataSetChanged")
243246
private void replaceNavigationFragments(@NonNull final WalletAction walletAction) {
244247
if (mCryptoWalletOnboardingViewPager == null) return;
245248
if (mCryptoWalletOnboardingPagerAdapter == null) return;
@@ -340,6 +343,7 @@ private void addWalletCreationPage(
340343
getResources().getString(stringId), onboardingCreatingWalletFragment));
341344
}
342345

346+
@SuppressLint("NotifyDataSetChanged")
343347
public void showOnboardingLayout() {
344348
addRemoveSecureFlag(true);
345349
mCryptoOnboardingLayout.setVisibility(View.VISIBLE);
@@ -377,7 +381,7 @@ public void gotoNextPage() {
377381
if (mCryptoWalletOnboardingViewPager != null
378382
&& mCryptoWalletOnboardingViewPager.getAdapter() != null
379383
&& mCryptoWalletOnboardingViewPager.getCurrentItem()
380-
< mCryptoWalletOnboardingViewPager.getAdapter().getCount() - 1) {
384+
< mCryptoWalletOnboardingViewPager.getAdapter().getItemCount() - 1) {
381385
mCryptoWalletOnboardingViewPager.setCurrentItem(
382386
mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
383387
}

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

+7-19
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@
66
package org.chromium.chrome.browser.crypto_wallet.adapters;
77

88
import androidx.annotation.NonNull;
9-
import androidx.annotation.Nullable;
109
import androidx.fragment.app.Fragment;
11-
import androidx.fragment.app.FragmentManager;
12-
import androidx.fragment.app.FragmentStatePagerAdapter;
10+
import androidx.fragment.app.FragmentActivity;
11+
import androidx.viewpager2.adapter.FragmentStateAdapter;
1312

1413
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
1514

1615
import java.util.ArrayList;
1716
import java.util.List;
1817

19-
public class CryptoWalletOnboardingPagerAdapter extends FragmentStatePagerAdapter {
18+
public class CryptoWalletOnboardingPagerAdapter extends FragmentStateAdapter {
2019
private final List<NavigationItem> mNavigationItems = new ArrayList<>();
2120

2221
public void setNavigationItems(@NonNull final List<NavigationItem> navigationItems) {
@@ -38,29 +37,18 @@ public void replaceWithNavigationItems(
3837
mNavigationItems.addAll(navigationItems);
3938
}
4039

41-
public CryptoWalletOnboardingPagerAdapter(FragmentManager fm) {
42-
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
43-
}
44-
45-
@Override
46-
public int getItemPosition(@NonNull Object object) {
47-
return POSITION_NONE;
40+
public CryptoWalletOnboardingPagerAdapter(@NonNull final FragmentActivity fragmentActivity) {
41+
super(fragmentActivity);
4842
}
4943

5044
@NonNull
5145
@Override
52-
public Fragment getItem(int position) {
46+
public Fragment createFragment(int position) {
5347
return mNavigationItems.get(position).getFragment();
5448
}
5549

5650
@Override
57-
public int getCount() {
51+
public int getItemCount() {
5852
return mNavigationItems.size();
5953
}
60-
61-
@Nullable
62-
@Override
63-
public CharSequence getPageTitle(int position) {
64-
return mNavigationItems.get(position).getTitle();
65-
}
6654
}

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

+13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
package org.chromium.chrome.browser.crypto_wallet.fragments.onboarding;
77

8+
import androidx.annotation.NonNull;
9+
import androidx.appcompat.widget.AppCompatButton;
10+
811
import org.chromium.chrome.browser.crypto_wallet.fragments.BaseWalletNextPageFragment;
912

1013
/**
@@ -35,4 +38,14 @@ public void onResume() {
3538
mOnNextPage.showBackButton(canNavigateBack());
3639
}
3740
}
41+
42+
protected void enable(@NonNull final AppCompatButton button, final boolean enable) {
43+
if (enable) {
44+
button.setAlpha(1f);
45+
button.setEnabled(true);
46+
} else {
47+
button.setAlpha(0.5f);
48+
button.setEnabled(false);
49+
}
50+
}
3851
}

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

+41
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,58 @@
1111
import android.view.ViewGroup;
1212

1313
import androidx.annotation.NonNull;
14+
import androidx.annotation.Nullable;
15+
import androidx.lifecycle.ViewModelProvider;
16+
import androidx.lifecycle.ViewModelStoreOwner;
1417

18+
import org.chromium.brave_wallet.mojom.BraveWalletP3a;
19+
import org.chromium.brave_wallet.mojom.KeyringService;
20+
import org.chromium.brave_wallet.mojom.OnboardingAction;
1521
import org.chromium.chrome.R;
22+
import org.chromium.chrome.browser.crypto_wallet.model.OnboardingViewModel;
23+
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
1624

1725
/** Onboarding fragment for Brave Wallet which shows the spinner while wallet is created/restored */
1826
public class OnboardingCreatingWalletFragment extends BaseOnboardingWalletFragment {
27+
private OnboardingViewModel mOnboardingViewModel;
28+
1929
@Override
2030
public View onCreateView(
2131
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
2232
return inflater.inflate(R.layout.fragment_creating_wallet, container, false);
2333
}
2434

35+
@Override
36+
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
37+
super.onViewCreated(view, savedInstanceState);
38+
mOnboardingViewModel =
39+
new ViewModelProvider((ViewModelStoreOwner) requireActivity())
40+
.get(OnboardingViewModel.class);
41+
42+
KeyringService keyringService = getKeyringService();
43+
BraveWalletP3a braveWalletP3A = getBraveWalletP3A();
44+
if (keyringService != null) {
45+
mOnboardingViewModel
46+
.getPassword()
47+
.observe(
48+
getViewLifecycleOwner(),
49+
password ->
50+
keyringService.createWallet(
51+
password,
52+
recoveryPhrases -> {
53+
if (braveWalletP3A != null) {
54+
braveWalletP3A.reportOnboardingAction(
55+
OnboardingAction.RECOVERY_SETUP);
56+
}
57+
// Go to the next page after wallet creation is done
58+
Utils.setCryptoOnboarding(false);
59+
if (mOnNextPage != null) {
60+
mOnNextPage.gotoNextPage();
61+
}
62+
}));
63+
}
64+
}
65+
2566
@Override
2667
protected boolean canBeClosed() {
2768
return false;

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

+13
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class OnboardingInitWalletFragment extends BaseOnboardingWalletFragment {
3636

3737
private boolean mRestartSetupAction;
3838
private boolean mRestartRestoreAction;
39+
private boolean mButtonClicked;
3940
private AnimationDrawable mAnimationDrawable;
4041

4142
public OnboardingInitWalletFragment(boolean restartSetupAction, boolean restartRestoreAction) {
@@ -46,6 +47,7 @@ public OnboardingInitWalletFragment(boolean restartSetupAction, boolean restartR
4647
@Override
4748
public void onCreate(@Nullable Bundle savedInstanceState) {
4849
super.onCreate(savedInstanceState);
50+
mButtonClicked = false;
4951
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
5052
Api33AndPlusBackPressHelper.create(
5153
this, (FragmentActivity) requireActivity(), () -> requireActivity().finish());
@@ -72,6 +74,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
7274
CardView newWallet = view.findViewById(R.id.new_wallet_card_view);
7375
newWallet.setOnClickListener(
7476
v -> {
77+
if (mButtonClicked) {
78+
return;
79+
}
80+
mButtonClicked = true;
81+
7582
checkOnBraveActivity(true, false);
7683
if (mOnNextPage != null) {
7784
// Add a little delay for a smooth ripple effect animation.
@@ -83,6 +90,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
8390
CardView restoreWallet = view.findViewById(R.id.restore_wallet_card_view);
8491
restoreWallet.setOnClickListener(
8592
v -> {
93+
if (mButtonClicked) {
94+
return;
95+
}
96+
mButtonClicked = true;
97+
8698
checkOnBraveActivity(false, true);
8799
if (mOnNextPage != null) {
88100
// Add a little delay for a smooth ripple effect animation.
@@ -108,6 +120,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
108120
@Override
109121
public void onResume() {
110122
super.onResume();
123+
mButtonClicked = false;
111124
mAnimationDrawable.start();
112125
}
113126

0 commit comments

Comments
 (0)