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 8aa02d89b820..ff0f6a45de5f 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
@@ -11,6 +11,7 @@
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
@@ -20,9 +21,12 @@
import android.os.Looper;
import android.text.Editable;
import android.text.SpannableString;
+import android.text.Spanned;
import android.text.TextWatcher;
+import android.text.method.LinkMovementMethod;
import android.util.DisplayMetrics;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
@@ -92,6 +96,7 @@
import org.chromium.chrome.browser.util.TabUtils;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
+import org.chromium.ui.text.NoUnderlineClickableSpan;
import java.io.IOException;
import java.util.ArrayList;
@@ -118,6 +123,7 @@ public class BuySendSwapActivity extends BraveWalletBaseActivity
private TextView mSlippageToleranceText;
private int radioSlippageToleranceCheckedId;
+ private TextView mMarketLimitPriceText;
public enum ActivityType {
BUY(0),
@@ -197,6 +203,7 @@ protected void triggerLayoutInflation() {
TextView toAssetText = findViewById(R.id.to_asset_text);
TextView marketPriceValueText = findViewById(R.id.market_price_value_text);
+ mMarketLimitPriceText = findViewById(R.id.market_limit_price_text);
mSlippageToleranceText = findViewById(R.id.slippage_tolerance_dropdown);
@@ -440,12 +447,11 @@ private void updateSwapControls(
} catch (NumberFormatException | NullPointerException ex) {
}
}
- TextView marketLimitPriceText = findViewById(R.id.market_limit_price_text);
String symbol = "ETH";
if (mCurrentBlockchainToken != null) {
symbol = mCurrentBlockchainToken.symbol;
}
- marketLimitPriceText.setText(String.format(getString(R.string.market_price_in), symbol));
+ mMarketLimitPriceText.setText(String.format(getString(R.string.market_price_in), symbol));
checkBalanceShowError(response, errorResponse);
}
@@ -681,6 +687,7 @@ private void setFromSendValueValidationResult(String validationResult) {
}
}
+ @SuppressLint("ClickableViewAccessibility")
private void adjustControls() {
EditText toValueText = findViewById(R.id.to_value_text);
TextView marketPriceValueText = findViewById(R.id.market_price_value_text);
@@ -892,9 +899,36 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
findViewById(R.id.brave_fee).setVisibility(View.VISIBLE);
TextView dexAggregator = findViewById(R.id.dex_aggregator);
dexAggregator.setVisibility(View.VISIBLE);
- dexAggregator.setOnClickListener(v -> {
- TabUtils.openUrlInNewTab(false, Utils.DEX_AGGREGATOR_URL);
- TabUtils.bringChromeTabbedActivityToTheTop(this);
+ dexAggregator.setMovementMethod(LinkMovementMethod.getInstance());
+ String dexAggregatorSrc = getString(R.string.swap_dex_aggregator_name);
+ String degAggregatorText = getString(R.string.wallet_dex_aggregator, dexAggregatorSrc);
+
+ NoUnderlineClickableSpan span = new NoUnderlineClickableSpan(
+ getResources(), R.color.brave_action_color, (textView) -> {
+ TabUtils.openUrlInNewTab(false, Utils.DEX_AGGREGATOR_URL);
+ TabUtils.bringChromeTabbedActivityToTheTop(BuySendSwapActivity.this);
+ });
+
+ SpannableString dexAggregatorSpanStr = Utils.createSpannableString(
+ degAggregatorText, dexAggregatorSrc, span, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ dexAggregator.setText(dexAggregatorSpanStr);
+ dexAggregator.setOnTouchListener((v, event) -> {
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ // verify if the touch was on textview's drawable
+ // note: do not add right padding to this textview, or make sure to adjust the
+ // below condition for extra padding
+ if (event.getRawX() >= (v.getRight() - dexAggregator.getTotalPaddingRight())) {
+ Context context = BuySendSwapActivity.this;
+ Utils.showPopUp(context, context.getString(R.string.swap_text),
+ context.getString(R.string.brave_wallet_swap_disclaimer_description,
+ getString(R.string.swap_dex_aggregator_name)),
+ context.getString(R.string.dialog_positive_button),
+ R.drawable.ic_info, (dialog, what) -> {});
+
+ return true;
+ }
+ }
+ return false;
});
initSwapFromToAssets();
}
@@ -1488,12 +1522,16 @@ public void finishNativeInitialization() {
for (EthereumChain chain : chains) {
if (chainId.equals(chain.chainId)) {
TextView fromAssetText = findViewById(R.id.from_asset_text);
+ TextView marketLimitPriceText =
+ findViewById(R.id.market_limit_price_text);
if (Utils.isCustomNetwork(chainId)) {
Utils.setBlockiesBitmapCustomAsset(mExecutor, mHandler, null, "",
chain.symbol, getResources().getDisplayMetrics().density,
fromAssetText, this, true, (float) 0.5);
}
fromAssetText.setText(chain.symbol);
+ marketLimitPriceText.setText(String.format(
+ getString(R.string.market_price_in), chain.symbol));
break;
}
}
diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java
index 1cd9a551d6cc..234304aeaa25 100644
--- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java
+++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java
@@ -27,9 +27,9 @@
public class SwapBottomSheetDialogFragment
extends BottomSheetDialogFragment implements View.OnClickListener {
public static final String TAG_FRAGMENT = SwapBottomSheetDialogFragment.class.getName();
- LinearLayout mBuyLayout;
- LinearLayout mSendLayout;
- LinearLayout mSwapLayout;
+ private LinearLayout mBuyLayout;
+ private LinearLayout mSendLayout;
+ private LinearLayout mSwapLayout;
private String mChainId;
public static SwapBottomSheetDialogFragment newInstance() {
diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java
index 9458dd34fec4..2f125848c75f 100644
--- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java
+++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java
@@ -11,6 +11,7 @@
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
@@ -24,16 +25,21 @@
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Handler;
+import android.text.SpannableString;
+import android.text.style.ClickableSpan;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -58,8 +64,6 @@
import org.chromium.brave_wallet.mojom.TransactionType;
import org.chromium.brave_wallet.mojom.TxData;
import org.chromium.chrome.R;
-import org.chromium.chrome.browser.crypto_wallet.activities.AccountDetailActivity;
-import org.chromium.chrome.browser.crypto_wallet.activities.AddAccountActivity;
import org.chromium.chrome.browser.crypto_wallet.activities.AssetDetailActivity;
import org.chromium.chrome.browser.crypto_wallet.activities.BuySendSwapActivity;
import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter;
@@ -67,10 +71,6 @@
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.AssetsPricesHelper;
-import org.chromium.chrome.browser.crypto_wallet.util.Blockies;
-import org.chromium.chrome.browser.crypto_wallet.util.PendingTxHelper;
-import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils;
import org.chromium.chrome.browser.util.TabUtils;
import org.chromium.ui.widget.Toast;
@@ -89,11 +89,9 @@
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
public class Utils {
public static int ONBOARDING_FIRST_PAGE_ACTION = 1;
@@ -1315,6 +1313,38 @@ private static void updateWalletCoinTransactionStatus(
itemModel.setTxStatusBitmap(txStatusBitmap);
}
+ public static AlertDialog showPopUp(Context context, String title, String message,
+ String positiveButtonTitle, int icon, DialogInterface.OnClickListener onClickListener) {
+ assert null != context;
+ MaterialAlertDialogBuilder builder =
+ new MaterialAlertDialogBuilder(context, R.style.BraveWalletAlertDialogTheme)
+ .setTitle(title)
+ .setMessage(message)
+ .setIcon(icon);
+ // positive button is only shown if the listener is not null
+ if (null != onClickListener) {
+ builder.setPositiveButton(positiveButtonTitle, onClickListener);
+ }
+ return builder.show();
+ }
+
+ public static SpannableString createSpannableString(
+ String text, ClickableSpan clickListener, int startIndex, int endIndex, int flags) {
+ assert null != text;
+ SpannableString spannableString = new SpannableString(text);
+ spannableString.setSpan(clickListener, startIndex, endIndex, flags);
+ return spannableString;
+ }
+
+ public static SpannableString createSpannableString(
+ String text, String spanText, ClickableSpan clickListener, int flags) {
+ assert null != spanText;
+ assert null != text;
+ int startIndex = text.indexOf(spanText);
+ int endIndex = startIndex + spanText.length();
+ return createSpannableString(text, clickListener, startIndex, endIndex, flags);
+ }
+
public static void warnWhenError(
String tag, String apiName, Integer error, String errorMessage) {
if (error != ProviderError.SUCCESS) {
diff --git a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java
index eb9b6c0a4fac..27390c3ef5e2 100644
--- a/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java
+++ b/android/java/org/chromium/chrome/browser/rewards/BraveRewardsPanel.java
@@ -1395,6 +1395,7 @@ public void onClick(View v) {
popup.getMenuInflater().inflate(
R.menu.monthly_contribution_popup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.change_amount_menu_id) {
openBannerActivity();
diff --git a/android/java/res/layout/activity_buy_send_swap.xml b/android/java/res/layout/activity_buy_send_swap.xml
index b1c915fb7768..ad3bc8e25374 100644
--- a/android/java/res/layout/activity_buy_send_swap.xml
+++ b/android/java/res/layout/activity_buy_send_swap.xml
@@ -664,14 +664,15 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/wallet_dex_aggregator"
- android:textColor="@color/brave_action_color"
+ app:drawableTint="@color/brave_action_color"
+ android:drawablePadding="8dp"
android:gravity="center"
android:textSize="14sp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
- android:visibility="gone"/>
+ android:layout_marginVertical="16dp"
+ android:visibility="gone"
+ app:drawableEndCompat="@drawable/ic_info" />
diff --git a/android/java/res/values/brave_styles.xml b/android/java/res/values/brave_styles.xml
index ef5888da6a42..331323ca9d50 100644
--- a/android/java/res/values/brave_styles.xml
+++ b/android/java/res/values/brave_styles.xml
@@ -97,6 +97,11 @@
- false
+
+
diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd
index 0a5918eb583b..997a9817a126 100644
--- a/browser/ui/android/strings/android_brave_strings.grd
+++ b/browser/ui/android/strings/android_brave_strings.grd
@@ -1879,7 +1879,13 @@ Are you sure you want to do this?
Send crypto or transfer from one account to another.
- Swap crypto assets with Brave DEX aggregator.
+ Swap tokens and assets
+
+
+ OK
+
+
+ %1$s will process the Ethereum address and IP address to fulfill a transaction (including getting quotes). %1$s will ONLY use this data for the purposes of processing transactions.
Secure your crypto with a password
@@ -2677,7 +2683,10 @@ If you don't accept this request, VPN will not reconnect and your internet conne
Failed to import account, please try again.
- Brave uses 0x as a DEX aggregator.
+ Brave uses %1$s0x as a DEX aggregator.
+
+
+ 0x
Price data powered by CoinGecko