From a446c41a9f2ab4c0760d492c7e234857c883d9b2 Mon Sep 17 00:00:00 2001 From: Qamar Zaman Date: Wed, 8 Jun 2022 04:20:31 +0500 Subject: [PATCH] Implementing Wallet notification badge --- android/brave_java_sources.gni | 1 + .../chrome/browser/app/BraveActivity.java | 18 ++++ .../chrome/browser/app/domain/DappsModel.java | 96 +++++++++++++++++++ .../browser/app/domain/WalletModel.java | 7 ++ .../crypto_wallet/util/PendingTxHelper.java | 4 +- .../toolbar/top/BraveToolbarLayoutImpl.java | 7 ++ android/java/res/layout/brave_toolbar.xml | 36 ++----- .../fragment_add_switch_ethereum_chain.xml | 1 + 8 files changed, 142 insertions(+), 28 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/app/domain/DappsModel.java diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 9bfa303bdf4..471a53754ed 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -44,6 +44,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/app/appmenu/AppMenuIconRowFooter.java", "../../brave/android/java/org/chromium/chrome/browser/app/appmenu/BraveAppMenuPropertiesDelegateImpl.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java", + "../../brave/android/java/org/chromium/chrome/browser/app/domain/DappsModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedData.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java", diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index 6f16a5567d7..0b32f84d945 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -348,6 +348,14 @@ public abstract class BraveActivity extends C }); } + + private void setWalletBadgeVisibility(boolean visibile) { + BraveToolbarLayoutImpl layout = getBraveToolbarLayout(); + if (layout != null) { + layout.updateWalletBadgeVisibility(visibile); + } + } + private void maybeShowPendingTransactions() { assert walletModel != null; // trigger to observer to refresh data to process the pending request @@ -472,9 +480,15 @@ public abstract class BraveActivity extends C BraveToolbarLayoutImpl layout = getBraveToolbarLayout(); if (layout != null) { layout.showWalletIcon(true); + updateWalletBadgeVisibility(); } } + private void updateWalletBadgeVisibility() { + assert walletModel != null; + walletModel.getDappsModel().updateWalletBadgeVisibility(); + } + private void verifySubscription() { List purchases = InAppPurchaseWrapper.getInstance().queryPurchases(); if (purchases != null && purchases.size() == 1) { @@ -657,6 +671,7 @@ public abstract class BraveActivity extends C // If active tab is private, set private DSE as an active DSE. BraveSearchEngineUtils.updateActiveDSE(tab.isIncognito()); BraveStatsUtil.removeShareStatsFile(); + updateWalletBadgeVisibility(); } @Override @@ -1319,6 +1334,9 @@ public abstract class BraveActivity extends C BraveWalletDAppsActivity.ActivityType.CONFIRM_TRANSACTION); } }); + walletModel.getDappsModel().mWalletIconNotificationVisible.removeObservers(this); + walletModel.getDappsModel().mWalletIconNotificationVisible.observe( + this, visible -> { setWalletBadgeVisibility(visible); }); } private void showBraveRateDialog() { diff --git a/android/java/org/chromium/chrome/browser/app/domain/DappsModel.java b/android/java/org/chromium/chrome/browser/app/domain/DappsModel.java new file mode 100644 index 00000000000..9f59640e3d7 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/app/domain/DappsModel.java @@ -0,0 +1,96 @@ +/* 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.app.domain; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Transformations; + +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.TransactionInfo; +import org.chromium.brave_wallet.mojom.TransactionStatus; + +import org.chromium.chrome.browser.crypto_wallet.util.PendingTxHelper; +import org.chromium.chrome.browser.crypto_wallet.util.Utils; + + +public class DappsModel { + private JsonRpcService mJsonRpcService; + private BraveWalletService mBraveWalletService; + private CryptoModel mCryptoModel; + private PendingTxHelper mPendingTxHelper; + private final MutableLiveData _mWalletIconNotificationVisible = + new MutableLiveData<>(false); + public final LiveData mWalletIconNotificationVisible = _mWalletIconNotificationVisible; + + public DappsModel(JsonRpcService jsonRpcService, + BraveWalletService braveWalletService, PendingTxHelper pendingTxHelper) { + mBraveWalletService = braveWalletService; + mJsonRpcService = jsonRpcService; + mPendingTxHelper = pendingTxHelper; + } + + public void resetServices(JsonRpcService jsonRpcService, + BraveWalletService braveWalletService, PendingTxHelper pendingTxHelper) { + mBraveWalletService = braveWalletService; + mJsonRpcService = jsonRpcService; + mPendingTxHelper = pendingTxHelper; + } + + public void updateWalletBadgeVisibility() { + _mWalletIconNotificationVisible.setValue(false); + + mBraveWalletService.getPendingSignMessageRequests(requests -> { + if (requests != null && requests.length > 0) { + setWalletBadgeVisible(); + return; + } + }); + mBraveWalletService.getPendingAddSuggestTokenRequests(requests -> { + if (requests != null && requests.length > 0) { + setWalletBadgeVisible(); + return; + } + }); + mBraveWalletService.getPendingGetEncryptionPublicKeyRequests(requests -> { + if (requests != null && requests.length > 0) { + setWalletBadgeVisible(); + return; + } + }); + mJsonRpcService.getPendingAddChainRequests(networks -> { + if (networks != null && networks.length > 0) { + setWalletBadgeVisible(); + return; + } + }); + mJsonRpcService.getPendingSwitchChainRequests(requests -> { + if (requests != null && requests.length > 0) { + setWalletBadgeVisible(); + return; + } + }); + for (TransactionInfo info : mPendingTxHelper.mTransactionInfoLd.getValue()) { + if (info.txStatus == TransactionStatus.UNAPPROVED) { + setWalletBadgeVisible(); + break; + } + } + } + + public void setWalletBadgeVisible() { + _mWalletIconNotificationVisible.setValue(true); + } + + public void setWalletBadgeInvisible() { + _mWalletIconNotificationVisible.setValue(false); + } +} 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 d3540b43df1..66da952bcab 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/WalletModel.java @@ -26,6 +26,7 @@ public class WalletModel { private BraveWalletService mBraveWalletService; private AssetRatioService mAssetRatioService; private final CryptoModel mCryptoModel; + private final DappsModel mDappsModel; private final KeyringModel mKeyringModel; public WalletModel(KeyringService keyringService, BlockchainRegistry blockchainRegistry, @@ -43,6 +44,7 @@ public class WalletModel { mCryptoModel = new CryptoModel(mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); + mDappsModel = new DappsModel(mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); mKeyringModel = new KeyringModel(keyringService, mCryptoModel.getSharedData()); init(); } @@ -62,6 +64,7 @@ public class WalletModel { mCryptoModel.resetServices(mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); + mDappsModel.resetServices(mJsonRpcService, mBraveWalletService, mCryptoModel.getPendingTxHelper()); mKeyringModel.resetService(mKeyringService); init(); } @@ -89,6 +92,10 @@ public class WalletModel { return mCryptoModel; } + public DappsModel getDappsModel() { + return mDappsModel; + } + public KeyringService getKeyringService() { return mKeyringService; } 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 72db325a89e..d1d04e72e60 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 @@ -76,6 +76,9 @@ public class PendingTxHelper implements TxServiceObserver { public void fetchTransactions(Runnable runWhenDone) { isFetchingTx = true; + mTransactionInfos.clear(); + mCacheTransactionInfos.clear(); + mTxInfos.clear(); _mTransactionInfos.postValue(Collections.emptyList()); _mSelectedPendingRequest.postValue(null); AsyncUtils.MultiResponseHandler allTxMultiResponse = @@ -171,7 +174,6 @@ public class PendingTxHelper implements TxServiceObserver { } private void updateTransactionList() { - mTransactionInfos.clear(); for (TransactionInfo[] transactionInfoArr : mTxInfos.values()) { Collections.addAll(mTransactionInfos, transactionInfoArr); } diff --git a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java index b6ba3765da3..13c20047df3 100644 --- a/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java +++ b/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayoutImpl.java @@ -169,6 +169,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout private BraveShieldsContentSettingsObserver mBraveShieldsContentSettingsObserver; private TextView mBraveRewardsNotificationsCount; private ImageView mBraveRewardsOnboardingIcon; + private View mBraveWalletBadge; private boolean mShieldsLayoutIsColorBackground; private int mCurrentToolbarColor; @@ -224,6 +225,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout mBraveShieldsButton = (ImageButton) findViewById(R.id.brave_shields_button); mBraveRewardsButton = (ImageButton) findViewById(R.id.brave_rewards_button); mHomeButton = (HomeButton) findViewById(R.id.home_button); + mBraveWalletBadge = findViewById(R.id.wallet_notfication_badge); if (mHomeButton != null) { mHomeButton.setOnLongClickListener(this); @@ -1256,6 +1258,11 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout BraveMenuButtonCoordinator.setMenuFromBottom(isMenuButtonOnBottom()); } + public void updateWalletBadgeVisibility(boolean visible) { + assert mBraveWalletBadge!=null; + mBraveWalletBadge.setVisibility(visible ? View.VISIBLE : View.GONE); + } + public void updateMenuButtonState() { BraveMenuButtonCoordinator.setMenuFromBottom(mIsBottomToolbarVisible); } diff --git a/android/java/res/layout/brave_toolbar.xml b/android/java/res/layout/brave_toolbar.xml index 7ef1dfe4c2a..5ecbae513c5 100644 --- a/android/java/res/layout/brave_toolbar.xml +++ b/android/java/res/layout/brave_toolbar.xml @@ -27,33 +27,15 @@ android:layout_gravity="center" android:contentDescription="@string/accessibility_toolbar_btn_brave_wallet" /> - - - +