Skip to content

Commit

Permalink
Merge pull request #15798 from brave/pr15593_feat-solana-dapps-tx_1.46.x
Browse files Browse the repository at this point in the history
feat(wallet): implement solana dapps send tx (uplift to 1.46.x)
  • Loading branch information
kjozwiak committed Nov 4, 2022
2 parents 7b64ea5 + 1197d6a commit 49c2fc0
Show file tree
Hide file tree
Showing 28 changed files with 783 additions and 238 deletions.
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

0 comments on commit 49c2fc0

Please sign in to comment.