Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(wallet): implement DApps decrypt screen (uplift to 1.40.x) #13876

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -86,6 +87,7 @@ public void resetServices(TxService mTxService, KeyringService mKeyringService,
this.mBraveWalletService = mBraveWalletService;
this.mAssetRatioService = mAssetRatioService;
mPendingTxHelper.setTxService(mTxService);
mNetworkModel.resetServices(mJsonRpcService);
init();
}

Expand Down Expand Up @@ -118,6 +120,16 @@ public void getPublicEncryptionRequest(Callback1<GetEncryptionPublicKeyRequest>
});
}

public void getDecryptMessageRequest(Callback1<DecryptRequest> 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); });
Expand All @@ -138,7 +150,6 @@ public LiveData<List<TransactionInfo>> 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);
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,32 +21,35 @@

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;

public class EncryptionKeyFragment extends Fragment implements View.OnClickListener {
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
Expand Down Expand Up @@ -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();

Expand All @@ -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;
}
}
Loading