diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index 2ffc5a0e211..75e5b3590d6 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -1326,6 +1326,10 @@ public abstract class BraveActivity extends C openBraveWalletDAppsActivity( BraveWalletDAppsActivity.ActivityType.CONFIRM_TRANSACTION); } + // update badge if there's a pending tx + if (transactionInfo != null && keyringInfo != null && !keyringInfo.isLocked) { + updateWalletBadgeVisibility(); + } }); mWalletModel.getDappsModel().mWalletIconNotificationVisible.observe( this, visible -> { setWalletBadgeVisibility(visible); }); diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index eaec9305c38..6d4b5440cd8 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -210,7 +210,8 @@ public class CryptoModel { WalletUtils.getAccountInfosFromKeyrings(keyringInfos); new SelectedAccountResponsesCollector(mKeyringService, coins, accountInfos) .getAccounts(defaultAccountPerCoin -> { - mPendingTxHelper.setAccountInfos(accountInfos); + mPendingTxHelper.setAccountInfos( + new ArrayList<>(defaultAccountPerCoin)); }); }); } diff --git a/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java b/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java index a8f71e243fd..e4d19629107 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java @@ -5,7 +5,6 @@ package org.chromium.chrome.browser.app.domain; -import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; @@ -28,11 +27,11 @@ import org.chromium.mojo.system.MojoException; import org.chromium.mojo.system.Pair; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Set; public class KeyringModel implements KeyringServiceObserver { private KeyringService mKeyringService; @@ -90,6 +89,28 @@ public class KeyringModel implements KeyringServiceObserver { } } + public void getDefaultAccountPerCoin( + Callbacks.Callback1> defaultAccountPerCoins) { + synchronized (mLock) { + if (mKeyringService == null) { + return; + } + List coins = new ArrayList<>(); + for (CryptoAccountTypeInfo cryptoAccountTypeInfo : + mSharedData.getSupportedCryptoAccountTypes()) { + coins.add(cryptoAccountTypeInfo.getCoinType()); + } + mKeyringService.getKeyringsInfo(mSharedData.getEnabledKeyrings(), keyringInfos -> { + List accountInfos = + WalletUtils.getAccountInfosFromKeyrings(keyringInfos); + new SelectedAccountResponsesCollector(mKeyringService, coins, accountInfos) + .getAccounts(defaultAccountPerCoin -> { + defaultAccountPerCoins.call(defaultAccountPerCoin); + }); + }); + } + } + private void update(int coinType) { synchronized (mLock) { if (mKeyringService == null) { @@ -113,7 +134,9 @@ public class KeyringModel implements KeyringServiceObserver { } _mSelectedAccount.postValue(selectedAccountInfo); } else if (accountInfos.size() > 0) { - _mSelectedAccount.postValue(accountInfos.get(0)); + AccountInfo accountInfo = accountInfos.get(0); + _mSelectedAccount.postValue(accountInfo); + setSelectedAccount(accountInfo.address, accountInfo.coin); } }); }); 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 ece5ce09661..4038bfca108 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java @@ -59,7 +59,7 @@ public class WalletModel { mDappsModel = new DappsModel( mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); mKeyringModel = new KeyringModel( - keyringService, mCryptoModel.getSharedData(), braveWalletService, mCryptoActions); + mKeyringService, mCryptoModel.getSharedData(), mBraveWalletService, mCryptoActions); // be careful with dependencies, must avoid cycles mCryptoModel.setAccountInfosFromKeyRingModel(mKeyringModel.mAccountInfos); init(); @@ -201,6 +201,8 @@ public class WalletModel { mKeyringModel.update(); // update network per selected coin mCryptoModel.getNetworkModel().init(); + // update transactions + mCryptoModel.refreshTransactions(); }); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletDAppsActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletDAppsActivity.java index 05ac13813c6..2bdc8b73d88 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletDAppsActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BraveWalletDAppsActivity.java @@ -19,6 +19,7 @@ import org.chromium.brave_wallet.mojom.CoinType; 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.WalletModel; import org.chromium.chrome.browser.crypto_wallet.fragments.ApproveTxBottomSheetDialogFragment; import org.chromium.chrome.browser.crypto_wallet.fragments.dapps.AddSwitchChainNetworkFragment; import org.chromium.chrome.browser.crypto_wallet.fragments.dapps.AddTokenFragment; @@ -27,8 +28,10 @@ import org.chromium.chrome.browser.crypto_wallet.fragments.dapps.EncryptionKeyFr import org.chromium.chrome.browser.crypto_wallet.fragments.dapps.SignMessageFragment; import org.chromium.chrome.browser.crypto_wallet.listeners.TransactionConfirmationListener; import org.chromium.chrome.browser.crypto_wallet.util.PendingTxHelper; +import org.chromium.chrome.browser.crypto_wallet.util.TransactionUtils; import java.util.HashMap; +import java.util.List; import java.util.Map; public class BraveWalletDAppsActivity extends BraveWalletBaseActivity @@ -39,6 +42,7 @@ public class BraveWalletDAppsActivity extends BraveWalletBaseActivity private ApproveTxBottomSheetDialogFragment approveTxBottomSheetDialogFragment; private PendingTxHelper mPendingTxHelper; private Fragment mFragment; + private WalletModel mWalletModel; public enum ActivityType { SIGN_MESSAGE(0), @@ -83,21 +87,21 @@ public class BraveWalletDAppsActivity extends BraveWalletBaseActivity intent.getIntExtra("activityType", ActivityType.ADD_ETHEREUM_CHAIN.getValue())); BraveActivity activity = BraveActivity.getBraveActivity(); if (activity != null) { - activity.getWalletModel().getCryptoModel().mProcessNextDAppsRequest.observe( - this, activityType -> { - if (activityType == null) return; - switch (activityType) { - case GET_ENCRYPTION_PUBLIC_KEY_REQUEST: - case DECRYPT_REQUEST: - processPendingDappsRequest(); - break; - case FINISH: - finish(); - break; - default: - break; - } - }); + mWalletModel = activity.getWalletModel(); + mWalletModel.getCryptoModel().mProcessNextDAppsRequest.observe(this, activityType -> { + if (activityType == null) return; + switch (activityType) { + case GET_ENCRYPTION_PUBLIC_KEY_REQUEST: + case DECRYPT_REQUEST: + processPendingDappsRequest(); + break; + case FINISH: + finish(); + break; + default: + break; + } + }); } onInitialLayoutInflationComplete(); } @@ -129,11 +133,13 @@ public class BraveWalletDAppsActivity extends BraveWalletBaseActivity @Override public void onRejectAllTransactions() { for (TransactionInfo transactionInfo : mPendingTxHelper.getPendingTransactions()) { - getTxService().rejectTransaction(CoinType.ETH, transactionInfo.id, success -> { - if (!success) { - Log.e(TAG, "Transaction failed " + transactionInfo.id); - } - }); + getTxService().rejectTransaction( + TransactionUtils.getCoinFromTxDataUnion(transactionInfo.txDataUnion), + transactionInfo.id, success -> { + if (!success) { + Log.e(TAG, "Transaction failed " + transactionInfo.id); + } + }); } mPendingTxHelper.destroy(); finish(); @@ -163,54 +169,48 @@ public class BraveWalletDAppsActivity extends BraveWalletBaseActivity } else if (mActivityType == ActivityType.ADD_TOKEN) { mFragment = new AddTokenFragment(); } else if (mActivityType == ActivityType.CONFIRM_TRANSACTION) { - getKeyringService().getKeyringInfo( - BraveWalletConstants.DEFAULT_KEYRING_ID, keyringInfo -> { - AccountInfo[] accountInfosTemp = keyringInfo.accountInfos; - if (accountInfosTemp == null) { - accountInfosTemp = new AccountInfo[] {}; + mWalletModel.getKeyringModel().getDefaultAccountPerCoin(defaultAccountPerCoin -> { + AccountInfo[] accountInfos = defaultAccountPerCoin.toArray(new AccountInfo[0]); + if (mPendingTxHelper != null) { + mPendingTxHelper.destroy(); + } + mPendingTxHelper = new PendingTxHelper(getTxService(), accountInfos, false, true); + mPendingTxHelper.mHasNoPendingTxAfterProcessing.observe(this, hasNoPendingTx -> { + if (hasNoPendingTx) { + finish(); + } + }); + final AccountInfo[] accounts = accountInfos; + mPendingTxHelper.mSelectedPendingRequest.observe(this, transactionInfo -> { + if (transactionInfo == null + || mPendingTxHelper.getPendingTransactions().size() == 0) { + return; + } + if (approveTxBottomSheetDialogFragment != null + && approveTxBottomSheetDialogFragment.isVisible()) { + // TODO: instead of dismiss, show the details of new Tx once + // onNextTransaction implementation is done + approveTxBottomSheetDialogFragment.dismiss(); + } + String accountName = ""; + for (AccountInfo accountInfo : accounts) { + if (accountInfo.address.equals(transactionInfo.fromAddress)) { + accountName = accountInfo.name; + break; } - if (mPendingTxHelper != null) { - mPendingTxHelper.destroy(); - } - mPendingTxHelper = - new PendingTxHelper(getTxService(), accountInfosTemp, false, true); - mPendingTxHelper.mHasNoPendingTxAfterProcessing.observe( - this, hasNoPendingTx -> { - if (hasNoPendingTx) { - finish(); - } - }); - final AccountInfo[] accounts = accountInfosTemp; - mPendingTxHelper.mSelectedPendingRequest.observe(this, transactionInfo -> { - if (transactionInfo == null - || mPendingTxHelper.getPendingTransactions().size() == 0) { - return; - } - if (approveTxBottomSheetDialogFragment != null - && approveTxBottomSheetDialogFragment.isVisible()) { - // TODO: instead of dismiss, show the details of new Tx once - // onNextTransaction implementation is done - approveTxBottomSheetDialogFragment.dismiss(); - } - String accountName = ""; - for (AccountInfo accountInfo : accounts) { - if (accountInfo.address.equals(transactionInfo.fromAddress)) { - accountName = accountInfo.name; - break; - } - } - approveTxBottomSheetDialogFragment = - ApproveTxBottomSheetDialogFragment.newInstance( - mPendingTxHelper.getPendingTransactions(), - transactionInfo, accountName, this); - approveTxBottomSheetDialogFragment.show(getSupportFragmentManager(), - ApproveTxBottomSheetDialogFragment.TAG_FRAGMENT); - mPendingTxHelper.mTransactionInfoLd.observe(this, transactionInfos -> { - approveTxBottomSheetDialogFragment.setTxList(transactionInfos); - }); - }); - mPendingTxHelper.fetchTransactions(() -> {}); + } + approveTxBottomSheetDialogFragment = + ApproveTxBottomSheetDialogFragment.newInstance( + mPendingTxHelper.getPendingTransactions(), transactionInfo, + accountName, this); + approveTxBottomSheetDialogFragment.show(getSupportFragmentManager(), + ApproveTxBottomSheetDialogFragment.TAG_FRAGMENT); + mPendingTxHelper.mTransactionInfoLd.observe(this, transactionInfos -> { + approveTxBottomSheetDialogFragment.setTxList(transactionInfos); }); + }); + mPendingTxHelper.fetchTransactions(() -> {}); + }); } else if (mActivityType == ActivityType.ADD_ETHEREUM_CHAIN || mActivityType == ActivityType.SWITCH_ETHEREUM_CHAIN) { mFragment = new AddSwitchChainNetworkFragment(mActivityType, this); 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 index 4f4c7a7958e..507e363d81f 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment.java @@ -465,15 +465,6 @@ public class PortfolioFragment return mCurrentPendingTx != null; } - private void getPendingTx(AccountInfo[] accountInfos, @Nullable Runnable callback) { - PendingTxHelper pendingTxHelper = new PendingTxHelper(getTxService(), accountInfos, false); - pendingTxHelper.fetchTransactions(() -> { - mPendingTxInfos = pendingTxHelper.getTransactions(); - pendingTxHelper.destroy(); - if (callback != null) callback.run(); - }); - } - private void updatePendingTxNotification() { Activity activity = getActivity(); if (activity instanceof BraveWalletActivity) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/PendingTxHelper.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/PendingTxHelper.java index 9a64ba8ac20..e47cea32f5b 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/PendingTxHelper.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/PendingTxHelper.java @@ -279,12 +279,9 @@ public class PendingTxHelper implements TxServiceObserverImplDelegate { } private void postTxUpdates() { - if (mTransactionInfos.size() > 0) { - _mSelectedPendingRequest.postValue(getFirstUnapprovedTx()); - } else { - _mSelectedPendingRequest.postValue(null); - _mHasNoPendingTxAfterProcessing.postValue(true); - } + TransactionInfo mFirstPendingInfo = getFirstUnapprovedTx(); + _mSelectedPendingRequest.postValue(mFirstPendingInfo); + _mHasNoPendingTxAfterProcessing.postValue(mFirstPendingInfo == null); } private void updatePending(List transactionInfos) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/SelectedAccountResponsesCollector.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/SelectedAccountResponsesCollector.java index ab6259b82c6..ce9a7c30f69 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/SelectedAccountResponsesCollector.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/SelectedAccountResponsesCollector.java @@ -43,8 +43,7 @@ public class SelectedAccountResponsesCollector { selectedAccountInfosPerCoinMultiResponse.singleResponseComplete, coin); accountsPermissionsContexts.add(accountContext); - if (CoinType.FIL == coin) { - } else { + if (CoinType.FIL != coin) { mKeyringService.getSelectedAccount(coin, accountContext); } } @@ -63,8 +62,9 @@ public class SelectedAccountResponsesCollector { break; } } - - mSelectedAccountsPerCoin.add(selectedAccountInfo); + if (selectedAccountInfo != null) { + mSelectedAccountsPerCoin.add(selectedAccountInfo); + } } runWhenDone.call(mSelectedAccountsPerCoin); });