From 47a65e62ba24d1c62c076754c2f1ffb282fb170f Mon Sep 17 00:00:00 2001 From: Pavneet-Sing Date: Mon, 20 Jun 2022 21:36:05 +0530 Subject: [PATCH] fix(wallet): implement DApps decrypt screen --- .../browser/app/domain/CryptoModel.java | 25 +++++- .../activities/BraveWalletDAppsActivity.java | 22 +++-- .../dapps/EncryptionKeyFragment.java | 78 ++++++++++++------ .../res/layout/fragment_encryption_key.xml | 81 ++++++++++++++----- .../java/res/layout/fragment_sign_message.xml | 3 +- .../android/strings/android_brave_strings.grd | 9 +++ 6 files changed, 163 insertions(+), 55 deletions(-) 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 ca0bfef3f417..538a58970f27 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -15,6 +15,7 @@ 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.DecryptRequest; import org.chromium.brave_wallet.mojom.EthTxManagerProxy; import org.chromium.brave_wallet.mojom.GetEncryptionPublicKeyRequest; import org.chromium.brave_wallet.mojom.JsonRpcService; @@ -86,6 +87,7 @@ public void resetServices(TxService mTxService, KeyringService mKeyringService, this.mBraveWalletService = mBraveWalletService; this.mAssetRatioService = mAssetRatioService; mPendingTxHelper.setTxService(mTxService); + mNetworkModel.resetServices(mJsonRpcService); init(); } @@ -118,6 +120,16 @@ public void getPublicEncryptionRequest(Callback1 }); } + public void getDecryptMessageRequest(Callback1 onResult) { + mBraveWalletService.getPendingDecryptRequests(requests -> { + DecryptRequest request = null; + if (requests != null && requests.length > 0) { + request = requests[0]; + } + onResult.call(request); + }); + } + public void refreshTransactions() { mKeyringService.getKeyringInfo(BraveWalletConstants.DEFAULT_KEYRING_ID, keyringInfo -> { mPendingTxHelper.setAccountInfos(keyringInfo.accountInfos); }); @@ -138,7 +150,6 @@ public LiveData> getAllTransactions() { public void processPublicEncryptionKey(boolean isApproved, Origin origin) { mBraveWalletService.notifyGetPublicKeyRequestProcessed(isApproved, origin); mBraveWalletService.getPendingGetEncryptionPublicKeyRequests(requests -> { - // either process the next request (if available) or finish the flow if (requests != null && requests.length > 0) { _mProcessNextDAppsRequest.postValue( BraveWalletDAppsActivity.ActivityType.GET_ENCRYPTION_PUBLIC_KEY_REQUEST); @@ -152,6 +163,18 @@ public void clearDappsState() { _mProcessNextDAppsRequest.postValue(null); } + public void processDecryptRequest(boolean isApproved, Origin origin) { + mBraveWalletService.notifyDecryptRequestProcessed(isApproved, origin); + mBraveWalletService.getPendingDecryptRequests(requests -> { + if (requests != null && requests.length > 0) { + _mProcessNextDAppsRequest.postValue( + BraveWalletDAppsActivity.ActivityType.DECRYPT_REQUEST); + } else { + _mProcessNextDAppsRequest.postValue(BraveWalletDAppsActivity.ActivityType.FINISH); + } + }); + } + public PendingTxHelper getPendingTxHelper() { return mPendingTxHelper; } 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 7fbf60ce49ae..1f619138f7b9 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 @@ -88,14 +88,11 @@ protected void triggerLayoutInflation() { if (activityType == null) return; switch (activityType) { case GET_ENCRYPTION_PUBLIC_KEY_REQUEST: + case DECRYPT_REQUEST: processPendingDappsRequest(); break; case FINISH: finish(); - // need to clear the state for a fresh state next time - // TODO (pavi): update the flow with dapps model - // (under-development) and get rid of explicit clear state call - activity.getWalletModel().getCryptoModel().clearDappsState(); break; default: break; @@ -215,9 +212,8 @@ private void processPendingDappsRequest() { mFragment = new AddSwitchChainNetworkFragment(mActivityType, this); } else if (mActivityType == ActivityType.CONNECT_ACCOUNT) { mFragment = new ConnectAccountFragment(); - } else if (mActivityType == ActivityType.DECRYPT_REQUEST) { - // TODO(sergz): Implement decrypt request screen - } else if (mActivityType == GET_ENCRYPTION_PUBLIC_KEY_REQUEST) { + } else if (mActivityType == GET_ENCRYPTION_PUBLIC_KEY_REQUEST + || mActivityType == ActivityType.DECRYPT_REQUEST) { mFragment = EncryptionKeyFragment.newInstance(mActivityType); } showCurrentFragment(); @@ -230,4 +226,16 @@ private void showCurrentFragment() { ft.commit(); } } + + @Override + public void onDestroy() { + super.onDestroy(); + // need to clear the state for a fresh state next time + // TODO (pavi): update the flow with dapps model + // (under-development) and get rid of explicit clear state call + BraveActivity activity = BraveActivity.getBraveActivity(); + if (activity != null) { + activity.getWalletModel().getCryptoModel().clearDappsState(); + } + } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/EncryptionKeyFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/EncryptionKeyFragment.java index 542397044bc3..df4b199d78bb 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/EncryptionKeyFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/EncryptionKeyFragment.java @@ -5,11 +5,13 @@ package org.chromium.chrome.browser.crypto_wallet.fragments.dapps; +import android.graphics.Typeface; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.SpannableStringBuilder; import android.text.TextUtils; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,16 +21,15 @@ import androidx.fragment.app.Fragment; +import org.chromium.brave_wallet.mojom.DecryptRequest; import org.chromium.brave_wallet.mojom.GetEncryptionPublicKeyRequest; import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.CryptoModel; import org.chromium.chrome.browser.app.domain.WalletModel; import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletDAppsActivity; import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -36,15 +37,19 @@ public class EncryptionKeyFragment extends Fragment implements View.OnClickListe private static final String ACTIVITY_TYPE = "param1"; private ImageView mAccountImage; private TextView mAccountName; + private TextView mTvMessage; private TextView mTvMessageDesc; + private TextView mTvMessageDecrypt; + private TextView mTveTldPlusOne; private TextView mNetworkName; private Button mBtCancel; - private Button mBtSign; + private Button mBtProvideAllow; private ExecutorService mExecutor; private Handler mHandler; private BraveWalletDAppsActivity.ActivityType mActivityType; private WalletModel mWalletModel; private GetEncryptionPublicKeyRequest mEncryptionPublicKeyRequest; + private DecryptRequest mDecryptRequest; /** * Factory method @@ -83,10 +88,14 @@ public View onCreateView( mAccountName = view.findViewById(R.id.fragment_encryption_msg_tv_account_name); mTvMessageDesc = view.findViewById(R.id.fragment_encryption_msg_desc); mNetworkName = view.findViewById(R.id.fragment_encryption_msg_tv_network_name); + mTvMessage = view.findViewById(R.id.fragment_encryption_msg_tv_message); + mTveTldPlusOne = view.findViewById(R.id.fragment_encryption_msg_tv_eTldPlusOne); + mTvMessageDecrypt = view.findViewById(R.id.fragment_encryption_tv_decrypt); mBtCancel = view.findViewById(R.id.fragment_encryption_msg_btn_cancel); - mBtSign = view.findViewById(R.id.fragment_encryption_msg_btn_sign); - mBtSign.setOnClickListener(this); + // Title: "provide" for public key request and "allow" for decrypt request + mBtProvideAllow = view.findViewById(R.id.fragment_encryption_msg_btn_provide_allow); + mBtProvideAllow.setOnClickListener(this); mBtCancel.setOnClickListener(this); initState(); @@ -112,30 +121,53 @@ private void initState() { mExecutor, mHandler, mAccountImage, accountInfo.address, true); mAccountName.setText(accountInfo.name); }); - mWalletModel.getCryptoModel().getPublicEncryptionRequest(encryptionPublicKeyRequest -> { - if (encryptionPublicKeyRequest != null) { - mEncryptionPublicKeyRequest = encryptionPublicKeyRequest; - SpannableStringBuilder requestDescription = new SpannableStringBuilder(); - requestDescription.append( - Utils.geteTLD(encryptionPublicKeyRequest.originInfo.eTldPlusOne)); - requestDescription.append(" "); - requestDescription.append( - getString(R.string.brave_wallet_provide_encryption_key_description)); - mTvMessageDesc.setText(requestDescription); - } - }); + + if (mActivityType + == BraveWalletDAppsActivity.ActivityType.GET_ENCRYPTION_PUBLIC_KEY_REQUEST) { + mWalletModel.getCryptoModel().getPublicEncryptionRequest( + encryptionPublicKeyRequest -> { + if (encryptionPublicKeyRequest != null) { + mEncryptionPublicKeyRequest = encryptionPublicKeyRequest; + SpannableStringBuilder requestDescription = + new SpannableStringBuilder(); + requestDescription.append(Utils.geteTLD( + encryptionPublicKeyRequest.originInfo.eTldPlusOne)); + requestDescription.append(" "); + requestDescription.append(getString( + R.string.brave_wallet_provide_encryption_key_description)); + mTvMessageDesc.setText(requestDescription); + } + }); + } else if (mActivityType == BraveWalletDAppsActivity.ActivityType.DECRYPT_REQUEST) { + mWalletModel.getCryptoModel().getDecryptMessageRequest(decryptRequest -> { + mDecryptRequest = decryptRequest; + mTveTldPlusOne.setVisibility(View.VISIBLE); + mTvMessageDecrypt.setVisibility(View.VISIBLE); + mTveTldPlusOne.setText(Utils.geteTLD(mDecryptRequest.originInfo.eTldPlusOne)); + mTvMessage.setText(R.string.brave_wallet_read_encrypted_message_title); + mBtProvideAllow.setText(R.string.brave_wallet_read_encrypted_message_button); + mTvMessageDecrypt.setOnClickListener(v -> { + mTvMessageDecrypt.setVisibility(View.GONE); + mTvMessageDesc.setText(mDecryptRequest.unsafeMessage); + }); + }); + } } } @Override public void onClick(View v) { - final int id = v.getId(); - if (id == R.id.fragment_encryption_msg_btn_sign) { - mWalletModel.getCryptoModel().processPublicEncryptionKey( - true, mEncryptionPublicKeyRequest.originInfo.origin); - } else if (id == R.id.fragment_encryption_msg_btn_cancel) { + if (mActivityType + == BraveWalletDAppsActivity.ActivityType.GET_ENCRYPTION_PUBLIC_KEY_REQUEST) { mWalletModel.getCryptoModel().processPublicEncryptionKey( - false, mEncryptionPublicKeyRequest.originInfo.origin); + isPositiveActionTriggered(v), mEncryptionPublicKeyRequest.originInfo.origin); + } else if (mActivityType == BraveWalletDAppsActivity.ActivityType.DECRYPT_REQUEST) { + mWalletModel.getCryptoModel().processDecryptRequest( + isPositiveActionTriggered(v), mDecryptRequest.originInfo.origin); } } + + private boolean isPositiveActionTriggered(View v) { + return v.getId() == R.id.fragment_encryption_msg_btn_provide_allow; + } } diff --git a/android/java/res/layout/fragment_encryption_key.xml b/android/java/res/layout/fragment_encryption_key.xml index 9bd657cab1cd..b7df1eba600b 100644 --- a/android/java/res/layout/fragment_encryption_key.xml +++ b/android/java/res/layout/fragment_encryption_key.xml @@ -2,7 +2,7 @@ + + + app:layout_constraintTop_toBottomOf="@+id/fragment_encryption_msg_tv_eTldPlusOne" /> + app:layout_constraintTop_toBottomOf="@+id/fragment_encryption_msg_title" /> - + + + + + + app:layout_constraintTop_toTopOf="@id/fragment_encryption_msg_container" /> + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent"> Allow this site to add a network? + + This DApp would like to read this message to complete your request. + + + Decrypt message + + + Allow + Add suggested token