Skip to content

Commit

Permalink
Refine logic for erc20 accounts creation
Browse files Browse the repository at this point in the history
Previously the parent eth account was added even if you have canceled
the creation of erc20 account. Now eth account creation is deferred
until you select erc20 token option.
  • Loading branch information
agneslovelace committed Mar 3, 2020
1 parent c71dc5d commit 30ff408
Showing 1 changed file with 54 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
import android.view.WindowManager;
import android.widget.ArrayAdapter;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;

Expand Down Expand Up @@ -116,15 +118,21 @@ public void onCreate(Bundle savedInstanceState) {
_progress = new ProgressDialog(this);
}

private Map<String, ERC20Token> getAvailableTokens(UUID ethAccountId) {
/**
* @return all supported tokens or all supported tokens except these that are already enabled for
* account with ethAccountId.
*/
private Map<String, ERC20Token> getAvailableTokens(@Nullable UUID ethAccountId) {
Map<String, ERC20Token> supportedTokens = _mbwManager.getSupportedERC20Tokens();
if (supportedTokens.isEmpty()) {
return Collections.emptyMap();
}
WalletAccount ethAccount = _mbwManager.getWalletManager(false).getAccount(ethAccountId);
List<String> enabledTokens = ((EthAccount) ethAccount).getEnabledTokens();
for (String tokenName : enabledTokens) {
supportedTokens.remove(tokenName);
if (ethAccountId != null) {
WalletAccount ethAccount = _mbwManager.getWalletManager(false).getAccount(ethAccountId);
List<String> enabledTokens = ((EthAccount) ethAccount).getEnabledTokens();
for (String tokenName : enabledTokens) {
supportedTokens.remove(tokenName);
}
}
return supportedTokens;
}
Expand All @@ -138,29 +146,24 @@ void onAddEth() {
boolean canCreateAccount = wallet.getModuleById(EthereumModule.ID).canCreateAccount(new EthereumMasterseedConfig());
if (!canCreateAccount) {
// TODO replace with string res
_toaster.toast("You can only have one unused HD Ethereum Account.", false);
_toaster.toast("You can only have one unused Ethereum Account.", false);
return;
}

if (ethCreationAsyncTask == null || ethCreationAsyncTask.getStatus() != AsyncTask.Status.RUNNING) {
boolean callERC20CreationDialog = false;
ethCreationAsyncTask = new ETHCreationAsyncTask(callERC20CreationDialog);
ethCreationAsyncTask = new ETHCreationAsyncTask(null);
ethCreationAsyncTask.execute();
}
}

@OnClick(R.id.btErc20Create)
void onAddERC20() {
List<WalletAccount<?>> ethAccounts = EthereumModuleKt.getEthAccounts(_mbwManager.getWalletManager(false));
// check whether any eth account exist
// if none of eth accounts exist show erc20 selection dialog right away
// else ask what eth account to add erc20 account to
if (ethAccounts.isEmpty()) {
// if not create eth account and call erc20 dialog after
if (ethCreationAsyncTask == null || ethCreationAsyncTask.getStatus() != AsyncTask.Status.RUNNING) {
boolean callERC20CreationDialog = true;
ethCreationAsyncTask = new ETHCreationAsyncTask(callERC20CreationDialog);
ethCreationAsyncTask.execute();
}
} else { // else ask what account select for erc20 token addition
showERC20TokensOptions(null);
} else {
showEthAccountsOptions();
}
}
Expand All @@ -169,14 +172,11 @@ private void showEthAccountsOptions() {
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(AddAccountActivity.this, android.R.layout.select_dialog_singlechoice);
List<WalletAccount<?>> accounts = EthereumModuleKt.getEthAccounts(_mbwManager.getWalletManager(false));
arrayAdapter.addAll(getEthAccountsForView(accounts));
arrayAdapter.add("Create new account");
AlertDialog.Builder dialogBuilder = getSingleChoiceDialog("Select Account", arrayAdapter);
dialogBuilder.setPositiveButton("ok", (dialog, which) -> {
if (selectedIndex == arrayAdapter.getCount() - 1) {
if (ethCreationAsyncTask == null || ethCreationAsyncTask.getStatus() != AsyncTask.Status.RUNNING) {
boolean callERC20CreationDialog = true;
ethCreationAsyncTask = new ETHCreationAsyncTask(callERC20CreationDialog);
ethCreationAsyncTask.execute();
}
if (selectedIndex == arrayAdapter.getCount() - 1) { // "Create new account" item
showERC20TokensOptions(null);
} else {
UUID ethAccountId = accounts.get(selectedIndex).getId();
showERC20TokensOptions(ethAccountId);
Expand All @@ -190,14 +190,19 @@ private List<String> getEthAccountsForView(List<WalletAccount<?>> accounts) {
String denominatedValue;
Collections.sort(accounts, (a1, a2) -> Integer.compare(((EthAccount) a1).getAccountIndex(), ((EthAccount) a2).getAccountIndex()));
for (WalletAccount account : accounts) {
denominatedValue = ValueExtensionsKt.toStringWithUnit(account.getAccountBalance().getSpendable(), _mbwManager.getDenomination(_mbwManager.getSelectedAccount().getCoinType()));
denominatedValue = ValueExtensionsKt.toStringWithUnit(account.getAccountBalance().getSpendable(), _mbwManager.getDenomination(account.getCoinType()));
result.add(account.getLabel() + " (" + denominatedValue + ")");
}
result.add("Create new account");
return result;
}

private void showERC20TokensOptions(UUID ethAccountId) {
/**
* After selecting the desired erc20 token depending on whether ethAccountId is null or not
* we create or don't create new ethereum account before creating erc20 account.
* @param ethAccountId if it's null we would need to create new ethereum account first
* before creating erc20 account
*/
private void showERC20TokensOptions(@Nullable UUID ethAccountId) {
if (getAvailableTokens(ethAccountId).isEmpty()) {
_toaster.toast("All supported tokens for this account are already added", true);
return;
Expand All @@ -207,12 +212,15 @@ private void showERC20TokensOptions(UUID ethAccountId) {
AlertDialog.Builder dialogBuilder = getSingleChoiceDialog("Select Token", arrayAdapter);
dialogBuilder.setPositiveButton("ok", (dialog, which) -> {
String strName = arrayAdapter.getItem(selectedIndex);
EthAccount ethAccount = (EthAccount) _mbwManager.getWalletManager(false).getAccount(ethAccountId);
if (ethAccount.isEnabledToken(strName)) {
setResult(RESULT_CANCELED);
finish();
} else {
if (ethAccountId != null) {
EthAccount ethAccount = (EthAccount) _mbwManager.getWalletManager(false).getAccount(ethAccountId);
new ERC20CreationAsyncTask(getAvailableTokens(ethAccountId).get(strName), ethAccount).execute();
} else {
// we need new ethereum account, so create it first and erc20 account after. pass which token we want to create then
if (ethCreationAsyncTask == null || ethCreationAsyncTask.getStatus() != AsyncTask.Status.RUNNING) {
ethCreationAsyncTask = new ETHCreationAsyncTask(getAvailableTokens(null).get(strName));
ethCreationAsyncTask.execute();
}
}
});
dialogBuilder.show();
Expand Down Expand Up @@ -294,10 +302,10 @@ protected void onPostExecute(UUID account) {
}

private class ETHCreationAsyncTask extends AsyncTask<Void, Integer, UUID> {
boolean callERC20CreationDialog;
ERC20Token token;

ETHCreationAsyncTask(boolean callERC20CreationDialog) {
this.callERC20CreationDialog = callERC20CreationDialog;
ETHCreationAsyncTask(@Nullable ERC20Token token) {
this.token = token;
}

@Override
Expand All @@ -313,14 +321,15 @@ protected UUID doInBackground(Void... params) {
}

@Override
protected void onPostExecute(UUID account) {
protected void onPostExecute(UUID accountId) {
_progress.dismiss();
MbwManager.getEventBus().post(new AccountCreated(account));
MbwManager.getEventBus().post(new AccountChanged(account));
if (callERC20CreationDialog) {
showERC20TokensOptions(account);
MbwManager.getEventBus().post(new AccountCreated(accountId));
MbwManager.getEventBus().post(new AccountChanged(accountId));
if (token != null) {
EthAccount ethAccount = (EthAccount) _mbwManager.getWalletManager(false).getAccount(accountId);
new ERC20CreationAsyncTask(token, ethAccount).execute();
} else {
finishOk(account);
finishOk(accountId);
}
}
}
Expand All @@ -329,7 +338,7 @@ private class ERC20CreationAsyncTask extends AsyncTask<Void, Integer, UUID> {
ERC20Token token;
EthAccount ethAccount;

ERC20CreationAsyncTask(ERC20Token token, EthAccount ethAccount) {
ERC20CreationAsyncTask(@NonNull ERC20Token token, @NonNull EthAccount ethAccount) {
this.token = token;
this.ethAccount = ethAccount;
}
Expand All @@ -347,13 +356,13 @@ protected UUID doInBackground(Void... params) {
}

@Override
protected void onPostExecute(UUID account) {
protected void onPostExecute(UUID accountId) {
_progress.dismiss();
_mbwManager.getMetadataStorage().setOtherAccountBackupState(account, MetadataStorage.BackupState.IGNORED);
MbwManager.getEventBus().post(new AccountCreated(account));
MbwManager.getEventBus().post(new AccountChanged(account));
_mbwManager.getMetadataStorage().setOtherAccountBackupState(accountId, MetadataStorage.BackupState.IGNORED);
MbwManager.getEventBus().post(new AccountCreated(accountId));
MbwManager.getEventBus().post(new AccountChanged(accountId));
ethAccount.addEnabledToken(token.getName());
finishOk(account);
finishOk(accountId);
}
}

Expand Down

0 comments on commit 30ff408

Please sign in to comment.