Adds a feature to select diff networks in a wallet

This commit is contained in:
Serg
2021-08-31 13:23:50 -04:00
parent 3e373db6cb
commit 4cfe2872a0
12 changed files with 341 additions and 21 deletions
@@ -0,0 +1,56 @@
/* Copyright (c) 2021 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.crypto_wallet;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.brave_wallet.mojom.EthJsonRpcController;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.bindings.Interface;
import org.chromium.mojo.bindings.Interface.Proxy.Handler;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.MojoException;
import org.chromium.mojo.system.impl.CoreImpl;
@JNINamespace("chrome::android")
public class EthJsonRpcControllerFactory {
private static final Object lock = new Object();
private static EthJsonRpcControllerFactory instance;
public static EthJsonRpcControllerFactory getInstance() {
synchronized (lock) {
if (instance == null) {
instance = new EthJsonRpcControllerFactory();
}
}
return instance;
}
private EthJsonRpcControllerFactory() {}
public EthJsonRpcController getEthJsonRpcController(
ConnectionErrorHandler connectionErrorHandler) {
int nativeHandle =
EthJsonRpcControllerFactoryJni.get().getInterfaceToEthJsonRpcController();
MessagePipeHandle handle = wrapNativeHandle(nativeHandle);
EthJsonRpcController ethJsonRpcController =
EthJsonRpcController.MANAGER.attachProxy(handle, 0);
Handler handler = ((Interface.Proxy) ethJsonRpcController).getProxyHandler();
handler.setErrorHandler(connectionErrorHandler);
return ethJsonRpcController;
}
private MessagePipeHandle wrapNativeHandle(int nativeHandle) {
return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle();
}
@NativeMethods
interface Natives {
int getInterfaceToEthJsonRpcController();
}
}
@@ -26,9 +26,11 @@ import com.google.android.material.tabs.TabLayout;
import org.chromium.base.Log;
import org.chromium.brave_wallet.mojom.ErcTokenRegistry;
import org.chromium.brave_wallet.mojom.EthJsonRpcController;
import org.chromium.brave_wallet.mojom.KeyringController;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.ERCTokenRegistryFactory;
import org.chromium.chrome.browser.crypto_wallet.EthJsonRpcControllerFactory;
import org.chromium.chrome.browser.crypto_wallet.KeyringControllerFactory;
import org.chromium.chrome.browser.crypto_wallet.adapters.CryptoFragmentPageAdapter;
import org.chromium.chrome.browser.crypto_wallet.adapters.CryptoWalletOnboardingPagerAdapter;
@@ -60,6 +62,7 @@ public class BraveWalletActivity
private CryptoWalletOnboardingPagerAdapter cryptoWalletOnboardingPagerAdapter;
private KeyringController mKeyringController;
private ErcTokenRegistry mErcTokenRegistry;
private EthJsonRpcController mEthJsonRpcController;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@@ -140,6 +143,7 @@ public class BraveWalletActivity
mErcTokenRegistry = null;
InitKeyringController();
InitErcTokenRegistry();
InitEthJsonRpcController();
}
private void InitKeyringController() {
@@ -158,6 +162,15 @@ public class BraveWalletActivity
mErcTokenRegistry = ERCTokenRegistryFactory.getInstance().getERCTokenRegistry(this);
}
private void InitEthJsonRpcController() {
if (mEthJsonRpcController != null) {
return;
}
mEthJsonRpcController =
EthJsonRpcControllerFactory.getInstance().getEthJsonRpcController(this);
}
public KeyringController getKeyringController() {
return mKeyringController;
}
@@ -166,11 +179,16 @@ public class BraveWalletActivity
return mErcTokenRegistry;
}
public EthJsonRpcController getEthJsonRpcController() {
return mEthJsonRpcController;
}
@Override
public void finishNativeInitialization() {
super.finishNativeInitialization();
InitKeyringController();
InitErcTokenRegistry();
InitEthJsonRpcController();
if (Utils.shouldShowCryptoOnboarding()) {
setNavigationFragments(ONBOARDING_ACTION);
} else if (mKeyringController != null) {
@@ -9,29 +9,37 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import org.chromium.brave_wallet.mojom.ErcTokenRegistry;
import org.chromium.brave_wallet.mojom.EthJsonRpcController;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.ERCTokenRegistryFactory;
import org.chromium.chrome.browser.crypto_wallet.EthJsonRpcControllerFactory;
import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter;
import org.chromium.chrome.browser.crypto_wallet.fragments.EditVisibleAssetsBottomSheetDialogFragment;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import org.chromium.chrome.browser.init.AsyncInitializationActivity;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BuySendSwapActivity
extends AsyncInitializationActivity implements ConnectionErrorHandler {
public class BuySendSwapActivity extends AsyncInitializationActivity
implements ConnectionErrorHandler, AdapterView.OnItemSelectedListener {
public enum ActivityType {
BUY(0),
SEND(1),
@@ -60,6 +68,7 @@ public class BuySendSwapActivity
}
private ErcTokenRegistry mErcTokenRegistry;
private EthJsonRpcController mEthJsonRpcController;
private ActivityType mActivityType;
@Override
@@ -110,10 +119,46 @@ public class BuySendSwapActivity
TextView slippingToleranceValueText = findViewById(R.id.slipping_tolerance_value_text);
slippingToleranceValueText.setText("2%");
Spinner spinner = findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, Utils.getNetworksList(this));
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
onInitialLayoutInflationComplete();
adjustControls();
InitErcTokenRegistry();
InitEthJsonRpcController();
if (mEthJsonRpcController != null) {
mEthJsonRpcController.getNetwork(
network -> { spinner.setSelection(getIndexOf(spinner, network)); });
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String item = parent.getItemAtPosition(position).toString();
if (mEthJsonRpcController != null) {
mEthJsonRpcController.setNetwork(Utils.getNetworkId(this, item));
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {}
private int getIndexOf(Spinner spinner, int network) {
String strNetwork = Utils.getNetworkText(this, network).toString();
for (int i = 0; i < spinner.getCount(); i++) {
if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(strNetwork)) {
return i;
}
}
return 0;
}
private void adjustControls() {
@@ -216,7 +261,9 @@ public class BuySendSwapActivity
@Override
public void onConnectionError(MojoException e) {
mErcTokenRegistry = null;
mEthJsonRpcController = null;
InitErcTokenRegistry();
InitEthJsonRpcController();
}
private void InitErcTokenRegistry() {
@@ -227,6 +274,15 @@ public class BuySendSwapActivity
mErcTokenRegistry = ERCTokenRegistryFactory.getInstance().getERCTokenRegistry(this);
}
private void InitEthJsonRpcController() {
if (mEthJsonRpcController != null) {
return;
}
mEthJsonRpcController =
EthJsonRpcControllerFactory.getInstance().getEthJsonRpcController(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -6,12 +6,16 @@
package org.chromium.chrome.browser.crypto_wallet.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -19,7 +23,9 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.chromium.brave_wallet.mojom.EthJsonRpcController;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletActivity;
import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter;
import org.chromium.chrome.browser.crypto_wallet.listeners.OnWalletListItemClick;
import org.chromium.chrome.browser.crypto_wallet.model.WalletListItemModel;
@@ -29,11 +35,23 @@ import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import java.util.ArrayList;
import java.util.List;
public class PortfolioFragment extends Fragment implements OnWalletListItemClick {
public class PortfolioFragment
extends Fragment implements OnWalletListItemClick, AdapterView.OnItemSelectedListener {
Spinner mSpinner;
public static PortfolioFragment newInstance() {
return new PortfolioFragment();
}
private EthJsonRpcController getEthJsonRpcController() {
Activity activity = getActivity();
if (activity instanceof BraveWalletActivity) {
return ((BraveWalletActivity) activity).getEthJsonRpcController();
}
return null;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -65,9 +83,55 @@ public class PortfolioFragment extends Fragment implements OnWalletListItemClick
}
});
mSpinner = view.findViewById(R.id.spinner);
mSpinner.setOnItemSelectedListener(this);
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, Utils.getNetworksList(getActivity()));
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(dataAdapter);
return view;
}
private void updateNetwork() {
EthJsonRpcController ethJsonRpcController = getEthJsonRpcController();
if (ethJsonRpcController != null) {
ethJsonRpcController.getNetwork(
network -> { mSpinner.setSelection(getIndexOf(mSpinner, network)); });
}
}
@Override
public void onResume() {
super.onResume();
updateNetwork();
}
private int getIndexOf(Spinner spinner, int network) {
String strNetwork = Utils.getNetworkText(getActivity(), network).toString();
for (int i = 0; i < spinner.getCount(); i++) {
if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(strNetwork)) {
return i;
}
}
return 0;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String item = parent.getItemAtPosition(position).toString();
EthJsonRpcController ethJsonRpcController = getEthJsonRpcController();
if (ethJsonRpcController != null) {
ethJsonRpcController.setNetwork(Utils.getNetworkId(getActivity(), item));
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -16,6 +16,7 @@ import android.content.SharedPreferences;
import android.view.inputmethod.InputMethodManager;
import org.chromium.base.ContextUtils;
import org.chromium.brave_wallet.mojom.Network;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.crypto_wallet.activities.AccountDetailActivity;
import org.chromium.chrome.browser.crypto_wallet.activities.AddAccountActivity;
@@ -127,4 +128,65 @@ public class Utils {
Intent accountDetailActivityIntent = new Intent(activity, AccountDetailActivity.class);
activity.startActivity(accountDetailActivityIntent);
}
public static List<String> getNetworksList(Activity activity) {
List<String> categories = new ArrayList<String>();
categories.add(activity.getText(R.string.mainnet).toString());
categories.add(activity.getText(R.string.rinkeby).toString());
categories.add(activity.getText(R.string.ropsten).toString());
categories.add(activity.getText(R.string.goerli).toString());
categories.add(activity.getText(R.string.kovan).toString());
categories.add(activity.getText(R.string.localhost).toString());
categories.add(activity.getText(R.string.custom).toString());
return categories;
}
public static CharSequence getNetworkText(Activity activity, int network) {
CharSequence strNetwork = activity.getText(R.string.mainnet);
switch (network) {
case Network.RINKEBY:
strNetwork = activity.getText(R.string.rinkeby);
break;
case Network.ROPSTEN:
strNetwork = activity.getText(R.string.ropsten);
break;
case Network.GOERLI:
strNetwork = activity.getText(R.string.goerli);
break;
case Network.KOVAN:
strNetwork = activity.getText(R.string.kovan);
break;
case Network.LOCALHOST:
strNetwork = activity.getText(R.string.localhost);
break;
case Network.CUSTOM:
strNetwork = activity.getText(R.string.custom);
break;
case Network.MAINNET:
default:
strNetwork = activity.getText(R.string.mainnet);
}
return strNetwork;
}
public static int getNetworkId(Activity activity, String network) {
int networkId = Network.MAINNET;
if (network.equals(activity.getText(R.string.rinkeby).toString())) {
networkId = Network.RINKEBY;
} else if (network.equals(activity.getText(R.string.ropsten).toString())) {
networkId = Network.ROPSTEN;
} else if (network.equals(activity.getText(R.string.goerli).toString())) {
networkId = Network.GOERLI;
} else if (network.equals(activity.getText(R.string.kovan).toString())) {
networkId = Network.KOVAN;
} else if (network.equals(activity.getText(R.string.localhost).toString())) {
networkId = Network.LOCALHOST;
} else if (network.equals(activity.getText(R.string.custom).toString())) {
networkId = Network.CUSTOM;
}
return networkId;
}
}
@@ -58,25 +58,18 @@
</LinearLayout>
<TextView
android:id="@+id/asset_network_text"
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@color/wallet_text_color"
android:layout_gravity="center_vertical"
android:text="@string/mainnet"
android:prompt="@string/mainnet"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackgroundBorderless"
android:background="@drawable/rounded_white_holo_bg"
app:drawableEndCompat="@drawable/ic_circle_down"
android:drawablePadding="8dp"
android:layout_marginEnd="20dp"/>
android:paddingBottom="2dp" />
</LinearLayout>
+31 -6
View File
@@ -12,17 +12,42 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="16dp"
android:layout_marginBottom="8dp"
android:text="$12,453.17"
android:textColor="@color/wallet_text_color"
android:textStyle="bold"
android:textSize="32sp" />
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="16dp"
android:layout_marginBottom="8dp"
android:text="$12,453.17"
android:textColor="@color/wallet_text_color"
android:textStyle="bold"
android:textSize="32sp" />
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="12sp"
android:textColor="@color/wallet_text_color"
android:layout_gravity="center_vertical"
android:prompt="@string/mainnet"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:paddingTop="2dp"
android:paddingBottom="2dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"