diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/AddSwitchChainNetworkFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/AddSwitchChainNetworkFragment.java
index 4b3fc98e6f5..e015720ccdc 100644
--- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/AddSwitchChainNetworkFragment.java
+++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/AddSwitchChainNetworkFragment.java
@@ -103,22 +103,16 @@ public class AddSwitchChainNetworkFragment extends BaseDAppsFragment {
Button btnAddSwitchNetwork = view.findViewById(R.id.fragment_add_switch_eth_chain_btn_sign);
if (mPanelType == ADD_ETHEREUM_CHAIN) {
btnAddSwitchNetwork.setText(R.string.approve);
- SpannableString addChainHeading = Utils.createSpannableString(
- getString(R.string.brave_wallet_allow_add_network_description),
- getString(R.string.brave_wallet_learn_more), new ClickableSpan() {
- @Override
- public void onClick(@NonNull View widget) {
- TabUtils.openUrlInNewTab(false, Utils.BRAVE_SUPPORT_URL);
- TabUtils.bringChromeTabbedActivityToTheTop(getActivity());
- }
- }, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-
TextView tvAddChainTitle = view.findViewById(R.id.fragment_add_switch_chain_tv_title);
tvAddChainTitle.setText(R.string.brave_wallet_allow_add_network_heading);
-
TextView addChainDesc = view.findViewById(R.id.fragment_add_switch_chain_tv_text);
+ Spanned spannedDescriptionText = Utils.createSpanForSurroundedPhrase(
+ getContext(), R.string.brave_wallet_allow_add_network_description, (v) -> {
+ TabUtils.openUrlInNewTab(false, Utils.BRAVE_SUPPORT_URL);
+ TabUtils.bringChromeTabbedActivityToTheTop(getActivity());
+ });
addChainDesc.setMovementMethod(LinkMovementMethod.getInstance());
- addChainDesc.setText(addChainHeading);
+ addChainDesc.setText(spannedDescriptionText);
} else if (mPanelType == SWITCH_ETHEREUM_CHAIN) {
btnAddSwitchNetwork.setText(R.string.brave_wallet_allow_change_network_button);
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 b962731904c..e686c159e9d 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
@@ -29,9 +29,11 @@ import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.text.Html;
+import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ClickableSpan;
+import android.text.style.URLSpan;
import android.util.Pair;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
@@ -40,6 +42,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
+import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
@@ -87,6 +90,7 @@ import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel;
import org.chromium.chrome.browser.crypto_wallet.observers.ApprovedTxObserver;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.util.TabUtils;
+import org.chromium.ui.text.NoUnderlineClickableSpan;
import org.chromium.ui.widget.Toast;
import org.chromium.url.GURL;
@@ -1532,10 +1536,37 @@ public class Utils {
String text, ClickableSpan clickListener, int startIndex, int endIndex, int flags) {
assert null != text;
SpannableString spannableString = new SpannableString(text);
- spannableString.setSpan(clickListener, startIndex, endIndex, flags);
+ if (startIndex >= 0 && endIndex > startIndex && endIndex < text.length()) {
+ spannableString.setSpan(clickListener, startIndex, endIndex, flags);
+ }
return spannableString;
}
+ /**
+ * This method should be used to make substring of a string clickable
+ * Example: This is %1$sClickable%2$s text.
+ *
+ * @param context The context
+ * @param stringRes The id of resource string
+ * @param onClickListener The callback when clickable substring is clicked.
+ */
+ public static Spannable createSpanForSurroundedPhrase(
+ Context context, @StringRes int stringRes, View.OnClickListener onClickListener) {
+ String htmlString =
+ String.format(context.getResources().getString(stringRes), "", "");
+ Spannable spannable = new SpannableString(AndroidUtils.formateHTML(htmlString));
+ URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+ for (URLSpan urlSpan : spans) {
+ NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan(context,
+ R.color.brave_theme_color, (view) -> { onClickListener.onClick(view); });
+ int spanStart = spannable.getSpanStart(urlSpan);
+ int spanEnd = spannable.getSpanEnd(urlSpan);
+ spannable.setSpan(linkSpan, spanStart, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ spannable.removeSpan(urlSpan);
+ }
+ return spannable;
+ }
+
public static SpannableString createSpannableString(
String text, String spanText, ClickableSpan clickListener, int flags) {
assert null != spanText;
diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd
index 56bd76e2d2a..43940958f74 100644
--- a/browser/ui/android/strings/android_brave_strings.grd
+++ b/browser/ui/android/strings/android_brave_strings.grd
@@ -2969,10 +2969,7 @@ If you don't accept this request, VPN will not reconnect and your internet conne
Network
- This will allow this network to be used within Brave Wallet. Learn more.
-
-
- Learn more.
+ This will allow this network to be used within Brave Wallet. %1$sLearn more%2$s.
Allow this site to add a network?