(Wallet) Improve onboarding adapter navigation logic (#22527)

This commit is contained in:
Simone Arpe
2024-03-14 19:15:05 +01:00
committed by GitHub
parent 4b7d5c19d4
commit 772c220172
5 changed files with 59 additions and 102 deletions
@@ -14,14 +14,11 @@ import android.view.WindowManager;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.view.menu.MenuBuilder;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.appbar.MaterialToolbar;
import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Log;
import org.chromium.brave_wallet.mojom.OnboardingAction;
import org.chromium.chrome.R;
@@ -29,6 +26,7 @@ import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.app.domain.NetworkModel;
import org.chromium.chrome.browser.app.domain.WalletModel;
import org.chromium.chrome.browser.crypto_wallet.adapters.CryptoWalletOnboardingPagerAdapter;
import org.chromium.chrome.browser.crypto_wallet.fragments.BaseWalletNextPageFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.UnlockWalletFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingBackupWalletFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingCreatingWalletFragment;
@@ -39,7 +37,6 @@ import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.Onboarding
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;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import org.chromium.chrome.browser.crypto_wallet.util.WalletUtils;
import org.chromium.chrome.browser.settings.BraveWalletPreferences;
@@ -151,8 +148,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
mCryptoWalletOnboardingViewPager.setUserInputEnabled(false);
mCryptoWalletOnboardingPagerAdapter = new CryptoWalletOnboardingPagerAdapter(this);
mCryptoWalletOnboardingViewPager.setAdapter(mCryptoWalletOnboardingPagerAdapter);
mCryptoWalletOnboardingViewPager.setOffscreenPageLimit(
mCryptoWalletOnboardingPagerAdapter.getItemCount() - 1);
mOnboardingCloseButton = findViewById(R.id.onboarding_close_button);
mOnboardingCloseButton.setOnClickListener(v -> finish());
@@ -184,7 +179,7 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
if (isLocked) {
setNavigationFragments(WalletAction.UNLOCK);
} else if (mBackupWallet) {
showOnboardingLayout();
showBackupSequence();
} else {
showMainLayout();
}
@@ -208,36 +203,27 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
};
}
@SuppressLint("NotifyDataSetChanged")
private void setNavigationFragments(@NonNull final WalletAction walletAction) {
List<NavigationItem> navigationItems = new ArrayList<>();
List<BaseWalletNextPageFragment> navigationFragments = new ArrayList<>();
mShowBiometricPrompt = true;
mCryptoOnboardingLayout.setVisibility(View.VISIBLE);
if (walletAction == WalletAction.ONBOARDING) {
OnboardingInitWalletFragment onboardingInitWalletFragment =
new OnboardingInitWalletFragment(mRestartSetupAction, mRestartRestoreAction);
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.setup_crypto),
onboardingInitWalletFragment));
navigationFragments.add(onboardingInitWalletFragment);
mBraveWalletP3A.reportOnboardingAction(OnboardingAction.SHOWN);
} else if (walletAction == WalletAction.UNLOCK) {
UnlockWalletFragment unlockWalletFragment = new UnlockWalletFragment();
navigationItems.add(new NavigationItem(
getResources().getString(R.string.unlock_wallet_title), unlockWalletFragment));
navigationFragments.add(unlockWalletFragment);
} else if (walletAction == WalletAction.ONBOARDING_RESTORE) {
mShowBiometricPrompt = false;
OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
OnboardingRestoreWalletFragment.newInstance();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.restore_crypto_account),
onboardingRestoreWalletFragment));
navigationFragments.add(onboardingRestoreWalletFragment);
}
if (mCryptoWalletOnboardingPagerAdapter != null) {
mCryptoWalletOnboardingPagerAdapter.setNavigationItems(navigationItems);
mCryptoWalletOnboardingPagerAdapter.notifyDataSetChanged();
mCryptoWalletOnboardingPagerAdapter.setNavigationItems(navigationFragments);
}
addRemoveSecureFlag(true);
}
@@ -247,15 +233,12 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
if (mCryptoWalletOnboardingViewPager == null) return;
if (mCryptoWalletOnboardingPagerAdapter == null) return;
final List<NavigationItem> navigationItems = new ArrayList<>();
final List<BaseWalletNextPageFragment> navigationFragments = 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));
navigationFragments.add(onboardingTermsOfUseFragment);
}
if (walletAction == WalletAction.ONBOARDING_RESTORE
@@ -264,26 +247,20 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
final OnboardingRestoreWalletFragment onboardingRestoreWalletFragment =
OnboardingRestoreWalletFragment.newInstance();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.restore_crypto_account),
onboardingRestoreWalletFragment));
addWalletCreationPage(navigationItems, R.string.your_wallet_is_restoring_page_title);
navigationFragments.add(onboardingRestoreWalletFragment);
addWalletCreationPage(navigationFragments);
} else if (walletAction == WalletAction.PASSWORD_CREATION) {
mShowBiometricPrompt = true;
final OnboardingSecurePasswordFragment onboardingSecurePasswordFragment =
new OnboardingSecurePasswordFragment();
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.secure_your_crypto),
onboardingSecurePasswordFragment));
addWalletCreationPage(navigationItems, R.string.your_wallet_is_creating_page_title);
addBackupWalletSequence(navigationItems, true);
navigationFragments.add(onboardingSecurePasswordFragment);
addWalletCreationPage(navigationFragments);
addBackupWalletSequence(navigationFragments, true);
}
mCryptoWalletOnboardingPagerAdapter.replaceWithNavigationItems(
navigationItems, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
navigationFragments, mCryptoWalletOnboardingViewPager.getCurrentItem() + 1);
mCryptoWalletOnboardingPagerAdapter.notifyDataSetChanged();
mCryptoWalletOnboardingViewPager.setCurrentItem(
@@ -313,62 +290,46 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe
}
private void addBackupWalletSequence(
@NonNull final List<NavigationItem> navigationItems, final boolean isOnboarding) {
@NonNull final List<BaseWalletNextPageFragment> navigationFragments,
final boolean isOnboarding) {
OnboardingBackupWalletFragment onboardingBackupWalletFragment =
OnboardingBackupWalletFragment.newInstance(isOnboarding);
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.backup_your_wallet),
onboardingBackupWalletFragment));
navigationFragments.add(onboardingBackupWalletFragment);
OnboardingRecoveryPhraseFragment onboardingRecoveryPhraseFragment =
OnboardingRecoveryPhraseFragment.newInstance(isOnboarding);
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.your_recovery_phrase),
onboardingRecoveryPhraseFragment));
navigationFragments.add(onboardingRecoveryPhraseFragment);
OnboardingVerifyRecoveryPhraseFragment onboardingVerifyRecoveryPhraseFragment =
OnboardingVerifyRecoveryPhraseFragment.newInstance(isOnboarding);
navigationItems.add(
new NavigationItem(
getResources().getString(R.string.verify_recovery_phrase),
onboardingVerifyRecoveryPhraseFragment));
navigationFragments.add(onboardingVerifyRecoveryPhraseFragment);
}
private void addWalletCreationPage(
@NonNull final List<NavigationItem> navigationItems, @StringRes int stringId) {
@NonNull final List<BaseWalletNextPageFragment> navigationFragments) {
OnboardingCreatingWalletFragment onboardingCreatingWalletFragment =
new OnboardingCreatingWalletFragment();
navigationItems.add(
new NavigationItem(
getResources().getString(stringId), onboardingCreatingWalletFragment));
navigationFragments.add(onboardingCreatingWalletFragment);
}
@SuppressLint("NotifyDataSetChanged")
public void showOnboardingLayout() {
public void showBackupSequence() {
addRemoveSecureFlag(true);
mCryptoOnboardingLayout.setVisibility(View.VISIBLE);
List<NavigationItem> navigationItems = new ArrayList<>();
List<BaseWalletNextPageFragment> navigationFragments = new ArrayList<>();
// We don't need addWalletCreatingPage here, as showOnboardingLayout
// is invoked only when we didn't back up wallet initially and doing
// it later from `Backup your crypto wallet` bubble.
addBackupWalletSequence(navigationItems, false);
addBackupWalletSequence(navigationFragments, false);
if (mCryptoWalletOnboardingPagerAdapter != null
&& mCryptoWalletOnboardingViewPager != null) {
mCryptoWalletOnboardingPagerAdapter.setNavigationItems(navigationItems);
mCryptoWalletOnboardingPagerAdapter.notifyDataSetChanged();
mCryptoWalletOnboardingPagerAdapter.setNavigationItems(navigationFragments);
mCryptoWalletOnboardingViewPager.setCurrentItem(0);
}
}
@Override
public boolean showBiometricPrompt() {
int state = ApplicationStatus.getStateForActivity(this);
return mShowBiometricPrompt
&& (state != ActivityState.PAUSED || state != ActivityState.STOPPED
|| state != ActivityState.DESTROYED);
return mShowBiometricPrompt;
}
@Override
@@ -5,46 +5,53 @@
package org.chromium.chrome.browser.crypto_wallet.adapters;
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
import org.chromium.chrome.browser.crypto_wallet.fragments.BaseWalletNextPageFragment;
import java.util.ArrayList;
import java.util.List;
public class CryptoWalletOnboardingPagerAdapter extends FragmentStateAdapter {
private final List<NavigationItem> mNavigationItems = new ArrayList<>();
public void setNavigationItems(@NonNull final List<NavigationItem> navigationItems) {
mNavigationItems.clear();
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);
}
@NonNull private final List<BaseWalletNextPageFragment> mNavigationItems = new ArrayList<>();
public CryptoWalletOnboardingPagerAdapter(@NonNull final FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@SuppressLint("NotifyDataSetChanged")
public void setNavigationItems(
@NonNull final List<BaseWalletNextPageFragment> navigationFragments) {
mNavigationItems.clear();
mNavigationItems.addAll(navigationFragments);
notifyDataSetChanged();
}
/**
* Replaces all navigation items starting from a given index.
*
* @param navigationFragments Navigation fragments to add.
* @param index Index pointing to the first item that will be replaced.
*/
@SuppressLint("NotifyDataSetChanged")
public void replaceWithNavigationItems(
@NonNull final List<BaseWalletNextPageFragment> navigationFragments, 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(navigationFragments);
notifyDataSetChanged();
}
@NonNull
@Override
public Fragment createFragment(int position) {
return mNavigationItems.get(position).getFragment();
return mNavigationItems.get(position);
}
@Override
@@ -42,7 +42,6 @@ public class OnboardingSecurePasswordFragment extends BaseOnboardingWalletFragme
private AppCompatButton mContinueButton;
private TextInputEditText mRetypePasswordEditText;
@SuppressLint("ClickableViewAccessibility")
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -79,8 +78,8 @@ public class OnboardingSecurePasswordFragment extends BaseOnboardingWalletFragme
}
private void proceedWithStrongPassword(@NonNull final String password) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
&& Utils.isBiometricAvailable(requireContext())) {
if (Utils.isBiometricAvailable(requireContext())) {
// noinspection NewApi
setUpBiometric(password);
} else {
goToTheNextPage(password);
@@ -7,8 +7,7 @@
android:scrollbars="vertical"
android:fadeScrollbars="false"
android:background="@color/wallet_bg"
android:fillViewport="true"
android:theme="@style/BraveWalletOnboarding">
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"