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 da2807ff8de..26c7e807cb9 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java @@ -5,27 +5,36 @@ package org.chromium.chrome.browser.app.domain; +import androidx.annotation.UiThread; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import org.chromium.brave_wallet.mojom.AccountInfo; import org.chromium.brave_wallet.mojom.BraveWalletConstants; +import org.chromium.brave_wallet.mojom.BraveWalletService; import org.chromium.brave_wallet.mojom.KeyringInfo; import org.chromium.brave_wallet.mojom.KeyringService; import org.chromium.brave_wallet.mojom.KeyringServiceObserver; +import org.chromium.chrome.browser.crypto_wallet.util.AccountsPermissionsHelper; +import org.chromium.chrome.browser.crypto_wallet.util.Utils; import org.chromium.mojo.system.MojoException; +import java.util.HashSet; + public class KeyringModel implements KeyringServiceObserver { private KeyringService mKeyringService; + private BraveWalletService mBraveWalletService; private MutableLiveData _mKeyringInfoLiveData; public LiveData mKeyringInfoLiveData; private final MutableLiveData _mSelectedAccount; public LiveData mSelectedAccount; private CryptoSharedData mSharedData; - // Todo: create method to interact with keyring + private AccountsPermissionsHelper mAccountsPermissionsHelper; - public KeyringModel(KeyringService mKeyringService, CryptoSharedData sharedData) { - this.mKeyringService = mKeyringService; + public KeyringModel(KeyringService keyringService, CryptoSharedData sharedData, + BraveWalletService braveWalletService) { + mKeyringService = keyringService; + mBraveWalletService = braveWalletService; mSharedData = sharedData; _mKeyringInfoLiveData = new MutableLiveData<>(null); mKeyringInfoLiveData = _mKeyringInfoLiveData; @@ -40,22 +49,62 @@ public class KeyringModel implements KeyringServiceObserver { private void update() { mKeyringService.getKeyringInfo(BraveWalletConstants.DEFAULT_KEYRING_ID, keyringInfo -> { _mKeyringInfoLiveData.postValue(keyringInfo); - Integer coinType = mSharedData.getCoinType(); - mKeyringService.getSelectedAccount(coinType, accountAddress -> { - if (keyringInfo.accountInfos.length > 0) { - AccountInfo selectedAccount = keyringInfo.accountInfos[0]; + + mKeyringService.getSelectedAccount(mSharedData.getCoinType(), accountAddress -> { + if (accountAddress != null && !accountAddress.isEmpty()) { + AccountInfo selectedAccountInfo = null; for (AccountInfo accountInfo : keyringInfo.accountInfos) { if (accountInfo.address.equals(accountAddress)) { - selectedAccount = accountInfo; + selectedAccountInfo = accountInfo; break; } } - _mSelectedAccount.postValue(selectedAccount); + _mSelectedAccount.postValue(selectedAccountInfo); + } else if (keyringInfo.accountInfos.length > 0) { + _mSelectedAccount.postValue(keyringInfo.accountInfos[0]); } }); }); } + private void updateSelectedAccountPerOriginOrFirst(KeyringInfo keyringInfo) { + mAccountsPermissionsHelper = new AccountsPermissionsHelper( + mBraveWalletService, keyringInfo.accountInfos, Utils.getCurrentMojomOrigin()); + mAccountsPermissionsHelper.checkAccounts(() -> { + String selectedAccountAddress = null; + HashSet permissionAccounts = + mAccountsPermissionsHelper.getAccountsWithPermissions(); + if (!permissionAccounts.isEmpty()) { + selectedAccountAddress = permissionAccounts.iterator().next().address; + } else if (keyringInfo.accountInfos.length > 0) { + selectedAccountAddress = keyringInfo.accountInfos[0].address; + } + if (selectedAccountAddress != null) { + setSelectedAccount(selectedAccountAddress, mSharedData.getCoinType()); + } + }); + } + + /** + * Enforce to fetch and use the first permitted account if there is no selected account in + * Keyring service + * + * @return mSelectedAccount live data to get the selected account + */ + @UiThread + public LiveData getSelectedAccountOrAccountPerOrigin() { + _mSelectedAccount.setValue(null); + mKeyringService.getSelectedAccount(mSharedData.getCoinType(), accountAddress -> { + if (accountAddress == null) { + mKeyringService.getKeyringInfo(BraveWalletConstants.DEFAULT_KEYRING_ID, + keyringInfo -> { updateSelectedAccountPerOriginOrFirst(keyringInfo); }); + } else { + update(); + } + }); + return mSelectedAccount; + } + public void setSelectedAccount(String accountAddress, int coin) { mKeyringService.setSelectedAccount(accountAddress, coin, isAccountSelected -> {}); } @@ -64,11 +113,13 @@ public class KeyringModel implements KeyringServiceObserver { return _mKeyringInfoLiveData.getValue(); } - public void resetService(KeyringService keyringService) { - if (mKeyringService == keyringService) { - return; + public void resetService(KeyringService keyringService, BraveWalletService braveWalletService) { + if (mKeyringService != keyringService) { + mKeyringService = keyringService; + } + if (mBraveWalletService != braveWalletService) { + mBraveWalletService = braveWalletService; } - this.mKeyringService = keyringService; init(); } 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 66da952bcab..79db2aed698 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java @@ -45,7 +45,8 @@ public class WalletModel { mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); mDappsModel = new DappsModel(mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); - mKeyringModel = new KeyringModel(keyringService, mCryptoModel.getSharedData()); + mKeyringModel = + new KeyringModel(keyringService, mCryptoModel.getSharedData(), braveWalletService); init(); } @@ -65,7 +66,7 @@ public class WalletModel { mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); mDappsModel.resetServices(mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); - mKeyringModel.resetService(mKeyringService); + mKeyringModel.resetService(mKeyringService, braveWalletService); init(); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/SignMessageFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/SignMessageFragment.java index 69de41b2e88..d99b3e5ce35 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/SignMessageFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/SignMessageFragment.java @@ -23,15 +23,11 @@ import androidx.viewpager2.widget.ViewPager2; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; -import org.chromium.brave_wallet.mojom.AccountInfo; -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.JsonRpcService; -import org.chromium.brave_wallet.mojom.KeyringService; import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.brave_wallet.mojom.SignMessageRequest; import org.chromium.chrome.R; +import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.crypto_wallet.adapters.SignMessagePagerAdapter; import org.chromium.chrome.browser.crypto_wallet.util.Utils; import org.chromium.url.GURL; @@ -127,27 +123,19 @@ public class SignMessageFragment extends BaseDAppsBottomSheetDialogFragment { } private void updateAccount() { - getKeyringService().getSelectedAccount(CoinType.ETH, address -> { - if (address == null) { - getActivity().finish(); - return; - } - getKeyringService().getKeyringInfo( - BraveWalletConstants.DEFAULT_KEYRING_ID, keyringInfo -> { - if (keyringInfo == null) { - return; - } - for (AccountInfo accountInfo : keyringInfo.accountInfos) { - if (address.equals(accountInfo.address)) { - Utils.setBlockiesBitmapResource( - mExecutor, mHandler, mAccountImage, address, true); - String accountText = accountInfo.name + "\n" + address; - mAccountName.setText(accountText); - break; - } - } + BraveActivity activity = BraveActivity.getBraveActivity(); + if (activity != null) { + activity.getWalletModel() + .getKeyringModel() + .getSelectedAccountOrAccountPerOrigin() + .observe(getViewLifecycleOwner(), accountInfo -> { + if (accountInfo == null) return; + Utils.setBlockiesBitmapResource( + mExecutor, mHandler, mAccountImage, accountInfo.address, true); + String accountText = accountInfo.name + "\n" + accountInfo.address; + mAccountName.setText(accountText); }); - }); + } } private void updateNetwork() {