Skip to content
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

Update on-ramp providers and add purchase method screen #16872

Merged
merged 36 commits into from
Feb 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
848e38c
Add required strings to android_brave_strings.grd
simoarpe Jan 23, 2023
bcec462
Implement new purchase method screen
simoarpe Jan 26, 2023
52ec63a
Apply formatting
simoarpe Jan 26, 2023
25daffa
Convert Ramp logo to a vector image
simoarpe Jan 26, 2023
62aca26
Include Transak and Sardine network
simoarpe Jan 30, 2023
7a9535f
Apply code formatting
simoarpe Jan 30, 2023
1de26c9
Switch to getBuyUrlV1
simoarpe Jan 30, 2023
f7f1301
Add reset method to OnRampModel
simoarpe Jan 31, 2023
fe37866
Address review feedback
simoarpe Jan 31, 2023
05c1485
Perform small refactoring
simoarpe Jan 31, 2023
2ed76d9
Simplify layout based on review feedback
simoarpe Feb 1, 2023
ad3bf88
Rename OnRampModel class to BuyModel
simoarpe Feb 1, 2023
dd76f6c
Extract locale check to improve UX
simoarpe Feb 1, 2023
e6210e8
Lazy load BuyModel
simoarpe Feb 1, 2023
dcc2aa0
Apply code formatting
simoarpe Feb 1, 2023
133d34a
Implement core method that accepts multiple on-ramp providers
simoarpe Feb 3, 2023
b7fe2b8
Fetch available assets and perform refactoring
simoarpe Feb 3, 2023
5a1d52c
Improve on-ramp setup
simoarpe Feb 3, 2023
024e4cf
Remove log
simoarpe Feb 3, 2023
6eda60f
Perform minor refactoring
simoarpe Feb 6, 2023
1a9bf3e
Apply code formatting
simoarpe Feb 6, 2023
60a91f7
Add missing include
simoarpe Feb 6, 2023
918745c
Revert vector to set implementation
simoarpe Feb 6, 2023
39f68ba
Remove duplicates
simoarpe Feb 6, 2023
c212874
Apply code formatting
simoarpe Feb 6, 2023
c7b6891
Update Sardine logo
simoarpe Feb 6, 2023
e3dded4
Fix duplication in search
simoarpe Feb 7, 2023
db6c9e6
Move currency code USD to WalletConstants
simoarpe Feb 7, 2023
4a45fc8
Improve code comments
simoarpe Feb 7, 2023
3261b16
Optimize string resources
simoarpe Feb 7, 2023
f0cb25a
Capitalize string
simoarpe Feb 7, 2023
099f330
Address review feedback
simoarpe Feb 8, 2023
da4de49
Address review feedback
simoarpe Feb 10, 2023
cfebf2e
Improve C++ test for GetProvidersBuyTokens
simoarpe Feb 10, 2023
83ae78f
Shrink test
simoarpe Feb 10, 2023
9de5f77
Small improvements
simoarpe Feb 10, 2023
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
5 changes: 5 additions & 0 deletions android/brave_java_resources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ brave_java_resources = [
"java/res/drawable-night-xhdpi/ic_cookie_background.png",
"java/res/drawable-night-xxhdpi/ic_cookie_background.png",
"java/res/drawable-night-xxxhdpi/ic_cookie_background.png",
"java/res/drawable-night/sardine_logo.xml",
"java/res/drawable-nodpi/dylan_malval_sea_min.webp",
"java/res/drawable-nodpi/eth.png",
"java/res/drawable-nodpi/fee_icon.png",
Expand Down Expand Up @@ -692,6 +693,7 @@ brave_java_resources = [
"java/res/drawable/radio_button_holo_bg.xml",
"java/res/drawable/radio_button_selected_bg.xml",
"java/res/drawable/radiobutton_background.xml",
"java/res/drawable/ramp_logo.xml",
"java/res/drawable/rating_bottomsheet_background.xml",
"java/res/drawable/rating_news_button_background.xml",
"java/res/drawable/recovery_phrase_bg.xml",
Expand Down Expand Up @@ -720,6 +722,7 @@ brave_java_resources = [
"java/res/drawable/rounded_top_corners.xml",
"java/res/drawable/rounded_wallet_edittext.xml",
"java/res/drawable/rounded_white_holo_bg.xml",
"java/res/drawable/sardine_logo.xml",
"java/res/drawable/selected_dot.xml",
"java/res/drawable/selected_indicator.xml",
"java/res/drawable/set_default_rounded_button_disabled.xml",
Expand All @@ -731,6 +734,7 @@ brave_java_resources = [
"java/res/drawable/tab_selector.xml",
"java/res/drawable/tip_amount.xml",
"java/res/drawable/toggle_text_color_selector.xml",
"java/res/drawable/transak_logo.xml",
"java/res/drawable/transparent_bg_bordered.xml",
"java/res/drawable/twitter_button_background.xml",
"java/res/drawable/unverified_48_rounded_bg.xml",
Expand Down Expand Up @@ -769,6 +773,7 @@ brave_java_resources = [
"java/res/layout/activity_network_selector.xml",
"java/res/layout/activity_nft_detail.xml",
"java/res/layout/activity_onboarding.xml",
"java/res/layout/activity_select_purchase_method.xml",
"java/res/layout/activity_split_tunnel.xml",
"java/res/layout/activity_welcome_onboarding.xml",
"java/res/layout/application_item_layout.xml",
Expand Down
2 changes: 2 additions & 0 deletions android/brave_java_sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/app/BraveActivity.java",
"../../brave/android/java/org/chromium/chrome/browser/app/appmenu/AppMenuIconRowFooter.java",
"../../brave/android/java/org/chromium/chrome/browser/app/appmenu/BraveAppMenuPropertiesDelegateImpl.java",
"../../brave/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java",
"../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java",
"../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedActions.java",
"../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedData.java",
Expand Down Expand Up @@ -92,6 +93,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NetworkSelectorActivity.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSpinnerAdapter.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/ApproveTxFragmentPageAdapter.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CreateAccountAdapter.java",
Expand Down
5 changes: 5 additions & 0 deletions android/java/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity"/>

<activity android:name="org.chromium.chrome.browser.crypto_wallet.activities.SelectPurchaseMethodActivity"
android:theme="@style/Theme.Chromium.Activity"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity"/>

<activity android:name="org.chromium.chrome.browser.crypto_wallet.activities.AccountSelectorActivity"
android:theme="@style/Theme.Chromium.Activity"
android:screenOrientation="sensorPortrait"
Expand Down
86 changes: 86 additions & 0 deletions android/java/org/chromium/chrome/browser/app/domain/BuyModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */

package org.chromium.chrome.browser.app.domain;

import android.content.res.Resources;
import android.text.TextUtils;

import androidx.core.os.ConfigurationCompat;

import org.chromium.brave_wallet.mojom.AssetRatioService;
import org.chromium.brave_wallet.mojom.BlockchainRegistry;
import org.chromium.brave_wallet.mojom.NetworkInfo;
import org.chromium.brave_wallet.mojom.OnRampProvider;
import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils;
import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils;
import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils;
import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants;
import org.chromium.mojo.bindings.Callbacks.Callback1;

import java.util.Locale;

public class BuyModel {
public static final int[] SUPPORTED_RAMP_PROVIDERS = {
OnRampProvider.RAMP, OnRampProvider.SARDINE, OnRampProvider.TRANSAK};

private final Object mLock = new Object();
private AssetRatioService mAssetRatioService;
private BlockchainRegistry mBlockchainRegistry;

public BuyModel(AssetRatioService assetRatioService, BlockchainRegistry blockchainRegistry) {
mAssetRatioService = assetRatioService;
mBlockchainRegistry = blockchainRegistry;
}

public boolean isAvailable(int onRampProvider, Resources resources) {
if (onRampProvider == OnRampProvider.SARDINE) {
// Sardine services are available only for US locales.
Locale currentLocale =
ConfigurationCompat.getLocales(resources.getConfiguration()).get(0);
return (currentLocale != null && currentLocale.getCountry().equals("US"));
}
return true;
}

public void getBuyUrl(int onRampProvider, String chainId, String from, String symbol,
String amount, String contractAddress, OnRampCallback callback) {
if (onRampProvider == OnRampProvider.RAMP) {
// Ramp.Network is a special case that requires a modified asset symbol.
symbol = AssetUtils.mapToRampNetworkSymbol(chainId, symbol, contractAddress);
}
mAssetRatioService.getBuyUrlV1(onRampProvider, chainId, from, symbol, amount,
WalletConstants.CURRENCY_CODE_USD, (url, error) -> {
if (error != null && !error.isEmpty()) {
callback.OnUrlReady(null);
return;
}
callback.OnUrlReady(url);
});
}

public void isBuySupported(NetworkInfo selectedNetwork, String assetSymbol,
String contractAddress, String chainId, int[] rampProviders,
Callback1<Boolean> callback) {
TokenUtils.getBuyTokensFiltered(mBlockchainRegistry, selectedNetwork,
TokenUtils.TokenType.ALL, rampProviders, tokens -> {
callback.call(JavaUtils.includes(tokens,
iToken
-> AssetUtils.Filters.isSameToken(
iToken, assetSymbol, contractAddress, chainId)));
});
}

void resetServices(AssetRatioService assetRatioService, BlockchainRegistry blockchainRegistry) {
synchronized (mLock) {
mAssetRatioService = assetRatioService;
mBlockchainRegistry = blockchainRegistry;
}
}

public interface OnRampCallback {
void OnUrlReady(String url);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public class CryptoModel {

private NetworkModel mNetworkModel;
private PortfolioModel mPortfolioModel;
private BuyModel mBuyModel;
// Todo: create method to create and return new models for Asset, Account,
// TransactionConfirmation, SwapModel, AssetModel, SendModel

Expand Down Expand Up @@ -134,6 +135,9 @@ public void resetServices(Context context, TxService mTxService, KeyringService
mPortfolioModel.resetServices(context, mTxService, mKeyringService, mBlockchainRegistry,
mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService,
mAssetRatioService);
if (mBuyModel != null) {
mBuyModel.resetServices(mAssetRatioService, mBlockchainRegistry);
}
}
init();
}
Expand Down Expand Up @@ -273,6 +277,13 @@ public NetworkModel getNetworkModel() {
return mNetworkModel;
}

public BuyModel getBuyModel() {
if (mBuyModel == null) {
mBuyModel = new BuyModel(mAssetRatioService, mBlockchainRegistry);
}
return mBuyModel;
}

public PortfolioModel getPortfolioModel() {
return mPortfolioModel;
}
Expand Down Expand Up @@ -324,21 +335,10 @@ public void setAccountInfosFromKeyRingModel(
mNetworkModel.setAccountInfosFromKeyRingModel(accountInfosFromKeyRingModel);
}

// TODO: Move to BuyModel class
public void isBuySupported(NetworkInfo selectedNetwork, String assetSymbol,
String contractAddress, String chainId, Callback1<Boolean> callback) {
TokenUtils.getBuyTokensFiltered(
mBlockchainRegistry, selectedNetwork, TokenUtils.TokenType.ALL, tokens -> {
callback.call(JavaUtils.includes(tokens,
iToken
-> AssetUtils.Filters.isSameToken(
iToken, assetSymbol, contractAddress, chainId)));
});
}

// Clear buy send swap model
public void clearBSS() {
mSendModel = null;
mBuyModel = null;
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.chromium.brave_wallet.mojom.TransactionInfo;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.app.domain.BuyModel;
import org.chromium.chrome.browser.app.domain.WalletModel;
import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory;
import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter;
Expand Down Expand Up @@ -506,8 +507,9 @@ private void showHideBuyUi() {

LiveDataUtil.observeOnce(mWalletModel.getCryptoModel().getNetworkModel().mDefaultNetwork,
selectedNetwork -> {
mWalletModel.getCryptoModel().isBuySupported(selectedNetwork, mAssetSymbol,
mContractAddress, mChainId, isBuyEnabled -> {
mWalletModel.getCryptoModel().getBuyModel().isBuySupported(selectedNetwork,
mAssetSymbol, mContractAddress, mChainId,
BuyModel.SUPPORTED_RAMP_PROVIDERS, isBuyEnabled -> {
if (isBuyEnabled) {
AndroidUtils.show(mBtnBuy);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -971,18 +971,11 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
});
}
} else if (mActivityType == ActivityType.BUY) {
assert mBlockchainRegistry != null;
String symbol = AssetUtils.mapToRampNetworkSymbol(mCurrentBlockchainToken);
mBlockchainRegistry.getBuyUrl(OnRampProvider.RAMP, mCurrentBlockchainToken.chainId,
from, symbol, amount, (url, error) -> {
if (error != null && !error.isEmpty() && Utils.isDebuggable(this)) {
Log.e(TAG, "Could not get buy URL: " + error);
return;
}
Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent(this,
mCurrentBlockchainToken.chainId, from, mCurrentBlockchainToken.symbol,
mCurrentBlockchainToken.contractAddress, amount);
startActivity(selectPurchaseMethodIntent);

TabUtils.openUrlInNewTab(false, url);
TabUtils.bringChromeTabbedActivityToTheTop(this);
});
} else if (mActivityType == ActivityType.SWAP) {
if (mCurrentBlockchainToken != null) {
String btnText = mBtnBuySendSwap.getText().toString();
Expand Down
Loading