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?