Update UI based on feedback

Add native functions
This commit is contained in:
Deep
2021-06-15 14:11:02 -04:00
parent 250dd27c66
commit 1a857f4e95
23 changed files with 587 additions and 430 deletions
@@ -97,7 +97,6 @@ import org.chromium.chrome.browser.toolbar.top.BraveToolbarLayout;
import org.chromium.chrome.browser.util.BraveDbUtil;
import org.chromium.chrome.browser.util.BraveReferrer;
import org.chromium.chrome.browser.util.PackageUtils;
// import org.chromium.chrome.browser.crypto_wallet.BraveWalletNativeWorker;
import org.chromium.chrome.browser.widget.crypto.binance.BinanceAccountBalance;
import org.chromium.chrome.browser.widget.crypto.binance.BinanceWidgetManager;
import org.chromium.components.bookmarks.BookmarkId;
@@ -413,7 +412,6 @@ public abstract class BraveActivity<C extends ChromeActivityComponent>
calender.getTimeInMillis());
}
checkSetDefaultBrowserModal();
// BraveWalletNativeWorker.getInstance().createWallet("qwerty");
}
private void openBraveWallet() {
@@ -8,6 +8,7 @@ package org.chromium.chrome.browser.crypto_wallet;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.Log;
@JNINamespace("chrome::android")
public class BraveWalletNativeWorker {
@@ -19,7 +20,7 @@ public class BraveWalletNativeWorker {
synchronized (lock) {
if (instance == null) {
instance = new BraveWalletNativeWorker();
instance.Init();
instance.init();
}
}
return instance;
@@ -27,7 +28,7 @@ public class BraveWalletNativeWorker {
private BraveWalletNativeWorker() {}
private void Init() {
private void init() {
if (mNativeBraveWalletNativeWorker == 0) {
BraveWalletNativeWorkerJni.get().init(this);
}
@@ -35,10 +36,10 @@ public class BraveWalletNativeWorker {
@Override
protected void finalize() {
Destroy();
destroy();
}
private void Destroy() {
private void destroy() {
if (mNativeBraveWalletNativeWorker != 0) {
BraveWalletNativeWorkerJni.get().destroy(mNativeBraveWalletNativeWorker, this);
mNativeBraveWalletNativeWorker = 0;
@@ -51,16 +52,21 @@ public class BraveWalletNativeWorker {
mNativeBraveWalletNativeWorker = nativePtr;
}
public String CreateWallet(String password) {
public String createWallet(String password) {
return BraveWalletNativeWorkerJni.get().createWallet(
mNativeBraveWalletNativeWorker, password);
}
public void LockWallet() {
public boolean isWalletLocked() {
Log.e("NTP", "isWalletLocked : "+BraveWalletNativeWorkerJni.get().isWalletLocked(mNativeBraveWalletNativeWorker));
return BraveWalletNativeWorkerJni.get().isWalletLocked(mNativeBraveWalletNativeWorker);
}
public void lockWallet() {
BraveWalletNativeWorkerJni.get().lockWallet(mNativeBraveWalletNativeWorker);
}
public boolean UnlockWallet(String password) {
public boolean unlockWallet(String password) {
return BraveWalletNativeWorkerJni.get().unlockWallet(
mNativeBraveWalletNativeWorker, password);
}
@@ -70,6 +76,7 @@ public class BraveWalletNativeWorker {
void init(BraveWalletNativeWorker caller);
void destroy(long nativeBraveWalletNativeWorker, BraveWalletNativeWorker caller);
String createWallet(long nativeBraveWalletNativeWorker, String password);
boolean isWalletLocked(long nativeBraveWalletNativeWorker);
void lockWallet(long nativeBraveWalletNativeWorker);
boolean unlockWallet(long nativeBraveWalletNativeWorker, String password);
}
@@ -29,6 +29,8 @@ import org.chromium.chrome.browser.crypto_wallet.fragments.RewardsFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.SwapBottomSheetDialogFragment;
import org.chromium.chrome.browser.crypto_wallet.listeners.OnFinishOnboarding;
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
import org.chromium.chrome.browser.crypto_wallet.BraveWalletNativeWorker;
import org.chromium.base.Log;
import java.util.ArrayList;
import java.util.List;
@@ -107,6 +109,18 @@ public class CryptoWalletActivity extends AppCompatActivity {
setNavigationFragments();
}
@Override
protected void onPause() {
super.onPause();
BraveWalletNativeWorker.getInstance().lockWallet();
}
@Override
protected void onResume() {
super.onResume();
Log.e("NTP", "OnResume");
}
private void setNavigationFragments() {
List<NavigationItem> navigationItems = new ArrayList<>();
int navigationMenu;
@@ -43,7 +43,7 @@ public class RecoveryPhraseAdapter extends RecyclerView.Adapter<RecoveryPhraseAd
holder.recoveryPhraseText.setText(
String.format(holder.recoveryPhraseText.getContext().getResources().getString(
R.string.recovery_phrase_item_text),
(recoveryPhrasePosition + 1), recoveryPhrase));
(position + 1), recoveryPhrase));
if (onRecoveryPhraseSelected != null) {
holder.itemView.setOnClickListener(v -> {
selectedRecoveryPhraseMap.put(position, recoveryPhrase);
@@ -36,6 +36,7 @@ import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding_fragments.
import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding_fragments.VerifyRecoveryPhraseFragment;
import org.chromium.chrome.browser.crypto_wallet.listeners.OnFinishOnboarding;
import org.chromium.chrome.browser.crypto_wallet.listeners.OnNextPage;
import org.chromium.chrome.browser.crypto_wallet.BraveWalletNativeWorker;
import org.chromium.chrome.browser.crypto_wallet.util.NavigationItem;
import java.util.ArrayList;
@@ -88,15 +89,39 @@ public class CryptoFragment extends Fragment {
cryptoWalletOnboardingViewPager.setOffscreenPageLimit(
cryptoWalletOnboardingPagerAdapter.getCount() - 1);
setNavigationFragments(ONBOARDING_ACTION);
ImageView onboardingBackButton = view.findViewById(R.id.onboarding_back_button);
onboardingBackButton.setVisibility(View.GONE);
onboardingBackButton.setOnClickListener(v -> {
if (cryptoWalletOnboardingViewPager != null) {
cryptoWalletOnboardingViewPager.setCurrentItem(
cryptoWalletOnboardingViewPager.getCurrentItem() - 1);
cryptoWalletOnboardingViewPager.setCurrentItem(cryptoWalletOnboardingViewPager.getCurrentItem() - 1);
}
});
cryptoWalletOnboardingViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == 0 || position == 2) {
onboardingBackButton.setVisibility(View.GONE);
} else {
onboardingBackButton.setVisibility(View.VISIBLE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
// if (BraveWalletNativeWorker.getInstance().isWalletLocked()) {
// setNavigationFragments(UNLOCK_WALLET_ACTION);
// } else {
setNavigationFragments(ONBOARDING_ACTION);
// }
}
}
@@ -25,11 +25,17 @@ import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RecoveryPhraseFragment extends CryptoOnboardingFragment {
private List<String> recoveryPhrases;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recoveryPhrases = new ArrayList<String>(Arrays.asList(Utils.recoveryPhrase.split(" ")));
}
@Override
@@ -74,21 +80,13 @@ public class RecoveryPhraseFragment extends CryptoOnboardingFragment {
recyclerView.setLayoutManager(layoutManager);
RecoveryPhraseAdapter recoveryPhraseAdapter = new RecoveryPhraseAdapter();
recoveryPhraseAdapter.setRecoveryPhraseMap(getRecoveryPhraseMap());
recoveryPhraseAdapter.setRecoveryPhraseMap(Utils.getRecoveryPhraseMap(recoveryPhrases));
recyclerView.setAdapter(recoveryPhraseAdapter);
}
private Map<Integer, String> getRecoveryPhraseMap() {
Map<Integer, String> recoveryPhraseMap = new HashMap<>();
for (int i = 0; i < Utils.recoveryPhrases.size(); i++) {
recoveryPhraseMap.put(i, Utils.recoveryPhrases.get(i));
}
return recoveryPhraseMap;
}
private String getRecoveryPhraseToCopy() {
String recoveryPhrasesText = "";
for (String phrase : Utils.recoveryPhrases) {
for (String phrase : recoveryPhrases) {
recoveryPhrasesText = recoveryPhrasesText.concat(phrase).concat(" ");
}
return recoveryPhrasesText.trim();
@@ -56,14 +56,13 @@ public class RestoreWalletFragment extends CryptoOnboardingFragment {
Button secureCryptoButton = view.findViewById(R.id.btn_restore_wallet);
secureCryptoButton.setOnClickListener(v -> {
if (TextUtils.isEmpty(passwordEdittext.getText())
|| passwordEdittext.getText().toString().length() < 7) {
passwordEdittext.setError(getResources().getString(R.string.password_error));
} else if (TextUtils.isEmpty(retypePasswordEdittext.getText())
|| !passwordEdittext.getText().toString().equals(
retypePasswordEdittext.getText().toString())) {
retypePasswordEdittext.setError(
getResources().getString(R.string.retype_password_error));
String passwordInput = passwordEdittext.getText().toString().trim();
String retypePasswordInput = retypePasswordEdittext.getText().toString().trim();
if (passwordInput.isEmpty() || !Utils.PASSWORD_PATTERN.matcher(passwordInput).matches()) {
passwordEdittext.setError(getResources().getString(R.string.password_text));
} else if (retypePasswordInput.isEmpty() || !passwordInput.equals(retypePasswordInput)) {
retypePasswordEdittext.setError(getResources().getString(R.string.retype_password_error));
} else {
// Restore button
}
@@ -24,9 +24,14 @@ import androidx.core.content.ContextCompat;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import org.chromium.chrome.browser.crypto_wallet.BraveWalletNativeWorker;
import java.util.concurrent.Executor;
public class SecurePasswordFragment extends CryptoOnboardingFragment {
private EditText passwordEdittext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -35,30 +40,29 @@ public class SecurePasswordFragment extends CryptoOnboardingFragment {
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_secure_password, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
EditText passwordEdittext = view.findViewById(R.id.secure_crypto_password);
passwordEdittext = view.findViewById(R.id.secure_crypto_password);
EditText retypePasswordEdittext = view.findViewById(R.id.secure_crypto_retype_password);
Button secureCryptoButton = view.findViewById(R.id.btn_secure_crypto_continue);
secureCryptoButton.setOnClickListener(v -> {
if (TextUtils.isEmpty(passwordEdittext.getText())
|| passwordEdittext.getText().toString().length() < 7) {
passwordEdittext.setError(getResources().getString(R.string.password_error));
} else if (TextUtils.isEmpty(retypePasswordEdittext.getText())
|| !passwordEdittext.getText().toString().equals(
retypePasswordEdittext.getText().toString())) {
retypePasswordEdittext.setError(
getResources().getString(R.string.retype_password_error));
String passwordInput = passwordEdittext.getText().toString().trim();
String retypePasswordInput = retypePasswordEdittext.getText().toString().trim();
if (passwordInput.isEmpty() || !Utils.PASSWORD_PATTERN.matcher(passwordInput).matches()) {
passwordEdittext.setError(getResources().getString(R.string.password_text));
} else if (retypePasswordInput.isEmpty() || !passwordInput.equals(retypePasswordInput)) {
retypePasswordEdittext.setError(getResources().getString(R.string.retype_password_error));
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
showFingerprintDialog(authenticationCallback);
} else {
Utils.recoveryPhrase = BraveWalletNativeWorker.getInstance().createWallet(passwordInput).trim();
onNextPage.gotoNextPage(false);
}
}
@@ -89,6 +93,7 @@ public class SecurePasswordFragment extends CryptoOnboardingFragment {
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
// Go to next Page
Utils.recoveryPhrase = BraveWalletNativeWorker.getInstance().createWallet(passwordEdittext.getText().toString().trim()).trim();
onNextPage.gotoNextPage(false);
}
@@ -19,6 +19,8 @@ import androidx.annotation.Nullable;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.BraveWalletNativeWorker;
public class UnlockWalletFragment extends CryptoOnboardingFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -40,8 +42,14 @@ public class UnlockWalletFragment extends CryptoOnboardingFragment {
unlockButton.setOnClickListener(v -> {
if (TextUtils.isEmpty(unlockWalletPassword.getText())) {
unlockWalletPassword.setError(getString(R.string.password_error));
return;
}
if (BraveWalletNativeWorker.getInstance().unlockWallet(unlockWalletPassword.getText().toString())) {
onNextPage.gotoNextPage(true);
} else {
unlockWalletPassword.setError(getString(R.string.password_error));
}
onNextPage.gotoNextPage(true);
});
TextView unlockWalletRestoreButton = view.findViewById(R.id.btn_unlock_wallet_restore);
@@ -24,12 +24,17 @@ import org.chromium.chrome.browser.crypto_wallet.fragments.AddAccountOnboardingD
import org.chromium.chrome.browser.crypto_wallet.util.ItemOffsetDecoration;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class VerifyRecoveryPhraseFragment extends CryptoOnboardingFragment {
private RecoveryPhraseAdapter recoveryPhraseAdapter;
private RecyclerView phraseRecyclerView;
private RecyclerView selectedPhraseRecyclerView;
private RecoveryPhraseAdapter selectedRecoveryPhraseAdapter;
private Button recoveryPhraseButton;
private List<String> recoveryPhrases;
public interface OnRecoveryPhraseSelected {
void onSelectedRecoveryPhrase();
@@ -38,6 +43,7 @@ public class VerifyRecoveryPhraseFragment extends CryptoOnboardingFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recoveryPhrases = new ArrayList<String>(Arrays.asList(Utils.recoveryPhrase.split(" ")));
}
@Override
@@ -71,7 +77,7 @@ public class VerifyRecoveryPhraseFragment extends CryptoOnboardingFragment {
phraseRecyclerView.setLayoutManager(layoutManager);
recoveryPhraseAdapter = new RecoveryPhraseAdapter();
recoveryPhraseAdapter.setRecoveryPhraseMap(Utils.getRecoveryPhraseMap());
recoveryPhraseAdapter.setRecoveryPhraseMap(Utils.getRecoveryPhraseMap(recoveryPhrases));
recoveryPhraseAdapter.setOnRecoveryPhraseSelectedListener(onRecoveryPhraseSelected);
phraseRecyclerView.setAdapter(recoveryPhraseAdapter);
}
@@ -117,7 +123,7 @@ public class VerifyRecoveryPhraseFragment extends CryptoOnboardingFragment {
if (recoveryPhraseAdapter != null
&& recoveryPhraseAdapter.getSelectedRecoveryPhraseMap().size()
== Utils.recoveryPhrases.size()) {
== recoveryPhrases.size()) {
recoveryPhraseButton.setAlpha(1f);
recoveryPhraseButton.setEnabled(true);
}
@@ -16,17 +16,29 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class Utils {
public static final List<String> recoveryPhrases =
new ArrayList<>(Arrays.asList("Tomato", "Green", "Velvet", "Span", "Celery", "Atoms",
"Parent", "Stop", "Bowl", "Wishful", "Stone", "Exercise"));
public static final Pattern PASSWORD_PATTERN =
Pattern.compile("^" +
"(?=.*[0-9])" + //at least 1 digit
"(?=.*[a-zA-Z])" + //any letter
"(?=.*[$&+,:;=?@#|'<>.^*()%!-])" + //at least 1 special character
"(?=\\S+$)" + //no white spaces
".{7,}" + //at least 7 characters
"$");
// public static final List<String> recoveryPhrases =
// new ArrayList<>(Arrays.asList("Tomato", "Green", "Velvet", "Span", "Celery", "Atoms",
// "Parent", "Stop", "Bowl", "Wishful", "Stone", "Exercise"));
public static String recoveryPhrase = "";
public static int ONBOARDING_ACTION = 1;
public static int UNLOCK_WALLET_ACTION = 2;
public static int RESTORE_WALLET_ACTION = 3;
public static Map<Integer, String> getRecoveryPhraseMap() {
public static Map<Integer, String> getRecoveryPhraseMap(List<String> recoveryPhrases) {
Map<Integer, String> recoveryPhraseMap = new HashMap<>();
for (int i = 0; i < recoveryPhrases.size(); i++) {
recoveryPhraseMap.put(i, recoveryPhrases.get(i));