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