Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(wallet): implement solana dapps send tx (uplift to 1.46.x) #15798

Merged
merged 1 commit into from
Nov 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion android/brave_java_sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ brave_java_sources = [
"../../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/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/TwoLineItemFragment.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/TxDetailsFragment.java",
Expand Down Expand Up @@ -135,14 +136,15 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/modal/DAppsDialog.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/SolanaInstructionPresenter.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/model/TxNonSwipeableViewPager.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/KeyringServiceObserverImpl.java",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/observers/TxServiceObserverImpl.java",
"../../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/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",
"../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/AndroidUtils.java",
Expand Down
2 changes: 1 addition & 1 deletion android/java/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
tools:ignore="LockedOrientationActivity"/>

<activity android:name="org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletDAppsActivity"
android:theme="@style/Theme.Chromium.Activity"
android:theme="@style/BraveTranslucentMaterial"
android:screenOrientation="sensorPortrait"
tools:ignore="LockedOrientationActivity"/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import android.content.Intent;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
Expand Down Expand Up @@ -84,6 +86,9 @@ public int getValue() {

@Override
protected void triggerLayoutInflation() {
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_brave_wallet_dapps);
Intent intent = getIntent();
mActivityType = ActivityType.valueOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package org.chromium.chrome.browser.crypto_wallet.adapters;

import android.app.Activity;
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand All @@ -18,8 +19,10 @@
import org.chromium.brave_wallet.mojom.NetworkInfo;
import org.chromium.brave_wallet.mojom.TransactionInfo;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.fragments.SolanaTxDetailsFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.TxDetailsFragment;
import org.chromium.chrome.browser.crypto_wallet.fragments.TxFragment;
import org.chromium.chrome.browser.crypto_wallet.util.TransactionUtils;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -37,6 +40,8 @@ public class ApproveTxFragmentPageAdapter extends FragmentStatePagerAdapter {
private HashMap<String, HashMap<String, Double>> mBlockchainTokensBalances;
private boolean mUpdateTxObjectManually;
private long mSolanaEstimatedTxFee;
private Context mContext;
private Fragment mDetailsFragment;

public ApproveTxFragmentPageAdapter(FragmentManager fm, TransactionInfo txInfo,
NetworkInfo selectedNetwork, AccountInfo[] accounts,
Expand All @@ -52,6 +57,7 @@ public ApproveTxFragmentPageAdapter(FragmentManager fm, TransactionInfo txInfo,
mFullTokenList = fullTokenList;
mNativeAssetsBalances = nativeAssetsBalances;
mBlockchainTokensBalances = blockchainTokensBalances;
mContext = activity;
mTitles = new ArrayList<>(Arrays.asList(activity.getText(R.string.transaction).toString(),
activity.getText(R.string.transaction_details).toString()));
mUpdateTxObjectManually = updateTxObjectManually;
Expand All @@ -66,10 +72,23 @@ public Fragment getItem(int position) {
mFullTokenList, mNativeAssetsBalances, mBlockchainTokensBalances,
mUpdateTxObjectManually, mSolanaEstimatedTxFee);
} else {
return TxDetailsFragment.newInstance(mTxInfo);
if (mDetailsFragment == null) {
if (TransactionUtils.isSolanaTx(mTxInfo)) {
mDetailsFragment = SolanaTxDetailsFragment.newInstance(mTxInfo, mContext);
} else {
mDetailsFragment = TxDetailsFragment.newInstance(mTxInfo);
}
}
return mDetailsFragment;
}
}

@Override
public void notifyDataSetChanged() {
mDetailsFragment = null;
super.notifyDataSetChanged();
}

@Override
public int getCount() {
return mTitles.size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ public TwoLineItemText(String title, String subTitle) {
this.subTitle = subTitle;
}

public TwoLineItemText(String title) {
this.title = title;
}

public String getTitle() {
return title;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.chromium.chrome.browser.crypto_wallet.adapters.ApproveTxFragmentPageAdapter;
import org.chromium.chrome.browser.crypto_wallet.listeners.TransactionConfirmationListener;
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.ParsedTransaction;
import org.chromium.chrome.browser.crypto_wallet.util.SolanaTransactionsGasHelper;
import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils;
Expand Down Expand Up @@ -356,27 +357,40 @@ private ParsedTransaction fillAssetDependentControls(View view, NetworkInfo sele
getResources().getString(R.string.activate_erc20), parsedTx.getSymbol()));
} else if (parsedTx.getIsSwap()) {
txType.setText(getResources().getString(R.string.swap));
} else if (parsedTx.isSolanaDappTransaction) {
txType.setText(R.string.brave_wallet_approve_transaction);
} else {
txType.setText(getResources().getString(R.string.send));
}

String amountText =
String.format(getResources().getString(R.string.crypto_wallet_amount_asset),
parsedTx.formatValueToDisplay(), parsedTx.getSymbol());
TextView fromTo = view.findViewById(R.id.from_to);
fromTo.setText(String.format(getResources().getString(R.string.crypto_wallet_from_to),
mAccountName, parsedTx.getSender(), parsedTx.getRecipient()));
TextView amountAsset = view.findViewById(R.id.amount_asset);
TextView amountFiat = view.findViewById(R.id.amount_fiat);
amountFiat.setText(
String.format(getResources().getString(R.string.crypto_wallet_amount_fiat),
String.format(Locale.getDefault(), "%.2f", parsedTx.getFiatTotal())));
if (mTxInfo.txType == TransactionType.ERC721_TRANSFER_FROM
|| mTxInfo.txType == TransactionType.ERC721_SAFE_TRANSFER_FROM) {
amountText = Utils.tokenToString(parsedTx.getErc721BlockchainToken());
amountFiat.setVisibility(View.GONE); // Display NFT values in the future
TextView amountAsset = view.findViewById(R.id.amount_asset);
if (parsedTx.isSolanaDappTransaction) {
AndroidUtils.gone(amountFiat, amountAsset);
} else {
amountFiat.setText(
String.format(getResources().getString(R.string.crypto_wallet_amount_fiat),
String.format(Locale.getDefault(), "%.2f", parsedTx.getFiatTotal())));
String amountText =
String.format(getResources().getString(R.string.crypto_wallet_amount_asset),
parsedTx.formatValueToDisplay(), parsedTx.getSymbol());

if (mTxInfo.txType == TransactionType.ERC721_TRANSFER_FROM
|| mTxInfo.txType == TransactionType.ERC721_SAFE_TRANSFER_FROM) {
amountText = Utils.tokenToString(parsedTx.getErc721BlockchainToken());
amountFiat.setVisibility(View.GONE); // Display NFT values in the future
}
amountAsset.setText(amountText);
}

TextView fromTo = view.findViewById(R.id.from_to);
if (parsedTx.getSender() != null && !parsedTx.getSender().equals(parsedTx.getRecipient())) {
fromTo.setText(String.format(getResources().getString(R.string.crypto_wallet_from_to),
mAccountName, parsedTx.getSender(), "->", parsedTx.getRecipient()));
} else {
fromTo.setText(String.format(getResources().getString(R.string.crypto_wallet_from_to),
mAccountName, parsedTx.getSender(), "", ""));
}
amountAsset.setText(amountText);
setupPager(view, selectedNetwork, accounts, assetPrices, fullTokenList,
nativeAssetsBalances, blockchainTokensBalances);
return parsedTx;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* 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 http://mozilla.org/MPL/2.0/. */

package org.chromium.chrome.browser.crypto_wallet.fragments;

import android.content.Context;

import androidx.fragment.app.Fragment;

import org.chromium.brave_wallet.mojom.SolanaInstruction;
import org.chromium.brave_wallet.mojom.TransactionInfo;
import org.chromium.chrome.browser.crypto_wallet.adapters.TwoLineItemRecyclerViewAdapter;
import org.chromium.chrome.browser.crypto_wallet.presenters.SolanaInstructionPresenter;
import org.chromium.chrome.browser.crypto_wallet.util.TransactionUtils;

import java.util.ArrayList;
import java.util.List;

public class SolanaTxDetailsFragment {
public static Fragment newInstance(TransactionInfo txInfo, Context context) {
List<TwoLineItemRecyclerViewAdapter.TwoLineItem> details = new ArrayList<>();
SolanaInstruction[] instructions =
TransactionUtils.safeSolData(txInfo.txDataUnion).instructions;
details.add(new TwoLineItemRecyclerViewAdapter.TwoLineItemText(
context.getString(TransactionUtils.getTxType(txInfo))));

for (SolanaInstruction solanaInstruction : instructions) {
SolanaInstructionPresenter solanaInstructionPresenter =
new SolanaInstructionPresenter(solanaInstruction);
details.addAll(solanaInstructionPresenter.toTwoLineList(context));
if (instructions.length > 1) {
details.add(new TwoLineItemRecyclerViewAdapter.TwoLineItemDivider());
}
}
return new TwoLineItemFragment(details);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

Expand Down Expand Up @@ -37,13 +38,32 @@ public static TwoLineItemFragment newInstance(List<TwoLineItem> items) {
return fragment;
}

@SuppressLint("ClickableViewAccessibility")
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_two_line_item_list, container, false);
RecyclerView recyclerView = (RecyclerView) view;
adapter = new TwoLineItemRecyclerViewAdapter(items);
recyclerView.setAdapter(adapter);
recyclerView.setOnTouchListener((v, event) -> {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow NestedScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;

case MotionEvent.ACTION_UP:
// Allow NestedScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}

// Handle RecyclerView touch events.
v.onTouchEvent(event);
return true;
});
return view;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.chromium.brave_wallet.mojom.TxData1559;
import org.chromium.brave_wallet.mojom.TxDataUnion;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.util.TransactionUtils;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;

public class TxDetailsFragment extends Fragment {
Expand Down Expand Up @@ -59,35 +60,7 @@ public void setupView(View view) {
return;
}
assert mTxInfo.txParams.length == mTxInfo.txArgs.length;
String functionType = getResources().getString(R.string.wallet_details_function_type_other);
switch (mTxInfo.txType) {
case TransactionType.ERC20_TRANSFER:
functionType = getResources().getString(
R.string.wallet_details_function_type_erc20transfer);
break;
case TransactionType.ERC20_APPROVE:
functionType = getResources().getString(
R.string.wallet_details_function_type_erc20approve);
break;
case TransactionType.ERC721_TRANSFER_FROM:
functionType = getResources().getString(
R.string.wallet_details_function_type_erc721transfer);
break;
case TransactionType.SOLANA_SYSTEM_TRANSFER:
functionType = getResources().getString(
R.string.wallet_details_function_type_solana_system_transfer);
break;
case TransactionType.SOLANA_SPL_TOKEN_TRANSFER:
functionType = getResources().getString(
R.string.wallet_details_function_type_spl_token_transfer);
break;
case TransactionType.SOLANA_SPL_TOKEN_TRANSFER_WITH_ASSOCIATED_TOKEN_ACCOUNT_CREATION:
functionType = getResources().getString(
R.string.wallet_details_function_type_solana_spl_token_transfer_with_associated_token_account_creation);
break;
default:
break;
}
String functionType = getString(TransactionUtils.getTxType(mTxInfo));

TextView functionTypeWidget = view.findViewById(R.id.function_type);
functionTypeWidget.setText(String.format(
Expand Down