From 42bdcfefb5bae6546f85e25ed8f05bbf483d875a Mon Sep 17 00:00:00 2001 From: Serg Date: Fri, 27 Aug 2021 09:46:42 -0400 Subject: [PATCH] Adds list for buy/send on Android --- .../activities/BraveWalletActivity.java | 1 + .../activities/BuySendSwapActivity.java | 49 ++++++++- .../adapters/WalletCoinAdapter.java | 62 +++++++---- ...isibleAssetsBottomSheetDialogFragment.java | 104 +++++++++++------- .../fragments/PortfolioFragment.java | 3 +- .../browser/brave_wallet_constants.h | 29 +++++ .../browser/erc_token_registry.cc | 12 ++ .../brave_wallet/browser/erc_token_registry.h | 2 +- .../brave_wallet/common/brave_wallet.mojom | 1 + 9 files changed, 200 insertions(+), 63 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java index 322ac90ea38..0dfc3f1087d 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java @@ -137,6 +137,7 @@ public class BraveWalletActivity @Override public void onConnectionError(MojoException e) { mKeyringController = null; + mErcTokenRegistry = null; InitKeyringController(); InitErcTokenRegistry(); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java index 36905d2cc8f..4ce5a876365 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java @@ -18,13 +18,20 @@ import android.widget.TextView; import androidx.appcompat.widget.Toolbar; +import org.chromium.brave_wallet.mojom.ErcTokenRegistry; import org.chromium.chrome.R; +import org.chromium.chrome.browser.crypto_wallet.ERCTokenRegistryFactory; +import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; +import org.chromium.chrome.browser.crypto_wallet.fragments.EditVisibleAssetsBottomSheetDialogFragment; import org.chromium.chrome.browser.init.AsyncInitializationActivity; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.system.MojoException; import java.util.HashMap; import java.util.Map; -public class BuySendSwapActivity extends AsyncInitializationActivity { +public class BuySendSwapActivity + extends AsyncInitializationActivity implements ConnectionErrorHandler { public enum ActivityType { BUY(0), SEND(1), @@ -52,6 +59,7 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { } } + private ErcTokenRegistry mErcTokenRegistry; private ActivityType mActivityType; @Override @@ -105,6 +113,7 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { onInitialLayoutInflationComplete(); adjustControls(); + InitErcTokenRegistry(); } private void adjustControls() { @@ -117,6 +126,7 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { Button btnBuySendSwap = findViewById(R.id.btn_buy_send_swap); TextView currencySign = findViewById(R.id.currency_sign); TextView toEstimateText = findViewById(R.id.to_estimate_text); + TextView assetDropDown = findViewById(R.id.from_asset_text); if (mActivityType == ActivityType.BUY) { TextView fromBuyText = findViewById(R.id.from_buy_text); fromBuyText.setText(getText(R.string.buy_wallet)); @@ -130,6 +140,13 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { btnBuySendSwap.setText(getText(R.string.buy_wallet)); RadioGroup radioPerPercent = findViewById(R.id.per_percent_radiogroup); radioPerPercent.setVisibility(View.GONE); + assetDropDown.setOnClickListener(v -> { + EditVisibleAssetsBottomSheetDialogFragment bottomSheetDialogFragment = + EditVisibleAssetsBottomSheetDialogFragment.newInstance( + WalletCoinAdapter.AdapterType.BUY_ASSETS_LIST); + bottomSheetDialogFragment.show(getSupportFragmentManager(), + EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); + }); } else if (mActivityType == ActivityType.SEND) { currencySign.setVisibility(View.GONE); toEstimateText.setText(getText(R.string.to_address)); @@ -141,6 +158,13 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { btnBuySendSwap.setText(getText(R.string.send)); LinearLayout toBalanceSection = findViewById(R.id.to_balance_section); toBalanceSection.setVisibility(View.GONE); + assetDropDown.setOnClickListener(v -> { + EditVisibleAssetsBottomSheetDialogFragment bottomSheetDialogFragment = + EditVisibleAssetsBottomSheetDialogFragment.newInstance( + WalletCoinAdapter.AdapterType.SEND_ASSETS_LIST); + bottomSheetDialogFragment.show(getSupportFragmentManager(), + EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); + }); } else if (mActivityType == ActivityType.SWAP) { currencySign.setVisibility(View.GONE); toValueText.setText(""); @@ -180,6 +204,29 @@ public class BuySendSwapActivity extends AsyncInitializationActivity { } } + public void updateBuySendAsset(String asset) { + TextView assetDropDown = findViewById(R.id.from_asset_text); + assetDropDown.setText(asset); + } + + public ErcTokenRegistry getErcTokenRegistry() { + return mErcTokenRegistry; + } + + @Override + public void onConnectionError(MojoException e) { + mErcTokenRegistry = null; + InitErcTokenRegistry(); + } + + private void InitErcTokenRegistry() { + if (mErcTokenRegistry != null) { + return; + } + + mErcTokenRegistry = ERCTokenRegistryFactory.getInstance().getERCTokenRegistry(this); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java index f398fb71d7c..ef8fa29cc13 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java @@ -13,6 +13,7 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -31,7 +32,9 @@ public class WalletCoinAdapter extends RecyclerView.Adapter walletListItemModelList) { this.walletListItemModelList = walletListItemModelList; - if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST) { + if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST || mType == AdapterType.BUY_ASSETS_LIST + || mType == AdapterType.SEND_ASSETS_LIST) { walletListItemModelListCopy.addAll(walletListItemModelList); mCheckedPositions.clear(); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java index 938d1cb6379..b3ad1bc3419 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java @@ -36,6 +36,7 @@ import org.chromium.brave_wallet.mojom.ErcToken; import org.chromium.brave_wallet.mojom.ErcTokenRegistry; import org.chromium.chrome.R; import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; +import org.chromium.chrome.browser.crypto_wallet.activities.BuySendSwapActivity; import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; import org.chromium.chrome.browser.crypto_wallet.listeners.OnWalletListItemClick; import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel; @@ -49,15 +50,23 @@ public class EditVisibleAssetsBottomSheetDialogFragment public static final String TAG_FRAGMENT = EditVisibleAssetsBottomSheetDialogFragment.class.getName(); private WalletCoinAdapter walletCoinAdapter; + private WalletCoinAdapter.AdapterType mType; - public static EditVisibleAssetsBottomSheetDialogFragment newInstance() { - return new EditVisibleAssetsBottomSheetDialogFragment(); + public static EditVisibleAssetsBottomSheetDialogFragment newInstance( + WalletCoinAdapter.AdapterType type) { + return new EditVisibleAssetsBottomSheetDialogFragment(type); + } + + private EditVisibleAssetsBottomSheetDialogFragment(WalletCoinAdapter.AdapterType type) { + mType = type; } private ErcTokenRegistry getErcTokenRegistry() { Activity activity = getActivity(); if (activity instanceof BraveWalletActivity) { return ((BraveWalletActivity) activity).getErcTokenRegistry(); + } else if (activity instanceof BuySendSwapActivity) { + return ((BuySendSwapActivity) activity).getErcTokenRegistry(); } return null; @@ -126,51 +135,34 @@ public class EditVisibleAssetsBottomSheetDialogFragment ViewParent parent = view.getParent(); ((View) parent).getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; Button saveAssets = view.findViewById(R.id.saveAssets); - saveAssets.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View clickView) { - if (walletCoinAdapter != null) { - // TODO(sergz): Save selected assets walletCoinAdapter.getCheckedAssets() + if (mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST) { + saveAssets.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View clickView) { + if (walletCoinAdapter != null) { + // TODO(sergz): Save selected assets walletCoinAdapter.getCheckedAssets() + } + dismiss(); } - dismiss(); - } - }); + }); + } else { + saveAssets.setVisibility(View.GONE); + } ErcTokenRegistry ercTokenRegistry = getErcTokenRegistry(); if (ercTokenRegistry != null) { - ercTokenRegistry.getAllTokens(tokens -> { - setUpAssetsList(view, tokens); - SearchView searchView = (SearchView) view.findViewById(R.id.searchView); - searchView.setQueryHint(getText(R.string.search_tokens)); - searchView.setIconified(false); - searchView.clearFocus(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - if (walletCoinAdapter != null) { - walletCoinAdapter.filter(query); - } - - return true; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (walletCoinAdapter != null) { - walletCoinAdapter.filter(newText); - } - - return true; - } - }); - }); + if (mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST + || mType == WalletCoinAdapter.AdapterType.SEND_ASSETS_LIST) { + ercTokenRegistry.getAllTokens(tokens -> { setUpAssetsList(view, tokens); }); + } else if (mType == WalletCoinAdapter.AdapterType.BUY_ASSETS_LIST) { + ercTokenRegistry.getBuyTokens(tokens -> { setUpAssetsList(view, tokens); }); + } } } private void setUpAssetsList(View view, ErcToken[] tokens) { RecyclerView rvAssets = view.findViewById(R.id.rvAssets); - walletCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST); + walletCoinAdapter = new WalletCoinAdapter(mType); List walletListItemModelList = new ArrayList<>(); for (int i = 0; i < tokens.length; i++) { walletListItemModelList.add(new WalletListItemModel( @@ -181,6 +173,29 @@ public class EditVisibleAssetsBottomSheetDialogFragment walletCoinAdapter.setWalletListItemType(Utils.ASSET_ITEM); rvAssets.setAdapter(walletCoinAdapter); rvAssets.setLayoutManager(new LinearLayoutManager(getActivity())); + SearchView searchView = (SearchView) view.findViewById(R.id.searchView); + searchView.setQueryHint(getText(R.string.search_tokens)); + searchView.setIconified(false); + searchView.clearFocus(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + if (walletCoinAdapter != null) { + walletCoinAdapter.filter(query); + } + + return true; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (walletCoinAdapter != null) { + walletCoinAdapter.filter(newText); + } + + return true; + } + }); } @Override @@ -189,5 +204,16 @@ public class EditVisibleAssetsBottomSheetDialogFragment } @Override - public void onAssetClick() {} + public void onAssetClick() { + if (mType == WalletCoinAdapter.AdapterType.SEND_ASSETS_LIST + || mType == WalletCoinAdapter.AdapterType.BUY_ASSETS_LIST) { + List checkedAssets = walletCoinAdapter.getCheckedAssets(); + Activity activity = getActivity(); + if (activity instanceof BuySendSwapActivity && checkedAssets.size() > 0) { + ((BuySendSwapActivity) activity) + .updateBuySendAsset(checkedAssets.get(0).getSubTitle()); + } + } + dismiss(); + } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java index 14d38b64174..05f1dd6db57 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java @@ -81,7 +81,8 @@ public class PortfolioFragment extends Fragment implements OnWalletListItemClick Button editVisibleAssets = view.findViewById(R.id.edit_visible_assets); editVisibleAssets.setOnClickListener(v -> { EditVisibleAssetsBottomSheetDialogFragment bottomSheetDialogFragment = - EditVisibleAssetsBottomSheetDialogFragment.newInstance(); + EditVisibleAssetsBottomSheetDialogFragment.newInstance( + WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST); bottomSheetDialogFragment.show( getFragmentManager(), EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); }); diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index c72dff057c7..40fa4ecd203 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -6,6 +6,11 @@ #ifndef BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ #define BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ +#include + +#include "base/no_destructor.h" +#include "brave/components/brave_wallet/common/brave_wallet.mojom.h" + namespace brave_wallet { enum class Web3ProviderTypes { @@ -19,6 +24,30 @@ enum class Web3ProviderTypes { extern const char kAssetRatioBaseURL[]; extern const char kSwapBaseURL[]; +// List of assets from Wyre, available to buy +static base::NoDestructor> kBuyTokens( + {{"", "Basic Attention Token", true, false, "BAT", 0}, + {"", "Ethereum", false, false, "ETH", 0}, + {"", "USD Coin", true, false, "USDC", 0}, + {"", "DAI", true, false, "DAI", 0}, + {"", "AAVE", true, false, "AAVE", 0}, + {"", "Binance USD", true, false, "BUSD", 0}, + {"", "Compound", true, false, "Comp", 0}, + {"", "Curve", true, false, "CRV", 0}, + {"", "Gemini Dollar", true, false, "GUSD", 0}, + {"", "Chainlink", true, false, "LINK", 0}, + {"", "Maker", true, false, "MKR", 0}, + {"", "Paxos Standard", true, false, "PAX", 0}, + {"", "Synthetix", true, false, "SNX", 0}, + {"", "UMA", true, false, "UMA", 0}, + {"", "Uniswap", true, false, "UNI", 0}, + {"", "Stably Dollar", true, false, "USDS", 0}, + {"", "Tether", true, false, "USDT", 0}, + {"", "Wrapped Bitcoin", true, false, "WBTC", 0}, + {"", "Year.Finance", true, false, "YFI", 0}, + {"", "Palm DAI", true, false, "PDAI", 0}, + {"", "Matic USDC", true, false, "MUSDC", 0}}); + } // namespace brave_wallet #endif // BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ diff --git a/components/brave_wallet/browser/erc_token_registry.cc b/components/brave_wallet/browser/erc_token_registry.cc index 5659c9ca9ae..38719d4befc 100644 --- a/components/brave_wallet/browser/erc_token_registry.cc +++ b/components/brave_wallet/browser/erc_token_registry.cc @@ -8,6 +8,8 @@ #include #include +#include "brave/components/brave_wallet/browser/brave_wallet_constants.h" + namespace brave_wallet { ERCTokenRegistry::ERCTokenRegistry() = default; @@ -75,4 +77,14 @@ void ERCTokenRegistry::GetAllTokens(GetAllTokensCallback callback) { std::move(callback).Run(std::move(erc_tokens_copy)); } +void ERCTokenRegistry::GetBuyTokens(GetBuyTokensCallback callback) { + std::vector erc_buy_tokens; + for (auto token : *kBuyTokens) { + auto erc_token = brave_wallet::mojom::ERCToken::New(); + *erc_token = token; + erc_buy_tokens.push_back(std::move(erc_token)); + } + std::move(callback).Run(std::move(erc_buy_tokens)); +} + } // namespace brave_wallet diff --git a/components/brave_wallet/browser/erc_token_registry.h b/components/brave_wallet/browser/erc_token_registry.h index b5eae7a2e35..0757b3bf0d1 100644 --- a/components/brave_wallet/browser/erc_token_registry.h +++ b/components/brave_wallet/browser/erc_token_registry.h @@ -29,7 +29,6 @@ class ERCTokenRegistry : public mojom::ERCTokenRegistry { mojo::PendingRemote MakeRemote(); void Bind(mojo::PendingReceiver receiver); - bool ParseERCTokens(const std::string& token_list); void UpdateTokenList(std::vector erc_tokens); // ERCTokenRegistry interface methods @@ -38,6 +37,7 @@ class ERCTokenRegistry : public mojom::ERCTokenRegistry { void GetTokenBySymbol(const std::string& symbol, GetTokenBySymbolCallback callback) override; void GetAllTokens(GetAllTokensCallback callback) override; + void GetBuyTokens(GetBuyTokensCallback callback) override; protected: std::vector erc_tokens_; diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index 11bea1b2787..6106a3ef1f0 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -176,6 +176,7 @@ interface ERCTokenRegistry { GetTokenByContract(string contract) => (ERCToken? token); GetTokenBySymbol(string symbol) => (ERCToken? token); GetAllTokens() => (array tokens); + GetBuyTokens() => (array tokens); }; interface KeyringController {