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 super Drawable> 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 6b71258af40..00000000000
Binary files a/android/java/res/drawable-nodpi/fee_icon.png and /dev/null differ
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 @@
-
-
-
-