From 91d7e1c852fc0cc465d73ef1d36971005c7cadb9 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 20 Feb 2024 11:26:52 +0100 Subject: [PATCH] (Wallet) Remove Android unused code (#22119) * Remove Nft details * Remove AddAssetsActivity * Remove PortfolioFragment * Remove MarketFragment * Remove AccountsFragment * Remove TransactionsFragment * Remove CryptoFragmentPagerAdapter * Remove AccountDetailActivity * Remove AssetDetailActivity * Remove AccountDetailsWithQrActivity * Remove WalletNftAdapter * Remove SwapBottomSheetDialogFragment * Remove NetworkInfoPresenter * Remove WebUiActivityType * Remove MarketModel * Remove UserAssetModel * Remove PortfolioModel * Remove TransactionsModel * Remove PortfolioHelper * Remove SmoothLineChartEquallySpaced * Clean up AssetUtils * Clean up TokenUtils * Clean up Utils * Clean up WalletConstants * Clean up Validations * Clean up WalletUtils * Apply code formatting * Remove AccountPrivateKeyActivity * Refactor and rename WalletCoinAdapter to AccountSelectorRecyclerView * Remove unused resources * Improve method name --- android/brave_java_resources.gni | 57 +- android/brave_java_sources.gni | 32 +- android/java/AndroidManifest.xml | 30 - .../browser/app/domain/CryptoModel.java | 32 - .../browser/app/domain/MarketModel.java | 110 ---- .../browser/app/domain/NetworkModel.java | 25 +- .../browser/app/domain/PortfolioModel.java | 293 --------- .../browser/app/domain/TransactionsModel.java | 337 ---------- .../browser/app/domain/UserAssetModel.java | 125 ---- .../browser/app/domain/WalletModel.java | 7 - .../activities/AccountDetailActivity.java | 266 -------- .../AccountDetailsWithQrActivity.java | 115 ---- .../activities/AccountPrivateKeyActivity.java | 259 -------- .../activities/AccountSelectorActivity.java | 87 +-- .../activities/AddAccountActivity.java | 59 +- .../activities/AddAssetActivity.java | 265 -------- .../activities/AssetDetailActivity.java | 568 ----------------- .../activities/BraveWalletActivity.java | 75 --- .../activities/NftDetailActivity.java | 277 --------- .../adapters/AccountSelectorRecyclerView.java | 185 ++++++ .../adapters/CryptoFragmentPageAdapter.java | 74 --- .../adapters/MarketCoinAdapter.java | 113 ---- .../PortfolioFragmentStateAdapter.java | 68 --- .../adapters/WalletCoinAdapter.java | 397 ------------ .../adapters/WalletNftAdapter.java | 150 ----- .../fragments/AccountsFragment.java | 187 ------ .../fragments/AssetsFragment.java | 375 ------------ ...isibleAssetsBottomSheetDialogFragment.java | 574 ------------------ .../fragments/MarketFragment.java | 158 ----- .../fragments/NftGridFragment.java | 450 -------------- .../fragments/PortfolioFragment.java | 146 ----- .../SwapBottomSheetDialogFragment.java | 148 ----- .../TransactionDetailsSheetFragment.java | 47 +- .../fragments/TransactionsFragment.java | 154 ----- .../AccountSelectorItemListener.java | 14 + .../listeners/OnWalletListItemClick.java | 24 - ...del.java => AccountSelectorItemModel.java} | 108 +--- .../model/TxNonSwipeableViewPager.java | 2 +- .../presenters/NetworkInfoPresenter.java | 23 - .../crypto_wallet/util/AssetUtils.java | 142 ----- .../crypto_wallet/util/PortfolioHelper.java | 383 ------------ .../util/SmoothLineChartEquallySpaced.java | 246 -------- .../crypto_wallet/util/TokenUtils.java | 192 ------ .../browser/crypto_wallet/util/Utils.java | 483 +-------------- .../crypto_wallet/util/Validations.java | 152 ----- .../crypto_wallet/util/WalletConstants.java | 34 +- .../crypto_wallet/util/WalletUtils.java | 61 -- .../web_ui/WebUiActivityType.java | 16 - .../res/color-night/wallet_selector_icon.xml | 11 - .../res/color-night/wallet_selector_text.xml | 11 - ...ypto_wallet_radiobutton_color_selector.xml | 5 - .../java/res/color/wallet_selector_icon.xml | 11 - .../java/res/color/wallet_selector_text.xml | 11 - android/java/res/drawable-nodpi/fee_icon.png | Bin 1515 -> 0 bytes .../res/drawable/chip_outline_selected.xml | 13 - android/java/res/drawable/circle_shimmer.xml | 10 - .../crypto_wallet_negative_button.xml | 20 - android/java/res/drawable/empty_assets.xml | 209 ------- android/java/res/drawable/ic_accounts.xml | 15 - android/java/res/drawable/ic_activity.xml | 15 - .../res/drawable/ic_baseline_more_vert_24.xml | 5 - android/java/res/drawable/ic_bear_arrow.xml | 9 - android/java/res/drawable/ic_bull_arrow.xml | 9 - android/java/res/drawable/ic_down_icon.xml | 9 - android/java/res/drawable/ic_edit.xml | 10 - android/java/res/drawable/ic_explore.xml | 15 - .../res/drawable/ic_globe_connect_icon.xml | 10 - .../ic_pending_tx_notification_bg.xml | 9 - .../ic_pending_tx_notification_icon.xml | 10 - android/java/res/drawable/ic_portfolio.xml | 15 - android/java/res/drawable/ic_safe.xml | 10 - android/java/res/drawable/ic_swap_bg.xml | 22 - android/java/res/drawable/ic_swap_icon.xml | 10 - android/java/res/drawable/ic_up_icon.xml | 9 - .../java/res/drawable/ic_wallet_filters.xml | 19 - .../res/drawable/rounded_white_holo_bg.xml | 9 - .../java/res/drawable/wallet_chip_outline.xml | 10 - .../drawable/wallet_radio_button_normal.xml | 5 - .../drawable/wallet_radio_button_selected.xml | 5 - .../drawable/wallet_radio_button_selector.xml | 5 - .../res/layout/activity_account_detail.xml | 132 ---- .../activity_account_details_with_qr.xml | 127 ---- .../layout/activity_account_private_key.xml | 143 ----- .../java/res/layout/activity_add_asset.xml | 215 ------- .../java/res/layout/activity_asset_detail.xml | 460 -------------- .../java/res/layout/activity_brave_wallet.xml | 105 ---- .../java/res/layout/activity_nft_detail.xml | 215 ------- .../java/res/layout/brave_wallet_divider.xml | 14 - .../java/res/layout/dialog_alert_template.xml | 46 -- .../java/res/layout/dialog_aurora_bridge.xml | 55 -- .../edit_visible_assets_bottom_sheet.xml | 76 --- android/java/res/layout/fragment_accounts.xml | 103 ---- android/java/res/layout/fragment_assets.xml | 323 ---------- android/java/res/layout/fragment_market.xml | 71 --- android/java/res/layout/fragment_nft_grid.xml | 154 ----- .../java/res/layout/fragment_portfolio.xml | 44 -- .../java/res/layout/fragment_transactions.xml | 66 -- .../java/res/layout/market_coin_list_item.xml | 68 --- .../res/layout/market_coin_shimmer_item.xml | 74 --- .../java/res/layout/shimmer_skeleton_item.xml | 61 -- android/java/res/layout/swap_bottom_sheet.xml | 136 ----- ...m.xml => view_holder_account_selector.xml} | 43 +- .../java/res/layout/wallet_backup_banner.xml | 47 -- android/java/res/layout/wallet_nft_item.xml | 62 -- .../menu/wallet_bottom_navigation_items.xml | 20 - .../java/res/values-night/brave_colors.xml | 3 - android/java/res/values/brave_colors.xml | 8 - android/java/res/values/brave_styles.xml | 12 - .../android/strings/android_brave_strings.grd | 292 --------- 109 files changed, 339 insertions(+), 11497 deletions(-) delete mode 100644 android/java/org/chromium/chrome/browser/app/domain/MarketModel.java delete mode 100644 android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java delete mode 100644 android/java/org/chromium/chrome/browser/app/domain/TransactionsModel.java delete mode 100644 android/java/org/chromium/chrome/browser/app/domain/UserAssetModel.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailActivity.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailsWithQrActivity.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAssetActivity.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java create mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSelectorRecyclerView.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoFragmentPageAdapter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/MarketCoinAdapter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/PortfolioFragmentStateAdapter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletNftAdapter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AccountsFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AssetsFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/MarketFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/NftGridFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionsFragment.java create mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/listeners/AccountSelectorItemListener.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java rename android/java/org/chromium/chrome/browser/crypto_wallet/model/{WalletListItemModel.java => AccountSelectorItemModel.java} (58%) delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/presenters/NetworkInfoPresenter.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/util/PortfolioHelper.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/util/SmoothLineChartEquallySpaced.java delete mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/web_ui/WebUiActivityType.java delete mode 100644 android/java/res/color-night/wallet_selector_icon.xml delete mode 100644 android/java/res/color-night/wallet_selector_text.xml delete mode 100644 android/java/res/color/crypto_wallet_radiobutton_color_selector.xml delete mode 100644 android/java/res/color/wallet_selector_icon.xml delete mode 100644 android/java/res/color/wallet_selector_text.xml delete mode 100644 android/java/res/drawable-nodpi/fee_icon.png delete mode 100644 android/java/res/drawable/chip_outline_selected.xml delete mode 100644 android/java/res/drawable/circle_shimmer.xml delete mode 100644 android/java/res/drawable/crypto_wallet_negative_button.xml delete mode 100644 android/java/res/drawable/empty_assets.xml delete mode 100644 android/java/res/drawable/ic_accounts.xml delete mode 100644 android/java/res/drawable/ic_activity.xml delete mode 100644 android/java/res/drawable/ic_baseline_more_vert_24.xml delete mode 100644 android/java/res/drawable/ic_bear_arrow.xml delete mode 100644 android/java/res/drawable/ic_bull_arrow.xml delete mode 100644 android/java/res/drawable/ic_down_icon.xml delete mode 100644 android/java/res/drawable/ic_edit.xml delete mode 100644 android/java/res/drawable/ic_explore.xml delete mode 100644 android/java/res/drawable/ic_globe_connect_icon.xml delete mode 100644 android/java/res/drawable/ic_pending_tx_notification_bg.xml delete mode 100644 android/java/res/drawable/ic_pending_tx_notification_icon.xml delete mode 100644 android/java/res/drawable/ic_portfolio.xml delete mode 100644 android/java/res/drawable/ic_safe.xml delete mode 100644 android/java/res/drawable/ic_swap_bg.xml delete mode 100644 android/java/res/drawable/ic_swap_icon.xml delete mode 100644 android/java/res/drawable/ic_up_icon.xml delete mode 100644 android/java/res/drawable/ic_wallet_filters.xml delete mode 100644 android/java/res/drawable/rounded_white_holo_bg.xml delete mode 100644 android/java/res/drawable/wallet_chip_outline.xml delete mode 100644 android/java/res/drawable/wallet_radio_button_normal.xml delete mode 100644 android/java/res/drawable/wallet_radio_button_selected.xml delete mode 100644 android/java/res/drawable/wallet_radio_button_selector.xml delete mode 100644 android/java/res/layout/activity_account_detail.xml delete mode 100644 android/java/res/layout/activity_account_details_with_qr.xml delete mode 100644 android/java/res/layout/activity_account_private_key.xml delete mode 100644 android/java/res/layout/activity_add_asset.xml delete mode 100644 android/java/res/layout/activity_asset_detail.xml delete mode 100644 android/java/res/layout/activity_nft_detail.xml delete mode 100644 android/java/res/layout/brave_wallet_divider.xml delete mode 100644 android/java/res/layout/dialog_alert_template.xml delete mode 100644 android/java/res/layout/dialog_aurora_bridge.xml delete mode 100644 android/java/res/layout/edit_visible_assets_bottom_sheet.xml delete mode 100644 android/java/res/layout/fragment_accounts.xml delete mode 100644 android/java/res/layout/fragment_assets.xml delete mode 100644 android/java/res/layout/fragment_market.xml delete mode 100644 android/java/res/layout/fragment_nft_grid.xml delete mode 100644 android/java/res/layout/fragment_portfolio.xml delete mode 100644 android/java/res/layout/fragment_transactions.xml delete mode 100644 android/java/res/layout/market_coin_list_item.xml delete mode 100644 android/java/res/layout/market_coin_shimmer_item.xml delete mode 100644 android/java/res/layout/shimmer_skeleton_item.xml delete mode 100644 android/java/res/layout/swap_bottom_sheet.xml rename android/java/res/layout/{wallet_coin_list_item.xml => view_holder_account_selector.xml} (71%) delete mode 100644 android/java/res/layout/wallet_backup_banner.xml delete mode 100644 android/java/res/layout/wallet_nft_item.xml delete mode 100644 android/java/res/menu/wallet_bottom_navigation_items.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 74a7b8e1496..6127b694e87 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -9,11 +9,6 @@ brave_java_resources = [ "java/res/anim/slide_in_top.xml", "java/res/anim/slide_out_bottom.xml", "java/res/anim/slide_out_top.xml", - "java/res/color-night/wallet_selector_icon.xml", - "java/res/color-night/wallet_selector_text.xml", - "java/res/color/crypto_wallet_radiobutton_color_selector.xml", - "java/res/color/wallet_selector_icon.xml", - "java/res/color/wallet_selector_text.xml", "java/res/drawable-hdpi/brave_ads_launch_graphic.png", "java/res/drawable-hdpi/brave_sync_btn_laptop.png", "java/res/drawable-hdpi/btn_bat.png", @@ -148,7 +143,6 @@ brave_java_resources = [ "java/res/drawable-night/tipping_background_success.xml", "java/res/drawable-nodpi/dylan_malval_sea_min.webp", "java/res/drawable-nodpi/eth.png", - "java/res/drawable-nodpi/fee_icon.png", "java/res/drawable-nodpi/ic_quick_action_search_and_bookmark_widget_preview.png", "java/res/drawable-nodpi/loader0_orange.png", "java/res/drawable-sw600dp/bottomsheet_rewards_tipping_success_background.xml", @@ -396,24 +390,18 @@ brave_java_resources = [ "java/res/drawable/carat_right.xml", "java/res/drawable/card_bg.xml", "java/res/drawable/checked_circle_filled.xml", - "java/res/drawable/chip_outline_selected.xml", - "java/res/drawable/circle_shimmer.xml", "java/res/drawable/circular_progress.xml", "java/res/drawable/country_spinner_background.xml", "java/res/drawable/create_custom_filter_edit_bg.xml", "java/res/drawable/crypto_wallet_blue_button.xml", "java/res/drawable/crypto_wallet_hollow_button.xml", - "java/res/drawable/crypto_wallet_negative_button.xml", "java/res/drawable/crypto_wallet_onboarding_blue_button.xml", "java/res/drawable/custodian_text_background.xml", "java/res/drawable/default_dot.xml", "java/res/drawable/default_indicator.xml", - "java/res/drawable/empty_assets.xml", "java/res/drawable/exchange_shape.xml", "java/res/drawable/ic_ac_onboarding.xml", "java/res/drawable/ic_accessibility.xml", - "java/res/drawable/ic_accounts.xml", - "java/res/drawable/ic_activity.xml", "java/res/drawable/ic_add.xml", "java/res/drawable/ic_addresses.xml", "java/res/drawable/ic_always_on_info.xml", @@ -430,11 +418,9 @@ brave_java_resources = [ "java/res/drawable/ic_baseline_add_24.xml", "java/res/drawable/ic_baseline_arrow_back_24.xml", "java/res/drawable/ic_baseline_close_24.xml", - "java/res/drawable/ic_baseline_more_vert_24.xml", "java/res/drawable/ic_basic_check.xml", "java/res/drawable/ic_bat_color.xml", "java/res/drawable/ic_bat_unverified_off.xml", - "java/res/drawable/ic_bear_arrow.xml", "java/res/drawable/ic_bell_icon.xml", "java/res/drawable/ic_bg.xml", "java/res/drawable/ic_bookmark_import_export_failed.xml", @@ -454,7 +440,6 @@ brave_java_resources = [ "java/res/drawable/ic_brave_smiley_happy.xml", "java/res/drawable/ic_brave_smiley_sad.xml", "java/res/drawable/ic_brave_vpn_graphic.xml", - "java/res/drawable/ic_bull_arrow.xml", "java/res/drawable/ic_calendar.xml", "java/res/drawable/ic_cancel_filled.xml", "java/res/drawable/ic_carat_down.xml", @@ -505,19 +490,15 @@ brave_java_resources = [ "java/res/drawable/ic_custom_tabs.xml", "java/res/drawable/ic_disabled.xml", "java/res/drawable/ic_discount.xml", - "java/res/drawable/ic_down_icon.xml", "java/res/drawable/ic_downloads.xml", - "java/res/drawable/ic_edit.xml", "java/res/drawable/ic_eth.xml", "java/res/drawable/ic_eth_24.xml", "java/res/drawable/ic_expand_arrows.xml", - "java/res/drawable/ic_explore.xml", "java/res/drawable/ic_fil_asset_icon.xml", "java/res/drawable/ic_fingerprint.xml", "java/res/drawable/ic_following.xml", "java/res/drawable/ic_gemini_logo_cyan.xml", "java/res/drawable/ic_gemini_logo_white.xml", - "java/res/drawable/ic_globe_connect_icon.xml", "java/res/drawable/ic_guardian.xml", "java/res/drawable/ic_hearts.xml", "java/res/drawable/ic_help.xml", @@ -575,15 +556,12 @@ brave_java_resources = [ "java/res/drawable/ic_payment_methods.xml", "java/res/drawable/ic_payout_status_complete.xml", "java/res/drawable/ic_payout_status_pending.xml", - "java/res/drawable/ic_pending_tx_notification_bg.xml", - "java/res/drawable/ic_pending_tx_notification_icon.xml", "java/res/drawable/ic_phantom.xml", "java/res/drawable/ic_phone.xml", "java/res/drawable/ic_plans.xml", "java/res/drawable/ic_plus.xml", "java/res/drawable/ic_plus_add_widget.xml", "java/res/drawable/ic_popular_sources.xml", - "java/res/drawable/ic_portfolio.xml", "java/res/drawable/ic_privacy_reports.xml", "java/res/drawable/ic_promoted.xml", "java/res/drawable/ic_qr_code.xml", @@ -596,7 +574,6 @@ brave_java_resources = [ "java/res/drawable/ic_rewards_external_link.xml", "java/res/drawable/ic_rewards_noti_warning_circle.xml", "java/res/drawable/ic_rocket.xml", - "java/res/drawable/ic_safe.xml", "java/res/drawable/ic_search.xml", "java/res/drawable/ic_search_21dp.xml", "java/res/drawable/ic_search_vector.xml", @@ -610,20 +587,16 @@ brave_java_resources = [ "java/res/drawable/ic_sol_asset_icon.xml", "java/res/drawable/ic_stats_notification_background.xml", "java/res/drawable/ic_suggestions.xml", - "java/res/drawable/ic_swap_bg.xml", - "java/res/drawable/ic_swap_icon.xml", "java/res/drawable/ic_sync.xml", "java/res/drawable/ic_thank_you.xml", "java/res/drawable/ic_tipping_error.xml", "java/res/drawable/ic_toggle_down.xml", "java/res/drawable/ic_toggle_up.xml", "java/res/drawable/ic_trash_icon.xml", - "java/res/drawable/ic_up_icon.xml", "java/res/drawable/ic_verify_wallet_arrow.xml", "java/res/drawable/ic_visibility_off.xml", "java/res/drawable/ic_vpn.xml", "java/res/drawable/ic_vpn_promo.xml", - "java/res/drawable/ic_wallet_filters.xml", "java/res/drawable/ic_wallet_lock.xml", "java/res/drawable/ic_wallet_settings.xml", "java/res/drawable/ic_warning.xml", @@ -701,7 +674,6 @@ brave_java_resources = [ "java/res/drawable/rounded_shape.xml", "java/res/drawable/rounded_top_corners.xml", "java/res/drawable/rounded_wallet_edittext.xml", - "java/res/drawable/rounded_white_holo_bg.xml", "java/res/drawable/selected_dot.xml", "java/res/drawable/selected_indicator.xml", "java/res/drawable/send_contribution_button_background.xml", @@ -740,10 +712,6 @@ brave_java_resources = [ "java/res/drawable/vpn_plan_action_gradient.xml", "java/res/drawable/vpn_plan_bg.xml", "java/res/drawable/vpn_plan_selected_bg.xml", - "java/res/drawable/wallet_chip_outline.xml", - "java/res/drawable/wallet_radio_button_normal.xml", - "java/res/drawable/wallet_radio_button_selected.xml", - "java/res/drawable/wallet_radio_button_selector.xml", "java/res/drawable/wallet_sign_msg_err_bg.xml", "java/res/drawable/wallet_toolbar_panel_gradient_bg.xml", "java/res/drawable/wallet_top_banner_bg.xml", @@ -758,14 +726,9 @@ brave_java_resources = [ "java/res/layout-sw600dp/brave_shields_stats_row.xml", "java/res/layout-sw600dp/rewards_tipping_banner_fragment.xml", "java/res/layout-sw600dp/rewards_tipping_success_contribution_fragment.xml", - "java/res/layout/activity_account_detail.xml", - "java/res/layout/activity_account_details_with_qr.xml", - "java/res/layout/activity_account_private_key.xml", "java/res/layout/activity_account_selector.xml", "java/res/layout/activity_add_account.xml", - "java/res/layout/activity_add_asset.xml", "java/res/layout/activity_advance_tx_setting.xml", - "java/res/layout/activity_asset_detail.xml", "java/res/layout/activity_brave_leo_plans.xml", "java/res/layout/activity_brave_vpn_plan.xml", "java/res/layout/activity_brave_vpn_profile.xml", @@ -773,7 +736,6 @@ brave_java_resources = [ "java/res/layout/activity_brave_wallet.xml", "java/res/layout/activity_brave_wallet_dapps.xml", "java/res/layout/activity_network_selector.xml", - "java/res/layout/activity_nft_detail.xml", "java/res/layout/activity_onboarding.xml", "java/res/layout/activity_playlist_host.xml", "java/res/layout/activity_split_tunnel.xml", @@ -852,7 +814,6 @@ brave_java_resources = [ "java/res/layout/brave_wallet_autolock_layout.xml", "java/res/layout/brave_wallet_connected_sites_list_item.xml", "java/res/layout/brave_wallet_connected_sites_preference_layout.xml", - "java/res/layout/brave_wallet_divider.xml", "java/res/layout/brave_wallet_edit_gas.xml", "java/res/layout/brave_wallet_network_item.xml", "java/res/layout/brave_wallet_networks_preference_layout.xml", @@ -865,15 +826,10 @@ brave_java_resources = [ "java/res/layout/connect_account_layout.xml", "java/res/layout/custom_layout_preference.xml", "java/res/layout/dapps_dialog.xml", - "java/res/layout/dialog_alert_template.xml", - "java/res/layout/dialog_aurora_bridge.xml", - "java/res/layout/edit_visible_assets_bottom_sheet.xml", - "java/res/layout/fragment_accounts.xml", "java/res/layout/fragment_ad_free_callout_dialog.xml", "java/res/layout/fragment_add_custom_filter_lists.xml", "java/res/layout/fragment_add_switch_ethereum_chain.xml", "java/res/layout/fragment_add_token.xml", - "java/res/layout/fragment_assets.xml", "java/res/layout/fragment_backup_wallet.xml", "java/res/layout/fragment_brave_ads_onboarding.xml", "java/res/layout/fragment_brave_bookmark_import_export_dialog.xml", @@ -893,10 +849,7 @@ brave_java_resources = [ "java/res/layout/fragment_dormant_users_engagement_dialog.xml", "java/res/layout/fragment_encryption_key.xml", "java/res/layout/fragment_link_subscription_dialog.xml", - "java/res/layout/fragment_market.xml", - "java/res/layout/fragment_nft_grid.xml", "java/res/layout/fragment_onboarding_v2.xml", - "java/res/layout/fragment_portfolio.xml", "java/res/layout/fragment_qr_code_share.xml", "java/res/layout/fragment_recovery_phrase.xml", "java/res/layout/fragment_restore_wallet.xml", @@ -913,7 +866,6 @@ brave_java_resources = [ "java/res/layout/fragment_timer_dialog_list_dialog_item.xml", "java/res/layout/fragment_transaction.xml", "java/res/layout/fragment_transaction_details.xml", - "java/res/layout/fragment_transactions.xml", "java/res/layout/fragment_troubleshooting_onboarding.xml", "java/res/layout/fragment_two_line_item_list.xml", "java/res/layout/fragment_two_line_item_sheet.xml", @@ -934,8 +886,6 @@ brave_java_resources = [ "java/res/layout/item_two_line_horizontal.xml", "java/res/layout/layout_search_widget_promo.xml", "java/res/layout/location_status_incognito_badge.xml", - "java/res/layout/market_coin_list_item.xml", - "java/res/layout/market_coin_shimmer_item.xml", "java/res/layout/menu_separator.xml", "java/res/layout/monthly_contribution_tooltip.xml", "java/res/layout/network_spinner_items.xml", @@ -964,8 +914,6 @@ brave_java_resources = [ "java/res/layout/rewards_you_are_not_earning_dialog.xml", "java/res/layout/search_preference.xml", "java/res/layout/selected_network_item.xml", - "java/res/layout/shimmer_skeleton_item.xml", - "java/res/layout/swap_bottom_sheet.xml", "java/res/layout/tipping_banner_tipping_panel_inside_layout.xml", "java/res/layout/tipping_verified_creator_tooltip.xml", "java/res/layout/tipping_warning_message_layout.xml", @@ -973,12 +921,10 @@ brave_java_resources = [ "java/res/layout/tracker_item_layout.xml", "java/res/layout/tx_details_bottom_sheet.xml", "java/res/layout/user_wallet_activity.xml", + "java/res/layout/view_holder_account_selector.xml", "java/res/layout/vpn_location_menu_item_action_layout.xml", "java/res/layout/vpn_settings_callout_modal_layout.xml", - "java/res/layout/wallet_backup_banner.xml", "java/res/layout/wallet_balance_layout.xml", - "java/res/layout/wallet_coin_list_item.xml", - "java/res/layout/wallet_nft_item.xml", "java/res/layout/web_notification_icon_frame_brave.xml", "java/res/layout/web_notification_small_icon.xml", "java/res/layout/widevine_permission_request_custom_view.xml", @@ -992,7 +938,6 @@ brave_java_resources = [ "java/res/menu/menu_network_selector.xml", "java/res/menu/new_tab_menu.xml", "java/res/menu/split_tunnel_menu.xml", - "java/res/menu/wallet_bottom_navigation_items.xml", "java/res/menu/wallet_search.xml", "java/res/values-h500dp/dimens.xml", "java/res/values-h568dp/dimens.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 6bd703086a6..934716ba22d 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -52,12 +52,8 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedData.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/DappsModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java", - "../../brave/android/java/org/chromium/chrome/browser/app/domain/MarketModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkSelectorModel.java", - "../../brave/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java", - "../../brave/android/java/org/chromium/chrome/browser/app/domain/TransactionsModel.java", - "../../brave/android/java/org/chromium/chrome/browser/app/domain/UserAssetModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/helpers/Api33AndPlusBackPressHelper.java", "../../brave/android/java/org/chromium/chrome/browser/app/helpers/ImageLoader.java", @@ -102,47 +98,29 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/KeyringServiceFactory.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/SwapServiceFactory.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/TxServiceFactory.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailsWithQrActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountSelectorActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAccountActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAssetActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AdvanceTxSettingActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletBaseActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletDAppsActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NetworkSelectorActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSelectorRecyclerView.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/ApproveTxFragmentPageAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CreateAccountAdapter.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoFragmentPageAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoWalletOnboardingPagerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/FragmentNavigationItemAdapter.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/MarketCoinAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/NetworkSelectorAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/NetworkSpinnerAdapter.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/PortfolioFragmentStateAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/RecoveryPhraseAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/SignMessagePagerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/TwoLineItemRecyclerViewAdapter.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletNftAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/controller/DAppsWalletController.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AccountsFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/ApproveTxBottomSheetDialogFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AssetsFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/BaseWalletNextPageFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/CreateAccountBottomSheetFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/MarketFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/NftGridFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SolanaTxDetailsFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionDetailsSheetFragment.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionsFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TwoLineItemBottomSheetFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TwoLineItemFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TxDetailsFragment.java", @@ -169,16 +147,16 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingSecurePasswordFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingTermsOfUseFragment.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding/OnboardingVerifyRecoveryPhraseFragment.java", + "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/AccountSelectorItemListener.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnNextPage.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/TransactionConfirmationListener.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/modal/BraveWalletPanel.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/modal/DAppsDialog.java", + "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/AccountSelectorItemModel.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/CryptoAccountTypeInfo.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/OnboardingViewModel.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/WalletAccountCreationRequest.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/WalletListItemModel.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/observers/ApprovedTxObserver.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/observers/BraveWalletServiceObserverImpl.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/observers/KeyringServiceObserverImpl.java", @@ -186,7 +164,6 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/permission/BraveDappPermissionPromptDialog.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/permission/BravePermissionAccountsListAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/Amount.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/NetworkInfoPresenter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/SolanaInstructionPresenter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/AccountsPermissionsHelper.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/AddressUtils.java", @@ -205,8 +182,6 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/ParsedTransaction.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/ParsedTransactionFees.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/PendingTxHelper.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/PortfolioHelper.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/SmoothLineChartEquallySpaced.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/SolanaTransactionsGasHelper.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/TransactionUtils.java", @@ -216,7 +191,6 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletDataFilesInstallerUtil.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletNativeUtils.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletUtils.java", - "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/web_ui/WebUiActivityType.java", "../../brave/android/java/org/chromium/chrome/browser/custom_layout/AutoFitVerticalGridLayoutManager.java", "../../brave/android/java/org/chromium/chrome/browser/custom_layout/HeightWrappingViewPager.java", "../../brave/android/java/org/chromium/chrome/browser/custom_layout/LockableNestedScrollView.java", diff --git a/android/java/AndroidManifest.xml b/android/java/AndroidManifest.xml index 2c58b7dc7aa..c0c29c1e214 100644 --- a/android/java/AndroidManifest.xml +++ b/android/java/AndroidManifest.xml @@ -49,31 +49,11 @@ android:screenOrientation="sensorPortrait" tools:ignore="LockedOrientationActivity,DiscouragedApi"/> - - - - - - - - - - - - > mAccountInfosFromKeyRingModel; - private TransactionsModel mTransactionsModel; public CryptoModel(Context context, TxService txService, KeyringService keyringService, BlockchainRegistry blockchainRegistry, JsonRpcService jsonRpcService, @@ -82,9 +79,6 @@ public class CryptoModel { mPendingTxHelper = new PendingTxHelper(mTxService, new AccountInfo[0], true, true); mNetworkModel = new NetworkModel( mBraveWalletService, mJsonRpcService, mSharedData, mCryptoSharedActions, context); - mPortfolioModel = new PortfolioModel(context, mTxService, mKeyringService, - mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, - mBraveWalletService, mAssetRatioService, mSharedData); } public void resetServices(Context context, TxService mTxService, KeyringService mKeyringService, @@ -103,14 +97,6 @@ public class CryptoModel { this.mAssetRatioService = mAssetRatioService; mPendingTxHelper.setTxService(mTxService); mNetworkModel.resetServices(mBraveWalletService, mJsonRpcService); - mPortfolioModel.resetServices(context, mTxService, mKeyringService, mBlockchainRegistry, - mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, - mAssetRatioService); - if (mTransactionsModel != null) { - mTransactionsModel.resetServices(mContext, mTxService, mKeyringService, - mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, - mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); - } } init(); } @@ -209,24 +195,6 @@ public class CryptoModel { return mNetworkModel; } - public PortfolioModel getPortfolioModel() { - return mPortfolioModel; - } - - public TransactionsModel createTransactionModel() { - if (mTransactionsModel == null) { - mTransactionsModel = new TransactionsModel(mContext, mTxService, mKeyringService, - mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, - mBraveWalletService, mAssetRatioService, mSharedData); - } - return mTransactionsModel; - } - - public UserAssetModel createUserAssetModel(WalletCoinAdapter.AdapterType type) { - return new UserAssetModel( - mBraveWalletService, mJsonRpcService, mBlockchainRegistry, mSharedData, type); - } - public void updateCoinType() { updateCoinType(null, null); } diff --git a/android/java/org/chromium/chrome/browser/app/domain/MarketModel.java b/android/java/org/chromium/chrome/browser/app/domain/MarketModel.java deleted file mode 100644 index b53367bbd0d..00000000000 --- a/android/java/org/chromium/chrome/browser/app/domain/MarketModel.java +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.app.domain; - -import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import org.chromium.brave_wallet.mojom.AssetRatioService; -import org.chromium.brave_wallet.mojom.CoinMarket; - -import java.math.RoundingMode; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.Locale; - -public class MarketModel { - private static final String CURRENCY = "USD"; - // Fetch the first 250 assets. - private static final byte ASSETS_REQUEST_LIMIT = (byte) (250 & 0xFF); - private AssetRatioService mAssetRatioService; - - private final DecimalFormatSymbols mSymbols; - private final DecimalFormat mPriceFormatter; - private final DecimalFormat mPercentageFormatter; - - public final LiveData mCoinMarkets; - private final MutableLiveData _mCoinMarkets; - - public MarketModel(AssetRatioService assetRatioService) { - mAssetRatioService = assetRatioService; - - _mCoinMarkets = new MutableLiveData<>(); - mCoinMarkets = _mCoinMarkets; - - mSymbols = new DecimalFormatSymbols(Locale.ENGLISH); - mPriceFormatter = new DecimalFormat("$0.00##########", mSymbols); - mPriceFormatter.setGroupingSize(3); - mPriceFormatter.setGroupingUsed(true); - - mPercentageFormatter = new DecimalFormat("0.00", mSymbols); - mPercentageFormatter.setRoundingMode(RoundingMode.UP); - } - - public void resetService(AssetRatioService assetRatioService) { - mAssetRatioService = assetRatioService; - } - - /** - * Gets the first 250 market assets. - * See {@link #mCoinMarkets} the live data used to emit the assets. - */ - public void getCoinMarkets() { - if (mAssetRatioService == null) { - return; - } - mAssetRatioService.getCoinMarkets( - CURRENCY, ASSETS_REQUEST_LIMIT, (success, coinMarkets) -> { - if (success) { - _mCoinMarkets.postValue(coinMarkets); - } else { - _mCoinMarkets.postValue(null); - } - }); - } - - /** - * Gets formatted price using the format `$0.00##########` (e.g. $27,160.00, or - * $0.523453456789). - * @param price Price to format. - * @return Formatted price. - */ - @NonNull - public String getFormattedPrice(double price) { - return mPriceFormatter.format(price); - } - - /** - * Gets formatted percentage change rounded up and using the format `0.00` (e.g. 0.05%). - * @param percentageChange Percentage change to format. - * @return Formatted percentage change. - */ - @NonNull - public String getFormattedPercentageChange(double percentageChange) { - double absoluteChange = Math.abs(percentageChange); - return String.format(Locale.ENGLISH, "%s%%", mPercentageFormatter.format(absoluteChange)); - } - - /** - * Formats a given USD value into a more readable string appending K (thousands), - * M (millions), or B (billions). - * E.g.{@code 1000000} becomes {@code "$1.00M"}. - * - * @param value Given value to format. - * @return Formatted string. - */ - @NonNull - public String getFormattedUsdBillions(final double value) { - if (value < 1000) { - final int rounded = (int) value; - return String.format(Locale.ENGLISH, "$%d", rounded); - } - final int exp = Math.min(3, (int) (Math.log(value) / Math.log(1000))); - return String.format( - Locale.ENGLISH, "$%.2f%c", value / Math.pow(1000, exp), "KMB".charAt(exp - 1)); - } -} diff --git a/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java b/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java index d3b031f2486..2ab8ac632a3 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java @@ -30,9 +30,7 @@ import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; import org.chromium.chrome.browser.crypto_wallet.util.NetworkResponsesCollector; import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; -import org.chromium.chrome.browser.crypto_wallet.web_ui.WebUiActivityType; import org.chromium.chrome.browser.util.Triple; import org.chromium.mojo.system.MojoException; import org.chromium.url.internal.mojom.Origin; @@ -224,18 +222,21 @@ public class NetworkModel implements JsonRpcServiceObserver { } /** - * Create a network selector model to handle either default or local state (onscreen e.g. {@link - * org.chromium.chrome.browser.crypto_wallet.fragments.PortfolioFragment}). Local network + * Create a network selector model to handle either default or local state. Local network * selection can be used by many views so make sure to use the same key which acts as a contract * between the view and the selection activity. + * * @param key acts as a binding key between caller and selection activity. * @param mode to handle network selection event globally or locally. * @param selectionMode to allow Single or Multiple network selection. * @param lifecycle to auto remove network-selection objects. * @return NetworkSelectorModel object. */ - public NetworkSelectorModel openNetworkSelectorModel(String key, NetworkSelectorModel.Mode mode, - NetworkSelectorModel.SelectionMode selectionMode, Lifecycle lifecycle) { + public NetworkSelectorModel openNetworkSelectorModel( + String key, + NetworkSelectorModel.Mode mode, + NetworkSelectorModel.SelectionMode selectionMode, + Lifecycle lifecycle) { NetworkSelectorModel networkSelectorModel; if (key == null) { return new NetworkSelectorModel(mode, selectionMode, this, mContext); @@ -403,18 +404,6 @@ public class NetworkModel implements JsonRpcServiceObserver { _mNeedToCreateAccountForNetwork.postValue(null); } - public List stripNoBuyNetworks( - List networkInfos, WebUiActivityType type) { - List networkInfosFiltered = new ArrayList<>(); - for (NetworkInfo networkInfo : networkInfos) { - if (type == WebUiActivityType.BUY && Utils.allowBuy(networkInfo.chainId)) { - networkInfosFiltered.add(networkInfo); - } - } - - return networkInfosFiltered; - } - public NetworkInfo getNetwork(String chainId) { if (TextUtils.isEmpty(chainId)) return null; List cryptoNws = JavaUtils.safeVal(_mCryptoNetworks.getValue()); diff --git a/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java b/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java deleted file mode 100644 index a61792c91d4..00000000000 --- a/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java +++ /dev/null @@ -1,293 +0,0 @@ -/* 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.app.domain; - -import android.content.Context; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import org.json.JSONException; -import org.json.JSONObject; - -import org.chromium.base.Callbacks; -import org.chromium.brave_wallet.mojom.AccountInfo; -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.BraveWalletService; -import org.chromium.brave_wallet.mojom.CoinType; -import org.chromium.brave_wallet.mojom.EthTxManagerProxy; -import org.chromium.brave_wallet.mojom.JsonRpcService; -import org.chromium.brave_wallet.mojom.KeyringService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.SolanaTxManagerProxy; -import org.chromium.brave_wallet.mojom.TxService; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.observers.BraveWalletServiceObserverImpl; -import org.chromium.chrome.browser.crypto_wallet.observers.BraveWalletServiceObserverImpl.BraveWalletServiceObserverImplDelegate; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; -import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; -import org.chromium.chrome.browser.crypto_wallet.util.PortfolioHelper; -import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class PortfolioModel implements BraveWalletServiceObserverImplDelegate { - public final LiveData> mNftModels; - public final LiveData> mNftHiddenModels; - private final CryptoSharedData mSharedData; - private final Object mLock = new Object(); - private TxService mTxService; - private KeyringService mKeyringService; - private BlockchainRegistry mBlockchainRegistry; - private JsonRpcService mJsonRpcService; - private EthTxManagerProxy mEthTxManagerProxy; - private SolanaTxManagerProxy mSolanaTxManagerProxy; - private BraveWalletService mBraveWalletService; - private AssetRatioService mAssetRatioService; - private Context mContext; - private final MutableLiveData> _mNftModels; - private final MutableLiveData> _mNftHiddenModels; - private final MutableLiveData _mIsDiscoveringUserAssets; - public LiveData mIsDiscoveringUserAssets; - - private List mAllNetworkInfos; - public PortfolioHelper mPortfolioHelper; - - public PortfolioModel(Context context, TxService txService, KeyringService keyringService, - BlockchainRegistry blockchainRegistry, JsonRpcService jsonRpcService, - EthTxManagerProxy ethTxManagerProxy, SolanaTxManagerProxy solanaTxManagerProxy, - BraveWalletService braveWalletService, AssetRatioService assetRatioService, - CryptoSharedData sharedData) { - mContext = context; - mTxService = txService; - mKeyringService = keyringService; - mBlockchainRegistry = blockchainRegistry; - mJsonRpcService = jsonRpcService; - mEthTxManagerProxy = ethTxManagerProxy; - mSolanaTxManagerProxy = solanaTxManagerProxy; - mBraveWalletService = braveWalletService; - mAssetRatioService = assetRatioService; - mSharedData = sharedData; - _mNftModels = new MutableLiveData<>(); - mNftModels = _mNftModels; - _mNftHiddenModels = new MutableLiveData<>(); - mNftHiddenModels = _mNftHiddenModels; - _mIsDiscoveringUserAssets = new MutableLiveData<>(); - mIsDiscoveringUserAssets = _mIsDiscoveringUserAssets; - addServiceObservers(); - } - - private void fetchNftMetadata(List nftList, List allNetworkList, - MutableLiveData> nftModels) { - // Filter out and calculate the size of supported NFTs. - // The total sum will be used by `MultiResponseHandler` to detect - // when `setWhenAllCompletedAction()` can be processed. - int erc721NftsSize = JavaUtils.filter(nftList, (nft -> nft.isErc721)).size(); - int solanaNftsSize = JavaUtils.filter(nftList, (nft -> nft.coin == CoinType.SOL)).size(); - List nftDataModels = new ArrayList<>(); - AsyncUtils.MultiResponseHandler nftMetaDataHandler = - new AsyncUtils.MultiResponseHandler(erc721NftsSize + solanaNftsSize); - - ArrayList nftMetadataList = new ArrayList<>(); - for (BlockchainToken userAsset : nftList) { - if (userAsset.isErc721) { - AsyncUtils.GetNftErc721MetadataContext nftMetadata = - new AsyncUtils.GetNftErc721MetadataContext( - nftMetaDataHandler.singleResponseComplete); - nftMetadata.asset = userAsset; - mJsonRpcService.getErc721Metadata(userAsset.contractAddress, userAsset.tokenId, - userAsset.chainId, nftMetadata); - nftMetadataList.add(nftMetadata); - } else if (userAsset.isNft) { - if (userAsset.coin == CoinType.SOL) { - // Solana NFTs. - AsyncUtils.GetNftSolanaMetadataContext nftMetadata = - new AsyncUtils.GetNftSolanaMetadataContext( - nftMetaDataHandler.singleResponseComplete); - nftMetadata.asset = userAsset; - mJsonRpcService.getSolTokenMetadata( - userAsset.chainId, userAsset.contractAddress, nftMetadata); - nftMetadataList.add(nftMetadata); - - } else { - // Other NFTs. - nftDataModels.add(new NftDataModel(userAsset, - NetworkUtils.findNetwork( - allNetworkList, userAsset.chainId, userAsset.coin), - null)); - } - } - } - nftMetaDataHandler.setWhenAllCompletedAction(() -> { - for (AsyncUtils.BaseGetNftMetadataContext metadata : nftMetadataList) { - nftDataModels.add(new NftDataModel(metadata.asset, - NetworkUtils.findNetwork( - allNetworkList, metadata.asset.chainId, metadata.asset.coin), - new NftMetadata(metadata.tokenMetadata, metadata.errorCode, - metadata.errorMessage))); - } - nftModels.postValue(nftDataModels); - }); - } - - public void discoverAssetsOnAllSupportedChains() { - if (mBraveWalletService == null) return; - _mIsDiscoveringUserAssets.postValue(true); - mBraveWalletService.discoverAssetsOnAllSupportedChains(); - } - - /** - * Fetch all NFT assets of selected networks including hidden NFTs. - * @param fragment the fragment making the call - * @param selectedNetworks list to fetch assets from - * @param braveWalletBaseActivity instance for native services - * @param callback to get the @{code PortfolioHelper} object containing result - */ - public void fetchNfts(@NonNull final Fragment fragment, List selectedNetworks, - BraveWalletBaseActivity braveWalletBaseActivity, - Callbacks.Callback1 callback) { - NetworkModel.getAllNetworks( - mJsonRpcService, mSharedData.getSupportedCryptoCoins(), allNetworks -> { - mAllNetworkInfos = allNetworks; - mKeyringService.getAllAccounts(allAccounts -> { - AccountInfo[] filteredAccounts = allAccounts.accounts; - mPortfolioHelper = new PortfolioHelper( - braveWalletBaseActivity, mAllNetworkInfos, filteredAccounts); - mPortfolioHelper.setSelectedNetworks(selectedNetworks); - mPortfolioHelper.fetchNfts(portfolioHelper -> { - if (!AndroidUtils.canUpdateFragmentUi(fragment)) { - return; - } - mPortfolioHelper = portfolioHelper; - final List nfts = mPortfolioHelper.getUserAssets(); - final List hiddenNfts = - mPortfolioHelper.getHiddenAssets(); - fetchNftMetadata(nfts, mAllNetworkInfos, _mNftModels); - fetchNftMetadata(hiddenNfts, mAllNetworkInfos, _mNftHiddenModels); - callback.call(portfolioHelper); - }); - }); - }); - } - - /** - * Fetch the assets of selected networks and filter by type. - * @param type by NFT, NON-NFT, ERC, SOL etc. - * @param selectedNetworks list to fetch assets from - * @param braveWalletBaseActivity instance for native services - * @param callback to get the @{code PortfolioHelper} object containing result - */ - public void fetchAssets(TokenUtils.TokenType type, List selectedNetworks, - BraveWalletBaseActivity braveWalletBaseActivity, - Callbacks.Callback1 callback) { - NetworkModel.getAllNetworks( - mJsonRpcService, mSharedData.getSupportedCryptoCoins(), allNetworks -> { - mAllNetworkInfos = allNetworks; - mKeyringService.getAllAccounts(allAccounts -> { - AccountInfo[] filteredAccounts = allAccounts.accounts; - mPortfolioHelper = new PortfolioHelper( - braveWalletBaseActivity, mAllNetworkInfos, filteredAccounts); - mPortfolioHelper.setSelectedNetworks(selectedNetworks); - mPortfolioHelper.fetchAssetsAndDetails(type, callback); - }); - }); - } - - @Override - public void onDiscoverAssetsCompleted(BlockchainToken[] discoveredAssets) { - _mIsDiscoveringUserAssets.postValue(false); - } - - public void clearNftModels() { - _mNftModels.postValue(Collections.emptyList()); - _mNftHiddenModels.postValue(Collections.emptyList()); - } - - private void addServiceObservers() { - if (mBraveWalletService != null) { - BraveWalletServiceObserverImpl walletServiceObserver = - new BraveWalletServiceObserverImpl(this); - mBraveWalletService.addObserver(walletServiceObserver); - } - } - - void resetServices(Context context, TxService mTxService, KeyringService mKeyringService, - BlockchainRegistry mBlockchainRegistry, JsonRpcService mJsonRpcService, - EthTxManagerProxy mEthTxManagerProxy, SolanaTxManagerProxy mSolanaTxManagerProxy, - BraveWalletService mBraveWalletService, AssetRatioService mAssetRatioService) { - synchronized (mLock) { - mContext = context; - this.mTxService = mTxService; - this.mKeyringService = mKeyringService; - this.mBlockchainRegistry = mBlockchainRegistry; - this.mJsonRpcService = mJsonRpcService; - this.mEthTxManagerProxy = mEthTxManagerProxy; - this.mSolanaTxManagerProxy = mSolanaTxManagerProxy; - this.mBraveWalletService = mBraveWalletService; - this.mAssetRatioService = mAssetRatioService; - addServiceObservers(); - } - } - - public static class NftDataModel { - public BlockchainToken token; - public NetworkInfo networkInfo; - public NftMetadata nftMetadata; - - public NftDataModel( - BlockchainToken token, NetworkInfo networkInfo, NftMetadata nftMetadata) { - this.token = token; - this.networkInfo = networkInfo; - this.nftMetadata = nftMetadata; - } - } - - public static class NftMetadata implements Serializable { - public String mImageUrl; - public String mName; - public int mErrCode; - public String mErrMsg; - // ERC721 only, but it may be present anyway in other standards. - public String mDescription; - - public NftMetadata(String jsonString, int mErrCode, String mErrMsg) { - this.mErrCode = mErrCode; - this.mErrMsg = mErrMsg; - try { - JSONObject metaDataJObj = new JSONObject(jsonString); - mDescription = metaDataJObj.optString("description"); - mImageUrl = refineUrl(metaDataJObj.optString("image")); - mName = metaDataJObj.optString("name"); - } catch (JSONException ignored) { - } - } - - public NftMetadata(String mDescription, String mImageUrl, String mName) { - this.mDescription = mDescription; - this.mImageUrl = mImageUrl; - this.mName = mName; - } - - private String refineUrl(String url) { - if (TextUtils.isEmpty(url)) return ""; - if (url.startsWith("data:image")) - return url; - else - return AssetUtils.httpifyIpfsUrl(url); - } - } -} diff --git a/android/java/org/chromium/chrome/browser/app/domain/TransactionsModel.java b/android/java/org/chromium/chrome/browser/app/domain/TransactionsModel.java deleted file mode 100644 index ca802a63c3c..00000000000 --- a/android/java/org/chromium/chrome/browser/app/domain/TransactionsModel.java +++ /dev/null @@ -1,337 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.app.domain; - -import android.content.Context; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import org.chromium.brave_wallet.mojom.AccountInfo; -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.BraveWalletService; -import org.chromium.brave_wallet.mojom.EthTxManagerProxy; -import org.chromium.brave_wallet.mojom.JsonRpcService; -import org.chromium.brave_wallet.mojom.KeyringService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.SolanaTxManagerProxy; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.brave_wallet.mojom.TransactionStatus; -import org.chromium.brave_wallet.mojom.TxService; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel; -import org.chromium.chrome.browser.crypto_wallet.observers.TxServiceObserverImpl; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; -import org.chromium.chrome.browser.crypto_wallet.util.ParsedTransaction; -import org.chromium.chrome.browser.crypto_wallet.util.PendingTxHelper; -import org.chromium.chrome.browser.crypto_wallet.util.SolanaTransactionsGasHelper; -import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -public class TransactionsModel implements TxServiceObserverImpl.TxServiceObserverImplDelegate { - private final CryptoSharedData mSharedData; - private final Object mLock = new Object(); - private TxService mTxService; - private KeyringService mKeyringService; - private BlockchainRegistry mBlockchainRegistry; - private JsonRpcService mJsonRpcService; - private EthTxManagerProxy mEthTxManagerProxy; - private SolanaTxManagerProxy mSolanaTxManagerProxy; - private BraveWalletService mBraveWalletService; - private AssetRatioService mAssetRatioService; - private Context mContext; - private final MutableLiveData> _mParsedTransactions; - private final MutableLiveData _mIsLoading; - private List mAllNetworkInfoList; - private WeakReference mActivityRef; - public final LiveData> mParsedTransactions; - public List mAllAccountInfoList; - public LiveData mIsLoading; - - public TransactionsModel(Context context, TxService txService, KeyringService keyringService, - BlockchainRegistry blockchainRegistry, JsonRpcService jsonRpcService, - EthTxManagerProxy ethTxManagerProxy, SolanaTxManagerProxy solanaTxManagerProxy, - BraveWalletService braveWalletService, AssetRatioService assetRatioService, - CryptoSharedData sharedData) { - mContext = context; - mTxService = txService; - mKeyringService = keyringService; - mBlockchainRegistry = blockchainRegistry; - mJsonRpcService = jsonRpcService; - mEthTxManagerProxy = ethTxManagerProxy; - mSolanaTxManagerProxy = solanaTxManagerProxy; - mBraveWalletService = braveWalletService; - mAssetRatioService = assetRatioService; - mSharedData = sharedData; - mAllNetworkInfoList = Collections.emptyList(); - _mParsedTransactions = new MutableLiveData<>(); - _mIsLoading = new MutableLiveData<>(false); - mIsLoading = _mIsLoading; - mParsedTransactions = _mParsedTransactions; - mAllAccountInfoList = Collections.emptyList(); - addServiceObservers(); - } - - // Fetch all transactions of all accounts except rejected, and calculate balances, gas etc. - public void update(WeakReference activityRef) { - synchronized (mLock) { - _mIsLoading.postValue(true); - mActivityRef = activityRef; - if (JavaUtils.anyNull( - mJsonRpcService, mKeyringService, mActivityRef, mActivityRef.get())) - return; - NetworkModel.getAllNetworks( - mJsonRpcService, - mSharedData.getSupportedCryptoCoins(), - allNetworks -> { - mAllNetworkInfoList = allNetworks; - mKeyringService.getAllAccounts( - allAccounts -> { - mAllAccountInfoList = Arrays.asList(allAccounts.accounts); - var allAccountsArray = allAccounts.accounts; - // Fetch transactions - PendingTxHelper pendingTxHelper = - new PendingTxHelper(mTxService, allAccountsArray, true); - pendingTxHelper.fetchTransactions( - () -> { - HashMap pendingTxInfos = - pendingTxHelper.getTransactions(); - pendingTxHelper.destroy(); - TransactionInfo[] filteredTransactions = - pendingTxInfos.values().stream() - .flatMap( - transactionInfos -> - Arrays.stream( - transactionInfos)) - .filter( - tx -> - tx.txStatus - != TransactionStatus - .REJECTED) - .toArray(TransactionInfo[]::new); - if (filteredTransactions.length == 0) { - postTxListResponse(Collections.emptyList()); - return; - } - // Fetch tokens, balances, price etc. - List - assetAccountsNetworkBalances = - new ArrayList<>(); - AtomicInteger balanceResultCounter = - new AtomicInteger(); - List txNetworks = - mAllNetworkInfoList.stream() - .filter( - networkInfo -> - Arrays.stream( - filteredTransactions) - .anyMatch( - transactionInfo -> - transactionInfo - .chainId - .equals( - networkInfo - .chainId))) - .collect(Collectors.toList()); - for (NetworkInfo networkInfo : txNetworks) { - var accountInfoListPerCoin = - mAllAccountInfoList.stream() - .filter( - accountInfo -> - accountInfo - .accountId - .coin - == networkInfo - .coin) - .collect(Collectors.toList()); - - Utils.getTxExtraInfo( - mActivityRef, - TokenUtils.TokenType.ALL, - mAllNetworkInfoList, - networkInfo, - accountInfoListPerCoin.toArray( - new AccountInfo[0]), - null, - false, - (assetPrices, - userAssetsList, - nativeAssetsBalances, - blockchainTokensBalances) -> { - AssetAccountsNetworkBalance asset = - new AssetAccountsNetworkBalance( - assetPrices, - userAssetsList, - nativeAssetsBalances, - blockchainTokensBalances, - networkInfo, - accountInfoListPerCoin); - assetAccountsNetworkBalances.add( - asset); - if (balanceResultCounter - .incrementAndGet() - == txNetworks.size()) { - parseTransactions( - mActivityRef, - assetAccountsNetworkBalances, - filteredTransactions, - networkInfo.coin); - } - }); - } - }); - }); - }); - } - } - - private void parseTransactions(WeakReference activityRef, - List assetAccountsNetworkBalances, - TransactionInfo[] transactionInfoArr, int coin) { - // Received balances of all network, can now fetch transaction - var allAccountsArray = mAllAccountInfoList.toArray(new AccountInfo[0]); - SolanaTransactionsGasHelper solanaTransactionsGasHelper = - new SolanaTransactionsGasHelper(activityRef.get(), transactionInfoArr); - solanaTransactionsGasHelper.maybeGetSolanaGasEstimations(() -> { - List walletListItemModelList = new ArrayList<>(); - var perTxSolanaFee = solanaTransactionsGasHelper.getPerTxFee(); - for (TransactionInfo txInfo : transactionInfoArr) { - AccountInfo txAccountInfo = - Utils.findAccount(allAccountsArray, txInfo.fromAccountId); - if (txAccountInfo == null) { - continue; - } - long solanaEstimatedTxFee = 0; - if (perTxSolanaFee.get(txInfo.id) != null) { - solanaEstimatedTxFee = perTxSolanaFee.get(txInfo.id); - } - var txNetwork = NetworkUtils.findNetwork(mAllNetworkInfoList, txInfo.chainId, coin); - var txExtraData = - assetAccountsNetworkBalances.stream() - .filter(data -> data.networkInfo.chainId.equals(txInfo.chainId)) - .findFirst() - .get(); - ParsedTransaction parsedTx = ParsedTransaction.parseTransaction(txInfo, txNetwork, - allAccountsArray, txExtraData.assetPrices, solanaEstimatedTxFee, - txExtraData.userAssetsList, txExtraData.nativeAssetsBalances, - txExtraData.blockchainTokensBalances); - WalletListItemModel itemModel = Utils.makeWalletItem( - activityRef.get(), txInfo, txNetwork, parsedTx, txAccountInfo); - walletListItemModelList.add(itemModel); - } - postTxListResponse(walletListItemModelList); - }); - } - - private void postTxListResponse(List walletListItemModelList) { - _mParsedTransactions.postValue(walletListItemModelList); - _mIsLoading.postValue(false); - } - - private void addServiceObservers() { - if (mTxService != null) { - TxServiceObserverImpl walletServiceObserver = new TxServiceObserverImpl(this); - mTxService.addObserver(walletServiceObserver); - } - } - - void resetServices(Context context, TxService mTxService, KeyringService mKeyringService, - BlockchainRegistry mBlockchainRegistry, JsonRpcService mJsonRpcService, - EthTxManagerProxy mEthTxManagerProxy, SolanaTxManagerProxy mSolanaTxManagerProxy, - BraveWalletService mBraveWalletService, AssetRatioService mAssetRatioService) { - synchronized (mLock) { - mContext = context; - this.mTxService = mTxService; - this.mKeyringService = mKeyringService; - this.mBlockchainRegistry = mBlockchainRegistry; - this.mJsonRpcService = mJsonRpcService; - this.mEthTxManagerProxy = mEthTxManagerProxy; - this.mSolanaTxManagerProxy = mSolanaTxManagerProxy; - this.mBraveWalletService = mBraveWalletService; - this.mAssetRatioService = mAssetRatioService; - addServiceObservers(); - } - } - - @Override - public void onNewUnapprovedTx(TransactionInfo txInfo) { - update(mActivityRef); - } - - @Override - public void onUnapprovedTxUpdated(TransactionInfo txInfo) { - updateTx(txInfo, mActivityRef); - } - - @Override - public void onTransactionStatusChanged(TransactionInfo txInfo) { - updateTx(txInfo, mActivityRef); - } - - private void updateTx( - TransactionInfo txInfo, WeakReference mActivityRef) { - List items = _mParsedTransactions.getValue(); - if (items != null && txInfo.txStatus == TransactionStatus.REJECTED - && items.stream().anyMatch( - walletItem -> walletItem.getTransactionInfo().id.equals(txInfo.id))) { - // Remove rejected transaction - items = items.stream() - .filter(walletItem - -> !walletItem.getTransactionInfo().id.equals(txInfo.id)) - .collect(Collectors.toList()); - _mParsedTransactions.postValue(items); - } else if (items != null && txInfo.txStatus != TransactionStatus.UNAPPROVED) { - // Update status - WalletListItemModel walletItemTx = - items.stream() - .filter(walletItem - -> walletItem.getTransactionInfo().id.equals(txInfo.id)) - .findFirst() - .orElse(null); - if (walletItemTx != null) { - walletItemTx.getTransactionInfo().txStatus = txInfo.txStatus; - Utils.updateWalletCoinTransactionStatus( - walletItemTx, mContext, walletItemTx.getTransactionInfo()); - _mParsedTransactions.postValue(items); - } - } else { - update(mActivityRef); - } - } - - private static class AssetAccountsNetworkBalance { - HashMap assetPrices; - BlockchainToken[] userAssetsList; - HashMap nativeAssetsBalances; - HashMap> blockchainTokensBalances; - NetworkInfo networkInfo; - List accountInfoList; - - public AssetAccountsNetworkBalance(HashMap assetPrices, - BlockchainToken[] userAssetsList, HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances, - NetworkInfo networkInfo, List accountInfoList) { - this.assetPrices = assetPrices; - this.userAssetsList = userAssetsList; - this.nativeAssetsBalances = nativeAssetsBalances; - this.blockchainTokensBalances = blockchainTokensBalances; - this.networkInfo = networkInfo; - this.accountInfoList = accountInfoList; - } - } -} diff --git a/android/java/org/chromium/chrome/browser/app/domain/UserAssetModel.java b/android/java/org/chromium/chrome/browser/app/domain/UserAssetModel.java deleted file mode 100644 index b5da3a0a089..00000000000 --- a/android/java/org/chromium/chrome/browser/app/domain/UserAssetModel.java +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.app.domain; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -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.JsonRpcService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; -import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; - -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Stream; - -public class UserAssetModel { - private final Object mLock = new Object(); - private final BraveWalletService mBraveWalletService; - private final JsonRpcService mJsonRpcService; - private final BlockchainRegistry mBlockchainRegistry; - private final WalletCoinAdapter.AdapterType mType; - private NetworkInfo mSelectedNetwork; - private List mCryptoNetworks; - private final CryptoSharedData mSharedData; - private final MutableLiveData _mAssetsResult; - public LiveData mAssetsResult; - - public UserAssetModel(BraveWalletService braveWalletService, JsonRpcService jsonRpcService, - BlockchainRegistry blockchainRegistry, CryptoSharedData sharedData, - WalletCoinAdapter.AdapterType type) { - mBraveWalletService = braveWalletService; - mJsonRpcService = jsonRpcService; - mBlockchainRegistry = blockchainRegistry; - mSharedData = sharedData; - mType = type; - _mAssetsResult = new MutableLiveData<>(); - mAssetsResult = _mAssetsResult; - } - - public void fetchAssets(boolean nftsOnly, NetworkInfo selectedNetwork) { - synchronized (mLock) { - mSelectedNetwork = selectedNetwork; - if (JavaUtils.anyNull(mBraveWalletService, mJsonRpcService, mSelectedNetwork)) return; - NetworkModel.getAllNetworks( - mJsonRpcService, mSharedData.getSupportedCryptoCoins(), allNetworks -> { - mCryptoNetworks = allNetworks; - if (mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - if (NetworkUtils.isAllNetwork(mSelectedNetwork)) { - fetchAllNetworksAssets(nftsOnly); - } else { - TokenUtils.getVisibleUserAssetsFiltered(mBraveWalletService, - mSelectedNetwork, mSelectedNetwork.coin, - TokenUtils.TokenType.ALL, - userAssets - -> TokenUtils.getAllTokensFiltered(mBraveWalletService, - mBlockchainRegistry, mSelectedNetwork, - nftsOnly ? TokenUtils.TokenType.NFTS - : TokenUtils.TokenType.NON_NFTS, - tokens -> { - _mAssetsResult.postValue( - new AssetsResult(Arrays.asList(tokens), - Arrays.asList(userAssets))); - })); - } - } - }); - } - } - - private void fetchAllNetworksAssets(boolean nftsOnly) { - mBraveWalletService.getAllUserAssets(userAssets -> { - Stream supportedNetworkAssets = - Arrays.stream(userAssets) - .filter(token - -> !WalletConstants.UNSUPPORTED_NETWORKS.contains( - token.chainId)) - .filter(token -> nftsOnly == token.isNft); - if (!AndroidUtils.isDebugBuild()) { - supportedNetworkAssets = supportedNetworkAssets.filter( - token -> !token.chainId.equals(BraveWalletConstants.LOCALHOST_CHAIN_ID)); - } - BlockchainToken[] supportedNetworkAssetsArray = - supportedNetworkAssets.toArray(BlockchainToken[] ::new); - - TokenUtils.getAllTokensFiltered(mBlockchainRegistry, mCryptoNetworks, - nftsOnly ? TokenUtils.TokenType.NFTS : TokenUtils.TokenType.NON_NFTS, - tokens -> { - sortByNetwork(tokens); - var filteredTokens = TokenUtils.distinctiveConcatenatedArrays( - tokens, supportedNetworkAssetsArray); - _mAssetsResult.postValue(new AssetsResult(Arrays.asList(filteredTokens), - Arrays.asList(supportedNetworkAssetsArray))); - }); - }); - } - - private void sortByNetwork(BlockchainToken[] tokens) { - var networkIndexMap = AssetUtils.toNetworkIndexMap(mCryptoNetworks); - Arrays.sort(tokens, Comparator.comparing(token -> networkIndexMap.get(token.chainId))); - } - - public static class AssetsResult { - public List tokens; - public List userAssets; - - public AssetsResult(List tokens, List userAssets) { - this.tokens = tokens; - this.userAssets = userAssets; - } - } -} diff --git a/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java b/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java index 0e6430aeca6..7eb94f2004a 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java @@ -33,7 +33,6 @@ public class WalletModel { private final CryptoModel mCryptoModel; private final DappsModel mDappsModel; private final KeyringModel mKeyringModel; - private final MarketModel mMarketModel; private Context mContext; private CryptoActions mCryptoActions; @@ -61,7 +60,6 @@ public class WalletModel { mCryptoModel.getPendingTxHelper()); mKeyringModel = new KeyringModel(mContext, mKeyringService, mBraveWalletService, mCryptoActions); - mMarketModel = new MarketModel(mAssetRatioService); // be careful with dependencies, must avoid cycles mCryptoModel.setAccountInfosFromKeyRingModel(mKeyringModel.mAccountInfos); init(); @@ -88,7 +86,6 @@ public class WalletModel { mDappsModel.resetServices( mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); mKeyringModel.resetService(mContext, mKeyringService, braveWalletService); - mMarketModel.resetService(mAssetRatioService); init(); } @@ -134,10 +131,6 @@ public class WalletModel { return mDappsModel; } - public MarketModel getMarketModel() { - return mMarketModel; - } - public KeyringService getKeyringService() { return mKeyringService; } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailActivity.java deleted file mode 100644 index e1a155ab38f..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailActivity.java +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Handler; -import android.os.Looper; -import android.view.MenuItem; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.Toolbar; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import org.chromium.base.Log; -import org.chromium.base.supplier.OneshotSupplier; -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.NetworkModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; -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.PortfolioHelper; -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.WalletUtils; -import org.chromium.chrome.browser.init.ActivityProfileProvider; -import org.chromium.chrome.browser.profiles.ProfileProvider; -import org.chromium.chrome.browser.util.LiveDataUtil; - -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; - -public class AccountDetailActivity - extends BraveWalletBaseActivity implements OnWalletListItemClick, ApprovedTxObserver { - private static final String TAG = "AccountDetail"; - - private AccountInfo mAccountInfo; - private TextView mAccountText; - private ExecutorService mExecutor; - private Handler mHandler; - private WalletCoinAdapter mWalletTxCoinAdapter; - private WalletModel mWalletModel; - - public static Intent createIntent(@NonNull Context context, @NonNull AccountInfo accountInfo) { - Intent intent = new Intent(context, AccountDetailActivity.class); - WalletUtils.addAccountInfoToIntent(intent, accountInfo); - return intent; - } - - @Override - protected void triggerLayoutInflation() { - setContentView(R.layout.activity_account_detail); - - mExecutor = Executors.newSingleThreadExecutor(); - mHandler = new Handler(Looper.getMainLooper()); - if (getIntent() != null) { - mAccountInfo = WalletUtils.getAccountInfoFromIntent(getIntent()); - } - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(""); - - ImageView accountPicture = findViewById(R.id.account_picture); - Utils.setBlockiesBitmapResourceFromAccount( - mExecutor, mHandler, accountPicture, mAccountInfo, true); - - mAccountText = findViewById(R.id.account_text); - mAccountText.setText(mAccountInfo.name); - - TextView accountValueText = findViewById(R.id.account_value_text); - accountValueText.setText(Utils.stripAccountAddress(mAccountInfo.address)); - - TextView btnDetails = findViewById(R.id.details_btn); - btnDetails.setOnClickListener(v -> { - Intent intent = AccountDetailsWithQrActivity.createIntent( - AccountDetailActivity.this, mAccountInfo); - startActivity(intent); - }); - TextView btnRename = findViewById(R.id.rename_btn); - btnRename.setOnClickListener(v -> { - Intent intent = AddAccountActivity.createIntentToEditAccount(this, mAccountInfo); - startActivityForResult(intent, Utils.ACCOUNT_REQUEST_CODE); - }); - - onInitialLayoutInflationComplete(); - } - - private void setUpAssetList() { - AccountInfo[] accountInfos = new AccountInfo[] {mAccountInfo}; - if (mWalletModel == null) return; - LiveDataUtil.observeOnce( - getNetworkModel().mCryptoNetworks, allNetworks -> { - PortfolioHelper portfolioHelper = - new PortfolioHelper(this, allNetworks, accountInfos); - portfolioHelper.setSelectedNetworks( - allNetworks.stream() - .filter(networkInfo - -> networkInfo.coin == mAccountInfo.accountId.coin) - .collect(Collectors.toList())); - portfolioHelper.fetchAssetsAndDetails( - TokenUtils.TokenType.ALL, portfolioHelperCopy -> { - RecyclerView rvAssets = findViewById(R.id.rv_assets); - - List userAssets = portfolioHelper.getUserAssets(); - HashMap perTokenCryptoSum = - portfolioHelper.getPerTokenCryptoSum(); - HashMap perTokenFiatSum = - portfolioHelper.getPerTokenFiatSum(); - - String tokensPath = BlockchainRegistryFactory.getInstance() - .getTokensIconsLocation(); - - WalletCoinAdapter walletCoinAdapter = Utils.setupVisibleAssetList( - userAssets, perTokenCryptoSum, perTokenFiatSum, tokensPath, - getResources(), allNetworks); - walletCoinAdapter.setOnWalletListItemClick( - AccountDetailActivity.this); - rvAssets.setAdapter(walletCoinAdapter); - rvAssets.setLayoutManager(new LinearLayoutManager(this)); - }); - }); - } - - // TODO(apaymyshev): this should not depend on selectedNetwork - private void fetchAccountInfo(NetworkInfo selectedNetwork) { - AccountInfo[] accounts = {mAccountInfo}; - LiveDataUtil.observeOnce( - getNetworkModel().mCryptoNetworks, allNetworks -> { - Utils.getTxExtraInfo(new WeakReference<>(this), TokenUtils.TokenType.ALL, - allNetworks, selectedNetwork, accounts, null, false, - (assetPrices, fullTokenList, nativeAssetsBalances, - blockchainTokensBalances) -> { - WalletListItemModel thisAccountItemModel = - WalletListItemModel.makeForAccountInfo(mAccountInfo); - Utils.setUpTransactionList(this, accounts, allNetworks, - thisAccountItemModel, assetPrices, fullTokenList, - nativeAssetsBalances, blockchainTokensBalances, - selectedNetwork, walletListItemModelList -> { - showTransactionList(walletListItemModelList); - }); - }); - }); - } - - private void showTransactionList(List walletListItemModelList) { - mWalletTxCoinAdapter.setWalletCoinAdapterType( - WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - - mWalletTxCoinAdapter.setWalletListItemModelList(walletListItemModelList); - mWalletTxCoinAdapter.setOnWalletListItemClick(AccountDetailActivity.this); - mWalletTxCoinAdapter.setWalletListItemType(Utils.TRANSACTION_ITEM); - RecyclerView rvTransactions = findViewById(R.id.rv_transactions); - rvTransactions.setAdapter(mWalletTxCoinAdapter); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - Intent returnIntent = new Intent(); - setResult(Activity.RESULT_OK, returnIntent); - finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void finishNativeInitialization() { - super.finishNativeInitialization(); - - initState(); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "finishNativeInitialization " + e); - } - assert mJsonRpcService != null && mWalletModel != null; - setUpAssetList(); - LiveDataUtil.observeOnce(getNetworkModel().mDefaultNetwork, - selectedNetwork -> { fetchAccountInfo(selectedNetwork); }); - } - - @Override - public void onAssetClick(BlockchainToken asset) { - Utils.openAssetDetailsActivity(AccountDetailActivity.this, asset); - } - - @Override - public void onTransactionClick(TransactionInfo txInfo) { - if (mWalletModel == null) return; - NetworkInfo txNetwork = getNetworkModel().getNetwork(txInfo.chainId); - Utils.openTransaction(txInfo, this, txNetwork.coin, txNetwork); - } - - @Override - public void onTxApprovedRejected(boolean approved, String txId) {} - - @Override - public void onTxPending(String txId) {} - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == Utils.ACCOUNT_REQUEST_CODE) { - if (resultCode == Activity.RESULT_OK && data != null) { - String name = data.getStringExtra(Utils.NAME); - if (name != null) { - mAccountInfo.name = name; - mAccountText.setText(name); - } - } - } - } - - @Override - public void onBackPressed() { - super.onBackPressed(); - - Intent returnIntent = new Intent(); - setResult(Activity.RESULT_OK, returnIntent); - finish(); - } - - @Override - public void onTransactionStatusChanged(TransactionInfo txInfo) { - mWalletTxCoinAdapter.onTransactionUpdate(txInfo); - } - - private void initState() { - mWalletTxCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - } - - private NetworkModel getNetworkModel() { - return mWalletModel.getNetworkModel(); - } - - @Override - protected OneshotSupplier createProfileProvider() { - return new ActivityProfileProvider(getLifecycleDispatcher()); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailsWithQrActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailsWithQrActivity.java deleted file mode 100644 index fa4dad314d0..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountDetailsWithQrActivity.java +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import android.content.Context; -import android.content.Intent; -import android.graphics.Bitmap; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.Toolbar; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.MultiFormatWriter; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletUtils; - -public class AccountDetailsWithQrActivity extends BraveWalletBaseActivity { - private static final int WIDTH = 300; - - private ImageView qrCodeImage; - private AccountInfo mAccountInfo; - - public static Intent createIntent(@NonNull Context context, @NonNull AccountInfo accountInfo) { - Intent intent = new Intent(context, AccountDetailsWithQrActivity.class); - WalletUtils.addAccountInfoToIntent(intent, accountInfo); - return intent; - } - - @Override - protected void triggerLayoutInflation() { - setContentView(R.layout.activity_account_details_with_qr); - - if (getIntent() != null) { - mAccountInfo = WalletUtils.getAccountInfoFromIntent(getIntent()); - } - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(getResources().getString(R.string.account_details)); - - qrCodeImage = findViewById(R.id.qr_code_image); - fillQrCode(mAccountInfo.address); - - TextView accountValueText = findViewById(R.id.account_value_text); - accountValueText.setText(Utils.stripAccountAddress(mAccountInfo.address)); - - ImageView accountCopyImage = findViewById(R.id.account_copy_image); - accountCopyImage.setOnClickListener(v - -> Utils.saveTextToClipboard(AccountDetailsWithQrActivity.this, - mAccountInfo.address, R.string.address_has_been_copied, false)); - - EditText accountNameText = findViewById(R.id.account_name_text); - accountNameText.setText(mAccountInfo.name); - accountNameText.setEnabled(false); - - TextView privateKeyText = findViewById(R.id.account_private_key_text); - privateKeyText.setOnClickListener(v -> { - Intent intent = AccountPrivateKeyActivity.createIntent( - AccountDetailsWithQrActivity.this, mAccountInfo); - startActivity(intent); - }); - - onInitialLayoutInflationComplete(); - } - - private void fillQrCode(String qrData) { - final int WHITE = 0xFFFFFFFF; - final int BLACK = 0xFF000000; - new Thread(new Runnable() { - @Override - public void run() { - // Generate QR code - BitMatrix result; - try { - result = new MultiFormatWriter().encode( - qrData, BarcodeFormat.QR_CODE, WIDTH, WIDTH, null); - } catch (WriterException e) { - Log.e("AccountDetailsWithQrActivity", "QR code unsupported format: " + e); - return; - } - int w = result.getWidth(); - int h = result.getHeight(); - int[] pixels = new int[w * h]; - for (int y = 0; y < h; y++) { - int offset = y * w; - for (int x = 0; x < w; x++) { - pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; - } - } - Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - bitmap.setPixels(pixels, 0, WIDTH, 0, 0, w, h); - runOnUiThread(new Runnable() { - @Override - public void run() { - qrCodeImage.setImageBitmap(bitmap); - qrCodeImage.invalidate(); - } - }); - } - }).start(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity.java deleted file mode 100644 index ab6d2b37156..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity.java +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import android.content.Context; -import android.content.Intent; -import android.hardware.biometrics.BiometricPrompt; -import android.os.Build; -import android.os.CancellationSignal; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.text.method.HideReturnsTransformationMethod; -import android.text.method.PasswordTransformationMethod; -import android.view.MotionEvent; -import android.view.View; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.crypto_wallet.util.KeystoreHelper; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletUtils; - -import java.util.concurrent.Executor; - -public class AccountPrivateKeyActivity extends BraveWalletBaseActivity { - private AccountInfo mAccountInfo; - - private String mPasswordFromBiometric; - private boolean mIsPrivateKeyShown; - private boolean mIsPasswordEntered; - private TextView mWalletTitle; - private EditText mWalletPassword; - private EditText mPrivateKeyText; - private ImageView mBiometricWalletImage; - private Button mShowPrivateKeyBtn; - - public static Intent createIntent(@NonNull Context context, @NonNull AccountInfo accountInfo) { - Intent intent = new Intent(context, AccountPrivateKeyActivity.class); - WalletUtils.addAccountInfoToIntent(intent, accountInfo); - return intent; - } - - @Override - protected void triggerLayoutInflation() { - getWindow().setFlags( - WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); - setContentView(R.layout.activity_account_private_key); - - if (getIntent() != null) { - mAccountInfo = WalletUtils.getAccountInfoFromIntent(getIntent()); - } - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(getResources().getString(R.string.private_key)); - - mWalletTitle = findViewById(R.id.tv_wallet_password_title); - mWalletPassword = findViewById(R.id.et_wallet_password); - mBiometricWalletImage = findViewById(R.id.iv_biometric_unlock_wallet); - mPrivateKeyText = findViewById(R.id.private_key_text); - - TextView copyToClipboardText = findViewById(R.id.copy_to_clipboard_text); - copyToClipboardText.setOnClickListener(v - -> Utils.saveTextToClipboard(AccountPrivateKeyActivity.this, - mPrivateKeyText.getText().toString(), R.string.text_has_been_copied, true)); - - LinearLayout bannerLayout = findViewById(R.id.wallet_backup_banner); - bannerLayout.setVisibility(View.VISIBLE); - - TextView warningText = findViewById(R.id.warning_text); - warningText.setText(getResources().getString(R.string.private_key_warning_text)); - - ImageView bannerBtn = findViewById(R.id.backup_banner_close); - bannerBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - bannerLayout.setVisibility(View.GONE); - } - }); - mPasswordFromBiometric = ""; - mWalletPassword.addTextChangedListener(new FilterTextWatcherPassword()); - - mShowPrivateKeyBtn = findViewById(R.id.btn_show_private_key); - mShowPrivateKeyBtn.setOnClickListener(v -> { - if (mIsPasswordEntered) { - if (!mIsPrivateKeyShown) { - mPrivateKeyText.setTransformationMethod( - HideReturnsTransformationMethod.getInstance()); - mShowPrivateKeyBtn.setText(getResources().getString(R.string.hide_private_key)); - } else { - mPrivateKeyText.setTransformationMethod( - PasswordTransformationMethod.getInstance()); - mShowPrivateKeyBtn.setText(getResources().getString(R.string.show_private_key)); - } - mIsPrivateKeyShown = !mIsPrivateKeyShown; - } else { - String passwordToUse = mPasswordFromBiometric.isEmpty() - ? mWalletPassword.getText().toString() - : mPasswordFromBiometric; - mKeyringService.encodePrivateKeyForExport( - mAccountInfo.accountId, passwordToUse, (privateKey) -> { - if (privateKey.isEmpty()) { - showPasswordRelatedControls(true); - mWalletPassword.setError( - getString(R.string.incorrect_password_error)); - - return; - } - mIsPasswordEntered = true; - showPasswordRelatedControls(false); - findViewById(R.id.ll_private_key_layout).setVisibility(View.VISIBLE); - - mPrivateKeyText.setText(privateKey); - mShowPrivateKeyBtn.setText( - getResources().getString(R.string.show_private_key)); - }); - } - }); - mBiometricWalletImage.setOnClickListener(v -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P - && Utils.isBiometricAvailable(this)) { - showPasswordRelatedControls(false); - createBiometricPrompt(); - } - }); - - onInitialLayoutInflationComplete(); - - checkOnBiometric(); - } - - private class FilterTextWatcherPassword implements TextWatcher { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - enableDisableContinueButton(); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - - @Override - public void afterTextChanged(Editable s) {} - } - - private void checkOnBiometric() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P - || !KeystoreHelper.shouldUseBiometricOnUnlock() - || !Utils.isBiometricAvailable(this)) { - showPasswordRelatedControls(true); - - return; - } - createBiometricPrompt(); - } - - private void showPasswordRelatedControls(boolean show) { - int visibility = show ? View.VISIBLE : View.GONE; - mWalletTitle.setVisibility(visibility); - mWalletPassword.setVisibility(visibility); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && Utils.isBiometricAvailable(this) - && KeystoreHelper.shouldUseBiometricOnUnlock()) { - mBiometricWalletImage.setVisibility(visibility); - } - } - - private void enableDisableContinueButton() { - if (!TextUtils.isEmpty(mWalletPassword.getText()) || !mPasswordFromBiometric.isEmpty()) { - mShowPrivateKeyBtn.setEnabled(true); - mShowPrivateKeyBtn.setAlpha(1.0f); - } else { - mShowPrivateKeyBtn.setEnabled(false); - mShowPrivateKeyBtn.setAlpha(0.5f); - } - } - - @RequiresApi(api = Build.VERSION_CODES.P) - private void createBiometricPrompt() { - final BiometricPrompt.AuthenticationCallback authenticationCallback = - new BiometricPrompt.AuthenticationCallback() { - @Override - public void onAuthenticationSucceeded( - BiometricPrompt.AuthenticationResult result) { - super.onAuthenticationSucceeded(result); - // We authenticated using fingerprint - try { - mPasswordFromBiometric = KeystoreHelper.decryptText(); - if (mPasswordFromBiometric.isEmpty()) { - showPasswordRelatedControls(true); - - return; - } - enableDisableContinueButton(); - mShowPrivateKeyBtn.performClick(); - } catch (Exception exc) { - showPasswordRelatedControls(true); - - return; - } - } - - @Override - public void onAuthenticationError(int errorCode, CharSequence errString) { - super.onAuthenticationError(errorCode, errString); - - if (!TextUtils.isEmpty(errString)) { - Toast.makeText(AccountPrivateKeyActivity.this, errString, - Toast.LENGTH_SHORT) - .show(); - } - // Even though we have an error, we still let to proceed - showPasswordRelatedControls(true); - } - }; - showFingerprintDialog(authenticationCallback); - } - - @RequiresApi(api = Build.VERSION_CODES.P) - private void showFingerprintDialog( - @NonNull final BiometricPrompt.AuthenticationCallback authenticationCallback) { - Executor executor = ContextCompat.getMainExecutor(this); - new BiometricPrompt.Builder(this) - .setTitle(getResources().getString(R.string.fingerprint_unlock)) - .setDescription(getResources().getString(R.string.use_fingerprint_text)) - .setNegativeButton(getResources().getString(android.R.string.cancel), executor, - (dialog, which) - -> authenticationCallback.onAuthenticationError( - BiometricPrompt.BIOMETRIC_ERROR_USER_CANCELED, "")) - .build() - .authenticate(new CancellationSignal(), executor, authenticationCallback); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - if (getCurrentFocus() != null) { - InputMethodManager imm = - (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); - } - return super.dispatchTouchEvent(ev); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountSelectorActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountSelectorActivity.java index 478a2f8473f..c3f8b3a3633 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountSelectorActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountSelectorActivity.java @@ -7,6 +7,7 @@ package org.chromium.chrome.browser.crypto_wallet.activities; import android.annotation.SuppressLint; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.appbar.MaterialToolbar; @@ -18,22 +19,22 @@ import org.chromium.brave_wallet.mojom.AccountKind; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.app.domain.KeyringModel; -import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; +import org.chromium.chrome.browser.crypto_wallet.adapters.AccountSelectorRecyclerView; import org.chromium.chrome.browser.crypto_wallet.fragments.CreateAccountBottomSheetFragment; -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.listeners.AccountSelectorItemListener; +import org.chromium.chrome.browser.crypto_wallet.model.AccountSelectorItemModel; import org.chromium.chrome.browser.crypto_wallet.util.WalletUtils; import java.util.ArrayList; import java.util.List; -public class AccountSelectorActivity - extends BraveWalletBaseActivity implements OnWalletListItemClick { +public class AccountSelectorActivity extends BraveWalletBaseActivity + implements AccountSelectorItemListener { private static final String TAG = "AccountSelector"; private KeyringModel mKeyringModel; private RecyclerView mRVNetworkSelector; - private WalletCoinAdapter mWalletCoinAdapter; + private AccountSelectorRecyclerView mAccountSelectorRecyclerView; private AccountInfo[] mAccountInfos; @Override @@ -52,10 +53,9 @@ public class AccountSelectorActivity private void init() { mRVNetworkSelector = findViewById(R.id.rv_account_selector_activity); - mWalletCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.SELECT_ACCOUNTS_LIST); - mRVNetworkSelector.setAdapter(mWalletCoinAdapter); - mWalletCoinAdapter.setOnWalletListItemClick(this); + mAccountSelectorRecyclerView = new AccountSelectorRecyclerView(); + mRVNetworkSelector.setAdapter(mAccountSelectorRecyclerView); + mAccountSelectorRecyclerView.setAccountSelectorItemListener(this); initAccounts(); MaterialToolbar toolbar = findViewById(R.id.toolbar); @@ -68,47 +68,54 @@ public class AccountSelectorActivity } @Override - public void onAccountClick(WalletListItemModel walletListItemModel) { - if (walletListItemModel.getAccountInfo() == null) { + public void onAccountClick(@NonNull final AccountSelectorItemModel accountSelectorItemModel) { + if (accountSelectorItemModel.getAccountInfo() == null) { return; } - mKeyringModel.setSelectedAccount(walletListItemModel.getAccountInfo()); + mKeyringModel.setSelectedAccount(accountSelectorItemModel.getAccountInfo()); finish(); } @SuppressLint("NotifyDataSetChanged") private void initAccounts() { - mKeyringModel.mSelectedAccount.observe(this, selectedAccountInfo -> { - if (selectedAccountInfo == null) return; + mKeyringModel.mSelectedAccount.observe( + this, + selectedAccountInfo -> { + if (selectedAccountInfo == null) return; - boolean callDataSetChanged = true; - if (mAccountInfos != null) { - for (AccountInfo accountInfo : mAccountInfos) { - if (WalletUtils.accountIdsEqual(selectedAccountInfo, accountInfo)) { - callDataSetChanged = false; - break; + boolean callDataSetChanged = true; + if (mAccountInfos != null) { + for (AccountInfo accountInfo : mAccountInfos) { + if (WalletUtils.accountIdsEqual(selectedAccountInfo, accountInfo)) { + callDataSetChanged = false; + break; + } + } } - } - } - if (!callDataSetChanged) return; + if (!callDataSetChanged) return; - mKeyringModel.getAccounts(accountInfos -> { - mAccountInfos = accountInfos; - List walletListItemModelList = new ArrayList<>(); - for (AccountInfo accountInfo : mAccountInfos) { - // TODO(apaymyshev): Why I'm not allowed to select imported account? - if (accountInfo.accountId.kind != AccountKind.IMPORTED) { - walletListItemModelList.add( - WalletListItemModel.makeForAccountInfo(accountInfo)); - } - } + mKeyringModel.getAccounts( + accountInfos -> { + mAccountInfos = accountInfos; + List accountSelectorItemModelList = + new ArrayList<>(); + for (AccountInfo accountInfo : mAccountInfos) { + // TODO(apaymyshev): Why I'm not allowed to select imported + // account? + if (accountInfo.accountId.kind != AccountKind.IMPORTED) { + accountSelectorItemModelList.add( + AccountSelectorItemModel.makeForAccountInfo( + accountInfo)); + } + } - mWalletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - mWalletCoinAdapter.notifyDataSetChanged(); - mWalletCoinAdapter.updateSelectedNetwork( - selectedAccountInfo.name, selectedAccountInfo.address); - }); - }); + mAccountSelectorRecyclerView.setWalletListItemModelList( + accountSelectorItemModelList); + mAccountSelectorRecyclerView.notifyDataSetChanged(); + mAccountSelectorRecyclerView.updateSelectedNetwork( + selectedAccountInfo.name, selectedAccountInfo.address); + }); + }); } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAccountActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAccountActivity.java index 6186af01ba1..d4913f95689 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAccountActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAccountActivity.java @@ -22,6 +22,7 @@ import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; import org.chromium.base.Log; @@ -59,13 +60,7 @@ public class AddAccountActivity extends BraveWalletBaseActivity { @FilecoinNetworkType private String mSelectedFilecoinNetwork; - public static Intent createIntentToEditAccount( - @NonNull Context context, @NonNull AccountInfo accountInfo) { - Intent intent = new Intent(context, AddAccountActivity.class); - WalletUtils.addAccountInfoToIntent(intent, accountInfo); - return intent; - } - + @NonNull public static Intent createIntentToAddAccount( @NonNull Context context, @CoinType.EnumType int coinForNewAccount) { Intent intent = new Intent(context, AddAccountActivity.class); @@ -160,7 +155,10 @@ public class AddAccountActivity extends BraveWalletBaseActivity { Button btnAdd = findViewById(R.id.btn_add); btnAdd.setText(getResources().getString(R.string.update)); mAddAccountText.setText(mEditedAccountInfo.name); - getSupportActionBar().setTitle(getResources().getString(R.string.update_account)); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setTitle(getResources().getString(R.string.update_account)); + } findViewById(R.id.import_account_layout).setVisibility(View.GONE); findViewById(R.id.import_account_title).setVisibility(View.GONE); return; @@ -186,7 +184,7 @@ public class AddAccountActivity extends BraveWalletBaseActivity { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { - sb.append(line + "\n"); + sb.append(line).append("\n"); } String content = sb.toString(); if (Utils.isJSONValid(content)) { @@ -216,8 +214,10 @@ public class AddAccountActivity extends BraveWalletBaseActivity { } private void updateAccountName() { - mKeyringService.setAccountName(mEditedAccountInfo.accountId, - mAddAccountText.getText().toString(), result -> { handleUpdateAccount(result); }); + mKeyringService.setAccountName( + mEditedAccountInfo.accountId, + mAddAccountText.getText().toString(), + this::handleUpdateAccount); } private void handleImportAccount(boolean result, boolean fromJson) { @@ -240,25 +240,37 @@ public class AddAccountActivity extends BraveWalletBaseActivity { if (Utils.isJSONValid(privateKey)) { // Import account from JSON. String accountPassword = mImportAccountPasswordText.getText().toString(); - mKeyringService.importAccountFromJson(accountName, accountPassword, privateKey, - (account) -> { handleImportAccount(account != null, true); }); + mKeyringService.importAccountFromJson( + accountName, + accountPassword, + privateKey, + (account) -> handleImportAccount(account != null, true)); } else { // Import account from string. if (coinType == CoinType.FIL) { - mKeyringService.importFilecoinAccount(accountName, privateKey.trim(), + mKeyringService.importFilecoinAccount( + accountName, + privateKey.trim(), mSelectedFilecoinNetwork, - (account) -> { handleImportAccount(account != null, false); }); + (account) -> handleImportAccount(account != null, false)); } else { - mKeyringService.importAccount(accountName, privateKey.trim(), coinType, - (account) -> { handleImportAccount(account != null, false); }); + mKeyringService.importAccount( + accountName, + privateKey.trim(), + coinType, + (account) -> handleImportAccount(account != null, false)); } } } private void addAccount(@CoinType.EnumType int coinType) { - mWalletModel.getKeyringModel().addAccount(coinType, mSelectedFilecoinNetwork, - mAddAccountText.getText().toString(), - result -> { handleAddAccountResult(result); }); + mWalletModel + .getKeyringModel() + .addAccount( + coinType, + mSelectedFilecoinNetwork, + mAddAccountText.getText().toString(), + this::handleAddAccountResult); } private void handleAddAccountResult(boolean result) { @@ -273,8 +285,11 @@ public class AddAccountActivity extends BraveWalletBaseActivity { private void setupFilecoinNetworkSpinner() { mFilecoinNetworkSpinner.setVisibility(View.VISIBLE); ArrayAdapter filecoinNetworkArrayAdapter = - new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, - Arrays.asList(getString(R.string.wallet_filecoin_mainnet), + new ArrayAdapter( + this, + android.R.layout.simple_spinner_dropdown_item, + Arrays.asList( + getString(R.string.wallet_filecoin_mainnet), getString(R.string.wallet_filecoin_testnet))); filecoinNetworkArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAssetActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAssetActivity.java deleted file mode 100644 index a36b084a7eb..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AddAssetActivity.java +++ /dev/null @@ -1,265 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import android.content.Context; -import android.content.Intent; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Button; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.Toolbar; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.BraveWalletService; -import org.chromium.brave_wallet.mojom.CoinType; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.NetworkModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.adapters.NetworkSpinnerAdapter; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletUtils; -import org.chromium.chrome.browser.util.LiveDataUtil; - -import java.util.Collections; - -/** - * Activity to add new assets or NFTs depending on the boolean value passed in the intent. - * {@see AddAssetActivity.getIntent(Context, boolean)}. - * Used by {@code EditVisibleAssetsBottomSheetDialogFragment}. - */ -public class AddAssetActivity extends BraveWalletBaseActivity implements TextWatcher { - private static final String TAG = "AddAssetActivity"; - - private static final String NFT_CUSTOM_ASSET = "nftCustomAsset"; - - private WalletModel mWalletModel; - private NetworkModel mNetworkModel; - private NetworkInfo mNetworkInfo; - - private boolean mNftsOnly; - private boolean mPauseTextWatcher; - private boolean mOnStartWithNativeCalled; - - private Toolbar mToolbar; - private Spinner mNetworkSpinner; - private View mTokenIdSection; - private View mTokenDecimalSection; - private TextView mTvDecimalTitle; - private EditText mTokenDecimalsEdit; - private TextView mTvAddressTitle; - private NetworkSpinnerAdapter mNetworkAdapter; - private Button mAdd; - private EditText mTokenNameEdit; - private EditText mTokenContractAddressEdit; - private EditText mTokenSymbolEdit; - private EditText mTokenIdEdit; - - /** - * Gets intent to start new activity {@code AddAssetActivity}. - * @param context Android context required to instantiate the intent. - * @param nftOnly {@code true} if the activity will add a new NFT, - * {@code false} to add a new custom asset. - * @return Intent to start new activity {@code AddAssetActivity}. - */ - public static Intent getIntent(@NonNull final Context context, final boolean nftOnly) { - Intent intent = new Intent(context, AddAssetActivity.class); - intent.putExtra(NFT_CUSTOM_ASSET, nftOnly); - return intent; - } - - @Override - protected void onPreCreate() { - Intent intent = getIntent(); - mNftsOnly = intent.getBooleanExtra(NFT_CUSTOM_ASSET, false); - } - - @Override - protected void triggerLayoutInflation() { - setContentView(R.layout.activity_add_asset); - - mToolbar = findViewById(R.id.toolbar); - mToolbar.setTitle(mNftsOnly ? R.string.wallet_add_nft : R.string.wallet_add_custom_asset); - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - mNetworkSpinner = findViewById(R.id.network_spinner); - mNetworkAdapter = new NetworkSpinnerAdapter(this, Collections.emptyList()); - mNetworkSpinner.setAdapter(mNetworkAdapter); - mTokenIdSection = findViewById(R.id.token_id_section); - mTokenDecimalSection = findViewById(R.id.token_decimal_section); - mTvDecimalTitle = findViewById(R.id.token_decimals_title); - mTokenDecimalsEdit = findViewById(R.id.token_decimals); - mTvAddressTitle = findViewById(R.id.token_contract_address_title); - - mAdd = findViewById(R.id.add); - mTokenNameEdit = findViewById(R.id.token_name); - mTokenContractAddressEdit = findViewById(R.id.token_contract_address); - mTokenSymbolEdit = findViewById(R.id.token_symbol); - mTokenIdEdit = findViewById(R.id.token_id); - - onInitialLayoutInflationComplete(); - } - - @Override - public void onStartWithNative() { - super.onStartWithNative(); - if (mOnStartWithNativeCalled) { - return; - } - mOnStartWithNativeCalled = true; - - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mNetworkModel = mWalletModel.getNetworkModel(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "Error onStartWithNative.", e); - } - - LiveDataUtil.observeOnce(mNetworkModel.mCryptoNetworks, - networkInfoList -> { mNetworkAdapter.setNetworks(networkInfoList); }); - - mNetworkSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - mNetworkInfo = mNetworkAdapter.getNetwork(position); - - mTokenDecimalSection.setVisibility(mNftsOnly ? View.GONE : View.VISIBLE); - if (mNetworkInfo.coin == CoinType.ETH || mNetworkInfo.coin == CoinType.FIL) { - mTokenIdSection.setVisibility(mNftsOnly ? View.VISIBLE : View.GONE); - mTvAddressTitle.setText(R.string.wallet_add_custom_asset_token_address); - } else if (mNetworkInfo.coin == CoinType.SOL) { - mTokenIdSection.setVisibility(View.GONE); - mTvAddressTitle.setText(R.string.wallet_add_custom_asset_mint_address); - } - } - @Override - public void onNothingSelected(AdapterView parent) { /* No-op. */ - } - }); - - mAdd.setOnClickListener(v -> { - BraveWalletService braveWalletService = getBraveWalletService(); - assert braveWalletService != null; - final NetworkInfo networkInfo = - mNetworkAdapter.getNetwork(mNetworkSpinner.getSelectedItemPosition()); - final BlockchainToken token = new BlockchainToken(); - token.contractAddress = mTokenContractAddressEdit.getText().toString(); - token.name = mTokenNameEdit.getText().toString(); - token.logo = ""; - String tokenId = mTokenIdEdit.getText().toString(); - token.tokenId = Utils.toHex(tokenId); - boolean isErc721 = !tokenId.trim().isEmpty(); - token.isErc20 = !isErc721; - token.isErc721 = isErc721; - token.isNft = isErc721; - token.symbol = mTokenSymbolEdit.getText().toString(); - token.decimals = networkInfo.decimals; - token.chainId = networkInfo.chainId; - token.coin = networkInfo.coin; - try { - token.decimals = Integer.valueOf(mTokenDecimalsEdit.getText().toString()); - } catch (NumberFormatException numberFormatException) { - Log.e(TAG, "Error when parsing token decimals.", numberFormatException); - } - if (networkInfo.coin == CoinType.SOL) { - token.isNft = mNftsOnly; - if (mNftsOnly) { - token.decimals = 0; - } - } - token.visible = true; - - braveWalletService.addUserAsset(token, success -> { - if (success) { - Intent intent = new Intent(); - WalletUtils.addBlockchainTokenToIntent(intent, token); - WalletUtils.addNetworkInfoToIntent(intent, networkInfo); - setResult(RESULT_OK, intent); - } else { - Log.e(TAG, "Error when adding user asset."); - } - finish(); - }); - }); - - mTokenNameEdit.addTextChangedListener(this); - mTokenContractAddressEdit.addTextChangedListener(this); - mTokenSymbolEdit.addTextChangedListener(this); - mTokenDecimalsEdit.addTextChangedListener(this); - mTokenIdEdit.addTextChangedListener(this); - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (mPauseTextWatcher) return; - String contractAddress = mTokenContractAddressEdit.getText().toString(); - String contractAddressTrimmed = contractAddress.trim(); - if (!contractAddress.equals(contractAddressTrimmed)) { - // Update the contractAddress and process it within the next onTextChanged pass. - mTokenContractAddressEdit.setText(contractAddressTrimmed, TextView.BufferType.EDITABLE); - return; - } - String tokenName = mTokenNameEdit.getText().toString(); - String tokenSymbol = mTokenNameEdit.getText().toString(); - - mTokenIdEdit.setEnabled(true); - mAdd.setEnabled(false); - - // AssetRatioService::GetTokenInfo has been removed in favour of - // JsonRpcService::GetEthTokenInfo, which is a chain-agnostic method - // to query EVM token info. - // - // AssetRatioService assetRatioService = getAssetRatioService(); - // assert assetRatioService != null; - // if (!contractAddress.isEmpty() && mNetworkInfo.coin == CoinType.ETH) { - // assetRatioService.getTokenInfo(contractAddress, token -> { - // if (token != null) { - // mPauseTextWatcher = true; - // mTokenNameEdit.setText(token.name, TextView.BufferType.EDITABLE); - // mTokenSymbolEdit.setText(token.symbol, TextView.BufferType.EDITABLE); - // mTokenDecimalsEdit.setText( - // String.valueOf(token.decimals), TextView.BufferType.EDITABLE); - // if (!token.isErc721) mTokenIdEdit.setEnabled(false); - // mPauseTextWatcher = false; - // if (!mNftsOnly - // || (token.isErc721 && !mTokenIdEdit.getText().toString().isEmpty()) - // || !token.isErc721) { - // mAdd.setEnabled(true); - // } - // } - // }); - // } - - if (tokenName.isEmpty() - || tokenSymbol.isEmpty() - || (mNetworkInfo.coin == CoinType.ETH - && ((mNftsOnly && mTokenIdEdit.getText().toString().isEmpty()) - || mTokenDecimalsEdit.getText().toString().isEmpty()))) { - return; - } - - mAdd.setEnabled(true); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* No-op. */ - } - - @Override - public void afterTextChanged(Editable s) { /* No-op. */ - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java deleted file mode 100644 index ea2351256f1..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java +++ /dev/null @@ -1,568 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import static org.chromium.ui.base.ViewUtils.dpToPx; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Looper; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.method.LinkMovementMethod; -import android.text.style.BulletSpan; -import android.util.DisplayMetrics; -import android.view.MotionEvent; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; -import androidx.cardview.widget.CardView; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.CustomTarget; -import com.bumptech.glide.request.transition.Transition; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.chromium.base.ContextUtils; -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.AssetPriceTimeframe; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.CoinType; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.MarketModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.app.helpers.ImageLoader; -import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; -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.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -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.crypto_wallet.web_ui.WebUiActivityType; -import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; -import org.chromium.chrome.browser.util.LiveDataUtil; -import org.chromium.chrome.browser.util.TabUtils; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class AssetDetailActivity - extends BraveWalletBaseActivity implements OnWalletListItemClick, ApprovedTxObserver { - private static final int ASSET_LOGO_SIZE_DP = 23; - - private SmoothLineChartEquallySpaced chartES; - private int checkedTimeframeType; - private String mAssetSymbol; - private String mAssetName; - private String mAssetId; - private String mChainId; - private boolean mIsMarketCoin; - private int mMarketCapRank; - private double mVolume24Hour; - private double mMarketCap; - private String mContractAddress; - private String mAssetLogo; - private int mAssetDecimals; - private int mCoinType; - private BlockchainToken mAsset; - private ExecutorService mExecutor; - private Handler mHandler; - private AccountInfo[] mAccountInfos; - private WalletCoinAdapter mWalletTxCoinAdapter; - private Button mBtnBuy; - private Button mBtnSwap; - private Button mBtnBridgeToAurora; - private boolean mHasNewTx; - private boolean mNativeInitialized; - private boolean mShouldShowDialog; - private WalletModel mWalletModel; - private MarketModel mMarketModel; - private NetworkInfo mAssetNetwork; - - @Override - protected void triggerLayoutInflation() { - setContentView(R.layout.activity_asset_detail); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mMarketModel = mWalletModel.getMarketModel(); - if (mWalletModel == null || mMarketModel == null) { - finish(); - return; - } - } catch (BraveActivity.BraveActivityNotFoundException ignored) { - finish(); - return; - } - - final Intent intent = getIntent(); - if (intent != null) { - mChainId = intent.getStringExtra(Utils.CHAIN_ID); - mAssetSymbol = intent.getStringExtra(Utils.ASSET_SYMBOL); - mAssetName = intent.getStringExtra(Utils.ASSET_NAME); - mAssetId = intent.getStringExtra(Utils.ASSET_ID); - mIsMarketCoin = intent.getBooleanExtra(Utils.IS_MARKET_COIN, false); - mMarketCapRank = intent.getIntExtra(Utils.MARKET_CAP_RANK, -1); - mVolume24Hour = intent.getDoubleExtra(Utils.TOTAL_VOLUME, -1); - mMarketCap = intent.getDoubleExtra(Utils.MARKET_CAP, -1); - mContractAddress = intent.getStringExtra(Utils.ASSET_CONTRACT_ADDRESS); - mAssetLogo = intent.getStringExtra(Utils.ASSET_LOGO); - mAssetDecimals = intent.getIntExtra(Utils.ASSET_DECIMALS, Utils.ETH_DEFAULT_DECIMALS); - mCoinType = intent.getIntExtra(Utils.COIN_TYPE, CoinType.ETH); - if (mAssetSymbol.equals("ETH")) { - mAssetLogo = "eth.png"; - } - mAssetNetwork = mWalletModel.getNetworkModel().getNetwork(mChainId); - getBlockchainToken(() -> {}); - } - mExecutor = Executors.newSingleThreadExecutor(); - mHandler = new Handler(Looper.getMainLooper()); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - TextView assetTitleText = findViewById(R.id.asset_title_text); - assetTitleText.setText(mAssetName); - mBtnBuy = findViewById(R.id.btn_buy); - Button btnSend = findViewById(R.id.btn_send); - mBtnSwap = findViewById(R.id.btn_swap); - - if (mIsMarketCoin) { - TextView informationLabel = findViewById(R.id.information); - CardView marketCoinInfo = findViewById(R.id.card_view_market_coin_info); - AndroidUtils.show(informationLabel, marketCoinInfo); - - if (mMarketCapRank != -1) { - TextView rank = findViewById(R.id.rank); - rank.setText(String.valueOf(mMarketCapRank)); - } - - if (mVolume24Hour != -1) { - TextView volume = findViewById(R.id.volume); - volume.setText(mMarketModel.getFormattedUsdBillions(mVolume24Hour)); - } - - if (mMarketCap != -1) { - TextView marketCap = findViewById(R.id.market_cap); - marketCap.setText(mMarketModel.getFormattedUsdBillions(mMarketCap)); - } - - DisplayMetrics displayMetrics = - ContextUtils.getApplicationContext().getResources().getDisplayMetrics(); - final int sizePx = dpToPx(displayMetrics, ASSET_LOGO_SIZE_DP); - ImageLoader.downloadImage( - mAssetLogo, Glide.with(this), true, 0, new CustomTarget<>(sizePx, sizePx) { - @Override - public void onResourceReady(@NonNull Drawable resource, - @Nullable Transition transition) { - assetTitleText.setCompoundDrawablesRelativeWithIntrinsicBounds( - resource, null, null, null); - } - - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { - /* No-op. */ - } - }, null); - TextView accountsLabel = findViewById(R.id.accounts); - TextView transactionsLabel = findViewById(R.id.transactions); - AndroidUtils.gone(accountsLabel, transactionsLabel, mBtnBuy, btnSend, mBtnSwap); - } else if (!mAssetLogo.isEmpty()) { - String tokensPath = BlockchainRegistryFactory.getInstance().getTokensIconsLocation(); - String iconPath = - mAssetLogo.isEmpty() ? null : ("file://" + tokensPath + "/" + mAssetLogo); - Utils.setBitmapResource(mExecutor, mHandler, this, iconPath, - Utils.getCoinIcon(mCoinType), null, assetTitleText, false); - } else { - Utils.setBlockiesBitmapCustomAsset(mExecutor, mHandler, null, mContractAddress, - mAssetSymbol, getResources().getDisplayMetrics().density, assetTitleText, this, - false, (float) 0.5, true); - } - - TextView assetPriceText = findViewById(R.id.asset_price_text); - assetPriceText.setText(String.format( - getResources().getString(R.string.asset_price), mAssetName, mAssetSymbol)); - - if (!mIsMarketCoin && AssetUtils.isAuroraAddress(mContractAddress, mChainId)) { - mBtnSwap.setVisibility(View.GONE); - mBtnBridgeToAurora = findViewById(R.id.btn_aurora_bridge); - mBtnBridgeToAurora.setVisibility(View.VISIBLE); - SpannableString rainBowLearnMore = - Utils.createSpanForSurroundedPhrase( - this, - R.string.brave_wallet_rainbow_bridge_learn_more, - (v) -> - TabUtils.openLinkWithFocus( - this, WalletConstants.URL_RAINBOW_BRIDGE_OVERVIEW)); - rainBowLearnMore.setSpan( - new BulletSpan(15, getColor(R.color.wallet_text_color)), - 0, - rainBowLearnMore.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - SpannableString rainBowRisksLearnMore = - Utils.createSpanForSurroundedPhrase( - this, - R.string.brave_wallet_rainbow_bridge_risks_learn_more, - (v) -> { - TabUtils.openLinkWithFocus( - this, WalletConstants.URL_RAINBOW_BRIDGE_RISKS); - }); - rainBowRisksLearnMore.setSpan( - new BulletSpan(15, getColor(R.color.wallet_text_color)), - 0, - rainBowRisksLearnMore.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - SpannableStringBuilder spannableStringBuilder = - new SpannableStringBuilder(rainBowLearnMore); - spannableStringBuilder.append(System.getProperty(WalletConstants.LINE_SEPARATOR)); - spannableStringBuilder.append(System.getProperty(WalletConstants.LINE_SEPARATOR)); - spannableStringBuilder.append(rainBowRisksLearnMore); - - 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(); - - mShouldShowDialog = - ChromeSharedPreferences.getInstance() - .readBoolean(WalletConstants.PREF_SHOW_BRIDGE_INFO_DIALOG, true); - - TextView message = dialogView.findViewById(R.id.dialog_aurora_desc); - TextView title = dialogView.findViewById(R.id.dialog_aurora_tv_title); - TextView learnMore = dialogView.findViewById(R.id.dialog_aurora_tv_learn_more); - Button btnOpenRainBow = dialogView.findViewById(R.id.btn_open_rainbow_app); - - title.setText(getString(R.string.brave_wallet_aurora_modal_title, - getString(R.string.brave_wallet_rainbow_bridge))); - learnMore.setMovementMethod(LinkMovementMethod.getInstance()); - learnMore.setText(spannableStringBuilder); - btnOpenRainBow.setText(getString(R.string.brave_wallet_aurora_modal_open_button_text, - getString(R.string.brave_wallet_rainbow_bridge))); - CheckBox checkBox = dialogView.findViewById(R.id.dialog_aurora_cb_dont_show); - checkBox.setChecked(!mShouldShowDialog); - checkBox.setOnCheckedChangeListener( - (buttonView, isChecked) -> { - ChromeSharedPreferences.getInstance() - .writeBoolean( - WalletConstants.PREF_SHOW_BRIDGE_INFO_DIALOG, !isChecked); - mShouldShowDialog = !isChecked; - }); - - message.setMovementMethod(LinkMovementMethod.getInstance()); - message.setText(getString(R.string.brave_wallet_aurora_modal_description, - getString(R.string.brave_wallet_rainbow_bridge))); - btnOpenRainBow.setOnClickListener( - v -> TabUtils.openLinkWithFocus(this, WalletConstants.URL_RAINBOW_AURORA)); - - mBtnBridgeToAurora.setOnClickListener(v -> { - if (mShouldShowDialog) { - auroraDialog.show(); - } else { - TabUtils.openLinkWithFocus(this, WalletConstants.URL_RAINBOW_AURORA); - } - }); - } - if (!mIsMarketCoin) { - mBtnSwap.setOnClickListener( - v -> Utils.openBuySendSwapActivity(this, WebUiActivityType.SWAP)); - mBtnBuy.setOnClickListener( - v -> Utils.openBuySendSwapActivity(this, WebUiActivityType.BUY)); - btnSend.setOnClickListener( - v -> Utils.openBuySendSwapActivity(this, WebUiActivityType.SEND)); - } - adjustButtonsVisibilities(); - - RadioGroup radioGroup = findViewById(R.id.asset_duration_radio_group); - checkedTimeframeType = radioGroup.getCheckedRadioButtonId(); - radioGroup.setOnCheckedChangeListener((group, checkedId) -> { - ((RadioButton) findViewById(checkedTimeframeType)) - .setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - RadioButton button = findViewById(checkedId); - int timeframeType = Utils.getTimeframeFromRadioButtonId(checkedId); - getPriceHistory(mAssetSymbol, "usd", timeframeType); - checkedTimeframeType = checkedId; - }); - - final TextView assetPrice = findViewById(R.id.asset_price); - chartES = findViewById(R.id.line_chart); - chartES.setColors(new int[] {getColor(R.color.wallet_asset_graph_color)}); - chartES.drawLine(0, assetPrice); - chartES.setNoDrawText(true); - chartES.setOnTouchListener(new View.OnTouchListener() { - @Override - @SuppressLint("ClickableViewAccessibility") - public boolean onTouch(View v, MotionEvent event) { - v.getParent().requestDisallowInterceptTouchEvent(true); - SmoothLineChartEquallySpaced chartES = (SmoothLineChartEquallySpaced) v; - if (event.getAction() == MotionEvent.ACTION_MOVE - || event.getAction() == MotionEvent.ACTION_DOWN) { - chartES.drawLine(event.getRawX(), assetPrice); - } else if (event.getAction() == MotionEvent.ACTION_UP - || event.getAction() == MotionEvent.ACTION_CANCEL) { - chartES.drawLine(-1, null); - } - - return true; - } - }); - - onInitialLayoutInflationComplete(); - } - - @Override - public void onStart() { - super.onStart(); - if (!mIsMarketCoin && mHasNewTx) { - setUpAccountList(); - mHasNewTx = false; - } - } - - private void getPriceHistory(String asset, String vsAsset, int timeframe) { - if (mAssetRatioService != null) { - mAssetRatioService.getPriceHistory(asset, vsAsset, timeframe, - (result, priceHistory) -> { chartES.setData(priceHistory); }); - } - } - - private void getPrice(String asset, String vsAsset, int timeframe) { - assert mAssetRatioService != null; - String[] fromAssets = new String[] {asset.toLowerCase(Locale.ENGLISH)}; - String[] toAssets = new String[] {vsAsset.toLowerCase(Locale.ENGLISH)}; - mAssetRatioService.getPrice(fromAssets, toAssets, timeframe, (success, price) -> { - if (!success && price.length == 0) { - return; - } - String btcPriceText = price[0].price + " BTC"; - TextView btcPrice = findViewById(R.id.asset_price_btc_text); - btcPrice.setText(btcPriceText); - }); - } - - private void setUpAccountList() { - RecyclerView rvAccounts = findViewById(R.id.rv_accounts); - WalletCoinAdapter walletCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.ACCOUNTS_LIST); - mWalletTxCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - if (JavaUtils.anyNull(mWalletModel, mAssetNetwork)) return; - LiveDataUtil.observeOnce( - mWalletModel.getKeyringModel().mAccountInfos, accounts -> { - mAccountInfos = AssetUtils.filterAccountsByNetwork( - accounts, mAssetNetwork.coin, mChainId); - - WalletListItemModel thisAssetItemModel = new WalletListItemModel( - R.drawable.ic_eth, mAsset.name, mAsset.symbol, mAsset.tokenId, "", ""); - LiveDataUtil.observeOnce( - mWalletModel.getNetworkModel().mCryptoNetworks, allNetworks -> { - Utils.getTxExtraInfo(new WeakReference<>(this), - TokenUtils.TokenType.ALL, allNetworks, mAssetNetwork, - mAccountInfos, new BlockchainToken[] {mAsset}, false, - (assetPrices, fullTokenList, nativeAssetsBalances, - blockchainTokensBalances) -> { - thisAssetItemModel.setBlockchainToken(mAsset); - Utils.setUpTransactionList(this, mAccountInfos, - allNetworks, thisAssetItemModel, assetPrices, - fullTokenList, nativeAssetsBalances, - blockchainTokensBalances, mAssetNetwork, - this::showTransactionList); - - double assetPrice = Utils.getOrDefault(assetPrices, - mAsset.symbol.toLowerCase(Locale.ENGLISH), - 0.0d); - - List walletListItemModelList = - createAccountList(mAccountInfos, assetPrice, - nativeAssetsBalances, - blockchainTokensBalances); - - showAccounts(rvAccounts, walletCoinAdapter, - walletListItemModelList); - }); - }); - }); - } - - private void showTransactionList(List walletListItemModelList) { - mWalletTxCoinAdapter.setWalletCoinAdapterType( - WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - - mWalletTxCoinAdapter.setWalletListItemModelList(walletListItemModelList); - mWalletTxCoinAdapter.setOnWalletListItemClick(AssetDetailActivity.this); - mWalletTxCoinAdapter.setWalletListItemType(Utils.TRANSACTION_ITEM); - RecyclerView rvTransactions = findViewById(R.id.rv_transactions); - rvTransactions.setAdapter(mWalletTxCoinAdapter); - } - - private Double getAccountBalance(HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances, - String accountAddressLower) { - return Utils.isNativeToken(mAssetNetwork, mAsset) - ? Utils.getOrDefault(nativeAssetsBalances, accountAddressLower, 0.0d) - : Utils.getOrDefault(Utils.getOrDefault(blockchainTokensBalances, - accountAddressLower, new HashMap<>()), - Utils.tokenToString(mAsset), 0.0d); - } - - // Get back token from native. If cannot find then something is wrong - private void getBlockchainToken(Runnable callback) { - if (mIsMarketCoin) { - return; - } - if (mAsset != null || !mNativeInitialized || mAssetNetwork == null) { - callback.run(); - return; - } - - TokenUtils.getExactUserAsset(getBraveWalletService(), mAssetNetwork, mAssetNetwork.coin, - mAssetSymbol, mAssetName, mAssetId, mContractAddress, mAssetDecimals, token -> { - assert token != null; - mAsset = token; - callback.run(); - }); - } - - @Override - public void finishNativeInitialization() { - super.finishNativeInitialization(); - mNativeInitialized = true; - getPriceHistory(mAssetSymbol, "usd", AssetPriceTimeframe.ONE_DAY); - getPrice(mAssetSymbol, "btc", AssetPriceTimeframe.LIVE); - getBlockchainToken(this::setUpAccountList); - } - - @Override - public void onAccountClick(WalletListItemModel walletListItemModel) { - if (walletListItemModel.getAccountInfo() == null) { - return; - } - - Intent intent = - AccountDetailActivity.createIntent(this, walletListItemModel.getAccountInfo()); - startActivityForResult(intent, Utils.ACCOUNT_REQUEST_CODE); - } - - @Override - public void onTransactionClick(TransactionInfo txInfo) { - if (mWalletModel == null) return; - NetworkInfo txNetwork = mWalletModel.getNetworkModel().getNetwork(txInfo.chainId); - Utils.openTransaction(txInfo, this, mCoinType, txNetwork); - } - - @Override - public void onTxApprovedRejected(boolean approved, String txId) {} - - @Override - public void onTxPending(String txId) {} - - @Override - public void onTransactionStatusChanged(TransactionInfo txInfo) { - mWalletTxCoinAdapter.onTransactionUpdate(txInfo); - } - - @Override - public void onNewUnapprovedTx(TransactionInfo txInfo) { - mHasNewTx = true; - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == Utils.ACCOUNT_REQUEST_CODE) { - if (resultCode == Activity.RESULT_OK) { - setUpAccountList(); - } - } - } - - private List createAccountList(AccountInfo[] accountInfos, - double assetPrice, HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances) { - List walletListItemModelList = new ArrayList<>(); - for (AccountInfo accountInfo : accountInfos) { - final String accountAddressLower = accountInfo.address.toLowerCase(Locale.ENGLISH); - double thisAccountBalance = getAccountBalance( - nativeAssetsBalances, blockchainTokensBalances, accountAddressLower); - final String fiatBalanceString = - String.format(Locale.ENGLISH, "$%,.2f", assetPrice * thisAccountBalance); - final String cryptoBalanceString = - String.format(Locale.ENGLISH, "%.4f %s", thisAccountBalance, mAsset.symbol); - - walletListItemModelList.add(WalletListItemModel.makeForAccountInfoWithBalances( - accountInfo, fiatBalanceString, cryptoBalanceString)); - } - return walletListItemModelList; - } - - private void showAccounts(RecyclerView rvAccounts, WalletCoinAdapter walletCoinAdapter, - List walletListItemModelList) { - walletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - walletCoinAdapter.setOnWalletListItemClick(this); - walletCoinAdapter.setWalletListItemType(Utils.ACCOUNT_ITEM); - rvAccounts.setAdapter(walletCoinAdapter); - rvAccounts.setLayoutManager(new LinearLayoutManager(this)); - } - - private void adjustButtonsVisibilities() { - if (mIsMarketCoin) { - return; - } - showHideBuyUi(); - if (Utils.allowSwap(mChainId)) { - mBtnSwap.setVisibility(View.VISIBLE); - } else { - mBtnSwap.setVisibility(View.GONE); - } - } - - private void showHideBuyUi() { - if (!Utils.allowBuy(mChainId)) { - AndroidUtils.gone(mBtnBuy); - return; - } - if (JavaUtils.anyNull(mWalletModel, mAssetNetwork)) return; - - TokenUtils.isBuySupported(mWalletModel.getBlockchainRegistry(), mAssetNetwork, mAssetSymbol, - mContractAddress, mChainId, isBuyEnabled -> { - if (isBuyEnabled) { - AndroidUtils.show(mBtnBuy); - } else { - AndroidUtils.gone(mBtnBuy); - } - }); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java index d3d6f2d2625..290183861a3 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletActivity.java @@ -8,34 +8,25 @@ package org.chromium.chrome.browser.crypto_wallet.activities; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.appcompat.view.menu.MenuBuilder; -import androidx.core.content.ContextCompat; import androidx.viewpager.widget.ViewPager; -import androidx.viewpager2.widget.ViewPager2; import com.google.android.material.appbar.MaterialToolbar; -import com.google.android.material.bottomnavigation.BottomNavigationView; import org.chromium.base.ActivityState; import org.chromium.base.ApplicationStatus; import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.BraveWalletConstants; -import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.brave_wallet.mojom.OnboardingAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.app.domain.NetworkModel; import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.adapters.CryptoFragmentPageAdapter; import org.chromium.chrome.browser.crypto_wallet.adapters.CryptoWalletOnboardingPagerAdapter; -import org.chromium.chrome.browser.crypto_wallet.fragments.PortfolioFragment; -import org.chromium.chrome.browser.crypto_wallet.fragments.SwapBottomSheetDialogFragment; import org.chromium.chrome.browser.crypto_wallet.fragments.UnlockWalletFragment; import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingBackupWalletFragment; import org.chromium.chrome.browser.crypto_wallet.fragments.onboarding.OnboardingCreatingWalletFragment; @@ -85,18 +76,12 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe private MaterialToolbar mToolbar; - private View mCryptoLayout; private View mCryptoOnboardingLayout; - private ImageView mPendingTxNotification; - private ImageView mBuySendSwapButton; private ImageView mOnboardingCloseButton; private ImageView mOnboardingBackButton; private ViewPager mCryptoWalletOnboardingViewPager; - private CryptoFragmentPageAdapter mCryptoFragmentPageAdapter; private ModalDialogManager mModalDialogManager; private CryptoWalletOnboardingPagerAdapter mCryptoWalletOnboardingPagerAdapter; - private BottomNavigationView mBottomNavigationView; - private ViewPager2 mViewPager; private boolean mShowBiometricPrompt; private boolean mIsFromDapps; private WalletModel mWalletModel; @@ -141,13 +126,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe getIntent().getBooleanExtra(Utils.RESTART_WALLET_ACTIVITY_RESTORE, false); } mShowBiometricPrompt = true; - mToolbar = findViewById(R.id.toolbar); - mToolbar.setOverflowIcon( - ContextCompat.getDrawable(this, R.drawable.ic_baseline_more_vert_24)); - setSupportActionBar(mToolbar); - - mBuySendSwapButton = findViewById(R.id.buy_send_swap_button); - mBottomNavigationView = findViewById(R.id.wallet_bottom_navigation); try { mWalletModel = BraveActivity.getBraveActivity().getWalletModel(); @@ -158,27 +136,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe Log.e(TAG, "triggerLayoutInflation", e); } - mBuySendSwapButton.setOnClickListener(v -> { - NetworkInfo ethNetwork = null; - // Always show buy send swap with ETH - if (mWalletModel != null) { - ethNetwork = getNetworkModel().getNetwork(BraveWalletConstants.MAINNET_CHAIN_ID); - } - SwapBottomSheetDialogFragment swapBottomSheetDialogFragment = - SwapBottomSheetDialogFragment.newInstance(); - swapBottomSheetDialogFragment.setNetwork(ethNetwork); - swapBottomSheetDialogFragment.show( - getSupportFragmentManager(), SwapBottomSheetDialogFragment.TAG_FRAGMENT); - }); - - mPendingTxNotification = findViewById(R.id.pending_tx_notification); - - mPendingTxNotification.setOnClickListener(v -> { - PortfolioFragment portfolioFragment = - mCryptoFragmentPageAdapter.getCurrentPortfolioFragment(); - if (portfolioFragment != null) portfolioFragment.callAnotherApproveDialog(); - }); - mCryptoLayout = findViewById(R.id.crypto_layout); mCryptoOnboardingLayout = findViewById(R.id.crypto_onboarding_layout); mCryptoWalletOnboardingViewPager = findViewById(R.id.crypto_wallet_onboarding_viewpager); mCryptoWalletOnboardingPagerAdapter = @@ -203,9 +160,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe mModalDialogManager = new ModalDialogManager( new AppModalPresenter(this), ModalDialogManager.ModalDialogType.APP); - mViewPager = findViewById(R.id.navigation_view_pager); - mViewPager.setUserInputEnabled(false); - onInitialLayoutInflationComplete(); } @@ -226,16 +180,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe } } - @Override - public void onStartWithNative() { - super.onStartWithNative(); - if (mCryptoFragmentPageAdapter == null) { - mCryptoFragmentPageAdapter = new CryptoFragmentPageAdapter(this); - mViewPager.setAdapter(mCryptoFragmentPageAdapter); - mViewPager.setOffscreenPageLimit(mCryptoFragmentPageAdapter.getItemCount() - 1); - } - } - @Override public void onDestroy() { mModalDialogManager.destroy(); @@ -255,7 +199,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe private void setNavigationFragments(@NonNull final WalletAction walletAction) { List navigationItems = new ArrayList<>(); mShowBiometricPrompt = true; - mCryptoLayout.setVisibility(View.GONE); mCryptoOnboardingLayout.setVisibility(View.VISIBLE); if (walletAction == WalletAction.ONBOARDING) { OnboardingInitWalletFragment onboardingInitWalletFragment = @@ -389,7 +332,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe public void showOnboardingLayout() { addRemoveSecureFlag(true); mCryptoOnboardingLayout.setVisibility(View.VISIBLE); - mCryptoLayout.setVisibility(View.GONE); List navigationItems = new ArrayList<>(); // We don't need addWalletCreatingPage here, as showOnboardingLayout @@ -405,18 +347,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe } } - private void showWalletBackupBanner() { - final ViewGroup backupTopBannerLayout = findViewById(R.id.wallet_backup_banner); - backupTopBannerLayout.setVisibility(View.VISIBLE); - backupTopBannerLayout.setOnClickListener(view -> showOnboardingLayout()); - ImageView bannerClose = backupTopBannerLayout.findViewById(R.id.backup_banner_close); - bannerClose.setOnClickListener(view -> backupTopBannerLayout.setVisibility(View.GONE)); - } - - public void showPendingTxNotification(final boolean show) { - mPendingTxNotification.setVisibility(show ? View.VISIBLE : View.INVISIBLE); - } - @Override public boolean showBiometricPrompt() { int state = ApplicationStatus.getStateForActivity(this); @@ -487,11 +417,6 @@ public class BraveWalletActivity extends BraveWalletBaseActivity implements OnNe setNavigationFragments(WalletAction.UNLOCK); } - @Override - public void backedUp() { - findViewById(R.id.wallet_backup_banner).setVisibility(View.GONE); - } - private NetworkModel getNetworkModel() { return mWalletModel.getNetworkModel(); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java deleted file mode 100644 index 9af24a0d5fb..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java +++ /dev/null @@ -1,277 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.activities; - -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.appcompat.widget.Toolbar; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.Target; -import com.bumptech.glide.request.transition.DrawableCrossFadeTransition; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.CoinType; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.PortfolioModel; -import org.chromium.chrome.browser.app.helpers.ImageLoader; -import org.chromium.chrome.browser.crypto_wallet.util.AddressUtils; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; -import org.chromium.chrome.browser.util.LiveDataUtil; -import org.chromium.chrome.browser.util.TabUtils; -import org.chromium.ui.text.NoUnderlineClickableSpan; - -import java.util.Locale; - -public class NftDetailActivity extends BraveWalletBaseActivity { - private static final String TAG = "NftDetailActivity"; - - private static final String TOKEN_ID_FORMAT = "#%s"; - private static final String NFT_ERC721_URL_FORMAT = "%s/token/%s?a=%s"; - private static final String NFT_SPL_URL_FORMAT = "%s/address/%s"; - private static final String NFT_SPL_URL_FORMAT_WITH_CLUSTER = - NFT_SPL_URL_FORMAT + "/?cluster=%s"; - - private static final String CHAIN_ID = "chainId"; - private static final String ASSET_NAME = "assetName"; - private static final String ASSET_CONTRACT_ADDRESS = "assetContractAddress"; - private static final String ASSET_SYMBOL = "assetSymbol"; - private static final String NFT_TOKEN_ID_HEX = "nftTokenIdHex"; - private static final String NFT_META_DATA = "nftMetadata"; - private static final String NFT_IS_ERC_721 = "nftIsErc721"; - private static final String COIN_TYPE = "coinType"; - - private String mNftName; - private String mChainId; - private String mContractAddress; - private String mSymbol; - private String mNftTokenId; - private String mNftTokenHex; - - private boolean mIsErc721; - - private int mCoinType; - - private ImageView mNftImageView; - private TextView mImageNotAvailableText; - private TextView mNetworkNameView; - private Button mBtnSend; - private TextView mTokenStandardView; - private TextView mTokenAddressLabelView; - private TextView mTokenAddressView; - private TextView mDescriptionContentView; - private TextView mNftDetailTitleView; - private TextView mNftNameView; - private ViewGroup mNftDescriptionLayout; - private ViewGroup mNftTokenStandardLayout; - private ViewGroup mNftTokenAddressLayout; - private Toolbar mToolbar; - - private PortfolioModel.NftMetadata mNftMetadata; - - @Override - protected void triggerLayoutInflation() { - setContentView(R.layout.activity_nft_detail); - - Intent intent = getIntent(); - if (intent != null) { - mChainId = intent.getStringExtra(CHAIN_ID); - mNftName = intent.getStringExtra(ASSET_NAME); - mContractAddress = intent.getStringExtra(ASSET_CONTRACT_ADDRESS); - mSymbol = intent.getStringExtra(ASSET_SYMBOL); - mNftTokenHex = intent.getStringExtra(NFT_TOKEN_ID_HEX); - mNftTokenId = Utils.hexToIntString(mNftTokenHex); - mNftMetadata = (PortfolioModel.NftMetadata) intent.getSerializableExtra(NFT_META_DATA); - mIsErc721 = intent.getBooleanExtra(NFT_IS_ERC_721, false); - mCoinType = intent.getIntExtra(COIN_TYPE, -1); - } - - // Calculate half screen height and assign it to NFT image view, - // and "Image not found" text view (that will pop up in case of issues). - int halfScreenHeight = AndroidUtils.getScreenHeight() / 2; - - mNftImageView = findViewById(R.id.nft_detail_image); - mNftImageView.getLayoutParams().height = halfScreenHeight; - - mImageNotAvailableText = findViewById(R.id.nft_detail_image_not_available); - mImageNotAvailableText.getLayoutParams().height = halfScreenHeight; - - mDescriptionContentView = findViewById(R.id.description_content); - - mToolbar = findViewById(R.id.toolbar); - setSupportActionBar(mToolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - mBtnSend = findViewById(R.id.btn_send); - // TODO(simone): Enable if it's the NFT owner. - // GitHub issue: https://github.com/brave/brave-browser/issues/27802. - mBtnSend.setVisibility(View.GONE); - - mNftDetailTitleView = findViewById(R.id.nft_detail_title); - mNftDetailTitleView.setText(Utils.formatErc721TokenTitle(mNftName, mNftTokenId)); - - mNftNameView = findViewById(R.id.nft_name); - mNftNameView.setText(mSymbol); - - mNetworkNameView = findViewById(R.id.blockchain_content); - mNftTokenStandardLayout = findViewById(R.id.nft_token_standard); - mNftTokenAddressLayout = findViewById(R.id.nft_token_address); - mTokenStandardView = findViewById(R.id.token_standard_content); - mTokenAddressLabelView = findViewById(R.id.token_address_label); - - if (mIsErc721) { - mTokenStandardView.setText(R.string.brave_wallet_nft_erc_721); - mTokenAddressLabelView.setText(R.string.brave_wallet_nft_token_id); - } else if (mCoinType == CoinType.SOL) { - mTokenStandardView.setText(R.string.brave_wallet_nft_sol_spl); - mTokenAddressLabelView.setText(R.string.brave_wallet_nft_mint_address); - } else { - // Not ERC 721, nor Solana NFT. - // Hiding incompatible lables. - AndroidUtils.gone(mNftTokenStandardLayout, mNftTokenAddressLayout); - } - - mTokenAddressView = findViewById(R.id.token_address_content); - - mNftDescriptionLayout = findViewById(R.id.nft_description); - - setMetadata(mNftMetadata); - BraveActivity braveActivity = null; - try { - braveActivity = BraveActivity.getBraveActivity(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "triggerLayoutInflation " + e); - } - assert braveActivity != null; - - LiveDataUtil.observeOnce( - braveActivity.getWalletModel().getCryptoModel().getNetworkModel().mDefaultNetwork, - defaultNetwork -> { - String networkName = defaultNetwork.chainName; - mNetworkNameView.setText(networkName); - String blockExplorerUrl = defaultNetwork.blockExplorerUrls.length > 0 - ? defaultNetwork.blockExplorerUrls[0] - : ""; - - SpannableString spannable; - if (mIsErc721) { - String tokenStr = - String.format(Locale.ENGLISH, TOKEN_ID_FORMAT, mNftTokenId); - spannable = new SpannableString(tokenStr); - - if (!TextUtils.isEmpty(blockExplorerUrl)) { - String url = String.format(Locale.ENGLISH, NFT_ERC721_URL_FORMAT, - blockExplorerUrl, mContractAddress, mNftTokenId); - createClickableLink(blockExplorerUrl, url, spannable); - } - - } else { - String mintAddress = AddressUtils.getTruncatedAddress(mContractAddress); - spannable = new SpannableString(mintAddress); - - if (!TextUtils.isEmpty(blockExplorerUrl)) { - // Blockchain explorer URLs may contain a cluster endpoint. - // When present it must be appended at the end of the formatted URL. - String[] splitBlockExplorerUrl = blockExplorerUrl.split("/\\?cluster="); - String baseUrl = splitBlockExplorerUrl[0]; - String url; - if (splitBlockExplorerUrl.length > 1) { - String cluster = splitBlockExplorerUrl[1]; - url = String.format(Locale.ENGLISH, NFT_SPL_URL_FORMAT_WITH_CLUSTER, - baseUrl, mContractAddress, cluster); - } else { - url = String.format(Locale.ENGLISH, NFT_SPL_URL_FORMAT, baseUrl, - mContractAddress); - } - createClickableLink(blockExplorerUrl, url, spannable); - } - } - - mTokenAddressView.setText(spannable); - mTokenAddressView.setMovementMethod(LinkMovementMethod.getInstance()); - - onInitialLayoutInflationComplete(); - }); - } - - private void createClickableLink( - String blockExplorerUrl, String url, SpannableString spannable) { - NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan( - this, R.color.brave_link, (textView) -> { TabUtils.openLinkWithFocus(this, url); }); - spannable.setSpan(linkSpan, 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - - private void setMetadata(PortfolioModel.NftMetadata nftMetadata) { - if (nftMetadata == null) return; - // In case of no errors proceed to assign description and fetch NFT image. - if (nftMetadata.mErrCode == 0) { - String description = nftMetadata.mDescription; - String imageUrl = nftMetadata.mImageUrl; - if (!TextUtils.isEmpty(description)) { - mDescriptionContentView.setText(description); - } else { - // Hide description layout in case of an empty string. - mNftDescriptionLayout.setVisibility(View.GONE); - } - if (ImageLoader.isSupported(imageUrl)) { - loadNftImage(imageUrl); - } else { - setNftImageAsNotAvailable(); - } - } - } - - private void loadNftImage(String imageUrl) { - ImageLoader.downloadImage(imageUrl, Glide.with(this), false, - WalletConstants.RECT_ROUNDED_CORNERS_DP, mNftImageView, new ImageLoader.Callback() { - @Override - public boolean onLoadFailed() { - setNftImageAsNotAvailable(); - return false; - } - @Override - public boolean onResourceReady(Drawable resource, Target target) { - target.onResourceReady( - resource, new DrawableCrossFadeTransition(250, true)); - return true; - } - }); - } - - private void setNftImageAsNotAvailable() { - mNftImageView.setVisibility(View.GONE); - mImageNotAvailableText.setVisibility(View.VISIBLE); - } - - public static Intent getIntent(Context context, String chainId, BlockchainToken asset, - PortfolioModel.NftDataModel nftDataModel) { - Intent intent = new Intent(context, NftDetailActivity.class); - intent.putExtra(CHAIN_ID, chainId); - intent.putExtra(ASSET_NAME, asset.name); - intent.putExtra(ASSET_CONTRACT_ADDRESS, asset.contractAddress); - intent.putExtra(ASSET_SYMBOL, asset.symbol); - intent.putExtra(NFT_TOKEN_ID_HEX, asset.tokenId); - intent.putExtra(NFT_META_DATA, nftDataModel.nftMetadata); - intent.putExtra(NFT_IS_ERC_721, nftDataModel.token.isErc721); - intent.putExtra(COIN_TYPE, asset.coin); - return intent; - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSelectorRecyclerView.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSelectorRecyclerView.java new file mode 100644 index 00000000000..2d10eb1ff61 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSelectorRecyclerView.java @@ -0,0 +1,185 @@ +/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.crypto_wallet.adapters; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.crypto_wallet.adapters.AccountSelectorRecyclerView.ViewHolder; +import org.chromium.chrome.browser.crypto_wallet.listeners.AccountSelectorItemListener; +import org.chromium.chrome.browser.crypto_wallet.model.AccountSelectorItemModel; +import org.chromium.chrome.browser.crypto_wallet.util.Utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class AccountSelectorRecyclerView extends RecyclerView.Adapter { + private Context context; + private List accountSelectorItemModelList = new ArrayList<>(); + private AccountSelectorItemListener accountSelectorItemListener; + private final ExecutorService mExecutor; + private final Handler mHandler; + private int mPreviousSelectedIndex; + + public AccountSelectorRecyclerView() { + mExecutor = Executors.newSingleThreadExecutor(); + mHandler = new Handler(Looper.getMainLooper()); + } + + @Override + public @NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + context = parent.getContext(); + LayoutInflater inflater = LayoutInflater.from(context); + View accountSelectorViewHolder = + inflater.inflate(R.layout.view_holder_account_selector, parent, false); + return new ViewHolder(accountSelectorViewHolder); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + AccountSelectorItemModel accountSelectorItemModel = + accountSelectorItemModelList.get(position); + // When ViewHolder is re-used, it has the observers which are fired when + // we modifying checkbox. This may cause unwanted modifying of the model. + holder.resetObservers(); + + holder.titleText.setText(accountSelectorItemModel.getTitle()); + holder.subTitleText.setText( + Utils.stripAccountAddress(accountSelectorItemModel.getSubTitle())); + if (accountSelectorItemModel.getText1() != null) { + holder.text1Text.setVisibility(View.VISIBLE); + holder.text1Text.setText(accountSelectorItemModel.getText1()); + } + + if (accountSelectorItemModel.getText2() != null) { + holder.text2Text.setVisibility(View.VISIBLE); + holder.text2Text.setText(accountSelectorItemModel.getText2()); + } + + holder.itemView.setOnClickListener( + v -> { + accountSelectorItemListener.onAccountClick(accountSelectorItemModel); + updateSelectedNetwork(holder.getLayoutPosition()); + }); + + holder.iconImg.setImageResource(android.R.color.transparent); + if (accountSelectorItemModel.getAccountInfo() != null) { + Utils.setBlockiesBitmapResourceFromAccount( + mExecutor, + mHandler, + holder.iconImg, + accountSelectorItemModel.getAccountInfo(), + true); + } + holder.itemView.setOnLongClickListener( + v -> { + Utils.saveTextToClipboard( + context, + accountSelectorItemModel.getSubTitle(), + R.string.address_has_been_copied, + false); + + return true; + }); + holder.selected.setVisibility( + accountSelectorItemModel.isSelected() ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public int getItemCount() { + return accountSelectorItemModelList.size(); + } + + public void setWalletListItemModelList( + List accountSelectorItemModelList) { + this.accountSelectorItemModelList = accountSelectorItemModelList; + } + + public void setAccountSelectorItemListener( + AccountSelectorItemListener accountSelectorItemListener) { + this.accountSelectorItemListener = accountSelectorItemListener; + } + + /** + * Update the list's selection icon to the passed account + * + * @param title is the account name + * @param subTitle is the account address + */ + public void updateSelectedNetwork(String title, String subTitle) { + for (int i = 0; i < accountSelectorItemModelList.size(); i++) { + AccountSelectorItemModel accountSelectorItemModel = accountSelectorItemModelList.get(i); + if (accountSelectorItemModel.getTitle().equals(title) + && accountSelectorItemModel.getSubTitle().equals(subTitle)) { + updateSelectedNetwork(i); + break; + } + } + } + + private void updateSelectedNetwork(final int selectedAccountPosition) { + accountSelectorItemModelList.get(mPreviousSelectedIndex).setSelected(false); + notifyItemChanged(mPreviousSelectedIndex); + + accountSelectorItemModelList.get(selectedAccountPosition).setSelected(true); + mPreviousSelectedIndex = selectedAccountPosition; + notifyItemChanged(selectedAccountPosition); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + private final ImageView iconImg; + private final TextView titleText; + private final TextView subTitleText; + private final TextView text1Text; + private final TextView text2Text; + private final ImageView selected; + + public ViewHolder(View itemView) { + super(itemView); + iconImg = itemView.findViewById(R.id.icon); + titleText = itemView.findViewById(R.id.title); + subTitleText = itemView.findViewById(R.id.sub_title); + text1Text = itemView.findViewById(R.id.text1); + text2Text = itemView.findViewById(R.id.text2); + selected = itemView.findViewById(R.id.iv_selected); + } + + public void resetObservers() { + itemView.setOnClickListener(null); + } + } + + @SuppressLint("NotifyDataSetChanged") + public void removeItem(AccountSelectorItemModel item) { + accountSelectorItemModelList.remove(item); + notifyDataSetChanged(); + } + + @SuppressLint("NotifyDataSetChanged") + public void addItem(AccountSelectorItemModel item) { + accountSelectorItemModelList.add(item); + notifyDataSetChanged(); + } + + @SuppressLint("NotifyDataSetChanged") + public void clear() { + accountSelectorItemModelList.clear(); + notifyDataSetChanged(); + } +} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoFragmentPageAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoFragmentPageAdapter.java deleted file mode 100644 index 53ca86d101a..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CryptoFragmentPageAdapter.java +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.adapters; - -import android.content.res.Resources; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.viewpager2.adapter.FragmentStateAdapter; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; -import org.chromium.chrome.browser.crypto_wallet.fragments.AccountsFragment; -import org.chromium.chrome.browser.crypto_wallet.fragments.MarketFragment; -import org.chromium.chrome.browser.crypto_wallet.fragments.PortfolioFragment; -import org.chromium.chrome.browser.crypto_wallet.fragments.TransactionsFragment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Fragment adapter for the main sections of Brave Wallet displayed by {@link BraveWalletActivity}. - */ -public class CryptoFragmentPageAdapter extends FragmentStateAdapter { - public static final int PORTFOLIO_FRAGMENT_POSITION = 0; - public static final int TRANSACTIONS_ACTIVITY_FRAGMENT_POSITION = 1; - public static final int ACCOUNTS_FRAGMENT_POSITION = 2; - public static final int MARKET_FRAGMENT_POSITION = 3; - - private final List mTitles; - - private PortfolioFragment mCurrentPortfolioFragment; - - public CryptoFragmentPageAdapter(@NonNull final FragmentActivity activity) { - super(activity); - Resources resources = activity.getResources(); - mTitles = new ArrayList(Arrays.asList(resources.getString(R.string.portfolio), - resources.getString(R.string.brave_wallet_activity), - resources.getString(R.string.accounts), resources.getString(R.string.explore))); - } - - public PortfolioFragment getCurrentPortfolioFragment() { - return mCurrentPortfolioFragment; - } - - @NonNull - @Override - public Fragment createFragment(int position) { - switch (position) { - case PORTFOLIO_FRAGMENT_POSITION: - mCurrentPortfolioFragment = PortfolioFragment.newInstance(); - return mCurrentPortfolioFragment; - case TRANSACTIONS_ACTIVITY_FRAGMENT_POSITION: - return TransactionsFragment.newInstance(); - case ACCOUNTS_FRAGMENT_POSITION: - return AccountsFragment.newInstance(); - case MARKET_FRAGMENT_POSITION: - return MarketFragment.newInstance(); - default: - throw new IllegalStateException( - String.format("No fragment found for position %d.", position)); - } - } - - @Override - public int getItemCount() { - return mTitles.size(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/MarketCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/MarketCoinAdapter.java deleted file mode 100644 index 0f4b6817b85..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/MarketCoinAdapter.java +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.adapters; - -import static org.chromium.ui.base.ViewUtils.dpToPx; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import org.chromium.brave_wallet.mojom.CoinMarket; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.domain.MarketModel; -import org.chromium.chrome.browser.app.helpers.ImageLoader; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -public class MarketCoinAdapter extends RecyclerView.Adapter { - private static final int PERCENTAGE_CHANGE_DRAWABLE_PADDING_PX = 8; - private final MarketModel mMarketModel; - private final List mCoinMarkets; - - private final Context mContext; - - public MarketCoinAdapter( - @NonNull final Context context, @NonNull final MarketModel marketModel) { - mContext = context; - mMarketModel = marketModel; - mCoinMarkets = new ArrayList<>(); - } - - @Override - public @NonNull ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(mContext); - View marketCoinView = inflater.inflate(R.layout.market_coin_list_item, parent, false); - return new ViewHolder(marketCoinView); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - CoinMarket coinMarket = mCoinMarkets.get(position); - holder.itemView.setOnClickListener( - view -> { Utils.openAssetDetailsActivity(mContext, coinMarket); }); - holder.coinName.setText(coinMarket.name); - holder.symbol.setText(coinMarket.symbol.toUpperCase(Locale.ENGLISH)); - - holder.price.setText(mMarketModel.getFormattedPrice(coinMarket.currentPrice)); - setPriceIndicator(holder.changePercentage, coinMarket.priceChangePercentage24h); - - ImageLoader.downloadImage( - coinMarket.image, Glide.with(mContext), true, 0, holder.icon, null); - } - - @Override - public int getItemCount() { - return mCoinMarkets.size(); - } - - public void setCoinMarkets(@NonNull final List coinMarkets) { - final int itemCount = mCoinMarkets.size(); - mCoinMarkets.clear(); - mCoinMarkets.addAll(coinMarkets); - notifyItemRangeRemoved(0, itemCount); - notifyItemRangeInserted(0, coinMarkets.size()); - } - - private void setPriceIndicator(TextView textView, double percentageChange) { - if (percentageChange > 0) { - textView.setTextColor(mContext.getColor(R.color.brave_wallet_day_night_bull)); - textView.setCompoundDrawablesRelativeWithIntrinsicBounds( - R.drawable.ic_bull_arrow, 0, 0, 0); - } else { - textView.setTextColor(mContext.getColor(R.color.brave_wallet_day_night_bear)); - textView.setCompoundDrawablesRelativeWithIntrinsicBounds( - R.drawable.ic_bear_arrow, 0, 0, 0); - } - - textView.setText(mMarketModel.getFormattedPercentageChange(percentageChange)); - textView.setCompoundDrawablePadding(dpToPx(mContext.getResources().getDisplayMetrics(), - PERCENTAGE_CHANGE_DRAWABLE_PADDING_PX)); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - private final ImageView icon; - private final TextView coinName; - private final TextView symbol; - private final TextView price; - private final TextView changePercentage; - - public ViewHolder(View itemView) { - super(itemView); - icon = itemView.findViewById(R.id.icon); - coinName = itemView.findViewById(R.id.coin_name); - symbol = itemView.findViewById(R.id.symbol); - price = itemView.findViewById(R.id.price); - changePercentage = itemView.findViewById(R.id.change_percentage); - } - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/PortfolioFragmentStateAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/PortfolioFragmentStateAdapter.java deleted file mode 100644 index d4eabf4a804..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/PortfolioFragmentStateAdapter.java +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.adapters; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.viewpager2.adapter.FragmentStateAdapter; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.crypto_wallet.fragments.AssetsFragment; -import org.chromium.chrome.browser.crypto_wallet.fragments.NftGridFragment; - -import java.util.ArrayList; -import java.util.Arrays; - -/** - * Adapter of Portfolio section showing assets and NFTs. - * @see org.chromium.chrome.browser.crypto_wallet.fragments.PortfolioFragment - */ -public class PortfolioFragmentStateAdapter extends FragmentStateAdapter { - private static final int ASSETS_FRAGMENT_POSITION = 0; - private static final int NFT_GRID_FRAGMENT_POSITION = 1; - - private final ArrayList mTitles; - - private AssetsFragment mAssetsFragment; - private NftGridFragment mNftGridFragment; - - public PortfolioFragmentStateAdapter(@NonNull final Fragment fragment) { - super(fragment); - mTitles = new ArrayList<>(Arrays.asList(fragment.getString(R.string.assets), - fragment.getString(R.string.brave_wallet_nfts))); - } - - @NonNull - @Override - public Fragment createFragment(final int position) { - switch (position) { - case ASSETS_FRAGMENT_POSITION: - if (mAssetsFragment == null) { - mAssetsFragment = AssetsFragment.newInstance(); - } - return mAssetsFragment; - case NFT_GRID_FRAGMENT_POSITION: - if (mNftGridFragment == null) { - mNftGridFragment = NftGridFragment.newInstance(); - } - return mNftGridFragment; - default: - throw new IllegalStateException( - String.format("No fragment found for position %d.", position)); - } - } - - @Override - public int getItemCount() { - return mTitles.size(); - } - - @Nullable - public CharSequence getPageTitle(final int position) { - return mTitles.get(position); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java deleted file mode 100644 index 38c743a7ed5..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ /dev/null @@ -1,397 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.adapters; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.drawable.BitmapDrawable; -import android.os.Handler; -import android.os.Looper; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.brave_wallet.mojom.TransactionStatus; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.domain.PortfolioModel; -import org.chromium.chrome.browser.app.helpers.ImageLoader; -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.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class WalletCoinAdapter extends RecyclerView.Adapter { - public enum AdapterType { - VISIBLE_ASSETS_LIST, - EDIT_VISIBLE_ASSETS_LIST, - ACCOUNTS_LIST, - SELECT_ACCOUNTS_LIST - } - - private Context context; - private List walletListItemModelList = new ArrayList<>(); - private final List walletListItemModelListCopy = new ArrayList<>(); - private final List mCheckedPositions = new ArrayList<>(); - private OnWalletListItemClick onWalletListItemClick; - private int walletListItemType; - private AdapterType mType; - private final ExecutorService mExecutor; - private final Handler mHandler; - private int previousSelectedPos; - - public WalletCoinAdapter(AdapterType type) { - mType = type; - mExecutor = Executors.newSingleThreadExecutor(); - mHandler = new Handler(Looper.getMainLooper()); - } - - @Override - public @NonNull ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - context = parent.getContext(); - LayoutInflater inflater = LayoutInflater.from(context); - View walletCoinView = inflater.inflate(R.layout.wallet_coin_list_item, parent, false); - return new ViewHolder(walletCoinView); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - WalletListItemModel walletListItemModel = walletListItemModelList.get(position); - // When ViewHolder is re-used, it has the observers which are fired when - // we modifying checkbox. This may cause unwanted modifying of the model. - holder.resetObservers(); - - holder.titleText.setText(walletListItemModel.getTitle()); - holder.subTitleText.setText( - mType == AdapterType.ACCOUNTS_LIST || mType == AdapterType.SELECT_ACCOUNTS_LIST - ? Utils.stripAccountAddress(walletListItemModel.getSubTitle()) - : walletListItemModel.getSubTitle()); - if (walletListItemModel.getText1() != null) { - holder.text1Text.setVisibility(View.VISIBLE); - holder.text1Text.setText(walletListItemModel.getText1()); - } - - if (walletListItemModel.getText2() != null) { - holder.text2Text.setVisibility(View.VISIBLE); - holder.text2Text.setText(walletListItemModel.getText2()); - } - - holder.itemView.setOnClickListener(v -> { - if (walletListItemType == Utils.TRANSACTION_ITEM) { - onWalletListItemClick.onTransactionClick(walletListItemModel.getTransactionInfo()); - } else if (walletListItemType == Utils.ASSET_ITEM) { - if (mType != AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - onWalletListItemClick.onAssetClick(walletListItemModel.getBlockchainToken()); - } - } else { - onWalletListItemClick.onAccountClick(walletListItemModel); - if (mType == AdapterType.SELECT_ACCOUNTS_LIST) { - updateSelectedNetwork(holder.getLayoutPosition()); - } - } - }); - - if (walletListItemType == Utils.TRANSACTION_ITEM) { - holder.txStatus.setVisibility(View.VISIBLE); - holder.txStatus.setText(walletListItemModel.getTxStatus()); - holder.txStatus.setCompoundDrawablesRelativeWithIntrinsicBounds( - new BitmapDrawable( - context.getResources(), walletListItemModel.getTxStatusBitmap()), - null, null, null); - holder.feeText.setVisibility(View.VISIBLE); - holder.feeText.setText(String.format( - context.getResources().getString(R.string.wallet_tx_fee), - String.format(Locale.getDefault(), "%.6f", walletListItemModel.getTotalGas()), - walletListItemModel.getChainSymbol(), - String.format( - Locale.getDefault(), "%.2f", walletListItemModel.getTotalGasFiat()))); - Utils.overlayBitmaps(mExecutor, mHandler, walletListItemModel.getAddressesForBitmap(), - holder.iconImg); - if (walletListItemModel.getTransactionInfo().txStatus == TransactionStatus.REJECTED) { - holder.disableClick(); - } else { - holder.itemView.setClickable(true); - } - } - - if (isAssetSelectionType() || mType == AdapterType.VISIBLE_ASSETS_LIST) { - if (walletListItemModel.isNativeAsset()) { - AndroidUtils.gone(holder.ivNetworkImage); - } else { - AndroidUtils.show(holder.ivNetworkImage); - Utils.setBitmapResource(mExecutor, mHandler, context, - walletListItemModel.getNetworkIcon(), walletListItemModel.getIcon(), - holder.ivNetworkImage, null, true); - } - } - - if (isAssetSelectionType()) { - holder.text1Text.setVisibility(View.GONE); - holder.text2Text.setVisibility(View.GONE); - if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - holder.assetCheck.setVisibility(View.VISIBLE); - holder.assetCheck.setChecked(walletListItemModel.isVisible()); - holder.assetCheck.setOnCheckedChangeListener( - new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged( - CompoundButton buttonView, boolean isChecked) { - for (int i = 0; i < walletListItemModelListCopy.size(); i++) { - WalletListItemModel item = walletListItemModelListCopy.get(i); - if (item.getTitle().equals(holder.titleText.getText()) - || item.getSubTitle().equals( - holder.subTitleText.getText())) { - if (isChecked) { - if (!mCheckedPositions.contains((Integer) i)) { - mCheckedPositions.add((Integer) i); - } - } else { - mCheckedPositions.remove((Integer) i); - } - break; - } - } - if ("noOnClickListener".equals( - (String) holder.assetCheck.getTag())) { - holder.assetCheck.setTag(null); - } else { - onWalletListItemClick.onAssetCheckedChanged( - walletListItemModel, holder.assetCheck, isChecked); - } - } - }); - } - } - - if (mType != AdapterType.ACCOUNTS_LIST && mType != AdapterType.SELECT_ACCOUNTS_LIST) { - if (walletListItemModel.getBlockchainToken() == null - || !walletListItemModel.getBlockchainToken().logo.isEmpty()) { - Utils.setBitmapResource(mExecutor, mHandler, context, - walletListItemModel.getIconPath(), walletListItemModel.getIcon(), - holder.iconImg, null, true); - } else { - PortfolioModel.NftDataModel nftDataModel = walletListItemModel.getNftDataModel(); - if (walletListItemModel.hasNftImageLink() - && ImageLoader.isSupported(nftDataModel.nftMetadata.mImageUrl)) { - String url = nftDataModel.nftMetadata.mImageUrl; - ImageLoader.downloadImage(url, Glide.with(context), false, - WalletConstants.RECT_ROUNDED_CORNERS_DP, holder.iconImg, null); - } else { - Utils.setBlockiesBitmapCustomAsset(mExecutor, mHandler, holder.iconImg, - walletListItemModel.getBlockchainToken().contractAddress, - walletListItemModel.getBlockchainToken().symbol, - context.getResources().getDisplayMetrics().density, null, context, - false, (float) 0.9, true); - } - if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - onWalletListItemClick.onMaybeShowTrashButton( - walletListItemModel, holder.iconTrash); - holder.iconTrash.setOnClickListener( - v -> onWalletListItemClick.onTrashIconClick(walletListItemModel)); - } - } - } else { - holder.iconImg.setImageResource(android.R.color.transparent); - if (walletListItemModel.getAccountInfo() != null) { - Utils.setBlockiesBitmapResourceFromAccount(mExecutor, mHandler, holder.iconImg, - walletListItemModel.getAccountInfo(), true); - } - holder.itemView.setOnLongClickListener(v -> { - Utils.saveTextToClipboard(context, walletListItemModel.getSubTitle(), - R.string.address_has_been_copied, false); - - return true; - }); - if (mType == AdapterType.SELECT_ACCOUNTS_LIST) { - holder.ivSelected.setVisibility( - walletListItemModel.isVisible() ? View.VISIBLE : View.INVISIBLE); - } - } - } - - private boolean isAssetSelectionType() { - return mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST; - } - - @Override - public int getItemCount() { - return walletListItemModelList.size(); - } - - public void setWalletCoinAdapterType(AdapterType type) { - mType = type; - } - - public void setWalletListItemModelList(List walletListItemModelList) { - this.walletListItemModelList = walletListItemModelList; - walletListItemModelListCopy.clear(); - if (isAssetSelectionType()) { - walletListItemModelListCopy.addAll(this.walletListItemModelList); - mCheckedPositions.clear(); - } - for (int i = 0; i < walletListItemModelListCopy.size(); i++) { - if (walletListItemModelListCopy.get(i).isVisible()) { - mCheckedPositions.add((Integer) i); - } - } - } - - public List getCheckedAssets() { - List checkedAssets = new ArrayList<>(); - for (Integer position : mCheckedPositions) { - if (position >= walletListItemModelListCopy.size()) { - assert false; - continue; - } - checkedAssets.add(walletListItemModelListCopy.get(position)); - } - - return checkedAssets; - } - - public void setOnWalletListItemClick(OnWalletListItemClick onWalletListItemClick) { - this.onWalletListItemClick = onWalletListItemClick; - } - - public void setWalletListItemType(int walletListItemType) { - this.walletListItemType = walletListItemType; - } - - public void onTransactionUpdate(TransactionInfo txInfo) { - for (int i = 0; i < walletListItemModelList.size(); i++) { - WalletListItemModel item = walletListItemModelList.get(i); - TransactionInfo transactionInfo = item.getTransactionInfo(); - if (transactionInfo != null && txInfo.id.equals(transactionInfo.id)) { - Utils.updateWalletCoinTransactionItem(item, txInfo, context); - walletListItemModelList.set(i, item); - notifyItemChanged(i); - break; - } - } - } - - /** - * Update the list's selection icon to the passed account - * @param title is the account name - * @param subTitle is the account address - */ - public void updateSelectedNetwork(String title, String subTitle) { - for (int i = 0; i < walletListItemModelList.size(); i++) { - WalletListItemModel walletListItemModel = walletListItemModelList.get(i); - if (walletListItemModel.getTitle().equals(title) - && walletListItemModel.getSubTitle().equals(subTitle)) { - updateSelectedNetwork(i); - break; - } - } - } - - private void updateSelectedNetwork(int selectedAccountPosition) { - walletListItemModelList.get(previousSelectedPos).isVisible(false); - notifyItemChanged(previousSelectedPos); - - walletListItemModelList.get(selectedAccountPosition).isVisible(true); - previousSelectedPos = selectedAccountPosition; - notifyItemChanged(selectedAccountPosition); - } - - public static class ViewHolder extends RecyclerView.ViewHolder { - private final ImageView iconImg; - private final TextView titleText; - private final TextView subTitleText; - private final TextView txStatus; - private final TextView text1Text; - private final TextView text2Text; - private final CheckBox assetCheck; - private final TextView feeText; - private final ImageView iconTrash; - private final ImageView ivSelected; - private final ImageView ivNetworkImage; - - public ViewHolder(View itemView) { - super(itemView); - iconImg = itemView.findViewById(R.id.icon); - titleText = itemView.findViewById(R.id.title); - txStatus = itemView.findViewById(R.id.status); - subTitleText = itemView.findViewById(R.id.sub_title); - text1Text = itemView.findViewById(R.id.text1); - text2Text = itemView.findViewById(R.id.text2); - assetCheck = itemView.findViewById(R.id.assetCheck); - feeText = itemView.findViewById(R.id.fee_text); - iconTrash = itemView.findViewById(R.id.icon_trash); - ivSelected = itemView.findViewById(R.id.iv_selected); - ivNetworkImage = itemView.findViewById(R.id.iv_network_Icon); - } - - public void resetObservers() { - itemView.setOnClickListener(null); - assetCheck.setOnCheckedChangeListener(null); - } - - public void disableClick() { - resetObservers(); - itemView.setClickable(false); - } - } - - @SuppressLint("NotifyDataSetChanged") - public void filter(String text, boolean searchSubtitle) { - walletListItemModelList.clear(); - if (text.isEmpty()) { - walletListItemModelList.addAll(walletListItemModelListCopy); - } else { - text = text.toLowerCase(Locale.getDefault()); - for (WalletListItemModel item : walletListItemModelListCopy) { - if (item.getTitle().toLowerCase(Locale.getDefault()).contains(text) - || (searchSubtitle - && item.getSubTitle() - .toLowerCase(Locale.getDefault()) - .contains(text))) { - walletListItemModelList.add(item); - } - } - } - notifyDataSetChanged(); - } - - @SuppressLint("NotifyDataSetChanged") - public void removeItem(WalletListItemModel item) { - walletListItemModelList.remove(item); - walletListItemModelListCopy.remove(item); - notifyDataSetChanged(); - } - - @SuppressLint("NotifyDataSetChanged") - public void addItem(WalletListItemModel item) { - walletListItemModelList.add(item); - walletListItemModelListCopy.add(item); - notifyDataSetChanged(); - } - - @SuppressLint("NotifyDataSetChanged") - public void clear() { - walletListItemModelList.clear(); - walletListItemModelListCopy.clear(); - mCheckedPositions.clear(); - notifyDataSetChanged(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletNftAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletNftAdapter.java deleted file mode 100644 index 60a9e26d7b6..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletNftAdapter.java +++ /dev/null @@ -1,150 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.adapters; - -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.domain.PortfolioModel; -import org.chromium.chrome.browser.app.helpers.ImageLoader; -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.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class WalletNftAdapter extends RecyclerView.Adapter { - private Context context; - private List walletListItemModelList; - private OnWalletListItemClick onWalletListItemClick; - private ExecutorService mExecutor; - private Handler mHandler; - - public WalletNftAdapter() { - mExecutor = Executors.newSingleThreadExecutor(); - mHandler = new Handler(Looper.getMainLooper()); - walletListItemModelList = new ArrayList<>(); - } - - @Override - public @NonNull ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - context = parent.getContext(); - LayoutInflater inflater = LayoutInflater.from(context); - View walletCoinView = inflater.inflate(R.layout.wallet_nft_item, parent, false); - return new ViewHolder(walletCoinView); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - WalletListItemModel walletListItemModel = walletListItemModelList.get(position); - // When a ViewHolder is reused, its listeners may be triggered when modifying the checkbox, - // potentially leading to unintended modifications of the model. - holder.resetListeners(); - - holder.titleText.setText(walletListItemModel.getTitle()); - - PortfolioModel.NftDataModel nftDataModel = walletListItemModel.getNftDataModel(); - holder.subTitleText.setText(nftDataModel.token.symbol); - - holder.itemView.setOnClickListener(v -> { - onWalletListItemClick.onAssetClick(walletListItemModel.getBlockchainToken()); - }); - - Utils.setBitmapResource(mExecutor, mHandler, context, walletListItemModel.getNetworkIcon(), - walletListItemModel.getIcon(), holder.networkIconImage, null, true); - - if (walletListItemModel.getBlockchainToken() == null - || !walletListItemModel.getBlockchainToken().logo.isEmpty()) { - Utils.setBitmapResource(mExecutor, mHandler, context, walletListItemModel.getIconPath(), - walletListItemModel.getIcon(), holder.iconImg, null, true); - } else { - if (walletListItemModel.hasNftImageLink() - && ImageLoader.isSupported(nftDataModel.nftMetadata.mImageUrl)) { - String url = nftDataModel.nftMetadata.mImageUrl; - ImageLoader.downloadImage(url, Glide.with(context), false, - WalletConstants.RECT_SHARP_ROUNDED_CORNERS_DP, holder.iconImg, null); - } else { - Utils.setBlockiesBitmapCustomAsset(mExecutor, mHandler, holder.iconImg, - walletListItemModel.getBlockchainToken().contractAddress, - walletListItemModel.getBlockchainToken().symbol, - context.getResources().getDisplayMetrics().density, null, context, false, - (float) 0.9, false); - } - } - } - - @Override - public int getItemCount() { - return walletListItemModelList.size(); - } - - public void setWalletListItemModelList(List walletListItemModelList) { - this.walletListItemModelList = walletListItemModelList; - } - - public void setOnWalletListItemClick(OnWalletListItemClick onWalletListItemClick) { - this.onWalletListItemClick = onWalletListItemClick; - } - - public void removeItem(WalletListItemModel item) { - int index = walletListItemModelList.indexOf(item); - if (index != -1) { - walletListItemModelList.remove(index); - notifyItemRemoved(index); - } - } - - public void addItem(WalletListItemModel item) { - walletListItemModelList.add(item); - notifyItemInserted(walletListItemModelList.size() - 1); - } - - public void clear() { - int size = walletListItemModelList.size(); - walletListItemModelList.clear(); - notifyItemRangeRemoved(0, size); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - public final ImageView iconImg; - public final ImageView networkIconImage; - public final TextView titleText; - public final TextView subTitleText; - - public ViewHolder(View itemView) { - super(itemView); - iconImg = itemView.findViewById(R.id.icon); - networkIconImage = itemView.findViewById(R.id.network_icon); - titleText = itemView.findViewById(R.id.title); - subTitleText = itemView.findViewById(R.id.sub_title); - } - - public void resetListeners() { - itemView.setOnClickListener(null); - } - - public void disableClick() { - resetListeners(); - itemView.setClickable(false); - } - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AccountsFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AccountsFragment.java deleted file mode 100644 index c56c9d9be93..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AccountsFragment.java +++ /dev/null @@ -1,187 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.AppCompatImageView; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.AccountKind; -import org.chromium.brave_wallet.mojom.KeyringService; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.activities.AccountDetailActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; -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.util.Utils; -import org.chromium.chrome.browser.settings.BraveWalletPreferences; -import org.chromium.chrome.browser.settings.SettingsLauncherImpl; -import org.chromium.components.browser_ui.settings.SettingsLauncher; - -import java.util.ArrayList; -import java.util.List; - -public class AccountsFragment extends Fragment implements OnWalletListItemClick { - private static final String TAG = "AccountsFragment"; - - private View rootView; - private WalletCoinAdapter walletCoinAdapter; - private WalletModel mWalletModel; - - public static AccountsFragment newInstance() { - return new AccountsFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate " + e); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - rootView = inflater.inflate(R.layout.fragment_accounts, container, false); - return rootView; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - TextView addAccountBtn = view.findViewById(R.id.add_account_btn); - addAccountBtn.setOnClickListener(v -> { - BottomSheetDialogFragment sheetDialogFragment = new CreateAccountBottomSheetFragment(); - sheetDialogFragment.show( - getChildFragmentManager(), CreateAccountBottomSheetFragment.TAG); - }); - - TextView backupBtn = view.findViewById(R.id.accounts_backup); - backupBtn.setOnClickListener( - v -> { ((BraveWalletActivity) getActivity()).showOnboardingLayout(); }); - - AppCompatImageView settingsBtn = view.findViewById(R.id.accounts_settings); - settingsBtn.setOnClickListener(v -> { - SettingsLauncher settingsLauncher = new SettingsLauncherImpl(); - settingsLauncher.launchSettingsActivity(getContext(), BraveWalletPreferences.class); - }); - - setUpAccountList(view); - setUpSecondaryAccountList(view); - } - - private void setUpAccountList(View view) { - RecyclerView rvAccounts = view.findViewById(R.id.rv_accounts); - walletCoinAdapter = new WalletCoinAdapter(WalletCoinAdapter.AdapterType.ACCOUNTS_LIST); - if (mWalletModel == null) { - return; - } - mWalletModel.getKeyringModel().mAccountInfos.observe( - getViewLifecycleOwner(), accountInfos -> { - List walletListItemModelList = new ArrayList<>(); - for (AccountInfo accountInfo : accountInfos) { - if (accountInfo.accountId.kind == AccountKind.DERIVED) { - WalletListItemModel model = - WalletListItemModel.makeForAccountInfo(accountInfo); - walletListItemModelList.add(model); - } - } - if (walletCoinAdapter != null) { - walletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - walletCoinAdapter.setOnWalletListItemClick(AccountsFragment.this); - walletCoinAdapter.setWalletListItemType(Utils.ACCOUNT_ITEM); - rvAccounts.setAdapter(walletCoinAdapter); - rvAccounts.setLayoutManager(new LinearLayoutManager(getActivity())); - } - }); - } - - private void setUpSecondaryAccountList(View view) { - if (mWalletModel == null) { - return; - } - RecyclerView rvSecondaryAccounts = view.findViewById(R.id.rv_secondary_accounts); - WalletCoinAdapter walletCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.ACCOUNTS_LIST); - mWalletModel.getKeyringModel().mAccountInfos.observe( - getViewLifecycleOwner(), accountInfos -> { - List walletListItemModelList = new ArrayList<>(); - for (AccountInfo accountInfo : accountInfos) { - if (accountInfo.accountId.kind == AccountKind.IMPORTED) { - walletListItemModelList.add( - WalletListItemModel.makeForAccountInfo(accountInfo)); - } - } - if (walletCoinAdapter != null) { - walletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - walletCoinAdapter.setOnWalletListItemClick(AccountsFragment.this); - walletCoinAdapter.setWalletListItemType(Utils.ACCOUNT_ITEM); - rvSecondaryAccounts.setAdapter(walletCoinAdapter); - rvSecondaryAccounts.setLayoutManager( - new LinearLayoutManager(getActivity())); - } - }); - } - - @Override - public void onAccountClick(WalletListItemModel walletListItemModel) { - if (walletListItemModel.getAccountInfo() == null) { - return; - } - - Intent accountDetailActivityIntent = AccountDetailActivity.createIntent( - getContext(), walletListItemModel.getAccountInfo()); - startActivity(accountDetailActivityIntent); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == Utils.ACCOUNT_REQUEST_CODE) { - if (resultCode == Activity.RESULT_OK) { - if (rootView != null) { - setUpAccountList(rootView); - setUpSecondaryAccountList(rootView); - } - } - } - } - - private KeyringService getKeyringService() { - Activity activity = getActivity(); - if (activity instanceof BraveWalletActivity) { - return ((BraveWalletActivity) activity).getKeyringService(); - } - - return null; - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AssetsFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AssetsFragment.java deleted file mode 100644 index 75f148d68eb..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/AssetsFragment.java +++ /dev/null @@ -1,375 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.TextView; - -import androidx.annotation.MainThread; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; -import org.chromium.base.task.PostTask; -import org.chromium.base.task.TaskTraits; -import org.chromium.brave_wallet.mojom.AssetPriceTimeframe; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.NetworkModel; -import org.chromium.chrome.browser.app.domain.NetworkSelectorModel; -import org.chromium.chrome.browser.app.domain.PortfolioModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.app.helpers.Api33AndPlusBackPressHelper; -import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.NetworkSelectorActivity; -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.observers.ApprovedTxObserver; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.PortfolioHelper; -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.util.LiveDataUtil; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; - -/** - * Assets fragment displayed under portfolio section of Brave Wallet. - */ -public class AssetsFragment extends Fragment implements OnWalletListItemClick, ApprovedTxObserver { - private static final String TAG = "AssetsFragment"; - private TextView mBalance; - private ImageButton mBtnChangeNetwork; - - private String mFiatSumString; - - private int mPreviousCheckedRadioId; - private int mCurrentTimeframeType; - private WalletModel mWalletModel; - - PortfolioHelper mPortfolioHelper; - private RecyclerView mRvCoins; - private WalletCoinAdapter mWalletCoinAdapter; - private List mSelectedNetworkList; - - private SmoothLineChartEquallySpaced mChartES; - private PortfolioModel mPortfolioModel; - private ProgressBar mPbAssetDiscovery; - private NetworkSelectorModel mNetworkSelectionModel; - private ImageView mIvMsg; - private TextView mTvMsgTitle; - private View mEditVisibleDivider; - - public static AssetsFragment newInstance() { - return new AssetsFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Api33AndPlusBackPressHelper.create( - this, (FragmentActivity) requireActivity(), () -> requireActivity().finish()); - } - mSelectedNetworkList = Collections.emptyList(); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mPortfolioModel = mWalletModel.getCryptoModel().getPortfolioModel(); - mWalletModel.getCryptoModel().getPortfolioModel().discoverAssetsOnAllSupportedChains(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate", e); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_assets, container, false); - mRvCoins = view.findViewById(R.id.rvCoins); - mChartES = view.findViewById(R.id.line_chart); - mPbAssetDiscovery = view.findViewById(R.id.frag_port_pb_asset_discovery); - mRvCoins.addItemDecoration( - new DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)); - - mChartES.setOnTouchListener(new View.OnTouchListener() { - @Override - @SuppressLint("ClickableViewAccessibility") - public boolean onTouch(View v, MotionEvent event) { - v.getParent().requestDisallowInterceptTouchEvent(true); - if (mChartES == null) { - return true; - } - if (event.getAction() == MotionEvent.ACTION_MOVE - || event.getAction() == MotionEvent.ACTION_DOWN) { - mChartES.drawLine(event.getRawX(), mBalance); - } else if (event.getAction() == MotionEvent.ACTION_UP - || event.getAction() == MotionEvent.ACTION_CANCEL) { - mBalance.setText(mFiatSumString); - mBalance.invalidate(); - mChartES.drawLine(-1, null); - } - - return true; - } - }); - - mBtnChangeNetwork = view.findViewById(R.id.fragment_portfolio_btn_change_networks); - mBtnChangeNetwork.setOnClickListener(v -> openNetworkSelection()); - - mIvMsg = view.findViewById(R.id.frag_assets_iv_msg); - mTvMsgTitle = view.findViewById(R.id.frag_assets_tv_msg); - mEditVisibleDivider = view.findViewById(R.id.frag_asset_edit_divider); - mBalance = view.findViewById(R.id.balance); - mBalance.setOnClickListener(v -> updatePortfolioGetPendingTx()); - if (mWalletModel != null) setUpObservers(); - return view; - } - - @MainThread - private void setUpObservers() { - ThreadUtils.assertOnUiThread(); - mNetworkSelectionModel = getNetworkModel().openNetworkSelectorModel(TAG, - NetworkSelectorModel.Mode.LOCAL_NETWORK_FILTER, - NetworkSelectorModel.SelectionMode.MULTI, getLifecycle()); - // Show pending transactions fab to process pending txs - mNetworkSelectionModel.mSelectedNetworks.observe( - getViewLifecycleOwner(), selectedNetworkInfos -> { - mSelectedNetworkList = selectedNetworkInfos; - if (mSelectedNetworkList.isEmpty()) { - clearAssets(); - AndroidUtils.show(mIvMsg, mTvMsgTitle, mEditVisibleDivider); - return; - } - AndroidUtils.gone(mIvMsg, mTvMsgTitle, mEditVisibleDivider); - updatePortfolioGetPendingTx(); - }); - mWalletModel.getCryptoModel().getPortfolioModel().mIsDiscoveringUserAssets.observe( - getViewLifecycleOwner(), isDiscoveringUserAssets -> { - if (isDiscoveringUserAssets) { - AndroidUtils.show(mPbAssetDiscovery); - } else { - AndroidUtils.gone(mPbAssetDiscovery); - updatePortfolioGetPendingTx(); - } - }); - - getNetworkModel().mNeedToCreateAccountForNetwork.observe( - getViewLifecycleOwner(), networkInfo -> { - if (networkInfo == null) return; - - MaterialAlertDialogBuilder builder = - new MaterialAlertDialogBuilder( - requireContext(), R.style.BraveWalletAlertDialogTheme) - .setMessage(getString( - R.string.brave_wallet_create_account_description, - networkInfo.symbolName)) - .setPositiveButton(R.string.brave_action_yes, - (dialog, which) - -> mWalletModel - .createAccountAndSetDefaultNetwork( - networkInfo)) - .setNegativeButton( - R.string.brave_action_no, (dialog, which) -> { - getNetworkModel().clearCreateAccountState(); - dialog.dismiss(); - }); - builder.show(); - }); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - TextView editVisibleAssets = view.findViewById(R.id.edit_visible_assets); - editVisibleAssets.setOnClickListener(v -> showEditVisibleDialog()); - - RadioGroup radioGroup = view.findViewById(R.id.portfolio_duration_radio_group); - mPreviousCheckedRadioId = radioGroup.getCheckedRadioButtonId(); - mCurrentTimeframeType = Utils.getTimeframeFromRadioButtonId(mPreviousCheckedRadioId); - radioGroup.setOnCheckedChangeListener((group, checkedId) -> { - ((RadioButton) view.findViewById(mPreviousCheckedRadioId)) - .setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - mCurrentTimeframeType = Utils.getTimeframeFromRadioButtonId(checkedId); - mPreviousCheckedRadioId = checkedId; - updatePortfolioGraph(); - }); - } - - private void setUpCoinList(List userAssets, - HashMap perTokenCryptoSum, HashMap perTokenFiatSum, - List networkInfos) { - String tokensPath = BlockchainRegistryFactory.getInstance().getTokensIconsLocation(); - - mWalletCoinAdapter = Utils.setupVisibleAssetList(userAssets, perTokenCryptoSum, - perTokenFiatSum, tokensPath, getResources(), networkInfos); - mWalletCoinAdapter.setOnWalletListItemClick(this); - mRvCoins.setAdapter(mWalletCoinAdapter); - mRvCoins.setLayoutManager(new LinearLayoutManager(getActivity())); - } - - private void clearAssets() { - if (mWalletCoinAdapter != null) { - mWalletCoinAdapter.clear(); - } - } - - @Override - public void onAssetClick(BlockchainToken asset) { - NetworkInfo selectedNetwork = null; - if (mWalletModel != null) { - selectedNetwork = getNetworkModel().getNetwork(asset.chainId); - } - if (selectedNetwork == null) { - return; - } - - Utils.openAssetDetailsActivity(requireContext(), asset); - } - - private void openNetworkSelection() { - Intent intent = NetworkSelectorActivity.createIntent( - requireContext(), NetworkSelectorModel.Mode.LOCAL_NETWORK_FILTER, TAG); - startActivity(intent); - } - - private void adjustTrendControls() { - TextView trendTimeframe = requireView().findViewById(R.id.trend_timeframe); - TextView trendPercentage = requireView().findViewById(R.id.trend_percentage); - - if (mPortfolioHelper.isFiatHistoryEmpty()) { - trendTimeframe.setVisibility(View.GONE); - trendPercentage.setVisibility(View.GONE); - } else { - trendTimeframe.setText(Utils.getTimeframeString(mCurrentTimeframeType)); - - Double currentFiatSum = mPortfolioHelper.getTotalFiatSum(); - Double mostRecentFiatSum = mPortfolioHelper.getMostRecentFiatSum(); - - double percents = ((currentFiatSum - mostRecentFiatSum) / mostRecentFiatSum) * 100; - trendPercentage.setText( - String.format(Locale.getDefault(), "%.2f%%", Math.abs(percents))); - if (mostRecentFiatSum > currentFiatSum) { - trendPercentage.setTextColor(ContextCompat.getColor( - requireContext(), R.color.wallet_negative_trend_color)); - trendPercentage.setCompoundDrawablesWithIntrinsicBounds( - R.drawable.ic_down_icon, 0, 0, 0); - } else { - trendPercentage.setTextColor(ContextCompat.getColor( - requireContext(), R.color.wallet_positive_trend_color)); - trendPercentage.setCompoundDrawablesWithIntrinsicBounds( - R.drawable.ic_up_icon, 0, 0, 0); - } - - trendTimeframe.setVisibility(View.VISIBLE); - trendPercentage.setVisibility(View.VISIBLE); - } - } - - private void updatePortfolioGraph() { - AssetPriceTimeframe.validate(mCurrentTimeframeType); - - if (mPortfolioHelper == null) { - updatePortfolioGetPendingTx(); - return; - } - - mPortfolioHelper.setFiatHistoryTimeframe(mCurrentTimeframeType); - mPortfolioHelper.calculateFiatHistory( - () -> PostTask.runOrPostTask(TaskTraits.UI_DEFAULT, () -> { - mChartES.setColors(new int[] {0xFFF73A1C, 0xFFBF14A2, 0xFF6F4CD2}); - mChartES.setData(mPortfolioHelper.getFiatHistory()); - - adjustTrendControls(); - })); - } - - private void updatePortfolioGetPendingTx() { - if (mWalletModel == null || mSelectedNetworkList.isEmpty()) return; - - Activity activity = getActivity(); - if (!(activity instanceof BraveWalletActivity)) return; - mPortfolioModel.fetchAssets(TokenUtils.TokenType.NON_NFTS, mSelectedNetworkList, - (BraveWalletBaseActivity) activity, (portfolioHelper) -> { - if (!AndroidUtils.canUpdateFragmentUi(this)) return; - mPortfolioHelper = portfolioHelper; - - mFiatSumString = String.format( - Locale.getDefault(), "$%,.2f", mPortfolioHelper.getTotalFiatSum()); - mBalance.setText(mFiatSumString); - mBalance.invalidate(); - - LiveDataUtil.observeOnce(getNetworkModel().mCryptoNetworks, - networkInfos - -> setUpCoinList(mPortfolioHelper.getUserAssets(), - mPortfolioHelper.getPerTokenCryptoSum(), - mPortfolioHelper.getPerTokenFiatSum(), networkInfos)); - updatePortfolioGraph(); - }); - } - - @Override - public void onTxPending(String txId) { - updatePortfolioGetPendingTx(); - } - - @Override - public void onTxApprovedRejected(boolean approved, String txId) { - /* No op. */ - } - - private void showEditVisibleDialog() { - EditVisibleAssetsBottomSheetDialogFragment bottomSheetDialogFragment = - EditVisibleAssetsBottomSheetDialogFragment.newInstance( - WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST, false); - - bottomSheetDialogFragment.setDismissListener(isAssetsListChanged -> { - if (isAssetsListChanged) { - updatePortfolioGetPendingTx(); - } - }); - - bottomSheetDialogFragment.show(getParentFragmentManager(), - EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); - } - - private NetworkModel getNetworkModel() { - return mWalletModel.getCryptoModel().getNetworkModel(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java deleted file mode 100644 index 97984bfe563..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java +++ /dev/null @@ -1,574 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import static java.lang.Boolean.compare; - -import android.app.Activity; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.Spinner; -import android.widget.TextView; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.SearchView; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.BlockchainRegistry; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.BraveWalletService; -import org.chromium.brave_wallet.mojom.KeyringService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.UserAssetModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; -import org.chromium.chrome.browser.crypto_wallet.activities.AddAssetActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.adapters.NetworkSpinnerAdapter; -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.KeyringServiceObserverImpl; -import org.chromium.chrome.browser.crypto_wallet.observers.KeyringServiceObserverImpl.KeyringServiceObserverImplDelegate; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; -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.WalletUtils; -import org.chromium.chrome.browser.util.LiveDataUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.stream.IntStream; - -public class EditVisibleAssetsBottomSheetDialogFragment extends BottomSheetDialogFragment - implements View.OnClickListener, OnWalletListItemClick, KeyringServiceObserverImplDelegate, - AdapterView.OnItemSelectedListener { - public static final String TAG_FRAGMENT = - EditVisibleAssetsBottomSheetDialogFragment.class.getName(); - private WalletCoinAdapter mWalletCoinAdapter; - private final WalletCoinAdapter.AdapterType mType; - private final boolean mNftsOnly; - private NetworkInfo mSelectedNetwork; - private DismissListener mDismissListener; - private boolean mIsAssetsListChanged; - private static final String TAG = "EditVisibleAssetsFrag"; - private WalletModel mWalletModel; - private KeyringServiceObserverImpl mKeyringServiceObserver; - private OnEditVisibleItemClickListener mOnEditVisibleItemClickListener; - private List mCryptoNetworks; - private UserAssetModel mUserAssetModel; - private final boolean isEditVisibleAssetType; - private Spinner mNetworkSp; - private NetworkSpinnerAdapter mNetworkAdapter; - private ArrayList mSpinnerNetworks; - - private ActivityResultLauncher mAddAssetActivityResultLauncher; - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (mUserAssetModel == null) return; - mSelectedNetwork = mSpinnerNetworks.get(position); - mUserAssetModel.fetchAssets(mNftsOnly, mSelectedNetwork); - } - - @Override - public void onNothingSelected(AdapterView parent) {} - - public interface DismissListener { - void onDismiss(boolean isAssetsListChanged); - } - - public static EditVisibleAssetsBottomSheetDialogFragment newInstance( - WalletCoinAdapter.AdapterType type, boolean nftsOnly) { - return new EditVisibleAssetsBottomSheetDialogFragment(type, nftsOnly); - } - - private EditVisibleAssetsBottomSheetDialogFragment( - WalletCoinAdapter.AdapterType type, boolean nftsOnly) { - mType = type; - mNftsOnly = nftsOnly; - isEditVisibleAssetType = mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST; - } - - // TODO (Wengling): add an interface for getting services that can be shared between activity - // and fragments - private BlockchainRegistry getBlockchainRegistry() { - Activity activity = getActivity(); - if (activity instanceof BraveWalletBaseActivity) { - return ((BraveWalletBaseActivity) activity).getBlockchainRegistry(); - } - - return null; - } - - private BraveWalletService getBraveWalletService() { - Activity activity = getActivity(); - if (activity instanceof BraveWalletBaseActivity) { - return ((BraveWalletBaseActivity) activity).getBraveWalletService(); - } - - return null; - } - - private KeyringService getKeyringService() { - Activity activity = getActivity(); - if (activity instanceof BraveWalletBaseActivity) { - return ((BraveWalletBaseActivity) activity).getKeyringService(); - } - - return null; - } - - public void setSelectedNetwork(NetworkInfo selectedNetwork) { - assert selectedNetwork != null; - mSelectedNetwork = selectedNetwork; - } - - public void setOnAssetClickListener( - OnEditVisibleItemClickListener onEditVisibleItemClickListener) { - mOnEditVisibleItemClickListener = onEditVisibleItemClickListener; - } - - public void setDismissListener(DismissListener dismissListener) { - mDismissListener = dismissListener; - } - - @Override - public void show(FragmentManager manager, String tag) { - try { - EditVisibleAssetsBottomSheetDialogFragment fragment = - (EditVisibleAssetsBottomSheetDialogFragment) manager.findFragmentByTag( - EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); - FragmentTransaction transaction = manager.beginTransaction(); - if (fragment != null) { - transaction.remove(fragment); - } - transaction.add(this, tag); - transaction.commitAllowingStateLoss(); - } catch (IllegalStateException e) { - Log.e(TAG, "Error when showing EditVisibleAssetsBottomSheetDialogFragment.", e); - } - } - - @Override - public void locked() { - dismiss(); - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mUserAssetModel = mWalletModel.getCryptoModel().createUserAssetModel(mType); - mSelectedNetwork = JavaUtils.safeVal( - mSelectedNetwork, NetworkUtils.getAllNetworkOption(requireContext())); - mUserAssetModel.fetchAssets(mNftsOnly, mSelectedNetwork); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "Error during dialog creation.", e); - } - - KeyringService keyringService = getKeyringService(); - assert keyringService != null; - mKeyringServiceObserver = new KeyringServiceObserverImpl(this); - keyringService.addObserver(mKeyringServiceObserver); - - Dialog dialog = super.onCreateDialog(savedInstanceState); - dialog.setOnShowListener(dialogInterface -> { - BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface; - setupFullHeight(bottomSheetDialog); - }); - return dialog; - } - - @Override - public void onDismiss(@NonNull DialogInterface dialog) { - super.onDismiss(dialog); - if (mDismissListener != null) { - mDismissListener.onDismiss(mIsAssetsListChanged); - } - if (mKeyringServiceObserver != null) { - mKeyringServiceObserver.close(); - mKeyringServiceObserver = null; - } - } - - private void setupFullHeight(BottomSheetDialog bottomSheetDialog) { - FrameLayout bottomSheet = bottomSheetDialog.findViewById(R.id.design_bottom_sheet); - if (bottomSheet != null) { - BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); - ViewGroup.LayoutParams layoutParams = bottomSheet.getLayoutParams(); - - int windowHeight = getWindowHeight(); - if (layoutParams != null) { - layoutParams.height = windowHeight; - } - bottomSheet.setLayoutParams(layoutParams); - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } - } - - private int getWindowHeight() { - // Calculate window height for fullscreen use - DisplayMetrics displayMetrics = new DisplayMetrics(); - requireActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - return displayMetrics.heightPixels; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - final View view = - inflater.inflate(R.layout.edit_visible_assets_bottom_sheet, container, false); - - Button saveAssets = view.findViewById(R.id.saveAssets); - TextView addCustomAsset = view.findViewById(R.id.add_custom_asset); - addCustomAsset.setText( - mNftsOnly ? R.string.wallet_add_nft : R.string.wallet_add_custom_asset); - if (mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - addCustomAsset.setOnClickListener(clickView -> showAddAssetActivity()); - saveAssets.setOnClickListener(clickView -> dismiss()); - } else { - saveAssets.setVisibility(View.GONE); - addCustomAsset.setVisibility(View.GONE); - } - - if (mType == WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST) { - mNetworkSp = view.findViewById(R.id.edit_visible_network_spinner); - mNetworkAdapter = new NetworkSpinnerAdapter(requireContext(), Collections.emptyList()); - mNetworkSp.setAdapter(mNetworkAdapter); - AndroidUtils.show(mNetworkSp); - mNetworkSp.setOnItemSelectedListener(this); - } - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setUpObservers(); - } - - private void setUpObservers() { - if (JavaUtils.anyNull(mUserAssetModel, mWalletModel)) return; - LiveDataUtil.observeOnce( - mWalletModel.getCryptoModel().getNetworkModel().mCryptoNetworks, networkInfos -> { - mCryptoNetworks = networkInfos; - mUserAssetModel.mAssetsResult.observe(getViewLifecycleOwner(), assetsResult -> { - setUpAssetsList(getView(), assetsResult.tokens, assetsResult.userAssets); - }); - if (mNetworkAdapter != null) { - mSpinnerNetworks = new ArrayList<>(networkInfos); - mSpinnerNetworks.add(0, NetworkUtils.getAllNetworkOption(requireContext())); - mNetworkAdapter.setNetworks(mSpinnerNetworks); - int selectedNetworkIndex = - IntStream.range(0, mSpinnerNetworks.size()) - .filter(i - -> mSpinnerNetworks.get(i).chainId.equals( - mSelectedNetwork.chainId)) - .findFirst() - .orElse(0); - mNetworkSp.setSelection(selectedNetworkIndex, false); - } - }); - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - - // Pass @{code ActivityResultRegistry} reference explicitly to avoid crash - // https://github.com/brave/brave-browser/issues/31882 - mAddAssetActivityResultLauncher = registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - ((BraveWalletBaseActivity) requireActivity()).getActivityResultRegistry(), - result -> { - if (result.getResultCode() == Activity.RESULT_OK) { - Intent intent = result.getData(); - if (intent == null) { - return; - } - final BlockchainToken token = - WalletUtils.getBlockchainTokenFromIntent(intent); - final NetworkInfo networkInfo = - WalletUtils.getNetworkInfoFromIntent(intent); - if (token == null || networkInfo == null) { - return; - } - - boolean isDuplicateToken = false; - for (WalletListItemModel item : mWalletCoinAdapter.getCheckedAssets()) { - // We can have multiple ERC721 or Solana NFTs with the same name - if (!item.isNft() - && (item.getTitle().equals(token.name) - || item.getSubTitle().equals(token.symbol))) { - isDuplicateToken = true; - break; - } - } - if (!isDuplicateToken) { - WalletListItemModel itemModel = - new WalletListItemModel(R.drawable.ic_eth, token.name, - token.symbol, token.tokenId, "", ""); - itemModel.setBlockchainToken(token); - itemModel.setIconPath(token.logo); - itemModel.setAssetNetwork(networkInfo); - - itemModel.isVisible(true); - mWalletCoinAdapter.addItem(itemModel); - mIsAssetsListChanged = true; - } - } - }); - } - - private void showAddAssetActivity() { - Intent addAssetIntent = AddAssetActivity.getIntent(requireContext(), mNftsOnly); - mAddAssetActivityResultLauncher.launch(addAssetIntent); - } - - private void setUpAssetsList( - View view, List tokens, List userSelectedTokens) { - HashSet selectedTokensSymbols = new HashSet<>(); - if (!mNftsOnly) { - for (BlockchainToken userSelectedToken : userSelectedTokens) { - selectedTokensSymbols.add(Utils.tokenToString(userSelectedToken)); - } - } - RecyclerView rvAssets = view.findViewById(R.id.rvAssets); - mWalletCoinAdapter = new WalletCoinAdapter(mType); - List walletListItemModelList = new ArrayList<>(); - String tokensPath = BlockchainRegistryFactory.getInstance().getTokensIconsLocation(); - for (int i = 0; i < tokens.size(); i++) { - BlockchainToken token = tokens.get(i); - - NetworkInfo assetNetwork = - NetworkUtils.findNetwork(mCryptoNetworks, token.chainId, token.coin); - if (assetNetwork == null) { - Log.e(TAG, - String.format("Asset network for token with chain Id %s was null.", - token.chainId)); - continue; - } - String subtitle = !isEditVisibleAssetType - ? token.symbol - : getString(R.string.brave_wallet_portfolio_asset_network_description, - token.symbol, assetNetwork.chainName); - - WalletListItemModel itemModel = new WalletListItemModel( - Utils.getCoinIcon(token.coin), token.name, subtitle, token.tokenId, "", ""); - itemModel.setBlockchainToken(token); - itemModel.setAssetNetwork(assetNetwork); - itemModel.setBrowserResourcePath(tokensPath); - itemModel.setIconPath("file://" + tokensPath + "/" + token.logo); - if (mNftsOnly) { - itemModel.isVisible(token.visible); - } else { - itemModel.isVisible(selectedTokensSymbols.contains(Utils.tokenToString(token))); - } - - walletListItemModelList.add(itemModel); - } - walletListItemModelList.sort( - (item1, item2) -> compare(item2.isVisible(), item1.isVisible())); - mWalletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - mWalletCoinAdapter.setOnWalletListItemClick(this); - mWalletCoinAdapter.setWalletListItemType(Utils.ASSET_ITEM); - rvAssets.setAdapter(mWalletCoinAdapter); - rvAssets.setLayoutManager(new LinearLayoutManager(getActivity())); - SearchView searchView = view.findViewById(R.id.searchView); - searchView.setQueryHint(getText(R.string.search_tokens)); - searchView.setIconified(false); - searchView.clearFocus(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - if (mWalletCoinAdapter != null) { - mWalletCoinAdapter.filter(query, !isEditVisibleAssetType); - } - - return true; - } - - @Override - public boolean onQueryTextChange(String newText) { - if (mWalletCoinAdapter != null) { - mWalletCoinAdapter.filter(newText, !isEditVisibleAssetType); - } - - return true; - } - }); - } - - @Override - public void onClick(View view) { - dismiss(); - } - - @Override - public void onAssetClick(BlockchainToken token) { - List checkedAssets = mWalletCoinAdapter.getCheckedAssets(); - if (mOnEditVisibleItemClickListener != null) { - mOnEditVisibleItemClickListener.onAssetClick(checkedAssets.get(0)); - } - dismiss(); - } - - @Override - public void onTrashIconClick(WalletListItemModel walletListItemModel) { - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); - builder.setTitle(R.string.wallet_remove_custom_asset); - builder.setMessage(String.format(getString(R.string.wallet_remove_custom_asset_desc), - walletListItemModel.getBlockchainToken().name, - walletListItemModel.getBlockchainToken().symbol)); - - builder.setPositiveButton(R.string.wallet_remove_custom_asset_yes, (dialog, id) -> { - BraveWalletService braveWalletService = getBraveWalletService(); - assert braveWalletService != null; - braveWalletService.removeUserAsset( - walletListItemModel.getBlockchainToken(), (success) -> { - if (success) { - mWalletCoinAdapter.removeItem(walletListItemModel); - mIsAssetsListChanged = true; - } - }); - }); - builder.setNegativeButton(R.string.wallet_remove_custom_asset_no, null); - AlertDialog alert = builder.create(); - alert.show(); - } - - @Override - public void onMaybeShowTrashButton( - WalletListItemModel walletListItemModel, ImageView trashButton) { - assert walletListItemModel.getAssetNetwork() != null : "Network should not be null"; - // Prevent NPE of network, issue:#31303 - if (mType != WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST - || walletListItemModel.getAssetNetwork() == null) { - return; - } - - TokenUtils.isCustomToken(getBlockchainRegistry(), walletListItemModel.getAssetNetwork(), - walletListItemModel.getBlockchainToken().coin, - walletListItemModel.getBlockchainToken(), isCustom -> { - if (!isCustom) return; - - trashButton.setVisibility(View.VISIBLE); - }); - } - - @Override - public void onAssetCheckedChanged( - WalletListItemModel walletListItemModel, CheckBox assetCheck, boolean isChecked) { - assert walletListItemModel.getAssetNetwork() != null : "Network should not be null"; - // Prevent NPE of network, issue:#31303 - if (mType != WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST - || walletListItemModel.getAssetNetwork() == null) { - return; - } - - BlockchainToken thisToken = walletListItemModel.getBlockchainToken(); - final BraveWalletService braveWalletService = getBraveWalletService(); - if (braveWalletService == null) { - Log.e(TAG, "BraveWalletService was null."); - return; - } - - final BlockchainRegistry blockchainRegistry = getBlockchainRegistry(); - if (blockchainRegistry == null) { - Log.e(TAG, "BlockchainRegistry was null."); - return; - } - - TokenUtils.isCustomToken(blockchainRegistry, walletListItemModel.getAssetNetwork(), - walletListItemModel.getBlockchainToken().coin, thisToken, isCustom -> { - // Only show add asset dialog on click when: - // 1. It is an ERC721 token - // 2. It is a token listed in Registry - // 3. It is not user added (i.e. doesn't have a token id) - if (thisToken.isErc721 && !isCustom - && (thisToken.tokenId == null || thisToken.tokenId.trim().isEmpty())) { - showAddAssetActivity(); - walletListItemModel.isVisible( - false); // The added token is different from the listed one - itemCheckboxConsistency(walletListItemModel, assetCheck, isChecked); - } else { - if (!isCustom) { - if (isChecked) { - braveWalletService.addUserAsset(thisToken, (success) -> { - if (success) { - walletListItemModel.isVisible(true); - } - itemCheckboxConsistency(walletListItemModel, assetCheck, true); - }); - } else { - braveWalletService.removeUserAsset(thisToken, (success) -> { - if (success) { - walletListItemModel.isVisible(false); - } - itemCheckboxConsistency(walletListItemModel, assetCheck, false); - }); - } - } else { - braveWalletService.setUserAssetVisible( - thisToken, isChecked, success -> { - if (success) { - walletListItemModel.isVisible(isChecked); - } - itemCheckboxConsistency( - walletListItemModel, assetCheck, isChecked); - }); - } - mIsAssetsListChanged = true; - } - }); - } - - private void itemCheckboxConsistency( - WalletListItemModel walletListItemModel, CheckBox assetCheck, boolean isChecked) { - if (isChecked != walletListItemModel.isVisible()) { - assetCheck.setTag("noOnClickListener"); - assetCheck.setChecked(walletListItemModel.isVisible()); - } - } - - public interface OnEditVisibleItemClickListener { - default void onAssetClick(WalletListItemModel asset) {} - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/MarketFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/MarketFragment.java deleted file mode 100644 index 5768265f5b4..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/MarketFragment.java +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.cardview.widget.CardView; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import org.chromium.base.Log; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.MarketModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.app.helpers.Api33AndPlusBackPressHelper; -import org.chromium.chrome.browser.app.shimmer.ShimmerFrameLayout; -import org.chromium.chrome.browser.crypto_wallet.adapters.MarketCoinAdapter; -import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; -import org.chromium.chrome.browser.custom_layout.LockableNestedScrollView; - -import java.util.Arrays; - -public class MarketFragment extends Fragment { - private static final String TAG = "MarketFragment"; - - private LockableNestedScrollView mRootView; - private RecyclerView mCoinMarkets; - private ShimmerFrameLayout mShimmerViewContainer; - private LinearLayout mSingleItemShimmer; - private CardView mShimmerCardView; - private LinearLayout mShimmerListContainer; - private CardView mMarketListCardView; - - private MarketCoinAdapter mMarketCoinAdapter; - - private WalletModel mWalletModel; - private MarketModel mMarketModel; - - private boolean mShimmerActive = true; - - public static MarketFragment newInstance() { - return new MarketFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Api33AndPlusBackPressHelper.create( - this, (FragmentActivity) requireActivity(), () -> requireActivity().finish()); - } - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mMarketModel = mWalletModel.getMarketModel(); - } catch (BraveActivity.BraveActivityNotFoundException exception) { - Log.e(TAG, "onCreate", exception); - return; - } - mMarketCoinAdapter = new MarketCoinAdapter(getContext(), mMarketModel); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - mRootView = (LockableNestedScrollView) inflater.inflate( - R.layout.fragment_market, container, false); - mRootView.setScrollingEnabled(false); - mShimmerViewContainer = mRootView.findViewById(R.id.shimmer_view_container); - mSingleItemShimmer = mRootView.findViewById(R.id.market_coin_item); - mShimmerCardView = mRootView.findViewById(R.id.card_view_market_placeholder); - mShimmerListContainer = mRootView.findViewById(R.id.shimmer_list); - mMarketListCardView = mRootView.findViewById(R.id.market_list_card_view_view_container); - - mCoinMarkets = mRootView.findViewById(R.id.coin_markets_recycler_view); - mCoinMarkets.addItemDecoration( - new DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)); - mCoinMarkets.setAdapter(mMarketCoinAdapter); - mCoinMarkets.setLayoutManager(new LinearLayoutManager(getActivity())); - - final int visibleShimmerItems = - getVisibleShimmerItems(mSingleItemShimmer, mShimmerCardView); - for (int i = 1; i < visibleShimmerItems; i++) { - inflater.inflate(R.layout.brave_wallet_divider, mShimmerListContainer, true); - inflater.inflate(R.layout.market_coin_shimmer_item, mShimmerListContainer, true); - } - - if (mMarketModel != null) { - mMarketModel.mCoinMarkets.observe(getViewLifecycleOwner(), coinMarkets -> { - if (coinMarkets == null) { - Log.e(TAG, "Failed to load coin market list."); - } else { - mMarketCoinAdapter.setCoinMarkets(Arrays.asList(coinMarkets)); - } - disableShimmerEffect(); - }); - mMarketModel.getCoinMarkets(); - } - return mRootView; - } - - private int getVisibleShimmerItems( - final ViewGroup mSingleItemShimmer, final CardView shimmerCardView) { - int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - - mSingleItemShimmer.measure(widthMeasureSpec, heightMeasureSpec); - int itemHeight = mSingleItemShimmer.getMeasuredHeight(); - int totalHeight = AndroidUtils.getScreenHeight(); - - int totalHeightNoPadding = - totalHeight - shimmerCardView.getPaddingTop() - shimmerCardView.getPaddingBottom(); - - return Math.max(1, (int) Math.ceil((float) totalHeightNoPadding / itemHeight)); - } - - @Override - public void onResume() { - super.onResume(); - if (mShimmerActive) { - mShimmerViewContainer.startShimmer(); - } - } - - @Override - public void onPause() { - super.onPause(); - if (mShimmerActive) { - mShimmerViewContainer.stopShimmer(); - } - } - - private void disableShimmerEffect() { - if (mShimmerActive) { - mShimmerViewContainer.hideShimmer(); - mShimmerViewContainer.setVisibility(View.GONE); - mRootView.setScrollingEnabled(true); - mMarketListCardView.setVisibility(View.VISIBLE); - mShimmerActive = false; - } - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/NftGridFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/NftGridFragment.java deleted file mode 100644 index 6f6b7b0fbf7..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/NftGridFragment.java +++ /dev/null @@ -1,450 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.app.Activity; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.text.method.LinkMovementMethod; -import android.text.style.UnderlineSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.MainThread; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.android.material.tabs.TabLayout; - -import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.BraveWalletP3a; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.NetworkModel; -import org.chromium.chrome.browser.app.domain.NetworkSelectorModel; -import org.chromium.chrome.browser.app.domain.PortfolioModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.app.helpers.Api33AndPlusBackPressHelper; -import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; -import org.chromium.chrome.browser.crypto_wallet.activities.AddAssetActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.NetworkSelectorActivity; -import org.chromium.chrome.browser.crypto_wallet.activities.NftDetailActivity; -import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; -import org.chromium.chrome.browser.crypto_wallet.adapters.WalletNftAdapter; -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.util.AssetUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.PortfolioHelper; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; -import org.chromium.chrome.browser.custom_layout.AutoFitVerticalGridLayoutManager; -import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; -import org.chromium.chrome.browser.util.TabUtils; -import org.chromium.ui.text.NoUnderlineClickableSpan; -import org.chromium.ui.text.SpanApplier; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -public class NftGridFragment extends Fragment implements OnWalletListItemClick { - private enum SelectedTab { NFTS, HIDDEN } - - public static final String SHOW_NFT_DISCOVERY_DIALOG = "nft_discovery_dialog"; - private static final String TAG = "NftGridFragment"; - private static final float NFT_ITEM_WIDTH_DP = 180; - - private WalletModel mWalletModel; - private PortfolioModel mPortfolioModel; - private List mNftDataModels; - private List mNftHiddenDataModels; - private NetworkSelectorModel mNetworkSelectionModel; - private boolean mCanRunOnceWhenResumed; - - private List mAllNetworkInfos; - private PortfolioHelper mPortfolioHelper; - private List mSelectedNetworkList; - - private boolean mActive; - private RecyclerView mRvNft; - private WalletNftAdapter mWalletNftAdapter; - private RecyclerView mRvHiddenNft; - private WalletNftAdapter mWalletHiddenNftAdapter; - private ProgressBar mPbAssetDiscovery; - private ViewGroup mAddNftsContainer; - private ImageButton mBtnChangeNetwork; - private ImageView mBtnAddNft; - private TabLayout mTabLayout; - private SelectedTab mSelectedTab; - - private ActivityResultLauncher mAddAssetActivityResultLauncher; - - public static NftGridFragment newInstance() { - return new NftGridFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Api33AndPlusBackPressHelper.create( - this, (FragmentActivity) requireActivity(), () -> requireActivity().finish()); - } - mSelectedNetworkList = Collections.emptyList(); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mPortfolioModel = mWalletModel.getCryptoModel().getPortfolioModel(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate", e); - } - mCanRunOnceWhenResumed = true; - // Initial state is NFTs section. - mSelectedTab = SelectedTab.NFTS; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_nft_grid, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - mTabLayout = view.findViewById(R.id.nft_tab_layout); - mTabLayout.addTab(mTabLayout.newTab().setText(getString(R.string.brave_wallet_nfts))); - mTabLayout.addTab(mTabLayout.newTab().setText(getString(R.string.brave_wallet_hidden))); - mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { - @Override - public void onTabSelected(TabLayout.Tab tab) { - final boolean nftPosition = tab.getPosition() == 0; - mRvNft.setVisibility(nftPosition ? View.VISIBLE : View.GONE); - mRvHiddenNft.setVisibility(nftPosition ? View.GONE : View.VISIBLE); - mSelectedTab = nftPosition ? SelectedTab.NFTS : SelectedTab.HIDDEN; - showEmptyMessage(nftPosition ? mWalletNftAdapter : mWalletHiddenNftAdapter); - } - - @Override - public void onTabUnselected(TabLayout.Tab tab) { - /* No-op. */ - } - - @Override - public void onTabReselected(TabLayout.Tab tab) { - /* No-op. */ - } - }); - mPbAssetDiscovery = view.findViewById(R.id.frag_nft_grid_pb_asset_discovery); - mAddNftsContainer = view.findViewById(R.id.add_nfts_container); - mBtnChangeNetwork = view.findViewById(R.id.fragment_nft_grid_btn_change_networks); - mBtnChangeNetwork.setOnClickListener(v -> openNetworkSelection()); - - mBtnAddNft = view.findViewById(R.id.fragment_nft_grid_btn_add_nft); - mBtnAddNft.setOnClickListener(v -> { - Intent addAssetIntent = AddAssetActivity.getIntent(requireContext(), true); - mAddAssetActivityResultLauncher.launch(addAssetIntent); - }); - setUpObservers(); - - // Pass @{code ActivityResultRegistry} reference explicitly to avoid crash - // https://github.com/brave/brave-browser/issues/31882 - mAddAssetActivityResultLauncher = - registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), - ((BraveWalletBaseActivity) requireActivity()).getActivityResultRegistry(), - result -> { - if (result.getResultCode() == Activity.RESULT_OK) { - mPbAssetDiscovery.setVisibility(View.VISIBLE); - updateNftGrid(); - } - }); - - TextView editVisibleNft = view.findViewById(R.id.edit_visible_nfts); - mRvNft = view.findViewById(R.id.rv_nft); - mRvHiddenNft = view.findViewById(R.id.rv_hidden_nft); - editVisibleNft.setOnClickListener(v -> showEditVisibleDialog()); - } - - private void showEmptyMessage(@Nullable final WalletNftAdapter adapter) { - final boolean showEmptyMessage = adapter == null || adapter.getItemCount() == 0; - mAddNftsContainer.setVisibility(showEmptyMessage ? View.VISIBLE : View.GONE); - } - - @Override - public void onResume() { - super.onResume(); - mActive = true; - recordP3AView(); - - if (JavaUtils.anyNull(mWalletModel) - || !mCanRunOnceWhenResumed - || !ChromeSharedPreferences.getInstance() - .readBoolean(SHOW_NFT_DISCOVERY_DIALOG, true)) return; - - mWalletModel.getCryptoModel().isNftDiscoveryEnabled(isNftDiscoveryEnabled -> { - if (!isNftDiscoveryEnabled) { - showNftDiscoveryDialog(); - mCanRunOnceWhenResumed = false; - } - }); - } - - @Override - public void onPause() { - super.onPause(); - mActive = false; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (mPortfolioModel != null) { - mPortfolioModel.clearNftModels(); - } - } - - @MainThread - private void setUpObservers() { - ThreadUtils.assertOnUiThread(); - if (mWalletModel == null) return; - getNetworkModel().mCryptoNetworks.observe( - getViewLifecycleOwner(), allNetworkInfos -> mAllNetworkInfos = allNetworkInfos); - mNetworkSelectionModel = getNetworkModel().openNetworkSelectorModel(TAG, - NetworkSelectorModel.Mode.LOCAL_NETWORK_FILTER, - NetworkSelectorModel.SelectionMode.MULTI, getLifecycle()); - mNetworkSelectionModel.mSelectedNetworks.observe( - getViewLifecycleOwner(), selectedNetworkInfos -> { - mSelectedNetworkList = selectedNetworkInfos; - if (mSelectedNetworkList.isEmpty()) { - mAddNftsContainer.setVisibility(View.VISIBLE); - // Clean up list to avoid user clicking on an asset of the previously - // selected network after the network has been changed. - clearAssets(); - return; - } - mPbAssetDiscovery.setVisibility(View.VISIBLE); - updateNftGrid(); - }); - - mPortfolioModel.mNftModels.observe(getViewLifecycleOwner(), nftDataModels -> { - if (mPortfolioModel.mPortfolioHelper == null) return; - mNftDataModels = nftDataModels; - recordP3AView(); - mWalletNftAdapter = new WalletNftAdapter(); - setUpNftList(mRvNft, mWalletNftAdapter, nftDataModels, - mPortfolioModel.mPortfolioHelper.getPerTokenCryptoSum(), - mPortfolioModel.mPortfolioHelper.getPerTokenFiatSum(), SelectedTab.NFTS); - mPbAssetDiscovery.setVisibility(View.INVISIBLE); - }); - - mPortfolioModel.mNftHiddenModels.observe(getViewLifecycleOwner(), nftHiddenDataModels -> { - if (mPortfolioModel.mPortfolioHelper == null) return; - mNftHiddenDataModels = nftHiddenDataModels; - mWalletHiddenNftAdapter = new WalletNftAdapter(); - setUpNftList(mRvHiddenNft, mWalletHiddenNftAdapter, nftHiddenDataModels, - mPortfolioModel.mPortfolioHelper.getPerTokenCryptoSum(), - mPortfolioModel.mPortfolioHelper.getPerTokenFiatSum(), SelectedTab.HIDDEN); - }); - - mPortfolioModel.mIsDiscoveringUserAssets.observe( - getViewLifecycleOwner(), isDiscoveringUserAssets -> { - if (isDiscoveringUserAssets) { - mPbAssetDiscovery.setVisibility(View.VISIBLE); - } else { - updateNftGrid(); - } - }); - - getNetworkModel().mNeedToCreateAccountForNetwork.observe( - getViewLifecycleOwner(), networkInfo -> { - if (networkInfo == null) return; - - MaterialAlertDialogBuilder builder = - new MaterialAlertDialogBuilder( - requireContext(), R.style.BraveWalletAlertDialogTheme) - .setMessage(getString( - R.string.brave_wallet_create_account_description, - networkInfo.symbolName)) - .setPositiveButton(R.string.brave_action_yes, - (dialog, which) - -> mWalletModel - .createAccountAndSetDefaultNetwork( - networkInfo)) - .setNegativeButton( - R.string.brave_action_no, (dialog, which) -> { - getNetworkModel().clearCreateAccountState(); - dialog.dismiss(); - }); - builder.show(); - }); - } - - private void showNftDiscoveryDialog() { - if (JavaUtils.anyNull(mWalletModel)) return; - - var nftDiscoveryDesc = SpanApplier.applySpans( - getString(R.string.brave_wallet_enable_nft_autodiscovery_modal_description), - new SpanApplier.SpanInfo("", "", new UnderlineSpan()), - new SpanApplier.SpanInfo("", "", - new NoUnderlineClickableSpan(requireContext(), R.color.brave_link, - result - -> TabUtils.openUrlInCustomTab(requireContext(), - WalletConstants.NFT_DISCOVERY_LEARN_MORE_LINK)))); - - MaterialAlertDialogBuilder nftDiscoveryDialogBuilder = new MaterialAlertDialogBuilder( - requireContext(), R.style.BraveWalletAlertDialogTheme); - - View dialogView = getLayoutInflater().inflate(R.layout.dialog_alert_template, null); - TextView title = dialogView.findViewById(R.id.dialog_tv_title); - TextView message = dialogView.findViewById(R.id.dialog_tv_msg); - Button cancelBtn = dialogView.findViewById(R.id.dialog_wallet_btn_negative); - Button enableBtn = dialogView.findViewById(R.id.dialog_wallet_btn_positive); - - title.setText(R.string.brave_wallet_enable_nft_autodiscovery_modal_header); - message.setMovementMethod(LinkMovementMethod.getInstance()); - message.setText(nftDiscoveryDesc); - enableBtn.setText(R.string.brave_action_enable); - nftDiscoveryDialogBuilder.setView(dialogView); - var dialog = nftDiscoveryDialogBuilder.create(); - - enableBtn.setOnClickListener( - v -> { - dialog.dismiss(); - mWalletModel.getCryptoModel().updateNftDiscovery(true); - ChromeSharedPreferences.getInstance() - .writeBoolean(SHOW_NFT_DISCOVERY_DIALOG, false); - }); - cancelBtn.setOnClickListener( - v -> { - dialog.dismiss(); - ChromeSharedPreferences.getInstance() - .writeBoolean(SHOW_NFT_DISCOVERY_DIALOG, false); - }); - dialog.show(); - } - - private void openNetworkSelection() { - Intent intent = NetworkSelectorActivity.createIntent( - requireContext(), NetworkSelectorModel.Mode.LOCAL_NETWORK_FILTER, TAG); - startActivity(intent); - } - - private void setUpNftList(RecyclerView recyclerView, WalletNftAdapter adapter, - List nftDataModels, - HashMap perTokenCryptoSum, HashMap perTokenFiatSum, - SelectedTab selectedTab) { - String tokensPath = BlockchainRegistryFactory.getInstance().getTokensIconsLocation(); - - List walletListItemModelList = - Utils.createWalletListItemModel(nftDataModels, perTokenCryptoSum, perTokenFiatSum, - tokensPath, getResources(), mAllNetworkInfos); - adapter.setWalletListItemModelList(walletListItemModelList); - adapter.setOnWalletListItemClick(this); - recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager( - new AutoFitVerticalGridLayoutManager(getActivity(), 2, NFT_ITEM_WIDTH_DP)); - - if (mSelectedTab == selectedTab) { - // Show empty screen layout if no NFTs have been added. - boolean emptyList = walletListItemModelList.isEmpty(); - mAddNftsContainer.setVisibility(emptyList ? View.VISIBLE : View.GONE); - } - } - - private void clearAssets() { - if (mWalletNftAdapter != null) { - mWalletNftAdapter.clear(); - } - - if (mWalletHiddenNftAdapter != null) { - mWalletHiddenNftAdapter.clear(); - } - } - - @Override - public void onAssetClick(BlockchainToken asset) { - PortfolioModel.NftDataModel selectedNft = JavaUtils.find(mNftDataModels, - nftDataModel -> AssetUtils.Filters.isSameNFT(asset, nftDataModel.token)); - if (selectedNft == null) { - PortfolioModel.NftDataModel selectedHiddenNft = JavaUtils.find(mNftHiddenDataModels, - nftHiddenDataModel - -> AssetUtils.Filters.isSameNFT(asset, nftHiddenDataModel.token)); - if (selectedHiddenNft == null) { - return; - } - selectedNft = selectedHiddenNft; - } - - Intent intent = NftDetailActivity.getIntent( - getContext(), selectedNft.networkInfo.chainId, asset, selectedNft); - startActivity(intent); - } - - private void updateNftGrid() { - if (mWalletModel == null || mSelectedNetworkList.isEmpty()) return; - - Activity activity = getActivity(); - if (!(activity instanceof BraveWalletActivity)) return; - mPortfolioModel.fetchNfts(this, mSelectedNetworkList, (BraveWalletBaseActivity) activity, - (portfolioHelper) -> { mPortfolioHelper = portfolioHelper; }); - } - - private void showEditVisibleDialog() { - EditVisibleAssetsBottomSheetDialogFragment bottomSheetDialogFragment = - EditVisibleAssetsBottomSheetDialogFragment.newInstance( - WalletCoinAdapter.AdapterType.EDIT_VISIBLE_ASSETS_LIST, true); - - bottomSheetDialogFragment.setDismissListener(isAssetsListChanged -> { - if (isAssetsListChanged) { - mPbAssetDiscovery.setVisibility(View.VISIBLE); - updateNftGrid(); - } - }); - - bottomSheetDialogFragment.show(getParentFragmentManager(), - EditVisibleAssetsBottomSheetDialogFragment.TAG_FRAGMENT); - } - - private void recordP3AView() { - if (!mActive) { - return; - } - Activity activity = getActivity(); - if (activity instanceof BraveWalletActivity) { - BraveWalletActivity walletActivity = (BraveWalletActivity) activity; - BraveWalletP3a walletP3A = walletActivity.getBraveWalletP3A(); - if (walletP3A != null && mNftDataModels != null) { - walletP3A.recordNftGalleryView(mNftDataModels.size()); - } - } - } - - private NetworkModel getNetworkModel() { - return mWalletModel.getCryptoModel().getNetworkModel(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java deleted file mode 100644 index c58c13d436c..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.app.Activity; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.brave_wallet.mojom.TransactionStatus; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity; -import org.chromium.chrome.browser.crypto_wallet.adapters.PortfolioFragmentStateAdapter; -import org.chromium.chrome.browser.crypto_wallet.observers.ApprovedTxObserver; - -import java.util.List; - -/** - * Main section of Brave Wallet showing Asset list and NFT grid view. - */ -public class PortfolioFragment extends Fragment implements ApprovedTxObserver { - private static final String TAG = "PortfolioFragment"; - - private TabLayout mTabLayout; - private ViewPager2 mViewPager; - - private PortfolioFragmentStateAdapter mViewPagerAdapter; - - private WalletModel mWalletModel; - private List mPendingTxs; - private TransactionInfo mCurrentPendingTx; - - public static PortfolioFragment newInstance() { - return new PortfolioFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate", e); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - if (mWalletModel != null) { - // Show pending transactions fab to process pending txs - mWalletModel.getCryptoModel().getPendingTransactions().observe( - getViewLifecycleOwner(), transactions -> { - mPendingTxs = transactions; - if (mCurrentPendingTx == null && mPendingTxs.size() > 0) { - mCurrentPendingTx = mPendingTxs.get(0); - } else if (mPendingTxs.size() == 0) { - mCurrentPendingTx = null; - } - updatePendingTxNotification(); - }); - } - return inflater.inflate(org.chromium.chrome.R.layout.fragment_portfolio, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mTabLayout = view.findViewById(R.id.portfolio_tab_layout); - mViewPager = view.findViewById(R.id.portfolio_view_pager); - - mViewPagerAdapter = new PortfolioFragmentStateAdapter(this); - mViewPager.setAdapter(mViewPagerAdapter); - mViewPager.setUserInputEnabled(false); - new TabLayoutMediator(mTabLayout, mViewPager, - (tab, position) -> tab.setText(mViewPagerAdapter.getPageTitle(position))) - .attach(); - } - - public void callAnotherApproveDialog() { - if (!hasPendingTx() || mWalletModel == null) { - return; - } - ApproveTxBottomSheetDialogFragment approveTxBottomSheetDialogFragment = - ApproveTxBottomSheetDialogFragment.newInstance(mCurrentPendingTx); - approveTxBottomSheetDialogFragment.setApprovedTxObserver(this); - approveTxBottomSheetDialogFragment.show( - getParentFragmentManager(), ApproveTxBottomSheetDialogFragment.TAG_FRAGMENT); - } - - private boolean hasPendingTx() { - return mCurrentPendingTx != null; - } - - private void updatePendingTxNotification() { - Activity activity = getActivity(); - if (activity instanceof BraveWalletActivity) { - ((BraveWalletActivity) activity).showPendingTxNotification(hasPendingTx()); - } - } - - private void updateNextPendingTx() { - if (mCurrentPendingTx != null) { - for (TransactionInfo info : mPendingTxs) { - if (!mCurrentPendingTx.id.equals(info.id) - && info.txStatus == TransactionStatus.UNAPPROVED) { - mCurrentPendingTx = info; - return; - } - } - mCurrentPendingTx = null; - } else if (mPendingTxs.size() > 0) { - mCurrentPendingTx = mPendingTxs.get(0); - } - } - - @Override - public void onTxApprovedRejected(boolean approved, String txId) { - updatePendingTxNotification(); - updateNextPendingTx(); - callAnotherApproveDialog(); - } - - @Override - public void onTxPending(String txId) { - /* No op. */ - } -} 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 deleted file mode 100644 index 87e884bc3c3..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/SwapBottomSheetDialogFragment.java +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.crypto_wallet.web_ui.WebUiActivityType; -import org.chromium.chrome.browser.util.TabUtils; - -public class SwapBottomSheetDialogFragment - extends WalletBottomSheetDialogFragment implements View.OnClickListener { - public static final String TAG_FRAGMENT = SwapBottomSheetDialogFragment.class.getName(); - private static final String TAG = "BSS-bottom-dialog"; - private LinearLayout mBuyLayout; - private LinearLayout mSendLayout; - private LinearLayout mSwapLayout; - private LinearLayout mDepositLayout; - private NetworkInfo mNetworkInfo; - private WalletModel mWalletModel; - - public static SwapBottomSheetDialogFragment newInstance() { - return new SwapBottomSheetDialogFragment(); - } - - public void setNetwork(NetworkInfo networkInfo) { - mNetworkInfo = networkInfo; - } - - @Override - public void show(FragmentManager manager, String tag) { - try { - SwapBottomSheetDialogFragment fragment = - (SwapBottomSheetDialogFragment) manager.findFragmentByTag( - SwapBottomSheetDialogFragment.TAG_FRAGMENT); - FragmentTransaction transaction = manager.beginTransaction(); - if (fragment != null) { - transaction.remove(fragment); - } - transaction.add(this, tag); - transaction.commitAllowingStateLoss(); - } catch (IllegalStateException e) { - Log.e("SwapBottomSheetDialogFragment", e.getMessage()); - } - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - try { - mWalletModel = BraveActivity.getBraveActivity().getWalletModel(); - registerKeyringObserver(mWalletModel.getKeyringModel()); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate ", e); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - final View view = - LayoutInflater.from(getContext()).inflate(R.layout.swap_bottom_sheet, null); - - mBuyLayout = view.findViewById(R.id.buy_layout); - mBuyLayout.setOnClickListener(this); - mSendLayout = view.findViewById(R.id.send_layout); - mSendLayout.setOnClickListener(this); - mSwapLayout = view.findViewById(R.id.swap_layout); - mSwapLayout.setOnClickListener(this); - mDepositLayout = view.findViewById(R.id.deposit_layout); - mDepositLayout.setOnClickListener(this); - return view; - } - - private void setDefaultNetwork( - @NonNull final Callback callback, @Nullable final WebUiActivityType webUiActivityType) { - if (!JavaUtils.anyNull(mWalletModel, mNetworkInfo)) { - // TODO(apaymyshev): buy/send/swap should be decoupled from panel selected network. - mWalletModel.getNetworkModel().setDefaultNetwork( - mNetworkInfo, isSelected -> callback.run(webUiActivityType)); - } else { - callback.run(webUiActivityType); - } - } - - @Override - public void onClick(View view) { - if (view == mDepositLayout) { - setDefaultNetwork(activityType -> openDepositWebUi(), null); - } else { - WebUiActivityType webUiActivityType = WebUiActivityType.BUY; - if (view == mSendLayout) { - webUiActivityType = WebUiActivityType.SEND; - } else if (view == mSwapLayout) { - webUiActivityType = WebUiActivityType.SWAP; - } - - setDefaultNetwork(this::openBssAndDismiss, webUiActivityType); - } - } - - private void openDepositWebUi() { - try { - BraveActivity.getBraveActivity().openNewOrSelectExistingTab( - BraveActivity.BRAVE_DEPOSIT_URL, true); - TabUtils.bringChromeTabbedActivityToTheTop(requireActivity()); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "Error while opening deposit tab.", e); - } - } - - // Open buy send swap (BSS) - private void openBssAndDismiss(WebUiActivityType webUiActivityType) { - Utils.openBuySendSwapActivity(requireActivity(), webUiActivityType); - dismiss(); - } - - /** - * Generic callback used by {@code setDefaultNetwork} that runs an action with a given activity - * type. - */ - private interface Callback { - /** - * Runs an action with a given activity type. - * @param webUiActivityType given activity type. May be null. - */ - void run(@Nullable final WebUiActivityType webUiActivityType); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionDetailsSheetFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionDetailsSheetFragment.java index 5363b2c90e3..a4060eb8d41 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionDetailsSheetFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionDetailsSheetFragment.java @@ -30,7 +30,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.app.domain.WalletModel; import org.chromium.chrome.browser.crypto_wallet.adapters.TwoLineItemRecyclerViewAdapter; -import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel; +import org.chromium.chrome.browser.crypto_wallet.model.AccountSelectorItemModel; import org.chromium.chrome.browser.crypto_wallet.presenters.Amount; import org.chromium.chrome.browser.crypto_wallet.util.AndroidUtils; import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; @@ -50,19 +50,19 @@ public class TransactionDetailsSheetFragment extends WalletBottomSheetDialogFrag private ExecutorService mExecutor; private Handler mHandler; private WalletModel mWalletModel; - private WalletListItemModel mWalletListItemModel; + private AccountSelectorItemModel mAccountSelectorItemModel; private TransactionInfo mTxInfo; private ParsedTransaction mParsedTx; public static TransactionDetailsSheetFragment newInstance( - WalletListItemModel walletListItemModel) { - return new TransactionDetailsSheetFragment(walletListItemModel); + AccountSelectorItemModel accountSelectorItemModel) { + return new TransactionDetailsSheetFragment(accountSelectorItemModel); } - private TransactionDetailsSheetFragment(WalletListItemModel walletListItemModel) { - mWalletListItemModel = walletListItemModel; - mTxInfo = mWalletListItemModel.getTransactionInfo(); - mParsedTx = mWalletListItemModel.getParsedTx(); + private TransactionDetailsSheetFragment(AccountSelectorItemModel accountSelectorItemModel) { + mAccountSelectorItemModel = accountSelectorItemModel; + mTxInfo = mAccountSelectorItemModel.getTransactionInfo(); + mParsedTx = mAccountSelectorItemModel.getParsedTx(); mExecutor = Executors.newSingleThreadExecutor(); mHandler = new Handler(Looper.getMainLooper()); } @@ -110,7 +110,7 @@ public class TransactionDetailsSheetFragment extends WalletBottomSheetDialogFrag if (JavaUtils.anyNull(mWalletModel)) return; ImageView icon = view.findViewById(R.id.account_picture); Utils.setBlockiesBitmapResourceFromAccount( - mExecutor, mHandler, icon, mWalletListItemModel.getAccountInfo(), true); + mExecutor, mHandler, icon, mAccountSelectorItemModel.getAccountInfo(), true); updateTxHeaderDetails(view); updateTxDetails(view); } @@ -124,7 +124,7 @@ public class TransactionDetailsSheetFragment extends WalletBottomSheetDialogFrag TextView amountAsset = view.findViewById(R.id.amount_asset); Utils.setBlockiesBitmapResourceFromAccount( - mExecutor, mHandler, icon, mWalletListItemModel.getAccountInfo(), true); + mExecutor, mHandler, icon, mAccountSelectorItemModel.getAccountInfo(), true); if (mTxInfo.originInfo != null && URLUtil.isValidUrl(mTxInfo.originInfo.originSpec)) { TextView domain = view.findViewById(R.id.domain); @@ -161,7 +161,7 @@ public class TransactionDetailsSheetFragment extends WalletBottomSheetDialogFrag amountAsset.setText(amountText); } - String accountName = mWalletListItemModel.getAccountInfo().name; + String accountName = mAccountSelectorItemModel.getAccountInfo().name; if (mParsedTx.getSender() != null && !mParsedTx.getSender().equals(mParsedTx.getRecipient())) { String recipient = @@ -201,16 +201,23 @@ public class TransactionDetailsSheetFragment extends WalletBottomSheetDialogFrag WalletUtils.timeDeltaToDateString(mParsedTx.getCreatedTime()))); items.add(new TwoLineItemRecyclerViewAdapter.TwoLineItemDivider()); items.add( - new TwoLineItemRecyclerViewAdapter.TwoLineItemText(getString(R.string.network_text), - mWalletListItemModel.getAssetNetwork().chainName)); + new TwoLineItemRecyclerViewAdapter.TwoLineItemText( + getString(R.string.network_text), + mAccountSelectorItemModel.getAssetNetwork().chainName)); items.add(new TwoLineItemRecyclerViewAdapter.TwoLineItemDivider()); - items.add(new TwoLineItemRecyclerViewAdapter.TwoLineItemText(getString(R.string.status), - mWalletListItemModel.getTxStatus(), (title, subtitle) -> { - subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds( - new BitmapDrawable( - getResources(), mWalletListItemModel.getTxStatusBitmap()), - null, null, null); - })); + items.add( + new TwoLineItemRecyclerViewAdapter.TwoLineItemText( + getString(R.string.status), + mAccountSelectorItemModel.getTxStatus(), + (title, subtitle) -> { + subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds( + new BitmapDrawable( + getResources(), + mAccountSelectorItemModel.getTxStatusBitmap()), + null, + null, + null); + })); txDetails.setAdapter(new TwoLineItemRecyclerViewAdapter( items, TwoLineItemRecyclerViewAdapter.ADAPTER_VIEW_ORIENTATION.HORIZONTAL)); diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionsFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionsFragment.java deleted file mode 100644 index 3baaeca79d1..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TransactionsFragment.java +++ /dev/null @@ -1,154 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.fragments; - -import android.annotation.SuppressLint; -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.RecyclerView; - -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.brave_wallet.mojom.TransactionStatus; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.TransactionsModel; -import org.chromium.chrome.browser.app.domain.WalletModel; -import org.chromium.chrome.browser.app.helpers.Api33AndPlusBackPressHelper; -import org.chromium.chrome.browser.app.shimmer.ShimmerFrameLayout; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -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.util.AndroidUtils; -import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; -import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.ui.base.ViewUtils; - -import java.lang.ref.WeakReference; -import java.util.Collections; -import java.util.List; - -public class TransactionsFragment extends Fragment implements OnWalletListItemClick { - private static final String TAG = "TransactionsFragment"; - private WalletModel mWalletModel; - private TransactionsModel mTransactionsModel; - private RecyclerView mRvTransactions; - private WalletCoinAdapter mWalletTxAdapter; - private List mWalletListItemModelList; - private TextView mTvEmptyListLabel; - private TextView mTvEmptyListDesc; - private ShimmerFrameLayout mShimmerLoading; - private ViewGroup mShimmerItems; - - public static TransactionsFragment newInstance() { - return new TransactionsFragment(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Api33AndPlusBackPressHelper.create( - this, (FragmentActivity) requireActivity(), () -> requireActivity().finish()); - } - try { - BraveActivity activity = BraveActivity.getBraveActivity(); - mWalletModel = activity.getWalletModel(); - mTransactionsModel = mWalletModel.getCryptoModel().createTransactionModel(); - mTransactionsModel.update( - new WeakReference<>((BraveWalletBaseActivity) requireActivity())); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "onCreate ", e); - } - mWalletListItemModelList = Collections.emptyList(); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_transactions, container, false); - mRvTransactions = view.findViewById(R.id.frag_tx_rv_transactions); - mShimmerLoading = view.findViewById(R.id.frag_tx_shimmer); - mTvEmptyListLabel = view.findViewById(R.id.frag_tx_empty_label); - mTvEmptyListDesc = view.findViewById(R.id.frag_tx_empty_desc); - mWalletTxAdapter = new WalletCoinAdapter(WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - mWalletTxAdapter.setOnWalletListItemClick(TransactionsFragment.this); - mWalletTxAdapter.setWalletListItemType(Utils.TRANSACTION_ITEM); - mRvTransactions.setAdapter(mWalletTxAdapter); - mShimmerItems = view.findViewById(R.id.ll_shimmer_items); - int shimmerSkeletonRows = - AndroidUtils.getSkeletonRowCount(ViewUtils.dpToPx(requireContext(), 50)); - for (int i = 0; i < shimmerSkeletonRows; i++) { - inflater.inflate(R.layout.shimmer_skeleton_item, mShimmerItems, true); - } - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setUpObservers(); - } - - @Override - public void onTransactionClick(TransactionInfo txInfo) { - if (txInfo.txStatus == TransactionStatus.UNAPPROVED) { - ApproveTxBottomSheetDialogFragment approveTx = - ApproveTxBottomSheetDialogFragment.newInstance(txInfo); - approveTx.show(getChildFragmentManager(), TAG); - } else { - WalletListItemModel txModel = JavaUtils.find( - mWalletListItemModelList, tx -> tx.getTransactionInfo().id.equals(txInfo.id)); - TransactionDetailsSheetFragment.newInstance(txModel).show( - getChildFragmentManager(), TAG); - } - } - - private void setUpObservers() { - if (JavaUtils.anyNull(mTransactionsModel)) return; - mTransactionsModel.mParsedTransactions.observe( - getViewLifecycleOwner(), walletListItemModelList -> { - if (walletListItemModelList == null) return; - - mWalletListItemModelList = walletListItemModelList; - updateTransactionList(walletListItemModelList); - if (walletListItemModelList.isEmpty()) { - AndroidUtils.gone(mRvTransactions); - AndroidUtils.show(mTvEmptyListLabel, mTvEmptyListDesc); - } else { - AndroidUtils.show(mRvTransactions); - AndroidUtils.gone(mTvEmptyListLabel, mTvEmptyListDesc); - } - }); - mTransactionsModel.mIsLoading.observe(getViewLifecycleOwner(), isLoading -> { - if (isLoading) { - mShimmerLoading.showShimmer(true); - AndroidUtils.show(mShimmerItems); - } else { - AndroidUtils.gone(mShimmerItems); - mShimmerLoading.hideShimmer(); - } - }); - } - - @SuppressLint("NotifyDataSetChanged") - private void updateTransactionList(List walletListItemModelList) { - mWalletTxAdapter.setWalletListItemModelList(walletListItemModelList); - mWalletTxAdapter.notifyDataSetChanged(); - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/AccountSelectorItemListener.java b/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/AccountSelectorItemListener.java new file mode 100644 index 00000000000..4c2559341ce --- /dev/null +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/AccountSelectorItemListener.java @@ -0,0 +1,14 @@ +/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.crypto_wallet.listeners; + +import androidx.annotation.NonNull; + +import org.chromium.chrome.browser.crypto_wallet.model.AccountSelectorItemModel; + +public interface AccountSelectorItemListener { + void onAccountClick(@NonNull final AccountSelectorItemModel accountSelectorItemModel); +} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java b/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java deleted file mode 100644 index 58c58dfd793..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/listeners/OnWalletListItemClick.java +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.listeners; - -import android.widget.CheckBox; -import android.widget.ImageView; - -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel; - -public interface OnWalletListItemClick { - default void onAccountClick(WalletListItemModel walletListItemModel) {} - default void onAssetClick(BlockchainToken asset) {} - default void onTransactionClick(TransactionInfo txInfo) {} - default void onAssetCheckedChanged( - WalletListItemModel walletListItemModel, CheckBox assetCheck, boolean isChecked) {} - default void onMaybeShowTrashButton( - WalletListItemModel walletListItemModel, ImageView trashButton) {} - default void onTrashIconClick(WalletListItemModel walletListItemModel) {} -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/model/WalletListItemModel.java b/android/java/org/chromium/chrome/browser/crypto_wallet/model/AccountSelectorItemModel.java similarity index 58% rename from android/java/org/chromium/chrome/browser/crypto_wallet/model/WalletListItemModel.java rename to android/java/org/chromium/chrome/browser/crypto_wallet/model/AccountSelectorItemModel.java index af674afd810..8fdd3a7fa52 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/model/WalletListItemModel.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/model/AccountSelectorItemModel.java @@ -6,17 +6,15 @@ package org.chromium.chrome.browser.crypto_wallet.model; import android.graphics.Bitmap; -import android.text.TextUtils; import org.chromium.brave_wallet.mojom.AccountInfo; import org.chromium.brave_wallet.mojom.BlockchainToken; import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.brave_wallet.mojom.TransactionInfo; -import org.chromium.chrome.browser.app.domain.PortfolioModel; import org.chromium.chrome.browser.crypto_wallet.util.ParsedTransaction; import org.chromium.chrome.browser.crypto_wallet.util.Utils; -public class WalletListItemModel { +public class AccountSelectorItemModel { private int mIcon; private String mIconPath; private String mTitle; @@ -27,21 +25,14 @@ public class WalletListItemModel { private String mText2; private BlockchainToken mBlockchainToken; private AccountInfo mAccountInfo; - private boolean mVisible; - private double mTotalGas; - private double mTotalGasFiat; - private String[] mAddressesForBitmap; + private boolean mSelected; private TransactionInfo mTxInfo; - private String mChainSymbol; - private int mChainDecimals; - private PortfolioModel.NftDataModel mNftDataModel; private NetworkInfo mAssetNetwork; - private String mBrowserResPath; public String mId; private ParsedTransaction mParsedTx; - public WalletListItemModel( + public AccountSelectorItemModel( int icon, String title, String subTitle, String id, String text1, String text2) { mIcon = icon; mTitle = title; @@ -51,11 +42,11 @@ public class WalletListItemModel { mText2 = text2; } - private WalletListItemModel() {} + private AccountSelectorItemModel() {} - public static WalletListItemModel makeForAccountInfoWithBalances( + public static AccountSelectorItemModel makeForAccountInfoWithBalances( AccountInfo accountInfo, String fiatBalanceString, String cryptoBalanceString) { - WalletListItemModel result = new WalletListItemModel(); + AccountSelectorItemModel result = new AccountSelectorItemModel(); result.mIcon = Utils.getCoinIcon(accountInfo.accountId.coin); result.mTitle = accountInfo.name; // TODO(apaymyshev): handle bitcoin account. @@ -67,19 +58,10 @@ public class WalletListItemModel { return result; } - public static WalletListItemModel makeForAccountInfo(AccountInfo accountInfo) { + public static AccountSelectorItemModel makeForAccountInfo(AccountInfo accountInfo) { return makeForAccountInfoWithBalances(accountInfo, null, null); } - public boolean isNft() { - return mBlockchainToken.isNft || mBlockchainToken.isErc721; - } - - public boolean hasNftImageLink() { - return isNft() && mNftDataModel != null && mNftDataModel.nftMetadata != null - && !TextUtils.isEmpty(mNftDataModel.nftMetadata.mImageUrl); - } - public void setTransactionInfo(TransactionInfo txInfo) { mTxInfo = txInfo; } @@ -88,16 +70,6 @@ public class WalletListItemModel { return mTxInfo; } - public void setAddressesForBitmap(String addressFrom, String addressTo) { - mAddressesForBitmap = new String[2]; - mAddressesForBitmap[0] = addressFrom; - mAddressesForBitmap[1] = addressTo; - } - - public String[] getAddressesForBitmap() { - return mAddressesForBitmap; - } - public void setIconPath(String iconPath) { mIconPath = iconPath; } @@ -106,38 +78,6 @@ public class WalletListItemModel { return mIconPath; } - public void setTotalGas(double totalGas) { - mTotalGas = totalGas; - } - - public double getTotalGas() { - return mTotalGas; - } - - public void setTotalGasFiat(double totalGasFiat) { - mTotalGasFiat = totalGasFiat; - } - - public double getTotalGasFiat() { - return mTotalGasFiat; - } - - public void setChainSymbol(String chainSymbol) { - mChainSymbol = chainSymbol; - } - - public String getChainSymbol() { - return mChainSymbol; - } - - public void setChainDecimals(int chainDecimals) { - mChainDecimals = chainDecimals; - } - - public int getChainDecimals() { - return mChainDecimals; - } - public void setTxStatus(String txStatus) { mTxStatus = txStatus; } @@ -193,12 +133,12 @@ public class WalletListItemModel { return mText2; } - public boolean isVisible() { - return mVisible; + public boolean isSelected() { + return mSelected; } - public void isVisible(final boolean visible) { - mVisible = visible; + public void setSelected(final boolean selected) { + mSelected = selected; } public boolean isErc721() { @@ -209,14 +149,6 @@ public class WalletListItemModel { return mAccountInfo != null; } - public PortfolioModel.NftDataModel getNftDataModel() { - return mNftDataModel; - } - - public void setNftDataModel(PortfolioModel.NftDataModel mNftDataModel) { - this.mNftDataModel = mNftDataModel; - } - public NetworkInfo getAssetNetwork() { return mAssetNetwork; } @@ -225,24 +157,6 @@ public class WalletListItemModel { this.mAssetNetwork = mAssetNetwork; } - public void setBrowserResourcePath(String resPath) { - mBrowserResPath = resPath; - } - - public String getBrowserResourcePath() { - return mBrowserResPath; - } - - public boolean isNativeAsset() { - if (mAssetNetwork == null || mBlockchainToken == null) return false; - return Utils.isNativeToken(mAssetNetwork, mBlockchainToken); - } - - public String getNetworkIcon() { - if (mAssetNetwork == null || TextUtils.isEmpty(getBrowserResourcePath())) return ""; - return "file://" + getBrowserResourcePath() + "/" + Utils.getNetworkIconName(mAssetNetwork); - } - public ParsedTransaction getParsedTx() { return mParsedTx; } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.java b/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.java index 0bbd14b3798..8ac25f80fb9 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.java @@ -68,7 +68,7 @@ public class TxNonSwipeableViewPager extends ViewPager { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - public class ViewPagerScroller extends Scroller { + public static class ViewPagerScroller extends Scroller { ViewPagerScroller(Context context) { super(context, new DecelerateInterpolator()); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/NetworkInfoPresenter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/NetworkInfoPresenter.java deleted file mode 100644 index 538348eb6b7..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/presenters/NetworkInfoPresenter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.presenters; - -import org.chromium.brave_wallet.mojom.NetworkInfo; - -import java.util.List; - -public class NetworkInfoPresenter { - public NetworkInfo mNetworkInfo; - public boolean mIsPrimary; - public List mSubNetworks; - - public NetworkInfoPresenter( - NetworkInfo mNetworkInfo, boolean mIsPrimary, List mSubNetworks) { - this.mNetworkInfo = mNetworkInfo; - this.mIsPrimary = mIsPrimary; - this.mSubNetworks = mSubNetworks; - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java index 4da02320e79..5af9371db46 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java @@ -5,8 +5,6 @@ package org.chromium.chrome.browser.crypto_wallet.util; -import static java.util.stream.Collectors.toMap; - import android.text.TextUtils; import androidx.annotation.Nullable; @@ -17,99 +15,23 @@ import org.chromium.brave_wallet.mojom.BlockchainToken; import org.chromium.brave_wallet.mojom.BraveWalletConstants; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.KeyringId; -import org.chromium.brave_wallet.mojom.NetworkInfo; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.function.Function; -import java.util.stream.IntStream; public class AssetUtils { private static final String TAG = "AssetUtils"; - public static String AURORA_SUPPORTED_CONTRACT_ADDRESSES[] = { - "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", // AAVE - "0xaaaaaa20d9e0e2461697782ef11675f668207961", // AURORA - "0xba100000625a3754423978a60c9317c58a424e3d", // BAL - "0x0d8775f648430679a709e98d2b0cb6250d2887ef", // BAT - "0xc00e94cb662c3520282e6f5717214004a7f26888", // COMP - "0x2ba592f78db6436527729929aaf6c908497cb200", // CREAM - "0x6b175474e89094c44da98b954eedeac495271d0f", // DAI - "0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd", // DODO - "0x3ea8ea4237344c9931214796d9417af1a1180770", // FLX - "0x853d955acef822db058eb8505911ed77f175b99e", // FRAX - "0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0", // FXS - "0xd9c2d319cd7e6177336b0a9c93c21cb48d84fb54", // HAPI - "0x514910771af9ca656af840dff83e8264ecf986ca", // LINK - "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", // MKR - "0x1117ac6ad6cdf1a3bc543bad3b133724620522d5", // MODA - "0xf5cfbc74057c610c8ef151a439252680ac68c6dc", // OCT - "0x9aeb50f542050172359a0e1a25a9933bc8c01259", // OIN - "0xea7cc765ebc94c4805e3bff28d7e4ae48d06468a", // PAD - "0x429881672b9ae42b8eba0e26cd9c73711b891ca5", // PICKLE - "0x408e41876cccdc0f92210600ef50372656052a38", // REN - "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", // SNX - "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", // SUSHI - "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", // UNI - "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC - "0xdac17f958d2ee523a2206206994597c13d831ec7", // USDT - "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", // WBTC - "0x4691937a7508860f876c9c0a2a617e7d9e945d4b", // WOO - "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e" // YFI - }; - public static class Filters { - public static boolean isSameToken(BlockchainToken token1, BlockchainToken token2) { - return token1.symbol.equals(token2.symbol) - && token1.contractAddress.equalsIgnoreCase(token2.contractAddress) - && token1.chainId.equals(token2.chainId); - } - public static boolean isSameToken( BlockchainToken token, String symbol, String contractAddress, String chainId) { return token.symbol.equals(symbol) && token.contractAddress.equalsIgnoreCase(contractAddress) && token.chainId.equals(chainId); } - - public static boolean isSameNFT( - BlockchainToken token, String tokenId, String contractAddress) { - if (token.isErc721) { - boolean isSameContractAddress = TextUtils.isEmpty(token.contractAddress) - && TextUtils.isEmpty(contractAddress); - if (!isSameContractAddress && !TextUtils.isEmpty(token.contractAddress) - && !TextUtils.isEmpty(contractAddress)) { - isSameContractAddress = token.contractAddress.equalsIgnoreCase(contractAddress); - } - return token.tokenId.equals(tokenId) && isSameContractAddress; - } else if (token.isNft) { // Solana - return token.contractAddress.equals(contractAddress); - } - return false; - } - - public static boolean isSameNFT(BlockchainToken token1, BlockchainToken token2) { - return isSameNFT(token1, token2.tokenId, token2.contractAddress); - } - } - - public static boolean isAuroraAddress(String contractAddress, String chainId) { - boolean isEthereumBridgeAddress = false; - boolean isNativeAsset = TextUtils.isEmpty(contractAddress); - - if (!isNativeAsset) { - for (String address : AURORA_SUPPORTED_CONTRACT_ADDRESSES) { - isEthereumBridgeAddress = address.equalsIgnoreCase(contractAddress); - if (isEthereumBridgeAddress) { - break; - } - } - } - return (isEthereumBridgeAddress || isNativeAsset) - && chainId.equals(BraveWalletConstants.MAINNET_CHAIN_ID); } public static @KeyringId.EnumType int getKeyring( @@ -141,16 +63,6 @@ public class AssetUtils { .toArray(AccountInfo[] ::new); } - public static AccountInfo[] filterAccountsByNetwork( - List accounts, @CoinType.EnumType int coinType, @Nullable String chainId) { - @KeyringId.EnumType - int keyringId = AssetUtils.getKeyring(coinType, chainId); - - return accounts.stream() - .filter(acc -> acc.accountId.keyringId == keyringId) - .toArray(AccountInfo[] ::new); - } - /** * Gets keyring Id only for coin types Ethereum and Solana. * @param coinType Coin type Ethereum or Solana. @@ -176,45 +88,6 @@ public class AssetUtils { } } - public static String mapToRampNetworkSymbol( - String assetChainId, String assetSymbol, String contractAddress) { - if (assetSymbol.equalsIgnoreCase("bat") - && assetChainId.equals(BraveWalletConstants.MAINNET_CHAIN_ID)) { - // BAT is the only token on Ethereum Mainnet with a prefix on Ramp.Network - return "ETH_BAT"; - } else if (assetChainId.equals(BraveWalletConstants.AVALANCHE_MAINNET_CHAIN_ID) - && TextUtils.isEmpty(contractAddress)) { - // AVAX native token has no prefix - return assetSymbol; - } else { - String rampNetworkPrefix = getRampNetworkPrefix(assetChainId); - return TextUtils.isEmpty(rampNetworkPrefix) - ? assetSymbol.toUpperCase(Locale.ENGLISH) - : rampNetworkPrefix + "_" + assetSymbol.toUpperCase(Locale.ENGLISH); - } - } - - public static String getRampNetworkPrefix(String chainId) { - switch (chainId) { - case BraveWalletConstants.AVALANCHE_MAINNET_CHAIN_ID: - return "AVAXC"; - case BraveWalletConstants.BINANCE_SMART_CHAIN_MAINNET_CHAIN_ID: - return "BSC"; - case BraveWalletConstants.POLYGON_MAINNET_CHAIN_ID: - return "MATIC"; - case BraveWalletConstants.SOLANA_MAINNET: - return "SOLANA"; - case BraveWalletConstants.OPTIMISM_MAINNET_CHAIN_ID: - return "OPTIMISM"; - case BraveWalletConstants.FILECOIN_MAINNET: - return "FILECOIN"; - case BraveWalletConstants.MAINNET_CHAIN_ID: - case BraveWalletConstants.CELO_MAINNET_CHAIN_ID: - default: - return ""; - } - } - public static boolean isNativeToken(BlockchainToken token) { List nativeTokens = NATIVE_TOKENS_PER_CHAIN.get(token.chainId); if (nativeTokens != null) { @@ -249,13 +122,6 @@ public class AssetUtils { put(BraveWalletConstants.FILECOIN_TESTNET, Arrays.asList("fil")); } }; - public static String httpifyIpfsUrl(String url) { - if (TextUtils.isEmpty(url)) return ""; - String trimedUrl = url.trim(); - return trimedUrl.startsWith("ipfs://") - ? trimedUrl.replace("ipfs://", "https://ipfs.io/ipfs/") - : trimedUrl; - } public static String assetRatioId(BlockchainToken token) { if (!TextUtils.isEmpty(token.coingeckoId)) return token.coingeckoId; @@ -264,12 +130,4 @@ public class AssetUtils { return token.symbol; return token.contractAddress; } - - public static Map toNetworkIndexMap(List networks) { - return IntStream.range(0, networks.size()) - .boxed() - .collect(toMap(i - -> networks.get(i).chainId, - Function.identity(), (index1, index2) -> index1)); - } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/PortfolioHelper.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/PortfolioHelper.java deleted file mode 100644 index 3823ad91c35..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/PortfolioHelper.java +++ /dev/null @@ -1,383 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.util; - -import androidx.annotation.NonNull; - -import org.chromium.base.Callbacks; -import org.chromium.base.Log; -import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.AssetTimePrice; -import org.chromium.brave_wallet.mojom.BlockchainRegistry; -import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.BraveWalletService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.mojo_base.mojom.TimeDelta; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -public class PortfolioHelper { - private static final String TAG = "PortfolioHelper"; - private final WeakReference mActivity; - private List mSelectedNetworks; - private final AccountInfo[] mAccountInfos; - - // Data supplied as result - private final List mUserAssets; // aka selected assets - private final List mHiddenAssets; - private Double mTotalFiatSum; - // Always use Utils#tokenToString(BlockchainToken) to create key - private HashMap mPerTokenFiatSum; - private HashMap mPerTokenCryptoSum; - private AssetTimePrice[] mFiatHistory; - private int mFiatHistoryTimeframe; - private final List mCryptoNetworks; - private Map mAssertSortPriorityPerCoinIndex; - - public PortfolioHelper(BraveWalletBaseActivity activity, List cryptoNetworks, - AccountInfo[] accountInfos) { - mActivity = new WeakReference<>(activity); - mCryptoNetworks = cryptoNetworks; - mAccountInfos = accountInfos; - mSelectedNetworks = Collections.emptyList(); - mUserAssets = new ArrayList<>(); - mHiddenAssets = new ArrayList<>(); - mAssertSortPriorityPerCoinIndex = Collections.emptyMap(); - } - - public void setFiatHistoryTimeframe(int timeframe) { - mFiatHistoryTimeframe = timeframe; - } - - public List getUserAssets() { - return mUserAssets; - } - - public List getHiddenAssets() { - return mHiddenAssets; - } - - public Double getTotalFiatSum() { - return mTotalFiatSum; - } - - public HashMap getPerTokenFiatSum() { - return mPerTokenFiatSum; - } - - public HashMap getPerTokenCryptoSum() { - return mPerTokenCryptoSum; - } - - public AssetTimePrice[] getFiatHistory() { - return mFiatHistory; - } - - public boolean isFiatHistoryEmpty() { - if (mFiatHistory == null || mFiatHistory.length == 0) { - return true; - } - - try { - for (AssetTimePrice assetTimePrice : mFiatHistory) { - if (Double.parseDouble(assetTimePrice.price) > 0.001d) { - return false; - } - } - } catch (NullPointerException | NumberFormatException ignored) { - return true; - } - return true; - } - - public Double getMostRecentFiatSum() { - if (mFiatHistory == null || mFiatHistory.length == 0) { - return 0.0d; - } - return Double.valueOf(mFiatHistory[mFiatHistory.length - 1].price); - } - - public void fetchAssetsAndDetails( - TokenUtils.TokenType type, Callbacks.Callback1 callback) { - resetResultData(); - if (mActivity.get() == null || mSelectedNetworks.isEmpty()) return; - int totalNetworks = mSelectedNetworks.size(); - AtomicInteger resCount = new AtomicInteger(); - List assetAccountsNetworkBalances = new ArrayList<>(); - - for (NetworkInfo networkInfo : mSelectedNetworks) { - List accountInfosPerCoin = JavaUtils.filter( - mAccountInfos, accountInfo -> accountInfo.accountId.coin == networkInfo.coin); - Utils.getTxExtraInfo(mActivity, type, mCryptoNetworks, networkInfo, - accountInfosPerCoin.toArray(new AccountInfo[0]), null, true, - (assetPrices, userAssetsList, nativeAssetsBalances, - blockchainTokensBalances) -> { - mUserAssets.addAll(Arrays.asList(userAssetsList)); - - AssetAccountsNetworkBalance asset = new AssetAccountsNetworkBalance( - assetPrices, userAssetsList, nativeAssetsBalances, - blockchainTokensBalances, networkInfo, accountInfosPerCoin); - assetAccountsNetworkBalances.add(asset); - - // Calculate balances only after the responses of network list are fetched - if (resCount.incrementAndGet() == totalNetworks) { - mUserAssets.sort(Comparator.comparing( - token -> mAssertSortPriorityPerCoinIndex.get(token.chainId))); - createBalanceRecords(assetAccountsNetworkBalances); - callback.call(this); - } - }); - } - } - - public void fetchNfts(@NonNull final Callbacks.Callback1 callback) { - resetResultData(); - if (mActivity.get() == null) { - Log.e(TAG, "Referenced activity was null."); - callback.call(this); - return; - } - final BraveWalletBaseActivity activity = mActivity.get(); - if (activity.isFinishing()) { - return; - } - if (mSelectedNetworks.isEmpty()) { - Log.e(TAG, "Selected network was null."); - callback.call(this); - return; - } - final BraveWalletService braveWalletService = activity.getBraveWalletService(); - if (braveWalletService == null) { - Log.e(TAG, "BraveWalletService was null."); - callback.call(this); - return; - } - final BlockchainRegistry blockchainRegistry = activity.getBlockchainRegistry(); - if (blockchainRegistry == null) { - Log.e(TAG, "BlockchainRegistry was null."); - callback.call(this); - return; - } - final int totalNetworks = mSelectedNetworks.size(); - AtomicInteger count = new AtomicInteger(); - final List assets = new ArrayList<>(); - for (NetworkInfo networkInfo : mSelectedNetworks) { - TokenUtils.getUserAndAllTokensFiltered(braveWalletService, blockchainRegistry, - networkInfo, networkInfo.coin, TokenUtils.TokenType.NFTS, - (allAssets, userAssets) -> { - mUserAssets.addAll(Arrays.asList(userAssets)); - assets.addAll(Arrays.asList(allAssets)); - if (count.incrementAndGet() == totalNetworks) { - mUserAssets.sort(Comparator.comparing( - token -> mAssertSortPriorityPerCoinIndex.get(token.chainId))); - - List comparableUserAssets = - mUserAssets.stream() - .map(Utils::tokenToString) - .collect(Collectors.toList()); - assets.removeIf(blockChainToken - -> comparableUserAssets.contains( - Utils.tokenToString(blockChainToken))); - mHiddenAssets.addAll(assets); - - callback.call(this); - } - }); - } - } - - private void createBalanceRecords( - List assetAccountsNetworkBalances) { - for (AssetAccountsNetworkBalance assetAccountsNetworkBalance : - assetAccountsNetworkBalances) { - // Sum across accounts - for (AccountInfo accountInfo : assetAccountsNetworkBalance.accountInfos) { - final String accountAddressLower = - accountInfo.address.toLowerCase(Locale.getDefault()); - HashMap thisAccountTokensBalances = - Utils.getOrDefault(assetAccountsNetworkBalance.blockchainTokensBalances, - accountAddressLower, new HashMap()); - for (BlockchainToken userAsset : assetAccountsNetworkBalance.userAssetsList) { - String currentAssetKey = Utils.tokenToString(userAsset); - double prevTokenCryptoBalanceSum = - Utils.getOrDefault(mPerTokenCryptoSum, currentAssetKey, 0.0d); - final double thisCryptoBalance = - Utils.isNativeToken(assetAccountsNetworkBalance.networkInfo, userAsset) - ? Utils.getOrDefault(assetAccountsNetworkBalance.nativeAssetsBalances, - accountAddressLower, 0.0d) - : Utils.getOrDefault(thisAccountTokensBalances, currentAssetKey, 0.0d); - - mPerTokenCryptoSum.put( - currentAssetKey, prevTokenCryptoBalanceSum + thisCryptoBalance); - - double prevTokenFiatBalanceSum = - Utils.getOrDefault(mPerTokenFiatSum, currentAssetKey, 0.0d); - double thisTokenPrice = - Utils.getOrDefault(assetAccountsNetworkBalance.assetPrices, - userAsset.symbol.toLowerCase(Locale.getDefault()), 0.0d); - double thisFiatBalance = thisTokenPrice * thisCryptoBalance; - - mPerTokenFiatSum.put( - currentAssetKey, prevTokenFiatBalanceSum + thisFiatBalance); - - mTotalFiatSum += thisFiatBalance; - } - } - } - } - - private void resetResultData() { - mUserAssets.clear(); - mHiddenAssets.clear(); - mTotalFiatSum = 0.0d; - mPerTokenFiatSum = new HashMap<>(); - mPerTokenCryptoSum = new HashMap<>(); - mFiatHistory = new AssetTimePrice[0]; - } - - private AssetTimePrice getZeroHistoryEntry(long microseconds) { - AssetTimePrice historyEntry = new AssetTimePrice(); - historyEntry.price = "0"; - historyEntry.date = new TimeDelta(); - historyEntry.date.microseconds = microseconds; - return historyEntry; - } - - private AssetTimePrice[] getZeroPortfolioHistory() { - // Gives two points of zero balance to make a chart - AssetTimePrice[] history = new AssetTimePrice[2]; - history[0] = getZeroHistoryEntry((new java.util.Date()).getTime() * 1000); - history[1] = getZeroHistoryEntry(history[0].date.microseconds - 1000 * 1000); - return history; - } - - public void calculateFiatHistory(Runnable runWhenDone) { - mFiatHistory = new AssetTimePrice[0]; - var nonZeroBalanceAssetList = - mUserAssets.stream() - .filter(token -> { - var assetBalance = mPerTokenCryptoSum.get(Utils.tokenToString(token)); - return assetBalance != null && assetBalance > 0; - }) - .collect(Collectors.toList()); - - AsyncUtils.MultiResponseHandler historyMultiResponse = - new AsyncUtils.MultiResponseHandler(nonZeroBalanceAssetList.size()); - - ArrayList pricesHistoryContexts = - new ArrayList(); - - for (BlockchainToken userAsset : nonZeroBalanceAssetList) { - AsyncUtils.GetPriceHistoryResponseContext priceHistoryContext = - new AsyncUtils.GetPriceHistoryResponseContext( - historyMultiResponse.singleResponseComplete); - - priceHistoryContext.userAsset = userAsset; - pricesHistoryContexts.add(priceHistoryContext); - - if (mActivity.get() != null && !mActivity.get().isFinishing()) { - mActivity.get().getAssetRatioService().getPriceHistory( - AssetUtils.assetRatioId(userAsset), "usd", mFiatHistoryTimeframe, - priceHistoryContext); - } - } - - historyMultiResponse.setWhenAllCompletedAction(() -> { - // Algorithm is taken from the desktop: - // components/brave_wallet_ui/common/reducers/wallet_reducer.ts - // WalletActions.portfolioPriceHistoryUpdated: - // 1. Exclude price history responses of zero length - // 2. Choose the price history of the shortest length - // 3. Per user selected token: - // 3.1 multiply each token history-entry price by current tokens amount - // 3.2 so have the history of per-date fiat balance per token - // 4. Base on shortest history consolidate fiat history. - // 4.1 take first date from shortest history prices, it may not - // the dates from the others tokens histories - // 4.2 take first-entries from all tokens and sum them - // 4.3 go through 4.1 and 4.2 till there are entries in shortest - // history. Some histories may have more entries - they are just ignored. - - Utils.removeIf(pricesHistoryContexts, phc -> phc.timePrices.length == 0); - - if (pricesHistoryContexts.isEmpty()) { - // All history price requests failed - mFiatHistory = getZeroPortfolioHistory(); - runWhenDone.run(); - return; - } - - AsyncUtils.GetPriceHistoryResponseContext shortestPriceHistoryContext = - Collections.min(pricesHistoryContexts, (l, r) -> { - return Integer.compare(l.timePrices.length, r.timePrices.length); - }); - - int shortestPricesLength = shortestPriceHistoryContext.timePrices.length; - - mFiatHistory = new AssetTimePrice[shortestPricesLength]; - - // Go over the selected userAssets - for (int i = 0; i < shortestPricesLength; ++i) { - mFiatHistory[i] = new AssetTimePrice(); - mFiatHistory[i].date = shortestPriceHistoryContext.timePrices[i].date; - - Double thisDateFiatSum = 0.0d; - for (AsyncUtils.GetPriceHistoryResponseContext priceHistoryContext : - pricesHistoryContexts) { - thisDateFiatSum += Float.parseFloat(priceHistoryContext.timePrices[i].price) - * Utils.getOrDefault(mPerTokenCryptoSum, - Utils.tokenToString(priceHistoryContext.userAsset), 0.0d); - } - mFiatHistory[i].price = Double.toString(thisDateFiatSum); - } - - runWhenDone.run(); - }); - } - - public void setSelectedNetworks(List mSelectedNetworks) { - this.mSelectedNetworks = mSelectedNetworks; - updateAssetSortPriority(mSelectedNetworks); - } - - // Update map of Map, to be used for sorting "All Networks" - // asset list - private void updateAssetSortPriority(List networks) { - mAssertSortPriorityPerCoinIndex = AssetUtils.toNetworkIndexMap(networks); - } - - private static class AssetAccountsNetworkBalance { - HashMap assetPrices; - BlockchainToken[] userAssetsList; - HashMap nativeAssetsBalances; - HashMap> blockchainTokensBalances; - NetworkInfo networkInfo; - List accountInfos; - - public AssetAccountsNetworkBalance(HashMap assetPrices, - BlockchainToken[] userAssetsList, HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances, - NetworkInfo networkInfo, List accountInfos) { - this.assetPrices = assetPrices; - this.userAssetsList = userAssetsList; - this.nativeAssetsBalances = nativeAssetsBalances; - this.blockchainTokensBalances = blockchainTokensBalances; - this.networkInfo = networkInfo; - this.accountInfos = accountInfos; - } - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/SmoothLineChartEquallySpaced.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/SmoothLineChartEquallySpaced.java deleted file mode 100644 index ae03c1c5638..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/SmoothLineChartEquallySpaced.java +++ /dev/null @@ -1,246 +0,0 @@ -/* Copyright (c) 2021 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.util; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.LinearGradient; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.graphics.Path; -import android.graphics.PointF; -import android.graphics.Shader; -import android.text.TextPaint; -import android.util.AttributeSet; -import android.view.View; -import android.widget.TextView; - -import org.chromium.brave_wallet.mojom.AssetTimePrice; -import org.chromium.chrome.R; - -import java.text.DateFormat; -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -public class SmoothLineChartEquallySpaced extends View { - private static final int CIRCLE_SIZE = 8; - private static final int STROKE_SIZE = 2; - private static final float SMOOTHNESS = 0.35f; // the higher the smoother, but don't go over 0.5 - - private static final int CANVAS_TEXT_START_Y = 35; - private static final int CANVAS_TEXT_PADDING_Y = 10; - - private final Paint mPaint; - private final Path mPath; - private final float mCircleSize; - private final float mStrokeSize; - private final float mBorder; - - private float[] mValues; - private String[] mDates; - private float mMinY; - private float mMaxY; - private float mCurrentLineX; - private boolean mNoDrawText; - private int[] colors; - private TextView mPrice; - - public SmoothLineChartEquallySpaced(Context context) { - this(context, null, 0); - } - - public SmoothLineChartEquallySpaced(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SmoothLineChartEquallySpaced(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - float scale = context.getResources().getDisplayMetrics().density; - - mCurrentLineX = -1; - mCircleSize = scale * CIRCLE_SIZE; - mStrokeSize = scale * STROKE_SIZE; - mBorder = mCircleSize; - - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setStrokeWidth(mStrokeSize); - - mPath = new Path(); - } - - @Override - public boolean performClick() { - super.performClick(); - return true; - } - - public void setData(AssetTimePrice[] data) { - mValues = new float[data.length]; - mDates = new String[data.length]; - for (int index = 0; index < data.length; index++) { - mValues[index] = Float.parseFloat(data[index].price); - Date date = new Date(data[index].date.microseconds / 1000); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a", Locale.getDefault()); - mDates[index] = dateFormat.format(date); - } - - if (mValues != null && mValues.length > 0) { - mMinY = mValues[0]; - mMaxY = mValues[0]; - for (float y : mValues) { - if (y > mMaxY) mMaxY = y; - if (y < mMinY) mMinY = y; - } - } - - invalidate(); - } - - public void setData(float[] values) { - mValues = values; - mDates = new String[values.length]; - - if (values != null && values.length > 0) { - mMinY = values[0]; - mMaxY = values[0]; - for (float y : values) { - if (y > mMaxY) mMaxY = y; - if (y < mMinY) mMinY = y; - } - } - for (int index = 0; index < mValues.length; index++) { - Date date = new Date(); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a", Locale.getDefault()); - mDates[index] = dateFormat.format(date); - } - - invalidate(); - } - - public void drawLine(float x, TextView price) { - mNoDrawText = false; - mPrice = price; - mCurrentLineX = x; - invalidate(); - } - - public void setNoDrawText(boolean noDraw) { - mNoDrawText = noDraw; - } - - public void setColors(int[] colors) { - this.colors = colors; - } - - @Override - @SuppressLint("SetTextI18n") - public void draw(Canvas canvas) { - super.draw(canvas); - - if (mValues == null || mValues.length == 0) return; - - int size = mValues.length; - - final float height = getMeasuredHeight() - 2 * mBorder; - final float width = getMeasuredWidth() - 2 * mBorder; - - final float dX = mValues.length > 1 ? mValues.length - 1 : (2); - final float dY = (mMaxY - mMinY) > 0 ? (mMaxY - mMinY) : (2); - - mPath.reset(); - - // calculate point coordinates - List points = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - float x = mBorder + i * width / dX; - float y = mBorder + height - (mValues[i] - mMinY) * height / dY; - points.add(new PointF(x, y)); - } - - // calculate smooth path - float lX = 0; - float lY = 0; - mPath.moveTo(points.get(0).x, points.get(0).y); - for (int i = 1; i < size; i++) { - PointF p = points.get(i); // current point - - // first control point - PointF p0 = points.get(i - 1); // previous point - float x1 = p0.x + lX; - float y1 = p0.y + lY; - - // second control point - PointF p1 = points.get(i + 1 < size ? i + 1 : i); // next point - lX = (p1.x - p0.x) / 2 * SMOOTHNESS; // (lX,lY) is the slope of the reference line - lY = (p1.y - p0.y) / 2 * SMOOTHNESS; - float x2 = p.x - lX; - float y2 = p.y - lY; - - // add line - mPath.cubicTo(x1, y1, x2, y2, p.x, p.y); - } - - // draw path - if (colors.length > 1) { - LinearGradient linearGradient = new LinearGradient(0, 0, width, height, - colors, // substitute the correct colors for these - new float[] {0, 0.60f, 0.90f}, Shader.TileMode.CLAMP); - mPaint.setShader(linearGradient); - } else { - mPaint.setColor(colors[0]); - } - mPaint.setStyle(Style.STROKE); - canvas.drawPath(mPath, mPaint); - - // draw circles - mPaint.setStyle(Style.FILL_AND_STROKE); - canvas.drawCircle(points.get(points.size() - 1).x, points.get(points.size() - 1).y, - mCircleSize / 2, mPaint); - mPaint.setStyle(Style.FILL); - mPaint.setColor(Color.WHITE); - canvas.drawCircle(points.get(points.size() - 1).x, points.get(points.size() - 1).y, - (mCircleSize - mStrokeSize) / 2, mPaint); - - // Draw vertical lines - if (mCurrentLineX != -1) { - Paint paint = new Paint(); - paint.setColor(getContext().getColor(R.color.wallet_text_color)); - - paint.setStrokeWidth(2f); - canvas.drawLine(mCurrentLineX, CANVAS_TEXT_START_Y + CANVAS_TEXT_PADDING_Y, - mCurrentLineX, getHeight() - mBorder - mStrokeSize / 2, paint); - float possibleValue = - mValues.length > 1 ? (mCurrentLineX / (width / mValues.length)) : 0; - if (possibleValue < 0) { - possibleValue = 0; - } else if (possibleValue >= mDates.length) { - possibleValue = mDates.length - 1; - } - TextPaint paintText = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); - paintText.setColor(getContext().getColor(R.color.wallet_text_color)); - paintText.setTextSize(35); - float textX = mCurrentLineX - 150; - if (textX < 0) { - textX = mCurrentLineX; - } - if (!mNoDrawText) - canvas.drawText(String.valueOf(mDates[(int) possibleValue]), textX, - CANVAS_TEXT_START_Y, paintText); - if (mPrice != null) { - DecimalFormat decimalFormat = new DecimalFormat("#,##0.00"); - mPrice.setText("$" + decimalFormat.format(mValues[(int) possibleValue])); - } - } - } -} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java index 49ee1cdcbd2..cc86cfadfb4 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java @@ -6,24 +6,19 @@ package org.chromium.chrome.browser.crypto_wallet.util; import android.annotation.SuppressLint; -import android.text.TextUtils; import androidx.annotation.NonNull; -import org.chromium.base.Callback; import org.chromium.base.Callbacks; -import org.chromium.base.Callbacks.Callback1; import org.chromium.brave_wallet.mojom.BlockchainRegistry; import org.chromium.brave_wallet.mojom.BlockchainToken; import org.chromium.brave_wallet.mojom.BraveWalletService; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.OnRampProvider; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.stream.Stream; @@ -139,38 +134,6 @@ public class TokenUtils { tokens -> callback.call(Utils.fixupTokensRegistry(tokens, chainId))); } - /** - * Gets all tokens from each network and filters out tokens different from a given type. - * @param blockchainRegistry BraveChainRegistry to retrieve all tokens from core. - * @param networks Network list whose tokens will get retrieved and filtered. - * @param tokenType Token type used for filtering. - * @param callback Callback containing a filtered array of tokens for each network. - * Note:: It does not add user assets. - */ - public static void getAllTokensFiltered(BlockchainRegistry blockchainRegistry, - List networks, TokenType tokenType, - Callbacks.Callback1 callback) { - AsyncUtils.MultiResponseHandler allNetworkTokenCollector = - new AsyncUtils.MultiResponseHandler(networks.size()); - ArrayList allTokenContexts = new ArrayList<>(); - - for (NetworkInfo networkInfo : networks) { - AsyncUtils.GetNetworkAllTokensContext context = - new AsyncUtils.GetNetworkAllTokensContext( - allNetworkTokenCollector.singleResponseComplete, networkInfo); - getAllTokens(blockchainRegistry, networkInfo.chainId, networkInfo.coin, context); - allTokenContexts.add(context); - } - allNetworkTokenCollector.setWhenAllCompletedAction( - () - -> callback.call(allTokenContexts.stream() - .map(context - -> filterTokens(context.networkInfo, - context.tokens, tokenType, false)) - .flatMap(Arrays::stream) - .toArray(BlockchainToken[] ::new))); - } - /** * Gets all tokens from a given single network, includes user assets and filters out tokens * different from a given type. @@ -194,34 +157,6 @@ public class TokenUtils { })); } - /** - * Retrieves user tokens and all tokens of a given type for a selected network. - * - * @param braveWalletService BraveWalletService instance used to get the user tokens. - * @param blockchainRegistry BlockchainRegistry instance used to get all the tokens. - * @param selectedNetwork Selected network used to retrieve the tokens. - * @param coinType Coin type of the selected network. - * @param tokenType Token type used for filtering. - * @param callback Callback returning two arrays: all tokens, and user tokens. - * Note:: the first array containing all the tokens will include the user tokens. - */ - public static void getUserAndAllTokensFiltered(BraveWalletService braveWalletService, - BlockchainRegistry blockchainRegistry, NetworkInfo selectedNetwork, int coinType, - TokenType tokenType, - Callbacks.Callback2 callback) { - getAllTokens(blockchainRegistry, selectedNetwork.chainId, coinType, - tokens - -> braveWalletService.getUserAssets( - selectedNetwork.chainId, coinType, userTokens -> { - BlockchainToken[] filteredTokens = filterTokens(selectedNetwork, - distinctiveConcatenatedArrays(tokens, userTokens), tokenType, - false); - BlockchainToken[] filteredUserTokens = - filterTokens(selectedNetwork, userTokens, tokenType, true); - callback.call(filteredTokens, filteredUserTokens); - })); - } - public static void getUserOrAllTokensFiltered(BraveWalletService braveWalletService, BlockchainRegistry blockchainRegistry, NetworkInfo selectedNetwork, int coinType, TokenType tokenType, boolean userAssetsOnly, @@ -235,67 +170,6 @@ public class TokenUtils { braveWalletService, blockchainRegistry, selectedNetwork, tokenType, callback); } - private static final int[] SUPPORTED_RAMP_PROVIDERS = { - OnRampProvider.RAMP, OnRampProvider.SARDINE, OnRampProvider.TRANSAK}; - - public static void getBuyTokensFiltered(BlockchainRegistry blockchainRegistry, - NetworkInfo selectedNetwork, Callbacks.Callback1 callback) { - int[] rampProviders = SUPPORTED_RAMP_PROVIDERS; - blockchainRegistry.getProvidersBuyTokens(rampProviders, selectedNetwork.chainId, tokens -> { - // blockchainRegistry.getProvidersBuyTokens returns a full list of tokens that are - // allowed to buy by given rampProviders. We just need to check on native assets logo - // and fill them if they are empty. - for (BlockchainToken tokenFromAll : tokens) { - if (tokenFromAll.logo.isEmpty()) { - tokenFromAll.logo = - Utils.getNetworkIconName(tokenFromAll.chainId, tokenFromAll.coin); - } - } - Arrays.sort(tokens, blockchainTokenComparatorPerGasOrBatType); - callback.call(removeDuplicates(tokens)); - }); - } - - public static void isBuySupported(BlockchainRegistry blockchainRegistry, - NetworkInfo selectedNetwork, String assetSymbol, String contractAddress, String chainId, - Callback1 callback) { - getBuyTokensFiltered( - blockchainRegistry, selectedNetwork, tokens -> { - callback.call(JavaUtils.includes(tokens, - iToken - -> AssetUtils.Filters.isSameToken( - iToken, assetSymbol, contractAddress, chainId))); - }); - } - - public static void isCustomToken(@NonNull BlockchainRegistry blockchainRegistry, - @NonNull NetworkInfo selectedNetwork, int coinType, @NonNull BlockchainToken token, - Callbacks.Callback1 callback) { - assert !JavaUtils.anyNull(token, selectedNetwork) : "Token or network should not be null"; - if (JavaUtils.anyNull(token, selectedNetwork)) return; - - if (TextUtils.isEmpty(token.contractAddress)) { - callback.call(false); - return; - } - // Any token with a token ID should be considered a custom token - if (!TextUtils.isEmpty(token.tokenId)) { - callback.call(true); - return; - } - getAllTokens(blockchainRegistry, selectedNetwork.chainId, coinType, tokens -> { - boolean isCustom = true; - tokens = filterTokens(selectedNetwork, tokens, TokenType.ALL, false); - for (BlockchainToken tokenFromAll : tokens) { - if (token.contractAddress.equals(tokenFromAll.contractAddress)) { - isCustom = false; - break; - } - } - callback.call(isCustom); - }); - } - /** * Concatenates arrays, add only elements of arraySecond that are not present in the arrayFirst * @param arrayFirst first array to be added in the result @@ -342,70 +216,4 @@ public class TokenUtils { && token1.contractAddress.equalsIgnoreCase(token2.contractAddress); } - public static void getExactUserAsset(BraveWalletService braveWalletService, - NetworkInfo selectedNetwork, int coinType, String assetSymbol, String assetName, - String assetId, String contractAddress, int assetDecimals, - Callback callback) { - getVisibleUserAssetsFiltered( - braveWalletService, selectedNetwork, coinType, TokenType.ALL, userAssets -> { - BlockchainToken resultToken = null; - for (BlockchainToken userAsset : userAssets) { - if (selectedNetwork.chainId.equals(userAsset.chainId) - && assetSymbol.equals(userAsset.symbol) - && assetName.equals(userAsset.name) - && (assetId.isEmpty() || assetId.equals(userAsset.tokenId)) - && contractAddress.equals(userAsset.contractAddress) - && assetDecimals == userAsset.decimals) { - resultToken = userAsset; - } - } - - callback.onResult(resultToken); - }); - } - - private static final Comparator blockchainTokenComparatorPerGasOrBatType = - (token1, token2) -> { - boolean isNativeToken1 = AssetUtils.isNativeToken(token1); - boolean isNativeToken2 = AssetUtils.isNativeToken(token2); - boolean isBatToken1 = AssetUtils.isBatToken(token1); - boolean isBatToken2 = AssetUtils.isBatToken(token2); - if (isNativeToken1 && !isNativeToken2) - return -1; - else if (!isNativeToken1 && isNativeToken2) - return 1; - else if (isBatToken1 && !isBatToken2) - return -1; - else if (!isBatToken1 && isBatToken2) - return 1; - else - return token1.symbol.compareTo(token2.symbol); - }; - - // Returns an array of available assets per ramp provider and removes duplicates with the - // same contract address using case insensitive contractAddress comparison. - // The `getProvidersBuyTokens` API can return a merged list containing the available assets - // per ramp provider. It's not unusual to have the same asset multiple times with the - // same contract address all upper case from a ramp provider and all lower case from another - // one. Thus it's important to compare the contract addresses ignoring case. - private static BlockchainToken[] removeDuplicates(BlockchainToken[] tokens) { - List result = new ArrayList<>(); - for (BlockchainToken item : tokens) { - String contractAddress = item.contractAddress; - boolean duplicate = false; - for (BlockchainToken itemResult : result) { - // IMPORTANT: use `equalsIgnoreCase` to detect two contract addresses with different - // capitalization. - if (contractAddress.equalsIgnoreCase(itemResult.contractAddress)) { - duplicate = true; - break; - } - } - // Do not add duplicated item. - if (!duplicate) { - result.add(item); - } - } - return result.toArray(new BlockchainToken[0]); - } } 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 00262a060b9..b4510cbf126 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 @@ -12,10 +12,7 @@ import android.app.Activity; 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.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -31,9 +28,7 @@ import android.os.Handler; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; -import android.text.style.ClickableSpan; import android.text.style.URLSpan; -import android.util.Pair; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; @@ -43,13 +38,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.hardware.fingerprint.FingerprintManagerCompat; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -61,14 +53,12 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.brave_wallet.mojom.AccountId; 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.BraveWalletP3a; import org.chromium.brave_wallet.mojom.BraveWalletService; -import org.chromium.brave_wallet.mojom.CoinMarket; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.JsonRpcService; import org.chromium.brave_wallet.mojom.NetworkInfo; @@ -76,20 +66,11 @@ import org.chromium.brave_wallet.mojom.OriginInfo; import org.chromium.brave_wallet.mojom.ProviderError; import org.chromium.brave_wallet.mojom.TransactionInfo; import org.chromium.brave_wallet.mojom.TransactionStatus; -import org.chromium.brave_wallet.mojom.TxData; -import org.chromium.brave_wallet.mojom.TxService; 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.app.domain.PortfolioModel; -import org.chromium.chrome.browser.crypto_wallet.activities.AssetDetailActivity; import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; -import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; -import org.chromium.chrome.browser.crypto_wallet.fragments.ApproveTxBottomSheetDialogFragment; -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.web_ui.WebUiActivityType; +import org.chromium.chrome.browser.crypto_wallet.model.AccountSelectorItemModel; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.util.TabUtils; import org.chromium.ui.text.NoUnderlineClickableSpan; @@ -119,18 +100,10 @@ import java.util.stream.Collectors; public class Utils { private static final String TAG = "Utils"; - public static int ACCOUNT_ITEM = 1; - public static int ASSET_ITEM = 2; - public static int TRANSACTION_ITEM = 3; - - public static final int ACCOUNT_REQUEST_CODE = 2; public static final int ETH_DEFAULT_DECIMALS = 18; public static final int SOL_DEFAULT_DECIMALS = 9; private static final String PREF_CRYPTO_ONBOARDING = "crypto_onboarding"; - public static final String DEX_AGGREGATOR_URL = "https://0x.org/"; - public static final String ENS_OFFCHAIN_LEARN_MORE_URL = - "https://github.com/brave/brave-browser/wiki/ENS-offchain-lookup"; public static final String BRAVE_SUPPORT_URL = "https://support.brave.com"; public static final String BRAVE_TERMS_OF_USE_URL = "https://brave.com/terms-of-use/"; public static final String NAME = "name"; @@ -139,18 +112,11 @@ public class Utils { public static final String ASSET_SYMBOL = "assetSymbol"; public static final String ASSET_NAME = "assetName"; public static final String ASSET_ID = "assetId"; - public static final String ASSET_CONTRACT_ADDRESS = "assetContractAddress"; - public static final String ASSET_LOGO = "assetLogo"; - public static final String ASSET_DECIMALS = "assetDecimals"; public static final String CHAIN_ID = "chainId"; - public static final String IS_MARKET_COIN = "isMarketCoin"; public static final String IS_FROM_DAPPS = "isFromDapps"; - public static final String MARKET_CAP = "marketCap"; - public static final String MARKET_CAP_RANK = "marketCapRank"; public static final String RESTART_WALLET_ACTIVITY = "restartWalletActivity"; public static final String RESTART_WALLET_ACTIVITY_SETUP = "restartWalletActivitySetup"; public static final String RESTART_WALLET_ACTIVITY_RESTORE = "restartWalletActivityRestore"; - public static final String TOTAL_VOLUME = "totalVolume"; public static final String ETHEREUM_CONTRACT_FOR_SWAP = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; public static final BigInteger MAX_UINT256 = @@ -232,63 +198,6 @@ public class Utils { if (focusedView != null) imm.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); } - public static void openBuySendSwapActivity( - @NonNull final Activity activity, @NonNull final WebUiActivityType webUiActivityType) { - String webWalletUrl; - switch (webUiActivityType) { - case SWAP: - webWalletUrl = BraveActivity.BRAVE_SWAP_URL; - break; - case SEND: - webWalletUrl = BraveActivity.BRAVE_SEND_URL; - break; - case BUY: - webWalletUrl = BraveActivity.BRAVE_BUY_URL; - break; - default: - throw new IllegalStateException( - String.format("Activity not found for type %s.", webUiActivityType)); - } - try { - BraveActivity.getBraveActivity().openNewOrSelectExistingTab(webWalletUrl, true); - TabUtils.bringChromeTabbedActivityToTheTop(activity); - } catch (BraveActivity.BraveActivityNotFoundException e) { - Log.e(TAG, "Error while opening wallet tab.", e); - } - } - - public static void openAssetDetailsActivity( - @NonNull final Context context, @NonNull final BlockchainToken asset) { - assert context != null; - Intent assetDetailIntent = new Intent(context, AssetDetailActivity.class); - assetDetailIntent.putExtra(CHAIN_ID, asset.chainId); - assetDetailIntent.putExtra(ASSET_SYMBOL, asset.symbol); - assetDetailIntent.putExtra(ASSET_NAME, asset.name); - assetDetailIntent.putExtra(ASSET_ID, asset.tokenId); - assetDetailIntent.putExtra(ASSET_LOGO, asset.logo); - assetDetailIntent.putExtra(ASSET_CONTRACT_ADDRESS, asset.contractAddress); - assetDetailIntent.putExtra(ASSET_DECIMALS, asset.decimals); - assetDetailIntent.putExtra(COIN_TYPE, asset.coin); - assetDetailIntent.setAction(Intent.ACTION_VIEW); - context.startActivity(assetDetailIntent); - } - - public static void openAssetDetailsActivity( - @NonNull final Context context, @NonNull final CoinMarket asset) { - assert context != null; - Intent assetDetailIntent = new Intent(context, AssetDetailActivity.class); - assetDetailIntent.putExtra(IS_MARKET_COIN, true); - assetDetailIntent.putExtra(MARKET_CAP, asset.marketCap); - assetDetailIntent.putExtra(MARKET_CAP_RANK, asset.marketCapRank); - assetDetailIntent.putExtra(TOTAL_VOLUME, asset.totalVolume); - assetDetailIntent.putExtra(ASSET_ID, asset.id); - assetDetailIntent.putExtra(ASSET_SYMBOL, asset.symbol); - assetDetailIntent.putExtra(ASSET_NAME, asset.name); - assetDetailIntent.putExtra(ASSET_LOGO, asset.image); - assetDetailIntent.setAction(Intent.ACTION_VIEW); - context.startActivity(assetDetailIntent); - } - /** * Get a short name of a network * @param networkName of chain e.g. Ethereum Mainnet @@ -308,21 +217,6 @@ public class Utils { return ""; } - public static void isCustomNetwork(JsonRpcService jsonRpcService, int coinType, String chainId, - Callbacks.Callback1 callback) { - if (coinType != CoinType.ETH || jsonRpcService == null) { - callback.call(false); - return; - } - jsonRpcService.getCustomNetworks(coinType, chainIds -> { - if (Arrays.asList(chainIds).contains(chainId)) { - callback.call(true); - } else { - callback.call(false); - } - }); - } - public static NetworkInfo getNetworkInfoByChainId( String chainId, List allNetworks) { for (NetworkInfo network : allNetworks) { @@ -346,19 +240,6 @@ public class Utils { return list.toArray(new NetworkInfo[0]); } - public static NetworkInfo getNetworkInfoByName(String chainName, NetworkInfo[] allNetworks) { - for (NetworkInfo network : allNetworks) { - if (network.chainName.equals(chainName)) { - return network; - } - } - return allNetworks[0]; - } - - public static String getNetworkShortText(NetworkInfo network) { - return getShortNameOfNetwork(network.chainName); - } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) public static String getDecimalsDepNumber(int decimals) { String strDecimals = "1"; @@ -605,45 +486,6 @@ public class Utils { } } - public static long toDecimalLamport(String amount, int decimals) { - try { - amount = removeHexPrefix(amount); - BigDecimal value = new BigDecimal(amount); - - String resStr = - value.multiply(new BigDecimal(getDecimalsDepNumber(decimals))).toPlainString(); - int integerPlaces = resStr.indexOf('.'); - if (integerPlaces != -1 && (integerPlaces + 9) <= resStr.length()) { - resStr = resStr.substring(0, integerPlaces + 9); - } - return (long) Double.parseDouble(resStr); - } catch (Exception e) { - e.printStackTrace(); - } - return 0; - } - - public static String removeHexPrefix(String value) { - if (value.startsWith("0x")) { - return value.substring(2); - } - return value; - } - - public static TxData getTxData( - String nonce, String gasPrice, String gasLimit, String to, String value, byte[] data) { - TxData res = new TxData(); - res.nonce = nonce; - res.gasPrice = gasPrice; - res.gasLimit = gasLimit; - res.to = to; - res.value = value; - res.data = data; - res.signedTransaction = ""; - - return res; - } - public static String stripAccountAddress(String address) { return address; // TODO(serg): Let's leave it for now as it could be we still @@ -948,49 +790,6 @@ public class Utils { return ""; } - public static int getTimeframeFromRadioButtonId(int radioButtonId) { - if (radioButtonId == R.id.live_radiobutton) { - return AssetPriceTimeframe.LIVE; - } else if (radioButtonId == R.id.day_1_radiobutton) { - return AssetPriceTimeframe.ONE_DAY; - } else if (radioButtonId == R.id.week_1_radiobutton) { - return AssetPriceTimeframe.ONE_WEEK; - } else if (radioButtonId == R.id.month_1_radiobutton) { - return AssetPriceTimeframe.ONE_MONTH; - } else if (radioButtonId == R.id.month_3_radiobutton) { - return AssetPriceTimeframe.THREE_MONTHS; - } else if (radioButtonId == R.id.year_1_radiobutton) { - return AssetPriceTimeframe.ONE_YEAR; - } else { - return AssetPriceTimeframe.ALL; - } - } - - public static String getTimeframeString(int assetPriceTimeframe) { - Resources resources = ContextUtils.getApplicationContext().getResources(); - assert resources != null; - - switch (assetPriceTimeframe) { - case AssetPriceTimeframe.LIVE: - return resources.getString(R.string.trend_1h_text); - case AssetPriceTimeframe.ONE_DAY: - return resources.getString(R.string.trend_1d_text); - case AssetPriceTimeframe.ONE_WEEK: - return resources.getString(R.string.trend_1w_text); - case AssetPriceTimeframe.ONE_MONTH: - return resources.getString(R.string.trend_1m_text); - case AssetPriceTimeframe.THREE_MONTHS: - return resources.getString(R.string.trend_3m_text); - case AssetPriceTimeframe.ONE_YEAR: - return resources.getString(R.string.trend_1y_text); - case AssetPriceTimeframe.ALL: - return resources.getString(R.string.trend_all_text); - default: - assert false; - return "N/A"; - } - } - /* * Java port of the same function in components/brave_wallet_ui/options/asset-options.ts. */ @@ -1117,34 +916,6 @@ public class Utils { .collect(Collectors.toList()); } - public static void openTransaction(TransactionInfo txInfo, AppCompatActivity activity, - int coinType, NetworkInfo networkInfo) { - assert txInfo != null; - if (txInfo.txStatus == TransactionStatus.UNAPPROVED) { - if (activity instanceof ApprovedTxObserver) { - showApproveDialog(txInfo, activity, ((ApprovedTxObserver) activity)); - return; - } - throw new RuntimeException("Activity must implement ApprovedTxObserver"); - } else { - if (txInfo.txHash == null || txInfo.txHash.isEmpty()) { - return; - } - boolean isFileCoinEvmNet = - TextUtils.equals( - txInfo.chainId, BraveWalletConstants.FILECOIN_ETHEREUM_MAINNET_CHAIN_ID) - || TextUtils.equals(txInfo.chainId, - BraveWalletConstants.FILECOIN_ETHEREUM_TESTNET_CHAIN_ID); - if (isFileCoinEvmNet) { - openAddress("/" + txInfo.txHash, activity, coinType, networkInfo); - } else if (coinType == CoinType.FIL) { - openAddress("?cid=" + txInfo.txHash, activity, coinType, networkInfo); - } else { - openAddress("/tx/" + txInfo.txHash, activity, coinType, networkInfo); - } - } - } - public static void openAddress( String toAppend, AppCompatActivity activity, int coinType, NetworkInfo networkInfo) { String blockExplorerUrl = Arrays.toString(networkInfo.blockExplorerUrls); @@ -1165,132 +936,14 @@ public class Utils { TabUtils.openUrlInCustomTab(activity, blockExplorerUrl); } - public static void setUpTransactionList(BraveWalletBaseActivity activity, - AccountInfo[] accounts, List allNetworks, - WalletListItemModel walletListItemModel, HashMap assetPrices, - BlockchainToken[] fullTokenList, HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances, - NetworkInfo selectedNetwork, Callbacks.Callback1> callback) { - TxService txService = activity.getTxService(); - assert txService != null; - - PendingTxHelper pendingTxHelper = new PendingTxHelper(txService, accounts, true); - - pendingTxHelper.fetchTransactions(() -> { - HashMap pendingTxInfos = pendingTxHelper.getTransactions(); - pendingTxHelper.destroy(); - SolanaTransactionsGasHelper solanaTransactionsGasHelper = - new SolanaTransactionsGasHelper(activity, getTransactionArray(pendingTxInfos)); - solanaTransactionsGasHelper.maybeGetSolanaGasEstimations(() -> { - workWithTransactions(activity, selectedNetwork, allNetworks, pendingTxInfos, - accounts, walletListItemModel, assetPrices, fullTokenList, - nativeAssetsBalances, blockchainTokensBalances, - solanaTransactionsGasHelper.getPerTxFee(), callback); - }); - }); - } - - private static TransactionInfo[] getTransactionArray( - HashMap txInfos) { - TransactionInfo[] result = new TransactionInfo[0]; - for (String key : txInfos.keySet()) { - TransactionInfo[] txs = txInfos.get(key); - result = concatWithArrayCopy(result, txs); - } - - return result; - } - - private static T[] concatWithArrayCopy(T[] array1, T[] array2) { - T[] result = Arrays.copyOf(array1, array1.length + array2.length); - System.arraycopy(array2, 0, result, array1.length, array2.length); - - return result; - } - - private static void workWithTransactions(BraveWalletBaseActivity activity, - NetworkInfo selectedNetwork, List allNetworks, - HashMap pendingTxInfos, AccountInfo[] accounts, - WalletListItemModel walletListItemModel, HashMap assetPrices, - BlockchainToken[] fullTokenList, HashMap nativeAssetsBalances, - HashMap> blockchainTokensBalances, - HashMap perTxSolanaFee, - Callbacks.Callback1> callback) { - List walletListItemModelList = new ArrayList<>(); - - for (String accountName : pendingTxInfos.keySet()) { - TransactionInfo[] txInfos = pendingTxInfos.get(accountName); - for (TransactionInfo txInfo : txInfos) { - long solanaEstimatedTxFee = 0; - if (perTxSolanaFee.get(txInfo.id) != null) { - solanaEstimatedTxFee = perTxSolanaFee.get(txInfo.id); - } - AccountInfo txAccountInfo = Utils.findAccount(accounts, txInfo.fromAccountId); - if (txAccountInfo == null) { - continue; - } - - var txNetwork = JavaUtils.safeVal( - NetworkUtils.findNetwork(allNetworks, txInfo.chainId, selectedNetwork.coin), - selectedNetwork); - ParsedTransaction parsedTx = ParsedTransaction.parseTransaction(txInfo, txNetwork, - accounts, assetPrices, solanaEstimatedTxFee, fullTokenList, - nativeAssetsBalances, blockchainTokensBalances); - WalletListItemModel itemModel = makeWalletItem( - (Context) activity, txInfo, txNetwork, parsedTx, txAccountInfo); - // Filter by token. Account is already filtered in the accounts array. - if (!walletListItemModel.isAccount() - && !walletListItemModel.getBlockchainToken().symbol.equals( - parsedTx.getSymbol())) { - continue; - } - walletListItemModelList.add(itemModel); - } - } - callback.call(walletListItemModelList); - } - - public static WalletListItemModel makeWalletItem(Context context, TransactionInfo txInfo, - NetworkInfo selectedNetwork, ParsedTransaction parsedTx, AccountInfo txAccountInfo) { - assert (txInfo != null); - assert (txAccountInfo != null); - Pair itemTitles = parsedTx.makeTxListItemTitles(context); - WalletListItemModel itemModel = - new WalletListItemModel(Utils.getCoinIcon(selectedNetwork.coin), itemTitles.first, - itemTitles.second, "", null, null); - updateWalletCoinTransactionStatus(itemModel, context, txInfo); - - itemModel.setAccountInfo(txAccountInfo); - itemModel.setChainSymbol(selectedNetwork.symbol); - itemModel.setChainDecimals(selectedNetwork.decimals); - itemModel.setTotalGas(parsedTx.getGasFee()); - itemModel.setTotalGasFiat(parsedTx.getGasFeeFiat()); - // TODO(apaymyshev): handle from address for bitcoin. - itemModel.setAddressesForBitmap(txInfo.fromAddress, parsedTx.getRecipient()); - itemModel.setTransactionInfo(txInfo); - itemModel.setParsedTx(parsedTx); - itemModel.setAssetNetwork(selectedNetwork); - - return itemModel; - } - public static void updateWalletCoinTransactionItem( - WalletListItemModel item, TransactionInfo txInfo, Context context) { + AccountSelectorItemModel item, TransactionInfo txInfo, Context context) { item.setTransactionInfo(txInfo); updateWalletCoinTransactionStatus(item, context, txInfo); } - private static void showApproveDialog(TransactionInfo txInfo, AppCompatActivity activity, - ApprovedTxObserver approvedTxObserver) { - ApproveTxBottomSheetDialogFragment approveTxBottomSheetDialogFragment = - ApproveTxBottomSheetDialogFragment.newInstance(txInfo); - approveTxBottomSheetDialogFragment.setApprovedTxObserver(approvedTxObserver); - approveTxBottomSheetDialogFragment.show(activity.getSupportFragmentManager(), - ApproveTxBottomSheetDialogFragment.TAG_FRAGMENT); - } - public static void updateWalletCoinTransactionStatus( - WalletListItemModel itemModel, Context context, TransactionInfo txInfo) { + AccountSelectorItemModel itemModel, Context context, TransactionInfo txInfo) { String txStatus = context.getResources().getString(R.string.wallet_tx_status_unapproved); Bitmap txStatusBitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(txStatusBitmap); @@ -1330,31 +983,6 @@ public class Utils { 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); - 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. @@ -1384,15 +1012,6 @@ public class Utils { return spannable; } - 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) { @@ -1459,93 +1078,6 @@ public class Utils { return chromeActivity.getTabModelSelector().getModel(isIncognito).getProfile(); } - public static org.chromium.url.internal.mojom.Origin getCurrentMojomOrigin() { - org.chromium.url.internal.mojom.Origin hostOrigin = - new org.chromium.url.internal.mojom.Origin(); - ChromeTabbedActivity activity = BraveActivity.getChromeTabbedActivity(); - if (activity == null || activity.getActivityTab() == null) { - return hostOrigin; - } - - org.chromium.url.Origin urlOrigin = - activity.getActivityTab().getWebContents().getMainFrame().getLastCommittedOrigin(); - if (urlOrigin == null) { - return hostOrigin; - } - hostOrigin.scheme = urlOrigin.getScheme(); - hostOrigin.host = urlOrigin.getHost(); - hostOrigin.port = (short) urlOrigin.getPort(); - - return hostOrigin; - } - - public static WalletCoinAdapter setupVisibleAssetList(List userAssets, - HashMap perTokenCryptoSum, HashMap perTokenFiatSum, - String tokensPath, Resources resources, List allNetworkInfos) { - WalletCoinAdapter walletCoinAdapter = - new WalletCoinAdapter(WalletCoinAdapter.AdapterType.VISIBLE_ASSETS_LIST); - List walletListItemModelList = new ArrayList<>(); - - for (BlockchainToken userAsset : userAssets) { - WalletListItemModel walletListItemModel = mapToWalletListItemModel(perTokenCryptoSum, - perTokenFiatSum, tokensPath, userAsset, resources, allNetworkInfos); - walletListItemModelList.add(walletListItemModel); - } - - walletCoinAdapter.setWalletListItemModelList(walletListItemModelList); - walletCoinAdapter.setWalletListItemType(Utils.ASSET_ITEM); - - return walletCoinAdapter; - } - - public static List createWalletListItemModel( - List userAssets, HashMap perTokenCryptoSum, - HashMap perTokenFiatSum, String tokensPath, Resources resources, - List allNetworkInfos) { - List walletListItemModelList = new ArrayList<>(); - - for (PortfolioModel.NftDataModel userAsset : userAssets) { - WalletListItemModel walletListItemModel = mapToWalletListItemModel(perTokenCryptoSum, - perTokenFiatSum, tokensPath, userAsset.token, resources, allNetworkInfos); - walletListItemModel.setNftDataModel(userAsset); - walletListItemModelList.add(walletListItemModel); - } - - return walletListItemModelList; - } - - @NonNull - private static WalletListItemModel mapToWalletListItemModel( - HashMap perTokenCryptoSum, HashMap perTokenFiatSum, - String tokensPath, BlockchainToken userAsset, Resources resources, - List allNetworkInfos) { - String currentAssetKey = Utils.tokenToString(userAsset); - Double fiatBalance = Utils.getOrDefault(perTokenFiatSum, currentAssetKey, 0.0d); - String fiatBalanceString = String.format(Locale.getDefault(), "$%,.2f", fiatBalance); - Double cryptoBalance = Utils.getOrDefault(perTokenCryptoSum, currentAssetKey, 0.0d); - NetworkInfo assetNetwork = - NetworkUtils.findNetwork(allNetworkInfos, userAsset.chainId, userAsset.coin); - String subtitle = assetNetwork == null - ? userAsset.symbol - : resources.getString(R.string.brave_wallet_portfolio_asset_network_description, - userAsset.symbol, assetNetwork.chainName); - String cryptoBalanceString = - String.format(Locale.getDefault(), "%.4f %s", cryptoBalance, userAsset.symbol); - - WalletListItemModel walletListItemModel = new WalletListItemModel( - Utils.getCoinIcon(userAsset.coin), userAsset.name, subtitle, userAsset.tokenId, - // Amount in USD - fiatBalanceString, - // Amount in current crypto currency/token - cryptoBalanceString); - - walletListItemModel.setBrowserResourcePath(tokensPath); - walletListItemModel.setAssetNetwork(assetNetwork); - walletListItemModel.setIconPath("file://" + tokensPath + "/" + userAsset.logo); - walletListItemModel.setBlockchainToken(userAsset); - return walletListItemModel; - } - public static String formatErc721TokenTitle(String title, String id) { if (id.isEmpty() || id.equals("0")) { return title; @@ -1722,15 +1254,6 @@ public class Utils { return result; } - public static boolean allowBuy(String chainId) { - return !WalletConstants.KNOWN_TEST_CHAIN_IDS.contains(chainId) - && WalletConstants.BUY_SUPPORTED_ONRAMP_NETWORKS.contains(chainId); - } - - public static boolean allowSwap(String chainId) { - return WalletConstants.SWAP_SUPPORTED_NETWORKS.contains(chainId); - } - public static double parseDouble(String s) throws ParseException { if (s.isEmpty()) return 0d; diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Validations.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Validations.java index 5c566539f9f..65016de2666 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Validations.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Validations.java @@ -5,159 +5,7 @@ package org.chromium.chrome.browser.crypto_wallet.util; -import android.content.res.Resources; - -import androidx.annotation.NonNull; - -import org.chromium.base.Callbacks; -import org.chromium.base.ContextUtils; -import org.chromium.brave_wallet.mojom.AccountInfo; -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.KeyringService; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.chrome.R; - -import java.util.HashSet; -import java.util.Locale; - public class Validations { - public static class SendToAccountAddress { - private HashSet mKnownContractAddresses; - private static int VALID_ACCOUNT_ADDRESS_BYTE_LENGTH = 20; - private boolean mIsKnowContracts; - - public SendToAccountAddress() {} - - public void validate(NetworkInfo selectedNetwork, KeyringService keyringService, - BlockchainRegistry blockchainRegistry, BraveWalletService braveWalletService, - AccountInfo fromAccount, String receiverAccountAddress, - Callbacks.Callback2 callback) { - String senderAccountAddressLower = fromAccount.address.toLowerCase(Locale.ENGLISH); - - String receiverAccountAddressLower = receiverAccountAddress.toLowerCase(Locale.ENGLISH); - - Resources resources = ContextUtils.getApplicationContext().getResources(); - - if (senderAccountAddressLower.equals(receiverAccountAddressLower)) { - callback.call(resources.getString(R.string.wallet_same_address_error), true); - return; - } - - @CoinType.EnumType - int coinType = fromAccount.accountId.coin; - if (coinType == CoinType.SOL) { - // TODO(apaymyshev): why are we validating wallet's account? - braveWalletService.isBase58EncodedSolanaPubkey(fromAccount.address, success -> { - String responseMsg = ""; - if (!success) { - responseMsg = resources.getString(R.string.invalid_sol_address); - } - callback.call(responseMsg, success); - }); - } else if (coinType == CoinType.FIL) { - if (receiverAccountAddress.isEmpty()) { - return; - } - final boolean showErrorMessage = !isValidFilAddress(receiverAccountAddress); - final String errorMessage = - showErrorMessage ? resources.getString(R.string.invalid_fil_address) : ""; - callback.call(errorMessage, showErrorMessage); - } else { - // Steps to validate: - // 1. Valid hex string - // 0x <20 bytes | 40 chars> - // 2. Not equal to ours address - // 3. Not one of token's contract addresses - // 4. Has valid checksum - - String receiverAccountAddressUpper = - Utils.maybeHexStrToUpperCase(receiverAccountAddress); - - byte[] bytesReceiverAccountAddress = - Utils.hexStrToNumberArray(receiverAccountAddress); - if (!receiverAccountAddress.isEmpty() - && bytesReceiverAccountAddress.length - != VALID_ACCOUNT_ADDRESS_BYTE_LENGTH) { - callback.call(resources.getString(R.string.wallet_not_valid_eth_address), true); - return; - } - - mIsKnowContracts = false; - if (mKnownContractAddresses == null) { - assert braveWalletService != null; - assert blockchainRegistry != null; - assert selectedNetwork != null; - - TokenUtils.getAllTokensFiltered(braveWalletService, blockchainRegistry, - selectedNetwork, TokenUtils.TokenType.ALL, (tokens) -> { - fillKnowContracts(tokens); - checkForKnowContracts( - receiverAccountAddressLower, callback, resources); - }); - } else { - checkForKnowContracts(receiverAccountAddressLower, callback, resources); - } - if (mIsKnowContracts) return; - - keyringService.getChecksumEthAddress(receiverAccountAddress, checksum_address -> { - if (receiverAccountAddress.equals(checksum_address) - || receiverAccountAddress.isEmpty()) { - callback.call("", false); - } else if (receiverAccountAddressLower.equals(receiverAccountAddress) - || receiverAccountAddressUpper.equals(receiverAccountAddress)) { - callback.call( - resources.getString(R.string.address_missing_checksum_warning), - false); - } else { - callback.call( - resources.getString(R.string.address_not_valid_checksum_error), - true); - } - }); - } - } - - /** - * Checks if the Filecoin contract address provided is valid. - * @param address Lowercase Filecoin contract address. - * @return {@code true} if the Filecoin contract address is valid, {@code false} otherwise. - */ - private boolean isValidFilAddress(@NonNull final String address) { - if (!address.startsWith(BraveWalletConstants.FILECOIN_MAINNET) - && !address.startsWith(BraveWalletConstants.FILECOIN_TESTNET)) { - return false; - } - // Secp256k have 41 address length and BLS keys have 86. - return (address.length() == 41 || address.length() == 86); - } - - private void checkForKnowContracts(String receiverAccountAddressLower, - Callbacks.Callback2 callback, Resources resources) { - assert mKnownContractAddresses != null; - if (mKnownContractAddresses.contains(receiverAccountAddressLower)) { - callback.call(resources.getString(R.string.wallet_contract_address_error), true); - mIsKnowContracts = true; - } else { - callback.call("", false); - mIsKnowContracts = false; - } - } - - private void fillKnowContracts(BlockchainToken[] tokens) { - mKnownContractAddresses = new HashSet(); - for (BlockchainToken token : tokens) { - if (token.contractAddress != null && !token.contractAddress.isEmpty()) { - mKnownContractAddresses.add( - token.contractAddress.toLowerCase(Locale.getDefault())); - } - } - } - } - public static boolean hasUnicode(String str) { for (int i = 0; i < str.length(); i++) { if (str.codePointAt(i) > 127) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java index 5dd29f5d1d0..575549edd55 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java @@ -8,35 +8,24 @@ package org.chromium.chrome.browser.crypto_wallet.util; import org.chromium.brave_wallet.mojom.BraveWalletConstants; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.TransactionType; -import org.chromium.chrome.browser.crypto_wallet.fragments.NftGridFragment; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; public final class WalletConstants { // Radius of the oval used to round the corners in density-independent pixels. public static final int RECT_SHARP_ROUNDED_CORNERS_DP = 12; - public static final int RECT_ROUNDED_CORNERS_DP = 12; public static final long MILLI_SECOND = 1000; // The maximum bitmap size used by {@code WebContents#downloadImage}. public static final int MAX_BITMAP_SIZE_FOR_DOWNLOAD = 2048; - // USD currency code used by on-ramp providers. - public static final String CURRENCY_CODE_USD = "USD"; - // Android public static final String LINE_SEPARATOR = "line.separator"; - // Crypto - public static final String URL_RAINBOW_BRIDGE_OVERVIEW = - "https://doc.aurora.dev/bridge/bridge-overview/"; - public static final String URL_RAINBOW_BRIDGE_RISKS = "https://rainbowbridge.app/approvals"; - // Brave public static final String URL_SIGN_TRANSACTION_REQUEST = "https://support.brave.com/hc/en-us/articles/4409513799693"; @@ -51,9 +40,6 @@ public final class WalletConstants { // Regex public static final String REGX_ANY_ETH_ADDRESS = ".*(0x[a-fA-F0-9]{40}).*"; - // Aurora - public static final String URL_RAINBOW_AURORA = "https://rainbowbridge.app"; - // Android resources public static final String RESOURCE_ID = "id"; @@ -76,28 +62,12 @@ public final class WalletConstants { public static final String PREF_SHOW_BRIDGE_INFO_DIALOG = "pref_show_bridge_info_dialog"; // To clear prefs while resetting wallet - public static final String[] BRAVE_WALLET_PREFS = { - PREF_SHOW_BRIDGE_INFO_DIALOG, NftGridFragment.SHOW_NFT_DISCOVERY_DIALOG}; + public static final String[] BRAVE_WALLET_PREFS = {PREF_SHOW_BRIDGE_INFO_DIALOG}; public static List SUPPORTED_TOP_LEVEL_CHAIN_IDS = Arrays.asList(BraveWalletConstants.MAINNET_CHAIN_ID, BraveWalletConstants.SOLANA_MAINNET, BraveWalletConstants.FILECOIN_MAINNET); - public static List BUY_SUPPORTED_ONRAMP_NETWORKS = Arrays.asList( - BraveWalletConstants.SOLANA_MAINNET, BraveWalletConstants.MAINNET_CHAIN_ID, - BraveWalletConstants.POLYGON_MAINNET_CHAIN_ID, - BraveWalletConstants.BINANCE_SMART_CHAIN_MAINNET_CHAIN_ID, - BraveWalletConstants.CELO_MAINNET_CHAIN_ID, - BraveWalletConstants.AVALANCHE_MAINNET_CHAIN_ID, - // BraveWalletConstants.FANTOM_MAINNET_CHAIN_ID, /* not yet supported */ - // BraveWalletConstants.AURORA_MAINNET_CHAIN_ID, /* not yet supported */ - BraveWalletConstants.FILECOIN_MAINNET, BraveWalletConstants.OPTIMISM_MAINNET_CHAIN_ID, - BraveWalletConstants.ARBITRUM_MAINNET_CHAIN_ID); - - public static List SWAP_SUPPORTED_NETWORKS = - Arrays.asList(BraveWalletConstants.MAINNET_CHAIN_ID, - BraveWalletConstants.GOERLI_CHAIN_ID, BraveWalletConstants.SOLANA_MAINNET); - // Solana public static final String SOL = "SOL"; public static final String SOL_LAMPORTS = "lamports"; @@ -141,6 +111,4 @@ public final class WalletConstants { TransactionType.ETH_SEND, TransactionType.ERC20_TRANSFER, TransactionType.SOLANA_SYSTEM_TRANSFER, TransactionType.SOLANA_SPL_TOKEN_TRANSFER, TransactionType.SOLANA_SPL_TOKEN_TRANSFER_WITH_ASSOCIATED_TOKEN_ACCOUNT_CREATION); - - public static final List UNSUPPORTED_NETWORKS = Collections.emptyList(); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletUtils.java index bcfeb0b88f6..5c0406e6210 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletUtils.java @@ -14,11 +14,7 @@ import androidx.annotation.Nullable; import org.chromium.base.Log; import org.chromium.brave_wallet.mojom.AccountId; import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.BlockchainToken; import org.chromium.brave_wallet.mojom.CoinType; -import org.chromium.brave_wallet.mojom.NetworkInfo; -import org.chromium.brave_wallet.mojom.SolanaTxData; -import org.chromium.brave_wallet.mojom.TxDataUnion; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.util.TabUtils; @@ -30,15 +26,12 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashSet; -import java.util.List; import java.util.Locale; import java.util.Set; import java.util.stream.Collectors; public class WalletUtils { private static final String ACCOUNT_INFO = "accountInfo"; - private static final String BLOCKCHAIN_TOKEN = "blockchainToken"; - private static final String NETWORK_INFO = "networkInfo"; private static final String TAG = "WalletUtils"; private static String getNewAccountPrefixForCoin(@CoinType.EnumType int coinType) { @@ -85,24 +78,6 @@ public class WalletUtils { return accountIdsEqual(left.accountId, right.accountId); } - public static int getSelectedAccountIndex( - AccountInfo accountInfo, List accountInfos) { - if (accountInfo == null || accountInfos.size() == 0) return -1; - for (int i = 0; i < accountInfos.size(); i++) { - AccountInfo account = accountInfos.get(i); - if (accountIdsEqual(account, accountInfo)) { - return i; - } - } - return 0; - } - - public static TxDataUnion toTxDataUnion(SolanaTxData solanaTxData) { - TxDataUnion txDataUnion = new TxDataUnion(); - txDataUnion.setSolanaTxData(solanaTxData); - return txDataUnion; - } - public static void addAccountInfoToIntent( @NonNull final Intent intent, @NonNull final AccountInfo accountInfo) { ByteBuffer bb = accountInfo.serialize(); @@ -121,42 +96,6 @@ public class WalletUtils { return AccountInfo.deserialize(ByteBuffer.wrap(bytes)); } - public static void addBlockchainTokenToIntent( - @NonNull final Intent intent, @NonNull final BlockchainToken blockchainToken) { - ByteBuffer bb = blockchainToken.serialize(); - byte[] bytes = new byte[bb.remaining()]; - bb.get(bytes); - - intent.putExtra(BLOCKCHAIN_TOKEN, bytes); - } - - @Nullable - public static BlockchainToken getBlockchainTokenFromIntent(@NonNull final Intent intent) { - byte[] bytes = intent.getByteArrayExtra(BLOCKCHAIN_TOKEN); - if (bytes == null) { - return null; - } - return BlockchainToken.deserialize(ByteBuffer.wrap(bytes)); - } - - public static void addNetworkInfoToIntent( - @NonNull final Intent intent, @NonNull final NetworkInfo networkInfo) { - ByteBuffer bb = networkInfo.serialize(); - byte[] bytes = new byte[bb.remaining()]; - bb.get(bytes); - - intent.putExtra(NETWORK_INFO, bytes); - } - - @Nullable - public static NetworkInfo getNetworkInfoFromIntent(@NonNull final Intent intent) { - byte[] bytes = intent.getByteArrayExtra(NETWORK_INFO); - if (bytes == null) { - return null; - } - return NetworkInfo.deserialize(ByteBuffer.wrap(bytes)); - } - public static void openWebWallet() { try { BraveActivity activity = BraveActivity.getBraveActivity(); diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/web_ui/WebUiActivityType.java b/android/java/org/chromium/chrome/browser/crypto_wallet/web_ui/WebUiActivityType.java deleted file mode 100644 index f5a0d973480..00000000000 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/web_ui/WebUiActivityType.java +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2023 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 https://mozilla.org/MPL/2.0/. */ - -package org.chromium.chrome.browser.crypto_wallet.web_ui; - -import android.app.Activity; - -import org.chromium.chrome.browser.crypto_wallet.util.Utils; - -/** - * Type of WebUi Activity. - * @see Utils#openBuySendSwapActivity(Activity, WebUiActivityType). - */ -public enum WebUiActivityType { BUY, SEND, SWAP } diff --git a/android/java/res/color-night/wallet_selector_icon.xml b/android/java/res/color-night/wallet_selector_icon.xml deleted file mode 100644 index 039f04c28bd..00000000000 --- a/android/java/res/color-night/wallet_selector_icon.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/android/java/res/color-night/wallet_selector_text.xml b/android/java/res/color-night/wallet_selector_text.xml deleted file mode 100644 index cf957316767..00000000000 --- a/android/java/res/color-night/wallet_selector_text.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/android/java/res/color/crypto_wallet_radiobutton_color_selector.xml b/android/java/res/color/crypto_wallet_radiobutton_color_selector.xml deleted file mode 100644 index d1c0df35d69..00000000000 --- a/android/java/res/color/crypto_wallet_radiobutton_color_selector.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/android/java/res/color/wallet_selector_icon.xml b/android/java/res/color/wallet_selector_icon.xml deleted file mode 100644 index e0be5b4f278..00000000000 --- a/android/java/res/color/wallet_selector_icon.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/android/java/res/color/wallet_selector_text.xml b/android/java/res/color/wallet_selector_text.xml deleted file mode 100644 index 21914ca31f1..00000000000 --- a/android/java/res/color/wallet_selector_text.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/android/java/res/drawable-nodpi/fee_icon.png b/android/java/res/drawable-nodpi/fee_icon.png deleted file mode 100644 index 6b71258af40eb2e501c1340d95bd0f6e14730c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 zcmVTM+qP}nwr$(y_dA=O?a3xpk}h-3 zytcvI`{mAjgZoT(`9X#qY+yRUVWu6NYr4Vh`u?!wWyx!j52NqTnNIkSVf)wW^EBPN zm*My;S=Df%N~JPJPbcnq-YBNyJDSunlIJDA<|IE@PH>0igu9v5aQ?yon5H?Z0BoZH zKVaaZMS$+N+~tSn3c~Wd$)x-d2I#T;VmQIUn!@n;tcD%j)ndR;B@al>*1fyqFP0sw zZn%M`w`!DZe~4-O70dB``NlfBZ!;#S&nxg7$@eYvZ=4xKsTM4dtUSDp30bx`ch)zC zqhm&<>+dI>uP2Q6LJq4DE|;MAYO}WDR7LnA3@BfGCpO;CnH6IWDa-wnm=!WHO;(=1ClJ?%Qv1Sju0y}xeH{1C+qz2Vxcqjd6CZD zDDd~{t-qP9qj(^_mx6(OrMLW1!4rSIcpz@@)PMm4Mlzgmu*_o*ox4fr-pUfupp=BQ+FlQ09dy%C=$%O#v zbG{`rkO7`I7QxM^En$a}>60G?*3 z%7P|2)Jl^RQFYV)a>UCcC11D6G(W;r(VIKQa>ES)-U1*dI-Tx+J98WhBCM826O!hh-~?k^nt>Ukb8)dD}H39P;l$|+_FxiA_3zU)8}?9a0O!{O^#{g62WAXiEPLcZ3n9$v2D_&X&7Nf+$@Qi>z;AMyL* zObF9T0tso*h=6J}xqi{_c9?E_^6dg)48}65-mKL3%tQCT#53tYvN`*gS@hI_&{D#u zC}qjtI-=j)X*B~7x*?6{GXaU{?}>sY{eev6MBaE35CURuKwt!v4y}e$)a{a@h6Y>* zCiJ7^MaeaiLk&Avm$p!y1u4E#fK1n<2>VzJdynqfhy1HeAk8})P-#7BB;9}n>Pe&H zIO8>Yz8R2u(pa{`CD6wh=q!2O1abP!3?%!J3?%x6!p z#B0ANasJIwjdC_%#r>!1_k}dq$ZDf9;QLPLH=^KSWEL{N)9Vd8$z#p*v1jtPiX(>Y zm%4cVQ3xUl$QwmYI!aQ%N(qSjccP0dfV7Bb6IqKUm~Ps%p-%px+lfbU;U-D}I_daM z8f#%zZRq4h9}zFg+M-_urwrD0ljM;Chlxe|701(L<2&_-O69e1a0X(@JEdO=Etm~` z2#p540zs=MUd)m5=K639kA`{{rcZCZb9Wcpj`+OGU#0MyvJt_W|- zYqf`$!h;f{Zt?Pf>3I|9YrE`cu;tYg0RB5LAMKyQ7=_e1D(-KMr3G2#Y4{&AERIal z9d&ftLiB)%8{|~@isZqlsrRzv!)UklrKp*9D{WEC6<=b@fhOQ^{~!Oc<2OQ&e7;zv R;G+Nl002ovPDHLkV1oO#{)PYm diff --git a/android/java/res/drawable/chip_outline_selected.xml b/android/java/res/drawable/chip_outline_selected.xml deleted file mode 100644 index 978b285f28d..00000000000 --- a/android/java/res/drawable/chip_outline_selected.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/android/java/res/drawable/circle_shimmer.xml b/android/java/res/drawable/circle_shimmer.xml deleted file mode 100644 index a18ffe270ee..00000000000 --- a/android/java/res/drawable/circle_shimmer.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/android/java/res/drawable/crypto_wallet_negative_button.xml b/android/java/res/drawable/crypto_wallet_negative_button.xml deleted file mode 100644 index 4b00a289ebc..00000000000 --- a/android/java/res/drawable/crypto_wallet_negative_button.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/drawable/empty_assets.xml b/android/java/res/drawable/empty_assets.xml deleted file mode 100644 index 4a3b2529fb2..00000000000 --- a/android/java/res/drawable/empty_assets.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/drawable/ic_accounts.xml b/android/java/res/drawable/ic_accounts.xml deleted file mode 100644 index ef3ce971b67..00000000000 --- a/android/java/res/drawable/ic_accounts.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/android/java/res/drawable/ic_activity.xml b/android/java/res/drawable/ic_activity.xml deleted file mode 100644 index 977f31a2dcd..00000000000 --- a/android/java/res/drawable/ic_activity.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/android/java/res/drawable/ic_baseline_more_vert_24.xml b/android/java/res/drawable/ic_baseline_more_vert_24.xml deleted file mode 100644 index cae90b51d44..00000000000 --- a/android/java/res/drawable/ic_baseline_more_vert_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_bear_arrow.xml b/android/java/res/drawable/ic_bear_arrow.xml deleted file mode 100644 index 3c13ca567a1..00000000000 --- a/android/java/res/drawable/ic_bear_arrow.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/android/java/res/drawable/ic_bull_arrow.xml b/android/java/res/drawable/ic_bull_arrow.xml deleted file mode 100644 index add49f1ea60..00000000000 --- a/android/java/res/drawable/ic_bull_arrow.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/android/java/res/drawable/ic_down_icon.xml b/android/java/res/drawable/ic_down_icon.xml deleted file mode 100644 index dc29b981a9f..00000000000 --- a/android/java/res/drawable/ic_down_icon.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_edit.xml b/android/java/res/drawable/ic_edit.xml deleted file mode 100644 index 4a2c40f4bb1..00000000000 --- a/android/java/res/drawable/ic_edit.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_explore.xml b/android/java/res/drawable/ic_explore.xml deleted file mode 100644 index 5bce02b1535..00000000000 --- a/android/java/res/drawable/ic_explore.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/android/java/res/drawable/ic_globe_connect_icon.xml b/android/java/res/drawable/ic_globe_connect_icon.xml deleted file mode 100644 index 42642fb1187..00000000000 --- a/android/java/res/drawable/ic_globe_connect_icon.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_pending_tx_notification_bg.xml b/android/java/res/drawable/ic_pending_tx_notification_bg.xml deleted file mode 100644 index 6f5a4a4da4a..00000000000 --- a/android/java/res/drawable/ic_pending_tx_notification_bg.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_pending_tx_notification_icon.xml b/android/java/res/drawable/ic_pending_tx_notification_icon.xml deleted file mode 100644 index 8fe046d54e6..00000000000 --- a/android/java/res/drawable/ic_pending_tx_notification_icon.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_portfolio.xml b/android/java/res/drawable/ic_portfolio.xml deleted file mode 100644 index 85bd135537a..00000000000 --- a/android/java/res/drawable/ic_portfolio.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/android/java/res/drawable/ic_safe.xml b/android/java/res/drawable/ic_safe.xml deleted file mode 100644 index c75a582667a..00000000000 --- a/android/java/res/drawable/ic_safe.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_swap_bg.xml b/android/java/res/drawable/ic_swap_bg.xml deleted file mode 100644 index 1e9afe031d5..00000000000 --- a/android/java/res/drawable/ic_swap_bg.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - diff --git a/android/java/res/drawable/ic_swap_icon.xml b/android/java/res/drawable/ic_swap_icon.xml deleted file mode 100644 index 420f2de36e3..00000000000 --- a/android/java/res/drawable/ic_swap_icon.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_up_icon.xml b/android/java/res/drawable/ic_up_icon.xml deleted file mode 100644 index dbcf68abc7e..00000000000 --- a/android/java/res/drawable/ic_up_icon.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android/java/res/drawable/ic_wallet_filters.xml b/android/java/res/drawable/ic_wallet_filters.xml deleted file mode 100644 index 0defe46e3e7..00000000000 --- a/android/java/res/drawable/ic_wallet_filters.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/android/java/res/drawable/rounded_white_holo_bg.xml b/android/java/res/drawable/rounded_white_holo_bg.xml deleted file mode 100644 index 2d3eb85afe6..00000000000 --- a/android/java/res/drawable/rounded_white_holo_bg.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/java/res/drawable/wallet_chip_outline.xml b/android/java/res/drawable/wallet_chip_outline.xml deleted file mode 100644 index 3d82ec7e24b..00000000000 --- a/android/java/res/drawable/wallet_chip_outline.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/android/java/res/drawable/wallet_radio_button_normal.xml b/android/java/res/drawable/wallet_radio_button_normal.xml deleted file mode 100644 index 62140479cf6..00000000000 --- a/android/java/res/drawable/wallet_radio_button_normal.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/java/res/drawable/wallet_radio_button_selected.xml b/android/java/res/drawable/wallet_radio_button_selected.xml deleted file mode 100644 index ea5ed7a8b7e..00000000000 --- a/android/java/res/drawable/wallet_radio_button_selected.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/java/res/drawable/wallet_radio_button_selector.xml b/android/java/res/drawable/wallet_radio_button_selector.xml deleted file mode 100644 index 441f2000b2f..00000000000 --- a/android/java/res/drawable/wallet_radio_button_selector.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/java/res/layout/activity_account_detail.xml b/android/java/res/layout/activity_account_detail.xml deleted file mode 100644 index 98b34be4725..00000000000 --- a/android/java/res/layout/activity_account_detail.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/activity_account_details_with_qr.xml b/android/java/res/layout/activity_account_details_with_qr.xml deleted file mode 100644 index ed144ebc571..00000000000 --- a/android/java/res/layout/activity_account_details_with_qr.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/java/res/layout/activity_account_private_key.xml b/android/java/res/layout/activity_account_private_key.xml deleted file mode 100644 index 9f6e4ad8c1c..00000000000 --- a/android/java/res/layout/activity_account_private_key.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/activity_add_asset.xml b/android/java/res/layout/activity_add_asset.xml deleted file mode 100644 index 875170c6ce6..00000000000 --- a/android/java/res/layout/activity_add_asset.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/activity_asset_detail.xml b/android/java/res/layout/activity_asset_detail.xml deleted file mode 100644 index 19681885d94..00000000000 --- a/android/java/res/layout/activity_asset_detail.xml +++ /dev/null @@ -1,460 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/activity_brave_wallet.xml b/android/java/res/layout/activity_brave_wallet.xml index c448d9b15ef..2ec1cab3746 100644 --- a/android/java/res/layout/activity_brave_wallet.xml +++ b/android/java/res/layout/activity_brave_wallet.xml @@ -12,111 +12,6 @@ android:background="@color/wallet_bg" tools:context=".BraveWalletActivity"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/brave_wallet_divider.xml b/android/java/res/layout/brave_wallet_divider.xml deleted file mode 100644 index cf3cd907dc3..00000000000 --- a/android/java/res/layout/brave_wallet_divider.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/android/java/res/layout/dialog_alert_template.xml b/android/java/res/layout/dialog_alert_template.xml deleted file mode 100644 index 72b78da23e2..00000000000 --- a/android/java/res/layout/dialog_alert_template.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - diff --git a/android/java/res/layout/dialog_aurora_bridge.xml b/android/java/res/layout/dialog_aurora_bridge.xml deleted file mode 100644 index c32d3086453..00000000000 --- a/android/java/res/layout/dialog_aurora_bridge.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/java/res/layout/edit_visible_assets_bottom_sheet.xml b/android/java/res/layout/edit_visible_assets_bottom_sheet.xml deleted file mode 100644 index da99e8de76c..00000000000 --- a/android/java/res/layout/edit_visible_assets_bottom_sheet.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_accounts.xml b/android/java/res/layout/fragment_accounts.xml deleted file mode 100644 index 0ec735726e2..00000000000 --- a/android/java/res/layout/fragment_accounts.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_assets.xml b/android/java/res/layout/fragment_assets.xml deleted file mode 100644 index 24bd63b32f5..00000000000 --- a/android/java/res/layout/fragment_assets.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_market.xml b/android/java/res/layout/fragment_market.xml deleted file mode 100644 index bc3756d5eb4..00000000000 --- a/android/java/res/layout/fragment_market.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_nft_grid.xml b/android/java/res/layout/fragment_nft_grid.xml deleted file mode 100644 index 939f6bc1774..00000000000 --- a/android/java/res/layout/fragment_nft_grid.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_portfolio.xml b/android/java/res/layout/fragment_portfolio.xml deleted file mode 100644 index 07d518e435b..00000000000 --- a/android/java/res/layout/fragment_portfolio.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - diff --git a/android/java/res/layout/fragment_transactions.xml b/android/java/res/layout/fragment_transactions.xml deleted file mode 100644 index 3d4b7d57038..00000000000 --- a/android/java/res/layout/fragment_transactions.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/market_coin_list_item.xml b/android/java/res/layout/market_coin_list_item.xml deleted file mode 100644 index 84243a4145d..00000000000 --- a/android/java/res/layout/market_coin_list_item.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/market_coin_shimmer_item.xml b/android/java/res/layout/market_coin_shimmer_item.xml deleted file mode 100644 index 2e43e1fd36a..00000000000 --- a/android/java/res/layout/market_coin_shimmer_item.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/shimmer_skeleton_item.xml b/android/java/res/layout/shimmer_skeleton_item.xml deleted file mode 100644 index 24326737a7d..00000000000 --- a/android/java/res/layout/shimmer_skeleton_item.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - diff --git a/android/java/res/layout/swap_bottom_sheet.xml b/android/java/res/layout/swap_bottom_sheet.xml deleted file mode 100644 index 39c58fb6d02..00000000000 --- a/android/java/res/layout/swap_bottom_sheet.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/wallet_coin_list_item.xml b/android/java/res/layout/view_holder_account_selector.xml similarity index 71% rename from android/java/res/layout/wallet_coin_list_item.xml rename to android/java/res/layout/view_holder_account_selector.xml index 9325ae546f5..fe9e3de0aff 100644 --- a/android/java/res/layout/wallet_coin_list_item.xml +++ b/android/java/res/layout/view_holder_account_selector.xml @@ -7,7 +7,8 @@ android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" - android:orientation="horizontal"> + android:orientation="horizontal" + android:baselineAligned="false"> - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/layout/wallet_nft_item.xml b/android/java/res/layout/wallet_nft_item.xml deleted file mode 100644 index df079456660..00000000000 --- a/android/java/res/layout/wallet_nft_item.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/java/res/menu/wallet_bottom_navigation_items.xml b/android/java/res/menu/wallet_bottom_navigation_items.xml deleted file mode 100644 index 3f2fa3e7aab..00000000000 --- a/android/java/res/menu/wallet_bottom_navigation_items.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/android/java/res/values-night/brave_colors.xml b/android/java/res/values-night/brave_colors.xml index 296975190aa..22ce8d17e59 100644 --- a/android/java/res/values-night/brave_colors.xml +++ b/android/java/res/values-night/brave_colors.xml @@ -47,7 +47,6 @@ #453e2d #1F1F27 #0D1214 - #21242A #7C91FF @@ -136,7 +135,6 @@ #C2C4CF #1E2029 #000000 - #0D0F14 #0D0F14 #3B3E4F #3B3E4F @@ -144,7 +142,6 @@ #33E32444 #FF4B6A #FF460A10 - #66687485 #17171F #FFFFFF diff --git a/android/java/res/values/brave_colors.xml b/android/java/res/values/brave_colors.xml index 56d0d0c9849..f110e90e5a8 100644 --- a/android/java/res/values/brave_colors.xml +++ b/android/java/res/values/brave_colors.xml @@ -35,9 +35,6 @@ #F0F2FF #FFFFFF #FFFFFF - #FF2AC194 - #FFEE6374 - #EDEEF1 #3F39E8 @color/brave_wallet_dn_button_color @@ -228,19 +225,14 @@ #495057 #F8F9FA #F6F7F8 - #F8F9FA #FF4081 #FFFFFF #AEB1C2 #FFFFFF #868E96 #4C54D2 - #51CF66 - #CF5159 - #12A378 #33E32444 #FF4B6A - #66A1ABBA #FFF1F1 diff --git a/android/java/res/values/brave_styles.xml b/android/java/res/values/brave_styles.xml index 0195ce52f27..179c5e35e0e 100644 --- a/android/java/res/values/brave_styles.xml +++ b/android/java/res/values/brave_styles.xml @@ -46,18 +46,6 @@ - - - -