-
Notifications
You must be signed in to change notification settings - Fork 925
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
feat(wallet): Implemented show all networks assets #17615
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,6 +10,10 @@ | |
import android.text.TextUtils; | ||
import android.util.Pair; | ||
|
||
import androidx.annotation.NonNull; | ||
import androidx.lifecycle.DefaultLifecycleObserver; | ||
import androidx.lifecycle.Lifecycle; | ||
import androidx.lifecycle.LifecycleOwner; | ||
import androidx.lifecycle.LiveData; | ||
import androidx.lifecycle.MediatorLiveData; | ||
import androidx.lifecycle.MutableLiveData; | ||
|
@@ -24,41 +28,47 @@ | |
import org.chromium.chrome.browser.crypto_wallet.model.CryptoAccountTypeInfo; | ||
import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; | ||
import org.chromium.chrome.browser.crypto_wallet.util.NetworkResponsesCollector; | ||
import org.chromium.chrome.browser.crypto_wallet.util.NetworkUtils; | ||
import org.chromium.chrome.browser.crypto_wallet.util.Utils; | ||
import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; | ||
import org.chromium.chrome.browser.util.Triple; | ||
import org.chromium.mojo.bindings.Callbacks; | ||
import org.chromium.mojo.system.MojoException; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Arrays; | ||
import java.util.Collections; | ||
import java.util.HashMap; | ||
import java.util.HashSet; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Set; | ||
|
||
public class NetworkModel implements JsonRpcServiceObserver { | ||
private JsonRpcService mJsonRpcService; | ||
private final Object mLock = new Object(); | ||
private final MediatorLiveData<String> _mChainId; | ||
private final MediatorLiveData<NetworkInfo[]> _mDefaultCoinCryptoNetworks; | ||
private final MutableLiveData<NetworkInfo[]> _mCryptoNetworks; | ||
private final MutableLiveData<List<NetworkInfo>> _mCryptoNetworks; | ||
private final CryptoSharedData mSharedData; | ||
private final CryptoSharedActions mCryptoActions; | ||
private final MediatorLiveData<Pair<String, NetworkInfo[]>> _mPairChainAndNetwork; | ||
private final MediatorLiveData<NetworkInfo> _mNeedToCreateAccountForNetwork; | ||
private final MediatorLiveData<NetworkInfo> _mDefaultNetwork; | ||
private final MediatorLiveData<Triple<String, NetworkInfo, NetworkInfo[]>> | ||
private final MediatorLiveData<Triple<String, NetworkInfo, List<NetworkInfo>>> | ||
_mChainNetworkAllNetwork; | ||
private final Context mContext; | ||
private final MediatorLiveData<String[]> _mCustomNetworkIds; | ||
private final MediatorLiveData<List<NetworkInfo>> _mPrimaryNetworks; | ||
private final MediatorLiveData<List<NetworkInfo>> _mSecondaryNetworks; | ||
private NetworkSelectorModel mNetworkSelectorModel; | ||
private Map<String, NetworkSelectorModel> mNetworkSelectorMap; | ||
public final LiveData<String[]> mCustomNetworkIds; | ||
public LiveData<NetworkInfo> mNeedToCreateAccountForNetwork; | ||
public final LiveData<Triple<String, NetworkInfo, NetworkInfo[]>> mChainNetworkAllNetwork; | ||
public final LiveData<Triple<String, NetworkInfo, List<NetworkInfo>>> mChainNetworkAllNetwork; | ||
public final LiveData<Pair<String, NetworkInfo[]>> mPairChainAndNetwork; | ||
public final LiveData<String> mChainId; | ||
public final LiveData<NetworkInfo[]> mDefaultCoinCryptoNetworks; | ||
public final LiveData<NetworkInfo[]> mCryptoNetworks; | ||
public final LiveData<List<NetworkInfo>> mCryptoNetworks; | ||
public final LiveData<NetworkInfo> mDefaultNetwork; | ||
public final LiveData<List<NetworkInfo>> mPrimaryNetworks; | ||
public final LiveData<List<NetworkInfo>> mSecondaryNetworks; | ||
|
@@ -74,7 +84,7 @@ public NetworkModel(JsonRpcService jsonRpcService, CryptoSharedData sharedData, | |
_mDefaultCoinCryptoNetworks = new MediatorLiveData<>(); | ||
mChainId = _mChainId; | ||
mDefaultCoinCryptoNetworks = _mDefaultCoinCryptoNetworks; | ||
_mCryptoNetworks = new MutableLiveData<>(new NetworkInfo[0]); | ||
_mCryptoNetworks = new MutableLiveData<>(Collections.emptyList()); | ||
mCryptoNetworks = _mCryptoNetworks; | ||
_mPairChainAndNetwork = new MediatorLiveData<>(); | ||
mPairChainAndNetwork = _mPairChainAndNetwork; | ||
|
@@ -92,7 +102,7 @@ public NetworkModel(JsonRpcService jsonRpcService, CryptoSharedData sharedData, | |
_mSecondaryNetworks = new MediatorLiveData<>(); | ||
mSecondaryNetworks = _mSecondaryNetworks; | ||
jsonRpcService.addObserver(this); | ||
mNetworkSelectorModel = new NetworkSelectorModel(this, mContext); | ||
mNetworkSelectorMap = new HashMap<>(); | ||
_mPairChainAndNetwork.setValue(Pair.create("", new NetworkInfo[] {})); | ||
_mPairChainAndNetwork.addSource(_mChainId, chainId -> { | ||
_mPairChainAndNetwork.setValue( | ||
|
@@ -106,8 +116,7 @@ public NetworkModel(JsonRpcService jsonRpcService, CryptoSharedData sharedData, | |
NetworkInfo[] cryptoNetworks = chainIdAndInfosPair.second; | ||
if (chainId == null || cryptoNetworks == null) return; | ||
for (NetworkInfo networkInfo : cryptoNetworks) { | ||
if (networkInfo.chainId.equals(chainId) | ||
&& sharedData.getCoinType() == networkInfo.coin) { | ||
if (networkInfo.chainId.equals(chainId)) { | ||
_mDefaultNetwork.postValue(networkInfo); | ||
break; | ||
} | ||
|
@@ -131,11 +140,19 @@ public NetworkModel(JsonRpcService jsonRpcService, CryptoSharedData sharedData, | |
}); | ||
|
||
_mChainNetworkAllNetwork.addSource(_mDefaultNetwork, networkInfo -> { | ||
NetworkInfo currNetwork = null; | ||
if (_mChainNetworkAllNetwork.getValue() != null) { | ||
currNetwork = _mChainNetworkAllNetwork.getValue().second; | ||
} | ||
if (currNetwork != null && networkInfo != null | ||
&& NetworkUtils.Filters.isSameNetwork(currNetwork, networkInfo)) { | ||
return; | ||
} | ||
_mChainNetworkAllNetwork.postValue( | ||
Triple.create(networkInfo.chainId, networkInfo, _mCryptoNetworks.getValue())); | ||
}); | ||
_mChainNetworkAllNetwork.addSource(_mCryptoNetworks, networkInfos -> { | ||
String chainId = _mChainId.getValue(); | ||
String chainId = null; | ||
NetworkInfo networkInfo = _mDefaultNetwork.getValue(); | ||
if (networkInfo != null) { | ||
chainId = networkInfo.chainId; | ||
|
@@ -172,12 +189,43 @@ public NetworkModel(JsonRpcService jsonRpcService, CryptoSharedData sharedData, | |
* @return mNetworkSelectorModel object in DEFAULT_WALLET_NETWORK mode | ||
*/ | ||
public NetworkSelectorModel openNetworkSelectorModel() { | ||
return openNetworkSelectorModel(NetworkSelectorModel.Mode.DEFAULT_WALLET_NETWORK); | ||
return new NetworkSelectorModel(this, mContext); | ||
} | ||
|
||
public NetworkSelectorModel openNetworkSelectorModel(NetworkSelectorModel.Mode mode) { | ||
mNetworkSelectorModel.updateSelectorMode(mode); | ||
return mNetworkSelectorModel; | ||
/** | ||
* Create a network model to handle either default or local state (onscreen e.g. {@link | ||
* org.chromium.chrome.browser.crypto_wallet.fragments.PortfolioFragment}). Local network | ||
* selection can be used by many views so make sure to use the same key which acts as a contract | ||
* between the view and the selection activity. | ||
* @param key acts as a binding key between caller and selection activity. | ||
* @param mode to handle network selection event globally or locally. | ||
* @param lifecycle to auto remove network-selection objects. | ||
* @return NetworkSelectorModel object. | ||
*/ | ||
Comment on lines
+195
to
+204
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ❤️ |
||
public NetworkSelectorModel openNetworkSelectorModel( | ||
String key, NetworkSelectorModel.Mode mode, Lifecycle lifecycle) { | ||
NetworkSelectorModel networkSelectorModel; | ||
if (key == null) { | ||
return new NetworkSelectorModel(mode, this, mContext); | ||
} else if (mNetworkSelectorMap.containsKey(key)) { | ||
// Use existing NetworkSelector object to show the previously selected network | ||
networkSelectorModel = mNetworkSelectorMap.get(key); | ||
if (networkSelectorModel != null && mode != networkSelectorModel.getMode()) { | ||
networkSelectorModel.updateSelectorMode(mode); | ||
} | ||
} else { | ||
networkSelectorModel = new NetworkSelectorModel(mode, this, mContext); | ||
mNetworkSelectorMap.put(key, networkSelectorModel); | ||
} | ||
if (lifecycle != null) { | ||
lifecycle.addObserver(new DefaultLifecycleObserver() { | ||
@Override | ||
public void onDestroy(@NonNull LifecycleOwner owner) { | ||
mNetworkSelectorMap.remove(key); | ||
} | ||
}); | ||
} | ||
return networkSelectorModel; | ||
} | ||
|
||
public void setAccountInfosFromKeyRingModel( | ||
|
@@ -212,22 +260,27 @@ public void refreshNetworks() { | |
init(); | ||
} | ||
|
||
static void getAllNetworks(JsonRpcService jsonRpcService, List<Integer> supportedCoins, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. package accessible only, if there is no modifier then it is |
||
Callbacks.Callback1<Set<NetworkInfo>> callback) { | ||
if (jsonRpcService == null) { | ||
callback.call(Collections.emptySet()); | ||
return; | ||
} | ||
|
||
NetworkResponsesCollector networkResponsesCollector = | ||
new NetworkResponsesCollector(jsonRpcService, supportedCoins); | ||
networkResponsesCollector.getNetworks(networkInfos -> { callback.call(networkInfos); }); | ||
} | ||
|
||
public void init() { | ||
synchronized (mLock) { | ||
if (mJsonRpcService == null) { | ||
return; | ||
} | ||
|
||
List<Integer> coins = new ArrayList<>(); | ||
for (CryptoAccountTypeInfo cryptoAccountTypeInfo : | ||
mSharedData.getSupportedCryptoAccountTypes()) { | ||
coins.add(cryptoAccountTypeInfo.getCoinType()); | ||
} | ||
NetworkResponsesCollector networkResponsesCollector = | ||
new NetworkResponsesCollector(mJsonRpcService, coins); | ||
networkResponsesCollector.getNetworks(networkInfos -> { | ||
_mCryptoNetworks.postValue( | ||
stripDebugNetwork(mContext, networkInfos.toArray(new NetworkInfo[0]))); | ||
getAllNetworks(mJsonRpcService, mSharedData.getSupportedCryptoCoins(), allNetworks -> { | ||
_mCryptoNetworks.postValue(Arrays.asList( | ||
stripDebugNetwork(mContext, allNetworks.toArray(new NetworkInfo[0])))); | ||
}); | ||
} | ||
} | ||
|
@@ -250,6 +303,11 @@ public void setNetworkWithAccountCheck( | |
} | ||
} | ||
|
||
public void setNetworkWithAccountCheck(String chainId, Callbacks.Callback1<Boolean> callback) { | ||
NetworkInfo networkToBeSetAsSelected = getNetwork(chainId); | ||
setNetworkWithAccountCheck(networkToBeSetAsSelected, callback); | ||
} | ||
|
||
public void setNetwork( | ||
NetworkInfo networkToBeSetAsSelected, Callbacks.Callback1<Boolean> callback) { | ||
mJsonRpcService.setNetwork( | ||
|
@@ -268,8 +326,8 @@ public void clearCreateAccountState() { | |
_mNeedToCreateAccountForNetwork.postValue(null); | ||
} | ||
|
||
public NetworkInfo[] stripNoBuySwapNetworks( | ||
NetworkInfo[] networkInfos, BuySendSwapActivity.ActivityType type) { | ||
public List<NetworkInfo> stripNoBuySwapNetworks( | ||
List<NetworkInfo> networkInfos, BuySendSwapActivity.ActivityType type) { | ||
List<NetworkInfo> networkInfosFiltered = new ArrayList<>(); | ||
for (NetworkInfo networkInfo : networkInfos) { | ||
if (type == BuySendSwapActivity.ActivityType.BUY && Utils.allowBuy(networkInfo.chainId) | ||
|
@@ -279,7 +337,18 @@ public NetworkInfo[] stripNoBuySwapNetworks( | |
} | ||
} | ||
|
||
return networkInfosFiltered.toArray(new NetworkInfo[networkInfosFiltered.size()]); | ||
return networkInfosFiltered; | ||
} | ||
|
||
public NetworkInfo getNetwork(String chainId) { | ||
if (TextUtils.isEmpty(chainId)) return null; | ||
List<NetworkInfo> cryptoNws = JavaUtils.safeVal(_mCryptoNetworks.getValue()); | ||
for (NetworkInfo info : cryptoNws) { | ||
if (info.chainId.equals(chainId)) { | ||
return info; | ||
} | ||
} | ||
return null; | ||
} | ||
|
||
private NetworkInfo[] stripDebugNetwork(Context context, NetworkInfo[] networkInfos) { | ||
|
@@ -298,8 +367,8 @@ private NetworkInfo[] stripDebugNetwork(Context context, NetworkInfo[] networkIn | |
} | ||
|
||
List<NetworkInfo> getSubTestNetworks(NetworkInfo networkInfo) { | ||
NetworkInfo[] cryptoNws = _mCryptoNetworks.getValue(); | ||
if (cryptoNws == null || cryptoNws.length == 0 | ||
List<NetworkInfo> cryptoNws = _mCryptoNetworks.getValue(); | ||
if (cryptoNws == null || cryptoNws.size() == 0 | ||
|| !WalletConstants.SUPPORTED_TOP_LEVEL_CHAIN_IDS.contains(networkInfo.chainId)) | ||
return Collections.emptyList(); | ||
List<NetworkInfo> list = new ArrayList<>(); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.