feat(wallet): implement aurora bridge button
This commit is contained in:
+59
-24
@@ -8,10 +8,10 @@ package org.chromium.chrome.browser.crypto_wallet.activities;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.view.MenuItem;
|
||||
import android.text.Spanned;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
@@ -19,25 +19,21 @@ import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import org.chromium.base.Callback;
|
||||
import org.chromium.base.Log;
|
||||
import org.chromium.brave_wallet.mojom.AccountInfo;
|
||||
import org.chromium.brave_wallet.mojom.AssetPriceTimeframe;
|
||||
import org.chromium.brave_wallet.mojom.AssetRatioService;
|
||||
import org.chromium.brave_wallet.mojom.BlockchainRegistry;
|
||||
import org.chromium.brave_wallet.mojom.BlockchainToken;
|
||||
import org.chromium.brave_wallet.mojom.BraveWalletConstants;
|
||||
import org.chromium.brave_wallet.mojom.BraveWalletService;
|
||||
import org.chromium.brave_wallet.mojom.CoinType;
|
||||
import org.chromium.brave_wallet.mojom.JsonRpcService;
|
||||
import org.chromium.brave_wallet.mojom.KeyringInfo;
|
||||
import org.chromium.brave_wallet.mojom.KeyringService;
|
||||
import org.chromium.brave_wallet.mojom.TransactionInfo;
|
||||
import org.chromium.brave_wallet.mojom.TxService;
|
||||
import org.chromium.chrome.R;
|
||||
import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory;
|
||||
import org.chromium.chrome.browser.crypto_wallet.activities.AccountDetailActivity;
|
||||
@@ -46,12 +42,16 @@ 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;
|
||||
import org.chromium.chrome.browser.crypto_wallet.observers.ApprovedTxObserver;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.AssetsPricesHelper;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.BalanceHelper;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.SmoothLineChartEquallySpaced;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants;
|
||||
import org.chromium.chrome.browser.init.AsyncInitializationActivity;
|
||||
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
|
||||
import org.chromium.chrome.browser.util.TabUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -79,6 +79,7 @@ public class AssetDetailActivity
|
||||
private WalletCoinAdapter mWalletTxCoinAdapter;
|
||||
private Button mBtnBuy;
|
||||
private Button mBtnSwap;
|
||||
private Button mBtnBridgeToAurora;
|
||||
private boolean mHasNewTx;
|
||||
private boolean mNativeInitialized;
|
||||
|
||||
@@ -138,21 +139,53 @@ public class AssetDetailActivity
|
||||
}
|
||||
});
|
||||
Button btnSend = findViewById(R.id.btn_send);
|
||||
btnSend.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Utils.openBuySendSwapActivity(AssetDetailActivity.this,
|
||||
BuySendSwapActivity.ActivityType.SEND, mAssetSymbol);
|
||||
}
|
||||
});
|
||||
btnSend.setOnClickListener(v
|
||||
-> Utils.openBuySendSwapActivity(AssetDetailActivity.this,
|
||||
BuySendSwapActivity.ActivityType.SEND, mAssetSymbol));
|
||||
|
||||
mBtnSwap = findViewById(R.id.btn_swap);
|
||||
mBtnSwap.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Utils.openBuySendSwapActivity(AssetDetailActivity.this,
|
||||
BuySendSwapActivity.ActivityType.SWAP, mAssetSymbol);
|
||||
}
|
||||
});
|
||||
|
||||
if (AssetUtils.isAuroraAddress(mContractAddress, mAssetSymbol)) {
|
||||
mBtnSwap.setVisibility(View.GONE);
|
||||
mBtnBridgeToAurora = findViewById(R.id.btn_aurora_bridge);
|
||||
mBtnBridgeToAurora.setVisibility(View.VISIBLE);
|
||||
Spanned auroraLearnMore = Utils.createSpanForSurroundedPhrase(this,
|
||||
R.string.brave_wallet_aurora_modal_description,
|
||||
(v) -> { TabUtils.openLinkWithFocus(this, WalletConstants.URL_BRIDGE_RISKS); });
|
||||
|
||||
MaterialAlertDialogBuilder auroraDialogBuilder =
|
||||
new MaterialAlertDialogBuilder(this, R.style.BraveWalletAlertDialogTheme);
|
||||
|
||||
View dialogView = getLayoutInflater().inflate(R.layout.dialog_aurora_bridge, null);
|
||||
auroraDialogBuilder.setView(dialogView);
|
||||
AlertDialog auroraDialog = auroraDialogBuilder.create();
|
||||
|
||||
TextView message = dialogView.findViewById(R.id.dialog_aurora_desc);
|
||||
Button btnOpenRainBow = dialogView.findViewById(R.id.btn_open_rainbow_app);
|
||||
|
||||
message.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
message.setText(auroraLearnMore);
|
||||
btnOpenRainBow.setOnClickListener(
|
||||
v -> { TabUtils.openLinkWithFocus(this, WalletConstants.URL_RAINBOW_AURORA); });
|
||||
|
||||
SharedPreferencesManager preferencesManager = SharedPreferencesManager.getInstance();
|
||||
|
||||
mBtnBridgeToAurora.setOnClickListener(v -> {
|
||||
if (preferencesManager.readBoolean(
|
||||
WalletConstants.PREF_SHOW_BRIDGE_INFO_DIALOG, true)) {
|
||||
auroraDialog.show();
|
||||
preferencesManager.writeBoolean(
|
||||
WalletConstants.PREF_SHOW_BRIDGE_INFO_DIALOG, false);
|
||||
} else {
|
||||
TabUtils.openLinkWithFocus(this, WalletConstants.URL_RAINBOW_AURORA);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
mBtnSwap.setOnClickListener(v
|
||||
-> Utils.openBuySendSwapActivity(AssetDetailActivity.this,
|
||||
BuySendSwapActivity.ActivityType.SWAP, mAssetSymbol));
|
||||
}
|
||||
|
||||
adjustButtonsVisibilities();
|
||||
|
||||
RadioGroup radioGroup = findViewById(R.id.asset_duration_radio_group);
|
||||
@@ -378,7 +411,9 @@ public class AssetDetailActivity
|
||||
private void adjustButtonsVisibilities() {
|
||||
if (Utils.allowBuyAndSwap(mChainId)) {
|
||||
mBtnBuy.setVisibility(View.VISIBLE);
|
||||
mBtnSwap.setVisibility(View.VISIBLE);
|
||||
if (!AssetUtils.isAuroraAddress(mContractAddress, mAssetSymbol)) {
|
||||
mBtnSwap.setVisibility(View.VISIBLE);
|
||||
}
|
||||
} else {
|
||||
mBtnBuy.setVisibility(View.GONE);
|
||||
mBtnSwap.setVisibility(View.GONE);
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.chromium.chrome.browser.crypto_wallet.util;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
public class AssetUtils {
|
||||
public static String ASSET_SYMBOL_ETH = "ETH";
|
||||
|
||||
public static String AURORA_SUPPORTED_CONTRACT_ADDRESSES[] = {
|
||||
"0x4e834cdcc911605227eedddb89fad336ab9dc00a", // AAVE
|
||||
"0x8bec47865ade3b172a928df8f990bc7f2a3b9f79", // AURORA
|
||||
"0xb59d0fdaf498182ff19c4e80c00ecfc4470926e2", // BAL
|
||||
"0x2b9025aecc5ce7a8e6880d3e9c6e458927ecba04", // BAT
|
||||
"0xdeacf0faa2b80af41470003b5f6cd113d47b4dcd", // COMP
|
||||
"0xabe9818c5fb5e751c4310be6f0f18c8d85f9bd7f", // CREAM
|
||||
"0xe3520349f477a5f6eb06107066048508498a291b", // DAI
|
||||
"0xe301ed8c7630c9678c39e4e45193d1e7dfb914f7", // DODO
|
||||
"0xea62791aa682d455614eaa2a12ba3d9a2fd197af", // FLX
|
||||
"0xda2585430fef327ad8ee44af8f1f989a2a91a3d2", // FRAX
|
||||
"0xc8fdd32e0bf33f0396a18209188bb8c6fb8747d2", // FXS
|
||||
"0x943f4bf75d5854e92140403255a471950ab8a26f", // HAPI
|
||||
"0x94190d8ef039c670c6d6b9990142e0ce2a1e3178", // LINK
|
||||
"0x1d1f82d8b8fc72f29a8c268285347563cb6cd8b3", // MKR
|
||||
"0x74974575d2f1668c63036d51ff48dbaa68e52408", // MODA
|
||||
"0x951cfdc9544b726872a8faf56792ef6704731aae", // OCT
|
||||
"0x07b2055fbd17b601c780aeb3abf4c2b3a30c7aae", // OIN
|
||||
"0x885f8CF6E45bdd3fdcDc644efdcd0AC93880c781", // PAD
|
||||
"0x291c8fceaca3342b29cc36171deb98106f712c66", // PICKLE
|
||||
"0x18921f1e257038e538ba24d49fa6495c8b1617bc", // REN
|
||||
"0xdc9be1ff012d3c6da818d136a3b2e5fdd4442f74", // SNX
|
||||
"0x7821c773a12485b12a2b5b7bc451c3eb200986b1", // SUSHI
|
||||
"0x1bc741235ec0ee86ad488fa49b69bb6c823ee7b7", // UNI
|
||||
"0xb12bfca5a55806aaf64e99521918a4bf0fc40802", // USDC
|
||||
"0x4988a896b1227218e4a686fde5eabdcabd91571f", // USDT
|
||||
"0xf4eb217ba2454613b15dbdea6e5f22276410e89e", // WBTC
|
||||
"0x99ec8f13b2afef5ec49073b9d20df109d25f78c0", // WOO
|
||||
"0xa64514a8af3ff7366ad3d5daa5a548eefcef85e0" // YFI
|
||||
};
|
||||
|
||||
public static boolean isAuroraAddress(String contractAddress, String assetSymbol) {
|
||||
if (!TextUtils.isEmpty(contractAddress)) {
|
||||
for (String address : AURORA_SUPPORTED_CONTRACT_ADDRESSES) {
|
||||
if (address.equalsIgnoreCase(contractAddress)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ASSET_SYMBOL_ETH.equalsIgnoreCase(assetSymbol);
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -43,8 +43,7 @@ public class SelectedAccountResponsesCollector {
|
||||
selectedAccountInfosPerCoinMultiResponse.singleResponseComplete, coin);
|
||||
|
||||
accountsPermissionsContexts.add(accountContext);
|
||||
if (CoinType.FIL == coin) {
|
||||
} else {
|
||||
if (CoinType.FIL != coin) {
|
||||
mKeyringService.getSelectedAccount(coin, accountContext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,14 @@ import java.util.List;
|
||||
public final class WalletConstants {
|
||||
public static final long MILLI_SECOND = 1000;
|
||||
|
||||
// URLs
|
||||
|
||||
// Crypto
|
||||
public static final String URL_BRIDGE_RISKS = "https://ethereum.org/en/bridges/#bridge-risk";
|
||||
|
||||
// Aurora
|
||||
public static final String URL_RAINBOW_AURORA = "https://rainbowbridge.app";
|
||||
|
||||
// Android resources
|
||||
public static final String RESOURCE_ID = "id";
|
||||
|
||||
@@ -24,6 +32,9 @@ public final class WalletConstants {
|
||||
public static final String ADD_NETWORK_FRAGMENT_ARG_ACTIVE_NETWORK = "activeNetwork";
|
||||
public static final String ADD_NETWORK_FRAGMENT_ARG_CHAIN_ID = "chainId";
|
||||
|
||||
// AssetDetailsActivity
|
||||
public static final String PREF_SHOW_BRIDGE_INFO_DIALOG = "pref_show_bridge_info_dialog";
|
||||
|
||||
public static List<String> BUY_SUPPORTED_NETWORKS = Arrays.asList(
|
||||
BraveWalletConstants.MAINNET_CHAIN_ID, BraveWalletConstants.RINKEBY_CHAIN_ID,
|
||||
BraveWalletConstants.ROPSTEN_CHAIN_ID, BraveWalletConstants.GOERLI_CHAIN_ID,
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.chromium.chrome.R;
|
||||
import org.chromium.chrome.browser.ChromeTabbedActivity;
|
||||
import org.chromium.chrome.browser.app.BraveActivity;
|
||||
import org.chromium.chrome.browser.app.ChromeActivity;
|
||||
import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants;
|
||||
import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder;
|
||||
import org.chromium.chrome.browser.tab.TabLaunchType;
|
||||
import org.chromium.content_public.browser.LoadUrlParams;
|
||||
@@ -105,4 +106,14 @@ public class TabUtils {
|
||||
braveActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
activity.startActivity(braveActivityIntent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open link in a (normal/non-incognito) tab
|
||||
* @param activity packageContext/source of the intent
|
||||
* @param link to be opened
|
||||
*/
|
||||
public static void openLinkWithFocus(Activity activity, String link) {
|
||||
TabUtils.openUrlInNewTab(false, link);
|
||||
TabUtils.bringChromeTabbedActivityToTheTop(activity);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user