diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0258a50..b185b0d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,8 +18,7 @@ android:configChanges="locale" android:theme="@style/AppTheme"> + android:name=".activities.LicenseActivity"> @@ -31,7 +30,7 @@ android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppTheme.NoActionBar"> diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/BackupSeedActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/BackupSeedActivity.java index 15b7d6b..1e4ebbc 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/BackupSeedActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/BackupSeedActivity.java @@ -18,6 +18,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.fragments.BackupsSettingsFragment; import cy.agorise.crystalwallet.models.AccountSeed; import cy.agorise.crystalwallet.viewmodels.AccountSeedViewModel; @@ -28,7 +29,7 @@ public class BackupSeedActivity extends AppCompatActivity { @BindView(R.id.tvBrainKey) TextView textfieldBrainkey; - @BindView(R.id.btnOk) + @BindView(R.id.btnCancel) Button btnOk; @BindView(R.id.btnCopy) Button btnCopy; @@ -60,14 +61,14 @@ public class BackupSeedActivity extends AppCompatActivity { accountSeedViewModel.loadSeed(seedId); } else { + finish(); } } - @OnClick(R.id.btnOk) + @OnClick(R.id.btnCancel) public void btnOkClick(){ - Intent intent = new Intent(this, IntroActivity.class); - startActivity(intent); + finish(); } /* diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/CreateSeedActivity.kt b/app/src/main/java/cy/agorise/crystalwallet/activities/CreateSeedActivity.kt index b1b86ba..5eb9400 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/CreateSeedActivity.kt +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/CreateSeedActivity.kt @@ -13,6 +13,7 @@ import cy.agorise.crystalwallet.R import cy.agorise.crystalwallet.dialogs.material.CrystalDialog import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests import cy.agorise.crystalwallet.requestmanagers.ValidateCreateBitsharesAccountRequest +import cy.agorise.crystalwallet.requestmanagers.ValidateExistBitsharesAccountRequest import cy.agorise.crystalwallet.viewmodels.validators.customImpl.interfaces.UIValidatorListener import cy.agorise.crystalwallet.viewmodels.validators.customImpl.validationFields.BitsharesAccountNameValidation import cy.agorise.crystalwallet.viewmodels.validators.customImpl.validationFields.BitsharesAccountNameValidation.OnAccountExist @@ -62,16 +63,12 @@ class CreateSeedActivity : CustomActivity() { runOnUiThread { val customTextInputEditText = customValidationField.currentView as CustomTextInputEditText customTextInputEditText.error = null + customTextInputEditText.fieldValidatorModel.setValid() } } catch (e: Exception) { e.printStackTrace() } - - /* - * Validate if can continue - * */ - validateFieldsToContinue() } override fun onValidationFailed(customValidationField: CustomValidationField) { @@ -82,6 +79,7 @@ class CreateSeedActivity : CustomActivity() { runOnUiThread { val customTextInputEditText = customValidationField.currentView as CustomTextInputEditText customTextInputEditText.error = customTextInputEditText.fieldValidatorModel.message + customTextInputEditText.fieldValidatorModel.setInvalid() } } } @@ -131,6 +129,8 @@ class CreateSeedActivity : CustomActivity() { * Validate continue to create account * */ validateFieldsToContinue() + + } @OnTextChanged(value = R.id.tietPinConfirmation, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) @@ -148,9 +148,9 @@ class CreateSeedActivity : CustomActivity() { this.fieldsValidator.validate() /* - * Always disable till the server response comes + * Validate continue to create account * */ - disableCreate() + validateFieldsToContinue() } @OnClick(R.id.btnCancel) @@ -221,8 +221,59 @@ class CreateSeedActivity : CustomActivity() { * If the result is true so the user can continue to the creation of the account * */ if (result) { - enableCreate() + + /* + * Show the dialog for connection with the server + * */ + val creatingAccountMaterialDialog = CrystalDialog(globalActivity) + creatingAccountMaterialDialog.setText(globalActivity.resources.getString(R.string.window_create_seed_Server_validation)) + creatingAccountMaterialDialog.progress() + creatingAccountMaterialDialog.show() + + /* + * Validate the account does not exists + * */ + val request = ValidateExistBitsharesAccountRequest(tietAccountName?.text.toString()) + request.setListener { + + /* + * Dismiss the dialog of loading + * */ + creatingAccountMaterialDialog.dismiss() + + if (request.accountExists) { + + /* + * The account exists and is not valid + * */ + tietAccountName.fieldValidatorModel.setInvalid() + tietAccountName.fieldValidatorModel.message = tietAccountName.resources.getString(R.string.account_name_already_exist) + + /* + * Disaible button create + * */ + disableCreate() + + } else { + + /* + * Passed all validations + * */ + tietAccountName.fieldValidatorModel.setValid() + + /* + * Enable button create + * */ + enableCreate() + } + } + CryptoNetInfoRequests.getInstance().addRequest(request) + } else { + + /* + * Disaible button create + * */ disableCreate() } } diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java index 26e3541..8e75c1a 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java @@ -1,22 +1,31 @@ package cy.agorise.crystalwallet.activities; import android.arch.lifecycle.ViewModelProviders; +import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; +import android.widget.Toast; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnTextChanged; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.enums.CryptoNet; import cy.agorise.crystalwallet.enums.SeedType; +import cy.agorise.crystalwallet.manager.BitsharesAccountManager; import cy.agorise.crystalwallet.models.AccountSeed; import cy.agorise.crystalwallet.models.CryptoNetAccount; +import cy.agorise.crystalwallet.models.GrapheneAccount; import cy.agorise.crystalwallet.models.GrapheneAccountInfo; +import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestListener; +import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests; +import cy.agorise.crystalwallet.requestmanagers.ImportBackupRequest; +import cy.agorise.crystalwallet.requestmanagers.ValidateImportBitsharesAccountRequest; import cy.agorise.crystalwallet.viewmodels.AccountSeedViewModel; import cy.agorise.crystalwallet.viewmodels.CryptoNetAccountViewModel; import cy.agorise.crystalwallet.viewmodels.GrapheneAccountInfoViewModel; @@ -100,7 +109,46 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator @OnClick(R.id.btnImport) public void importSeed(){ + final ImportSeedActivity thisActivity = this; + if (this.importSeedValidator.isValid()) { + + final ValidateImportBitsharesAccountRequest validatorRequest = + new ValidateImportBitsharesAccountRequest(etAccountName.getText().toString(), etSeedWords.getText().toString(), getApplicationContext(), true); + + validatorRequest.setListener(new CryptoNetInfoRequestListener() { + @Override + public void onCarryOut() { + if (!validatorRequest.getStatus().equals(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED)) { + String errorText = "An error ocurred attempting to import the account"; + + switch (validatorRequest.getStatus()){ + case PETITION_FAILED: + case NO_INTERNET: + case NO_SERVER_CONNECTION: + errorText = "There was an error with the connection. Try again later"; + break; + case ACCOUNT_DOESNT_EXIST: + errorText = "The account doesn't exists"; + break; + case BAD_SEED: + errorText = "The seed is not valid"; + break; + case NO_ACCOUNT_DATA: + errorText = "The account doesn't have any data"; + break; + } + + Toast.makeText(thisActivity.getApplicationContext(),errorText,Toast.LENGTH_LONG).show(); + } else { + Intent intent = new Intent(thisActivity, BoardActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + } + }); + /*CryptoNetInfoRequests.getInstance().addRequest(validatorRequest); + AccountSeed seed = new AccountSeed(); //TODO verify if words are already in the db @@ -122,7 +170,8 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator grapheneAccountInfo.setName(etAccountName.getText().toString()); grapheneAccountInfoViewModel.addGrapheneAccountInfo(grapheneAccountInfo); - this.finish(); + this.finish();*/ + CryptoNetInfoRequests.getInstance().addRequest(validatorRequest); } } diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java index 50968fa..f0e00d3 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java @@ -158,5 +158,6 @@ public class IntroActivity extends CustomActivity { // Create and show the dialog. ImportAccountOptionsFragment newFragment = ImportAccountOptionsFragment.newInstance(); newFragment.show(ft, "importAccountOptions"); + newFragment.setIntroActivity(globalActivity); //This activity should close when import succeds } } diff --git a/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java b/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java index 575a75c..de1a19e 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java +++ b/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java @@ -8,6 +8,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; +import cy.agorise.crystalwallet.application.constant.BitsharesConstant; import cy.agorise.crystalwallet.dao.BitsharesAssetDao; import cy.agorise.crystalwallet.dao.CryptoCoinBalanceDao; import cy.agorise.crystalwallet.dao.CryptoCurrencyDao; @@ -78,17 +79,15 @@ public abstract class GrapheneApiGenerator { /** * This is used for manager each listener in the subscription thread */ - private static HashMap currentBitsharesListener = new HashMap<>(); - - + private static HashMap currentBitsharesListener = new HashMap<>(); /** * Retrieves the data of an account searching by it's id * * @param accountId The accountId to retrieve - * @param request The Api request object, to answer this petition + * @param request The Api request object, to answer this petition */ - public static void getAccountById(String accountId, final ApiRequest request) { + public static void getAccountById(String accountId, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetAccounts(accountId, new WitnessResponseListener() { @Override @@ -97,7 +96,7 @@ public abstract class GrapheneApiGenerator { List list = (List) response.result; if (list.size() > 0) { if (list.get(0).getClass() == AccountProperties.class) { - request.getListener().success(list.get(0), request.getId()); + request.getListener().success(list.get(0),request.getId()); return; } } @@ -109,7 +108,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -119,20 +118,17 @@ public abstract class GrapheneApiGenerator { * @param address The address to retrieve * @param request The Api request object, to answer this petition */ - public static void getAccountByOwnerOrActiveAddress(Address address, final ApiRequest request) { + public static void getAccountByOwnerOrActiveAddress(Address address, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetKeyReferences(address, true, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { final List> resp = (List>) response.result; - if (resp.size() > 0) { + if(resp.size() > 0){ List accounts = resp.get(0); - if (accounts.size() > 0) { - for (UserAccount account : accounts) { - request.getListener().success(account, request.getId()); - } - } - } + if(accounts.size() > 0){ + for(UserAccount account : accounts) { + request.getListener().success(account,request.getId());}}} request.getListener().fail(request.getId()); } @@ -140,7 +136,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -149,25 +145,25 @@ public abstract class GrapheneApiGenerator { * Gets the Transaction for an Account * * @param accountGrapheneId The account id to search - * @param start The start index of the transaction list - * @param stop The stop index of the transaction list - * @param limit the maximun transactions to retrieve - * @param request The Api request object, to answer this petition + * @param start The start index of the transaction list + * @param stop The stop index of the transaction list + * @param limit the maximun transactions to retrieve + * @param request The Api request object, to answer this petition */ public static void getAccountTransaction(String accountGrapheneId, int start, int stop, - int limit, final ApiRequest request) { + int limit, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetRelativeAccountHistory(new UserAccount(accountGrapheneId), start, limit, stop, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - request.getListener().success(response.result, request.getId()); + request.getListener().success(response.result,request.getId()); } @Override public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -175,18 +171,18 @@ public abstract class GrapheneApiGenerator { * Retrieves the account id by the name of the account * * @param accountName The account Name to find - * @param request The Api request object, to answer this petition + * @param request The Api request object, to answer this petition */ - public static void getAccountByName(String accountName, final ApiRequest request) { + public static void getAccountByName(String accountName, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetAccountByName(accountName, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - AccountProperties accountProperties = (AccountProperties) response.result; - if (accountProperties == null) { + AccountProperties accountProperties = (AccountProperties)response.result; + if(accountProperties == null){ request.getListener().fail(request.getId()); - } else { - request.getListener().success(accountProperties, request.getId()); + }else{ + request.getListener().success(accountProperties,request.getId()); } } @@ -194,7 +190,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -202,18 +198,18 @@ public abstract class GrapheneApiGenerator { * Retrieves the account id by the name of the account * * @param accountName The account Name to find - * @param request The Api request object, to answer this petition + * @param request The Api request object, to answer this petition */ - public static void getAccountIdByName(String accountName, final ApiRequest request) { + public static void getAccountIdByName(String accountName, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetAccountByName(accountName, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - AccountProperties accountProperties = (AccountProperties) response.result; - if (accountProperties == null) { - request.getListener().success(null, request.getId()); - } else { - request.getListener().success(accountProperties.id, request.getId()); + AccountProperties accountProperties = (AccountProperties)response.result; + if(accountProperties == null){ + request.getListener().success(null,request.getId()); + }else{ + request.getListener().success(accountProperties.id,request.getId()); } } @@ -221,7 +217,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -229,23 +225,23 @@ public abstract class GrapheneApiGenerator { * Broadcast a transaction, this is use for sending funds * * @param transaction The graphene transaction - * @param feeAsset The feeAseet, this needs only the id of the asset - * @param request the api request object, to answer this petition + * @param feeAsset The feeAseet, this needs only the id of the asset + * @param request the api request object, to answer this petition */ public static void broadcastTransaction(Transaction transaction, Asset feeAsset, - final ApiRequest request) { + final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new TransactionBroadcastSequence(transaction, feeAsset, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - request.getListener().success(true, request.getId()); + request.getListener().success(true,request.getId()); } @Override public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -253,20 +249,20 @@ public abstract class GrapheneApiGenerator { * This gets the asset information using only the asset name * * @param assetNames The list of the names of the assets to be retrieve - * @param request the api request object, to answer this petition + * @param request the api request object, to answer this petition */ - public static void getAssetByName(ArrayList assetNames, final ApiRequest request) { + public static void getAssetByName(ArrayList assetNames, final ApiRequest request){ - WebSocketThread thread = new WebSocketThread(new LookupAssetSymbols(assetNames, true, + WebSocketThread thread = new WebSocketThread(new LookupAssetSymbols(assetNames,true, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { List assets = (List) response.result; - if (assets.size() <= 0) { + if(assets.size() <= 0){ request.getListener().fail(request.getId()); - } else { + }else{ ArrayList responseAssets = new ArrayList<>(); - for (Asset asset : assets) { + for(Asset asset: assets){ //TODO asset type BitsharesAsset.Type assetType = BitsharesAsset.Type.UIA; /*if(asset.getAssetType().equals(Asset.AssetType.CORE_ASSET)){ @@ -279,10 +275,10 @@ public abstract class GrapheneApiGenerator { assetType = BitsharesAsset.Type.PREDICTION_MARKET; }*/ BitsharesAsset responseAsset = new BitsharesAsset(asset.getSymbol(), - asset.getPrecision(), asset.getObjectId(), assetType); + asset.getPrecision(),asset.getObjectId(),assetType); responseAssets.add(responseAsset); } - request.getListener().success(responseAssets, request.getId()); + request.getListener().success(responseAssets,request.getId()); } } @@ -290,32 +286,31 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } /** * Gets the asset ifnormation using the id of the net - * * @param assetIds The list of the ids to retrieve - * @param request the api request object, to answer this petition + * @param request the api request object, to answer this petition */ - public static void getAssetById(ArrayList assetIds, final ApiRequest request) { + public static void getAssetById(ArrayList assetIds, final ApiRequest request){ ArrayList assets = new ArrayList<>(); - for (String assetId : assetIds) { + for(String assetId : assetIds){ Asset asset = new Asset(assetId); assets.add(asset); } - WebSocketThread thread = new WebSocketThread(new LookupAssetSymbols(assets, true, new WitnessResponseListener() { + WebSocketThread thread = new WebSocketThread(new LookupAssetSymbols(assets,true, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { List assets = (List) response.result; - if (assets.size() <= 0) { + if(assets.size() <= 0){ request.getListener().fail(request.getId()); - } else { + }else{ ArrayList responseAssets = new ArrayList<>(); - for (Asset asset : assets) { + for(Asset asset: assets){ //TODO asset type BitsharesAsset.Type assetType = BitsharesAsset.Type.UIA; /*if(asset.getAssetType().equals(Asset.AssetType.CORE_ASSET)){ @@ -328,10 +323,10 @@ public abstract class GrapheneApiGenerator { assetType = BitsharesAsset.Type.PREDICTION_MARKET; }*/ BitsharesAsset responseAsset = new BitsharesAsset(asset.getSymbol(), - asset.getPrecision(), asset.getObjectId(), assetType); + asset.getPrecision(),asset.getObjectId(),assetType); responseAssets.add(responseAsset); } - request.getListener().success(responseAssets, request.getId()); + request.getListener().success(responseAssets,request.getId()); } } @@ -339,20 +334,20 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } /** * Subscribe a bitshares account to receive real time updates * - * @param accountId The id opf the database of the account - * @param accountBitsharesId The bitshares id of the account - * @param context The android context of this application + * @param accountId The id opf the database of the account + * @param accountBitsharesId The bitshares id of the account + * @param context The android context of this application */ public static void subscribeBitsharesAccount(final long accountId, final String accountBitsharesId, - final Context context) { - if (!currentBitsharesListener.containsKey(accountId)) { + final Context context){ + if(!currentBitsharesListener.containsKey(accountId)){ CrystalDatabase db = CrystalDatabase.getAppDatabase(context); final BitsharesAssetDao bitsharesAssetDao = db.bitsharesAssetDao(); final CryptoCurrencyDao cryptoCurrencyDao = db.cryptoCurrencyDao(); @@ -365,15 +360,15 @@ public abstract class GrapheneApiGenerator { @Override public void onSubscriptionUpdate(SubscriptionResponse response) { List updatedObjects = (List) response.params.get(1); - if (updatedObjects.size() > 0) { - for (Serializable update : updatedObjects) { - if (update instanceof BroadcastedTransaction) { + if(updatedObjects.size() > 0){ + for(Serializable update : updatedObjects){ + if(update instanceof BroadcastedTransaction){ BroadcastedTransaction transactionUpdate = (BroadcastedTransaction) update; - for (BaseOperation operation : transactionUpdate.getTransaction().getOperations()) { - if (operation instanceof TransferOperation) { + for(BaseOperation operation : transactionUpdate.getTransaction().getOperations()){ + if(operation instanceof TransferOperation){ final TransferOperation tOperation = (TransferOperation) operation; - if (tOperation.getFrom().getObjectId().equals(accountBitsharesId) || tOperation.getTo().getObjectId().equals(accountBitsharesId)) { - GrapheneApiGenerator.getAccountBalance(accountId, accountBitsharesId, context); + if(tOperation.getFrom().getObjectId().equals(accountBitsharesId) || tOperation.getTo().getObjectId().equals(accountBitsharesId)){ + GrapheneApiGenerator.getAccountBalance(accountId,accountBitsharesId,context); final CryptoCoinTransaction transaction = new CryptoCoinTransaction(); transaction.setAccountId(accountId); transaction.setAmount(tOperation.getAssetAmount().getAmount().longValue()); @@ -384,13 +379,13 @@ public abstract class GrapheneApiGenerator { @Override public void success(Object answer, int idPetition) { ArrayList assets = (ArrayList) answer; - for (BitsharesAsset asset : assets) { + for(BitsharesAsset asset : assets){ long idCryptoCurrency = cryptoCurrencyDao.insertCryptoCurrency(asset)[0]; BitsharesAssetInfo info = new BitsharesAssetInfo(asset); info.setCryptoCurrencyId(idCryptoCurrency); - asset.setId((int) idCryptoCurrency); + asset.setId((int)idCryptoCurrency); bitsharesAssetDao.insertBitsharesAssetInfo(info); - saveTransaction(transaction, cryptoCurrencyDao.getById(info.getCryptoCurrencyId()), accountBitsharesId, tOperation, context); + saveTransaction(transaction,cryptoCurrencyDao.getById(info.getCryptoCurrencyId()),accountBitsharesId,tOperation,context); } } @@ -401,9 +396,9 @@ public abstract class GrapheneApiGenerator { }); ArrayList assets = new ArrayList<>(); assets.add(tOperation.getAssetAmount().getAsset().getObjectId()); - GrapheneApiGenerator.getAssetById(assets, assetRequest); - } else { - saveTransaction(transaction, cryptoCurrencyDao.getById(info.getCryptoCurrencyId()), accountBitsharesId, tOperation, context); + GrapheneApiGenerator.getAssetById(assets,assetRequest); + }else{ + saveTransaction(transaction,cryptoCurrencyDao.getById(info.getCryptoCurrencyId()),accountBitsharesId,tOperation,context); } } } @@ -415,62 +410,56 @@ public abstract class GrapheneApiGenerator { } }; - currentBitsharesListener.put(accountId, balanceListener); + currentBitsharesListener.put(accountId,balanceListener); bitsharesSubscriptionHub.addSubscriptionListener(balanceListener); - try { - if (!subscriptionThread.isConnected() && !subscriptionThread.isAlive()) { - subscriptionThread.start(); - - } else if (bitsharesSubscriptionHub != null && !bitsharesSubscriptionHub.isSubscribed()) { - bitsharesSubscriptionHub.resubscribe(); - } - } catch (Exception e) { - e.printStackTrace(); + if(!subscriptionThread.isConnected()){ + subscriptionThread.start(); + }else if(!bitsharesSubscriptionHub.isSubscribed()){ + bitsharesSubscriptionHub.resubscribe(); } } } /** * Function to save a transaction retrieved from the update - * - * @param transaction The transaction db object - * @param currency The currency of the transaccion + * @param transaction The transaction db object + * @param currency The currency of the transaccion * @param accountBitsharesId The id of the account in the bitshares network - * @param tOperation The transfer operation fetched from the update - * @param context The context of this app + * @param tOperation The transfer operation fetched from the update + * @param context The context of this app */ private static void saveTransaction(CryptoCoinTransaction transaction, CryptoCurrency currency, - String accountBitsharesId, TransferOperation tOperation, - Context context) { - transaction.setIdCurrency((int) currency.getId()); + String accountBitsharesId, TransferOperation tOperation , + Context context){ + transaction.setIdCurrency((int)currency.getId()); transaction.setConfirmed(true); //graphene transaction are always confirmed transaction.setFrom(tOperation.getFrom().getObjectId()); transaction.setInput(!tOperation.getFrom().getObjectId().equals(accountBitsharesId)); transaction.setTo(tOperation.getTo().getObjectId()); transaction.setDate(new Date()); CrystalDatabase.getAppDatabase(context).transactionDao().insertTransaction(transaction); - if (transaction.getInput()) { - CryptoNetEvents.getInstance().fireEvent(new ReceivedFundsCryptoNetEvent(transaction.getAccount(), currency, transaction.getAmount())); + if(transaction.getInput()){ + CryptoNetEvents.getInstance().fireEvent(new ReceivedFundsCryptoNetEvent(transaction.getAccount(),currency,transaction.getAmount())); } } /** * Cancels all bitshares account subscriptions */ - public static void cancelBitsharesAccountSubscriptions() { + public static void cancelBitsharesAccountSubscriptions(){ bitsharesSubscriptionHub.cancelSubscriptions(); } /** * Retrieve the account balance of an account * - * @param accountId The dataabase id of the account + * @param accountId The dataabase id of the account * @param accountGrapheneId The bitshares id of the account - * @param context The android context of this application + * @param context The android context of this application */ public static void getAccountBalance(final long accountId, final String accountGrapheneId, - final Context context) { + final Context context){ CrystalDatabase db = CrystalDatabase.getAppDatabase(context); final CryptoCoinBalanceDao balanceDao = db.cryptoCoinBalanceDao(); @@ -481,19 +470,19 @@ public abstract class GrapheneApiGenerator { @Override public void onSuccess(WitnessResponse response) { List balances = (List) response.result; - for (final AssetAmount balance : balances) { + for(final AssetAmount balance : balances){ final CryptoCoinBalance ccBalance = new CryptoCoinBalance(); ccBalance.setAccountId(accountId); ccBalance.setBalance(balance.getAmount().longValue()); BitsharesAssetInfo assetInfo = bitsharesAssetDao.getBitsharesAssetInfoById(balance.getAsset().getObjectId()); - if (assetInfo == null) { + if(assetInfo == null ){ ArrayList idAssets = new ArrayList<>(); idAssets.add(balance.getAsset().getObjectId()); ApiRequest getAssetRequest = new ApiRequest(1, new ApiRequestListener() { @Override public void success(Object answer, int idPetition) { List assets = (List) answer; - for (BitsharesAsset asset : assets) { + for(BitsharesAsset asset : assets) { BitsharesAssetInfo info = new BitsharesAssetInfo(asset); long[] cryptoCurrencyId = cryptoCurrencyDao.insertCryptoCurrency((CryptoCurrency) asset); info.setCryptoCurrencyId(cryptoCurrencyId[0]); @@ -507,9 +496,9 @@ public abstract class GrapheneApiGenerator { public void fail(int idPetition) { } }); - getAssetById(idAssets, getAssetRequest); + getAssetById(idAssets,getAssetRequest); - } else { + }else { ccBalance.setCryptoCurrencyId(assetInfo.getCryptoCurrencyId()); balanceDao.insertCryptoCoinBalance(ccBalance); @@ -521,7 +510,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); @@ -531,15 +520,15 @@ public abstract class GrapheneApiGenerator { * Gets the date time of a block header * * @param blockHeader The block header to retrieve the date time - * @param request the api request object, to answer this petition + * @param request the api request object, to answer this petition */ - public static void getBlockHeaderTime(long blockHeader, final ApiRequest request) { + public static void getBlockHeaderTime(long blockHeader, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetBlockHeader(blockHeader, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - if (response == null) { + if(response == null){ request.getListener().fail(request.getId()); - } else { + }else { request.getListener().success(response.result, request.getId()); } } @@ -548,7 +537,7 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); + }),CryptoNetManager.getURL(CryptoNet.BITSHARES)); thread.start(); } @@ -556,21 +545,21 @@ public abstract class GrapheneApiGenerator { /** * Gets a single equivalent value * - * @param baseId The base asset bistshares id + * @param baseId The base asset bistshares id * @param quoteId the quote asset bitshares id * @param request the api request object, to answer this petition */ - public static void getEquivalentValue(final String baseId, String quoteId, final ApiRequest request) { + public static void getEquivalentValue(final String baseId, String quoteId, final ApiRequest request){ WebSocketThread thread = new WebSocketThread(new GetLimitOrders(baseId, quoteId, 10, new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { List orders = (List) response.result; - if (orders.size() <= 0) { + if(orders.size()<= 0){ //TODO indirect equivalent value } - for (LimitOrder order : orders) { - if (order.getSellPrice().base.getAsset().getBitassetId().equals(baseId)) { + for(LimitOrder order : orders){ + if(order.getSellPrice().base.getAsset().getBitassetId().equals(baseId)) { Converter converter = new Converter(); double equiValue = converter.getConversionRate(order.getSellPrice(), Converter.BASE_TO_QUOTE); @@ -584,23 +573,23 @@ public abstract class GrapheneApiGenerator { public void onError(BaseResponse.Error error) { request.getListener().fail(request.getId()); } - }), CryptoNetManager.getURL(CryptoNet.BITSHARES)); //todo change equivalent url for current server url + }), BitsharesConstant.EQUIVALENT_URL); //todo change equivalent url for current server url thread.start(); } /** * Gets equivalent value and store it on the database * - * @param baseAsset The baset asset as a bitshares asset, it needs the CryptoCurrency and thge BitsharesInfo + * @param baseAsset The baset asset as a bitshares asset, it needs the CryptoCurrency and thge BitsharesInfo * @param quoteAssets The list of the qutoe assets as a full bitshares asset object - * @param context The android context of this application + * @param context The android context of this application */ public static void getEquivalentValue(BitsharesAsset baseAsset, - final List quoteAssets, final Context context) { - for (BitsharesAsset quoteAsset : quoteAssets) { + final List quoteAssets, final Context context){ + for(BitsharesAsset quoteAsset : quoteAssets){ WebSocketThread thread = new WebSocketThread(new GetLimitOrders(baseAsset.getBitsharesId(), quoteAsset.getBitsharesId(), 10, new EquivalentValueListener(baseAsset, - quoteAsset, context)), CryptoNetManager.getURL(CryptoNet.BITSHARES)); //todo change equivalent url for current server url + quoteAsset,context)), BitsharesConstant.EQUIVALENT_URL); //todo change equivalent url for current server url thread.start(); } } @@ -609,25 +598,25 @@ public abstract class GrapheneApiGenerator { * Retrieves the equivalent value from a list of assets to a base asset * * @param baseAssetName The base asset to use - * @param quoteAssets The list of quotes assets to query - * @param context The Context of this Application + * @param quoteAssets The list of quotes assets to query + * @param context The Context of this Application */ - public static void getEquivalentValue(String baseAssetName, final List quoteAssets, final Context context) { + public static void getEquivalentValue(String baseAssetName, final List quoteAssets, final Context context){ CrystalDatabase db = CrystalDatabase.getAppDatabase(context); final CryptoCurrencyDao cryptoCurrencyDao = db.cryptoCurrencyDao(); final BitsharesAssetDao bitsharesAssetDao = db.bitsharesAssetDao(); CryptoCurrency baseCurrency = cryptoCurrencyDao.getByName(baseAssetName); BitsharesAssetInfo info = null; - if (baseCurrency != null) { + if(baseCurrency != null){ info = db.bitsharesAssetDao().getBitsharesAssetInfo(baseCurrency.getId()); } - if (baseCurrency == null || info == null) { + if(baseCurrency == null || info == null){ ApiRequest getAssetRequest = new ApiRequest(1, new ApiRequestListener() { @Override public void success(Object answer, int idPetition) { - if (answer instanceof BitsharesAsset) { + if(answer instanceof BitsharesAsset){ BitsharesAssetInfo info = new BitsharesAssetInfo((BitsharesAsset) answer); - long cryptoCurrencyId = cryptoCurrencyDao.insertCryptoCurrency((CryptoCurrency) answer)[0]; + long cryptoCurrencyId = cryptoCurrencyDao.insertCryptoCurrency((CryptoCurrency)answer )[0]; info.setCryptoCurrencyId(cryptoCurrencyId); bitsharesAssetDao.insertBitsharesAssetInfo(info); GrapheneApiGenerator.getEquivalentValue((BitsharesAsset) answer, quoteAssets, context); @@ -641,12 +630,12 @@ public abstract class GrapheneApiGenerator { }); ArrayList names = new ArrayList<>(); names.add(baseAssetName); - GrapheneApiGenerator.getAssetByName(names, getAssetRequest); + GrapheneApiGenerator.getAssetByName(names,getAssetRequest); - } else { + }else { BitsharesAsset baseAsset = new BitsharesAsset(baseCurrency); baseAsset.loadInfo(info); - getEquivalentValue(baseAsset, quoteAssets, context); + getEquivalentValue(baseAsset,quoteAssets,context); } @@ -655,7 +644,7 @@ public abstract class GrapheneApiGenerator { /** * Listener of the equivalent value the answer is stored in the database, for use in conjuntion with LiveData */ - private static class EquivalentValueListener implements WitnessResponseListener { + private static class EquivalentValueListener implements WitnessResponseListener{ /** * The base asset */ @@ -678,10 +667,10 @@ public abstract class GrapheneApiGenerator { @Override public void onSuccess(WitnessResponse response) { List orders = (List) response.result; - if (orders.size() <= 0) { + if(orders.size()<= 0){ //TODO indirect equivalent value } - for (LimitOrder order : orders) { + for(LimitOrder order : orders){ try { //if (order.getSellPrice().base.getAsset().getBitassetId().equals(baseAsset.getBitsharesId())) { Converter converter = new Converter(); @@ -692,7 +681,7 @@ public abstract class GrapheneApiGenerator { CrystalDatabase.getAppDatabase(context).cryptoCurrencyEquivalenceDao().insertCryptoCurrencyEquivalence(equivalence); break; //} - } catch (Exception e) { + }catch(Exception e){ e.printStackTrace(); } } @@ -703,4 +692,5 @@ public abstract class GrapheneApiGenerator { } } -} + +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/dialogs/material/DialogMaterial.kt b/app/src/main/java/cy/agorise/crystalwallet/dialogs/material/DialogMaterial.kt index 973081c..9f43713 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/dialogs/material/DialogMaterial.kt +++ b/app/src/main/java/cy/agorise/crystalwallet/dialogs/material/DialogMaterial.kt @@ -43,6 +43,7 @@ open abstract class DialogMaterial{ * Init the builder * */ builder = MaterialDialog.Builder(activity) + builder.cancelable(false) } /* diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java index f20f11e..66dd34e 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java @@ -2,6 +2,7 @@ package cy.agorise.crystalwallet.fragments; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.Observer; +import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; @@ -24,6 +25,8 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.activities.BackupSeedActivity; +import cy.agorise.crystalwallet.activities.IntroActivity; import cy.agorise.crystalwallet.dao.CrystalDatabase; import cy.agorise.crystalwallet.models.GeneralSetting; import cy.agorise.crystalwallet.requestmanagers.CreateBackupRequest; @@ -47,6 +50,9 @@ public class BackupsSettingsFragment extends Fragment{ return fragment; } + @BindView(R.id.btnBrainkey) + public Button btnBrainkey; + @BindView(R.id.tvBinFile) public TextView tvBinFile; @@ -81,6 +87,15 @@ public class BackupsSettingsFragment extends Fragment{ return ssb; } + + @OnClick(R.id.btnBrainkey) + public void btnBrainOnClick(){ + + Intent intent = new Intent(getContext(), BackupSeedActivity.class); + startActivity(intent); + } + + @OnClick(R.id.btnBinFile) public void makeBackupFile(){ if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/ImportAccountOptionsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/ImportAccountOptionsFragment.java index ca278d5..6d3fe60 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/ImportAccountOptionsFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/ImportAccountOptionsFragment.java @@ -1,12 +1,15 @@ package cy.agorise.crystalwallet.fragments; +import android.app.Activity; import android.app.Dialog; +import android.arch.lifecycle.ViewModelProviders; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; @@ -22,12 +25,16 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.activities.BoardActivity; import cy.agorise.crystalwallet.activities.ImportSeedActivity; import cy.agorise.crystalwallet.activities.IntroActivity; +import cy.agorise.crystalwallet.dialogs.material.CrystalDialog; +import cy.agorise.crystalwallet.dialogs.material.DialogMaterial; import cy.agorise.crystalwallet.requestmanagers.FileServiceRequestListener; import cy.agorise.crystalwallet.requestmanagers.FileServiceRequests; import cy.agorise.crystalwallet.requestmanagers.ImportBackupRequest; import cy.agorise.crystalwallet.util.UriTranslator; +import cy.agorise.crystalwallet.viewmodels.AccountSeedListViewModel; import static android.app.Activity.RESULT_OK; @@ -45,6 +52,21 @@ public class ImportAccountOptionsFragment extends DialogFragment { @BindView(R.id.btnImportBackup) Button btnImportBackup; + + /* + Dialog for loading + */ + private CrystalDialog crystalDialog; + + /* + * Contains the activity to close in case import succed + * */ + private Activity introActivity; + + + + + public ImportAccountOptionsFragment() { // Required empty public constructor } @@ -141,14 +163,30 @@ public class ImportAccountOptionsFragment extends DialogFragment { @Override public void run() { if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.SUCCEEDED) { - Toast toast = Toast.makeText( - getContext(), "Backup restored!", Toast.LENGTH_LONG); - toast.show(); - Intent intent = new Intent(getContext(), IntroActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + //Checks if the user has any seed created + AccountSeedListViewModel accountSeedListViewModel = ViewModelProviders.of((FragmentActivity) getContext()).get(AccountSeedListViewModel.class); + + if(introActivity!=null){ + introActivity.finish(); + } + + Intent intent = new Intent(getContext(), BoardActivity.class); startActivity(intent); + dismiss(); + + /* + * Hide the loading dialog + * */ + crystalDialog.dismiss(); + } else if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.FAILED) { + + /* + * Hide the loading dialog + * */ + crystalDialog.dismiss(); + Toast toast = Toast.makeText( getContext(), "An error ocurred while restoring the backup!", Toast.LENGTH_LONG); toast.show(); @@ -159,6 +197,14 @@ public class ImportAccountOptionsFragment extends DialogFragment { }); FileServiceRequests.getInstance().addRequest(importBackupRequest); + + /* + * Show loading dialog + * */ + crystalDialog = new CrystalDialog((Activity) getContext()); + crystalDialog.setText(getContext().getString(R.string.Creating_backup_from_file)); + crystalDialog.progress(); + crystalDialog.show(); } }) .setNegativeButton("Cancel", @@ -173,4 +219,9 @@ public class ImportAccountOptionsFragment extends DialogFragment { } } + + + public void setIntroActivity(Activity introActivity) { + this.introActivity = introActivity; + } } diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java index 86b201b..b48a029 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java @@ -56,7 +56,10 @@ public class SecuritySettingsFragment extends Fragment { return fragment; } - private NfcAdapter mNfcAdapter; + /* + * Functionality not needed for now + * */ + //private NfcAdapter mNfcAdapter; private PendingIntent pendingIntent; private IntentFilter ndef; IntentFilter[] intentFiltersArray; @@ -100,7 +103,11 @@ public class SecuritySettingsFragment extends Fragment { mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mPager)); - mNfcAdapter = NfcAdapter.getDefaultAdapter(this.getActivity()); + /* + * Functionality not needed for now + * */ + //mNfcAdapter = NfcAdapter.getDefaultAdapter(this.getActivity()); + this.configureForegroundDispatch(); return v; @@ -149,32 +156,37 @@ public class SecuritySettingsFragment extends Fragment { } public void configureForegroundDispatch(){ - if (mNfcAdapter != null) { - pendingIntent = PendingIntent.getActivity( - this.getActivity(), 0, new Intent(this.getActivity(), getActivity().getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); - ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); - try { - ndef.addDataType("*/*"); /* Handles all MIME based dispatches. - You should specify only the ones that you need. */ - } catch (IntentFilter.MalformedMimeTypeException e) { - throw new RuntimeException("fail", e); - } - intentFiltersArray = new IntentFilter[]{ndef,}; - techList = new String[][]{ new String[] {IsoDep.class.getName(), NfcA.class.getName(), MifareClassic.class.getName(), NdefFormatable.class.getName()} }; + /* + * Functionality not needed for now + * */ + //if (mNfcAdapter != null) { + //pendingIntent = PendingIntent.getActivity( + // this.getActivity(), 0, new Intent(this.getActivity(), getActivity().getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); - } else { - Toast.makeText(this.getContext(), "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); - } + //ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); + //try { + //ndef.addDataType("*/*"); + // Handles all MIME based dispatches. + //You should specify only the ones that you need. + //} catch (IntentFilter.MalformedMimeTypeException e) { + //throw new RuntimeException("fail", e); + //} + //intentFiltersArray = new IntentFilter[]{ndef,}; + //techList = new String[][]{ new String[] {IsoDep.class.getName(), NfcA.class.getName(), MifareClassic.class.getName(), NdefFormatable.class.getName()} }; + + //} else { + //Toast.makeText(this.getContext(), "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); + //} } public void enableNfc(){ - mNfcAdapter.enableForegroundDispatch(this.getActivity(), pendingIntent, intentFiltersArray, techList); + //mNfcAdapter.enableForegroundDispatch(this.getActivity(), pendingIntent, intentFiltersArray, techList); Toast.makeText(this.getContext(), "Tap with your yubikey", Toast.LENGTH_LONG).show(); } public void disableNfc(){ - mNfcAdapter.disableForegroundDispatch(this.getActivity()); + //mNfcAdapter.disableForegroundDispatch(this.getActivity()); } public void onPause() { @@ -184,9 +196,9 @@ public class SecuritySettingsFragment extends Fragment { public void onResume() { super.onResume(); - if (mNfcAdapter != null) { + /*if (mNfcAdapter != null) { enableNfc(); - } + }*/ } public void onNewIntent(Intent intent) { diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java index 05bfcfe..5d7a0fc 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java @@ -24,15 +24,18 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; +import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; import com.google.zxing.Result; import com.jaredrummler.materialspinner.MaterialSpinner; +import com.vincent.filepicker.ToastUtil; import java.io.File; import java.math.RoundingMode; @@ -79,12 +82,16 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat TextView tvFromError; @BindView(R.id.etTo) EditText etTo; + @BindView(R.id.viewSend) + View viewSend; @BindView(R.id.tvToError) TextView tvToError; @BindView(R.id.spAsset) Spinner spAsset; @BindView(R.id.tvAssetError) TextView tvAssetError; + @BindView(R.id.scrollMain) + ScrollView scrollMain; @BindView(R.id.etAmount) EditText etAmount; @BindView(R.id.tvAmountError) @@ -136,15 +143,65 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat fabSend.hide(); //AlertDialog.Builder - builder = new AlertDialog.Builder(getActivity(), R.style.SendTransactionTheme); + builder = new AlertDialog.Builder(getActivity(), R.style.dialog_theme_full); //builder.setTitle("Send"); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.send_transaction, null); ButterKnife.bind(this, view); + + /* + * Detet scroll changes + * */ + scrollMain.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { + @Override + public void onScrollChanged() { + + View view = scrollMain.getChildAt(scrollMain.getChildCount() - 1); + + int diff = (view.getBottom() - (scrollMain.getHeight() + scrollMain.getScrollY())); + + float traslationY = btnSend.getTranslationY(); + + if(diff<=266 && diff>128){ + //btnSend.setTranslationY(0); + //viewSend.setTranslationY(0); + + btnSend.animate().y(880); + viewSend.animate().y(800); + } + else if(diff<=128 && diff>10){ + //btnSend.setTranslationY(-130); + //viewSend.setTranslationY(-130); + + btnSend.animate().y(880); + viewSend.animate().y(800); + } + else if(diff<=10 && diff>0){ + //btnSend.setTranslationY(-170); + //viewSend.setTranslationY(-170); + + btnSend.animate().y(680); + viewSend.animate().y(600); + } + else if(diff==0){ + //btnSend.setTranslationY(-190); + //viewSend.setTranslationY(-190); + + btnSend.animate().y(680); + viewSend.animate().y(600); + } + } + }); + this.cryptoNetAccountId = getArguments().getLong("CRYPTO_NET_ACCOUNT_ID",-1); + /* + * Add style to the spinner android + * */ + spFrom.setBackground(getContext().getDrawable(R.drawable.square_color)); + if (this.cryptoNetAccountId != -1) { db = CrystalDatabase.getAppDatabase(this.getContext()); this.cryptoNetAccount = db.cryptoNetAccountDao().getById(this.cryptoNetAccountId); @@ -153,8 +210,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat * this is only for graphene accounts. * **/ - //this.grapheneAccount = new GrapheneAccount(this.cryptoNetAccount); - //this.grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getByAccountId(this.cryptoNetAccountId)); + this.grapheneAccount = new GrapheneAccount(this.cryptoNetAccount); + this.grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getByAccountId(this.cryptoNetAccountId)); final LiveData> balancesList = db.cryptoCoinBalanceDao().getBalancesFromAccount(cryptoNetAccountId); balancesList.observe(this, new Observer>() { @@ -178,7 +235,7 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat List cryptoNetAccounts = cryptoNetAccountListViewModel.getCryptoNetAccountList(); CryptoNetAccountAdapter fromSpinnerAdapter = new CryptoNetAccountAdapter(this.getContext(), android.R.layout.simple_spinner_item, cryptoNetAccounts); - //spFrom.setAdapter(fromSpinnerAdapter); + spFrom.setAdapter(fromSpinnerAdapter); //spFrom.setSelection(0); /* diff --git a/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java b/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java index 5514263..c0d5194 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java +++ b/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java @@ -19,6 +19,7 @@ import cy.agorise.crystalwallet.apigenerator.BitsharesFaucetApiGenerator; import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator; import cy.agorise.crystalwallet.apigenerator.grapheneoperation.AccountUpgradeOperationBuilder; import cy.agorise.crystalwallet.application.constant.BitsharesConstant; +import cy.agorise.crystalwallet.dao.AccountSeedDao; import cy.agorise.crystalwallet.models.BitsharesAccountNameCache; import cy.agorise.crystalwallet.models.seed.BIP39; import cy.agorise.crystalwallet.requestmanagers.CryptoNetEquivalentRequest; @@ -246,6 +247,9 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI */ private void validateImportAccount(final ValidateImportBitsharesAccountRequest importRequest){ //TODO check internet and server status + final CrystalDatabase db = CrystalDatabase.getAppDatabase(importRequest.getContext()); + final AccountSeedDao accountSeedDao = db.accountSeedDao(); + ApiRequest checkAccountName = new ApiRequest(0, new ApiRequestListener() { @Override public void success(Object answer, int idPetition) { @@ -259,7 +263,8 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI if((new Address(activeKey.getKey(),"BTS")).toString().equals(bk.getPublicAddress("BTS").toString())){ importRequest.setSeedType(SeedType.BRAINKEY); importRequest.setStatus(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED); - return; + + break; } } BIP39 bip39 = new BIP39(-1, importRequest.getMnemonic()); @@ -267,9 +272,29 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI if((new Address(activeKey.getKey(),"BTS")).toString().equals(new Address(ECKey.fromPublicOnly(bip39.getBitsharesActiveKey(0).getPubKey())).toString())){ importRequest.setSeedType(SeedType.BIP39); importRequest.setStatus(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED); - return; + break; } } + + if ((importRequest.getStatus() == ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED)){ + if (importRequest.addAccountIfValid()) { + AccountSeed seed = new AccountSeed(); + seed.setName(importRequest.getAccountName()); + seed.setType(importRequest.getSeedType()); + seed.setMasterSeed(importRequest.getMnemonic()); + long idSeed = accountSeedDao.insertAccountSeed(seed); + if (idSeed >= 0) { + GrapheneAccount account = new GrapheneAccount(); + account.setCryptoNet(CryptoNet.BITSHARES); + account.setAccountIndex(0); + account.setSeedId(idSeed); + account.setName(importRequest.getAccountName()); + importAccountFromSeed(account, importRequest.getContext()); + } + } + return; + } + importRequest.setStatus(ValidateImportBitsharesAccountRequest.StatusCode.BAD_SEED); } importRequest.setStatus(ValidateImportBitsharesAccountRequest.StatusCode.PETITION_FAILED); diff --git a/app/src/main/java/cy/agorise/crystalwallet/manager/FileBackupManager.java b/app/src/main/java/cy/agorise/crystalwallet/manager/FileBackupManager.java index 5417dd9..b0944dd 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/manager/FileBackupManager.java +++ b/app/src/main/java/cy/agorise/crystalwallet/manager/FileBackupManager.java @@ -234,14 +234,14 @@ public class FileBackupManager implements FileServiceRequestsListener { final AccountSeedDao accountSeedDao = db.accountSeedDao(); for(BitsharesSeedName seedName : seedNames) { final ValidateImportBitsharesAccountRequest validatorRequest = - new ValidateImportBitsharesAccountRequest(seedName.accountName, seedName.accountSeed); + new ValidateImportBitsharesAccountRequest(seedName.accountName, seedName.accountSeed, request.getContext(), true); validatorRequest.setListener(new CryptoNetInfoRequestListener() { @Override public void onCarryOut() { if (!validatorRequest.getStatus().equals(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED)) { request.setStatus(ImportBackupRequest.StatusCode.FAILED); // TODO reason bad seed } else { - AccountSeed seed = new AccountSeed(); + /*AccountSeed seed = new AccountSeed(); seed.setName(validatorRequest.getAccountName()); seed.setType(validatorRequest.getSeedType()); seed.setMasterSeed(validatorRequest.getMnemonic()); @@ -257,7 +257,8 @@ public class FileBackupManager implements FileServiceRequestsListener { request.setStatus(ImportBackupRequest.StatusCode.SUCCEEDED); }else{ request.setStatus(ImportBackupRequest.StatusCode.FAILED); //TODO reason couldn't insert seed - } + }*/ + request.setStatus(ImportBackupRequest.StatusCode.SUCCEEDED); } } }); diff --git a/app/src/main/java/cy/agorise/crystalwallet/network/BitsharesCryptoNetVerifier.java b/app/src/main/java/cy/agorise/crystalwallet/network/BitsharesCryptoNetVerifier.java index e90758f..c382cc5 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/network/BitsharesCryptoNetVerifier.java +++ b/app/src/main/java/cy/agorise/crystalwallet/network/BitsharesCryptoNetVerifier.java @@ -1,6 +1,5 @@ package cy.agorise.crystalwallet.network; -import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator; import cy.agorise.crystalwallet.enums.CryptoNet; import cy.agorise.graphenej.interfaces.WitnessResponseListener; import cy.agorise.graphenej.models.BaseResponse; @@ -24,21 +23,15 @@ public class BitsharesCryptoNetVerifier extends CryptoNetVerifier { private final String CHAIN_ID = "9cf6f255a208100d2bb275a3c52f4b1589b7ec9c9bfc2cb2a5fe6411295106d8";//testnet //private final String CHAIN_ID = "4018d7844c78f6a6c41c6a552b898022310fc5dec06da467ee7905a8dad512c8";//mainnet - - - - - - public BitsharesCryptoNetVerifier(){ - - /**/ + @Override + public void checkURL(final String url) { final long startTime = System.currentTimeMillis(); - thread = new WebSocketThread(new GetChainId(new WitnessResponseListener() { + WebSocketThread thread = new WebSocketThread(new GetChainId(new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { if(response.result instanceof String) { if(response.result.equals(CHAIN_ID)) { - CryptoNetManager.verifiedCryptoNetURL(cryptoNet, null, System.currentTimeMillis() - startTime); + CryptoNetManager.verifiedCryptoNetURL(cryptoNet, url, System.currentTimeMillis() - startTime); }else{ System.out.println(" BitsharesCryptoNetVerifier Error we are not in the net current chain id " + response.result + " excepted " + CHAIN_ID); //TODO handle error bad chain @@ -50,19 +43,12 @@ public class BitsharesCryptoNetVerifier extends CryptoNetVerifier { public void onError(BaseResponse.Error error) { //TODO handle error } - }),null); - - } - - - @Override - public void checkURL(final String url) { - thread.setmUrl(url); //Set the url - thread.start(); //Run the thread connection + }),url); + thread.start(); } @Override public String getChainId() { return CHAIN_ID; } -} +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/network/CryptoNetVerifier.java b/app/src/main/java/cy/agorise/crystalwallet/network/CryptoNetVerifier.java index 832d2f0..046a3d7 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/network/CryptoNetVerifier.java +++ b/app/src/main/java/cy/agorise/crystalwallet/network/CryptoNetVerifier.java @@ -1,8 +1,5 @@ package cy.agorise.crystalwallet.network; -import android.app.Activity; - -import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator; import cy.agorise.crystalwallet.enums.CryptoNet; /** @@ -15,14 +12,6 @@ import cy.agorise.crystalwallet.enums.CryptoNet; public abstract class CryptoNetVerifier { - /* - * Contains the worker connection thread - */ - protected WebSocketThread thread; - - - - static CryptoNetVerifier getNetworkVerify(CryptoNet cryptoNet){ if(cryptoNet.getLabel().equals(CryptoNet.BITSHARES.getLabel())){ return new BitsharesCryptoNetVerifier(); @@ -33,9 +22,4 @@ public abstract class CryptoNetVerifier { public abstract void checkURL(final String url); public abstract String getChainId(); - - - public WebSocketThread getThread() { - return thread; - } -} +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/network/WebSocketThread.java b/app/src/main/java/cy/agorise/crystalwallet/network/WebSocketThread.java index 58f4dad..d3c9504 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/network/WebSocketThread.java +++ b/app/src/main/java/cy/agorise/crystalwallet/network/WebSocketThread.java @@ -3,6 +3,7 @@ package cy.agorise.crystalwallet.network; import android.util.Log; import com.neovisionaries.ws.client.WebSocket; +import com.neovisionaries.ws.client.WebSocketException; import com.neovisionaries.ws.client.WebSocketFactory; import com.neovisionaries.ws.client.WebSocketListener; @@ -33,11 +34,6 @@ public class WebSocketThread extends Thread { private boolean canChange = true; - /* - * Object needed for socket connection - * */ - private WebSocketFactory factory; - /** * Basic constructor, * @@ -47,27 +43,16 @@ public class WebSocketThread extends Thread { * @param url The url to connect */ public WebSocketThread(WebSocketListener webSocketListener, String url) { - - /* - * The listener always can be setted - * */ - this.mWebSocketListener = webSocketListener; - - /* - * - * If at this point the url is not defined, this will be set after - * */ - if(url!=null){ - try { - factory = new WebSocketFactory().setConnectionTimeout(5000); - this.mUrl = url; - this.mWebSocket = factory.createSocket(this.mUrl); - this.mWebSocket.addListener(this.mWebSocketListener); - } catch (IOException e) { - Log.e(TAG, "IOException. Msg: "+e.getMessage()); - } catch(NullPointerException e){ - Log.e(TAG, "NullPointerException at WebsocketWorkerThreas. Msg: "+e.getMessage()); - } + try { + WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(5000); + this.mUrl = url; + this.mWebSocketListener = webSocketListener; + this.mWebSocket = factory.createSocket(this.mUrl); + this.mWebSocket.addListener(this.mWebSocketListener); + } catch (IOException e) { + Log.e(TAG, "IOException. Msg: "+e.getMessage()); + } catch(NullPointerException e){ + Log.e(TAG, "NullPointerException at WebsocketWorkerThreas. Msg: "+e.getMessage()); } } @@ -125,28 +110,16 @@ public class WebSocketThread extends Thread { @Override public void run() { - canChange = false; - // Moves the current Thread into the background android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); - try { - - /* - * If the initialization of the socket comes after - * */ - if(factory==null){ - factory = new WebSocketFactory().setConnectionTimeout(5000); - this.mWebSocket = factory.createSocket(this.mUrl); - this.mWebSocket.addListener(this.mWebSocketListener); - } - WebSocketThread.currentThreads.put(this.getId(),this); mWebSocket.connect(); - - } catch (final Exception e) { + } catch (WebSocketException e) { Log.e(TAG, "WebSocketException. Msg: "+e.getMessage()); + } catch(NullPointerException e){ + Log.e(TAG, "NullPointerException. Msg: "+e.getMessage()); } WebSocketThread.currentThreads.remove(this.getId()); } @@ -154,9 +127,4 @@ public class WebSocketThread extends Thread { public boolean isConnected(){ return mWebSocket.isOpen(); } - - - public void setmUrl(String mUrl) { - this.mUrl = mUrl; - } -} +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateImportBitsharesAccountRequest.java b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateImportBitsharesAccountRequest.java index 81c3aa4..244bf3b 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateImportBitsharesAccountRequest.java +++ b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateImportBitsharesAccountRequest.java @@ -1,5 +1,7 @@ package cy.agorise.crystalwallet.requestmanagers; +import android.content.Context; + import cy.agorise.crystalwallet.enums.CryptoCoin; import cy.agorise.crystalwallet.enums.SeedType; @@ -36,6 +38,11 @@ public class ValidateImportBitsharesAccountRequest extends CryptoNetInfoRequest */ private final String mnemonic; + /** + * True - the account must be added if the accountName and mnemonic are correct + */ + private boolean addAccountIfValid = false; + /** * If this seed is BIP39 or Brainkey */ @@ -46,10 +53,21 @@ public class ValidateImportBitsharesAccountRequest extends CryptoNetInfoRequest */ private StatusCode status = StatusCode.NOT_STARTED; - public ValidateImportBitsharesAccountRequest(String accountName, String mnemonic){ + private Context context; + + public ValidateImportBitsharesAccountRequest(String accountName, String mnemonic, Context context){ super(CryptoCoin.BITSHARES); this.accountName = accountName; this.mnemonic = mnemonic; + this.context = context; + } + + public ValidateImportBitsharesAccountRequest(String accountName, String mnemonic, Context context, boolean addAccountIfValid){ + super(CryptoCoin.BITSHARES); + this.accountName = accountName; + this.mnemonic = mnemonic; + this.addAccountIfValid = addAccountIfValid; + this.context = context; } public void validate(){ @@ -70,6 +88,14 @@ public class ValidateImportBitsharesAccountRequest extends CryptoNetInfoRequest return seedType; } + public Context getContext() { + return context; + } + + public boolean addAccountIfValid(){ + return this.addAccountIfValid; + } + public void setSeedType(SeedType seedType) { this.seedType = seedType; } diff --git a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/customImpl/validationFields/BitsharesAccountNameValidation.kt b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/customImpl/validationFields/BitsharesAccountNameValidation.kt index 9c56bfe..2f6f002 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/customImpl/validationFields/BitsharesAccountNameValidation.kt +++ b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/customImpl/validationFields/BitsharesAccountNameValidation.kt @@ -69,6 +69,7 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { * Remove error * */ accountNameField.error = null + accountNameField.fieldValidatorModel.setValid() /* Validate at least min length @@ -87,6 +88,7 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { * Remove error * */ accountNameField.error = null + accountNameField.fieldValidatorModel.setValid() /* Validate at least one character @@ -105,6 +107,7 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { * Remove error * */ accountNameField.error = null + accountNameField.fieldValidatorModel.setValid() /* Validate at least one number for the account string @@ -117,12 +120,14 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { result = false accountNameField.fieldValidatorModel.setInvalid() accountNameField.fieldValidatorModel.message = this.accountNameField.resources.getString(R.string.create_account_window_err_at_least_one_number) + } else { /* * Remove error * */ accountNameField.error = null + accountNameField.fieldValidatorModel.setValid() /* @@ -136,12 +141,14 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { result = false accountNameField.fieldValidatorModel.setInvalid() accountNameField.fieldValidatorModel.message = this.accountNameField.resources.getString(R.string.create_account_window_err_at_least_one_script) + } else { /* * Remove error * */ accountNameField.error = null + accountNameField.fieldValidatorModel.setValid() } } } @@ -162,46 +169,11 @@ class BitsharesAccountNameValidation : CustomValidationField, UIValidator { } else { /* - * Show the dialog for connection with the server + * Deliver result * */ - val creatingAccountMaterialDialog = CrystalDialog(activity) - creatingAccountMaterialDialog.setText(activity.resources.getString(R.string.window_create_seed_Server_validation)) - creatingAccountMaterialDialog.build() - creatingAccountMaterialDialog.show() - - val request = ValidateExistBitsharesAccountRequest(newValue) - request.setListener { - - /* - * Dismiss the dialog of loading - * */ - creatingAccountMaterialDialog.dismiss() - - if (request.accountExists) { - - /* - * The account exists and is not valid - * */ - accountNameField.fieldValidatorModel.setInvalid() - accountNameField.fieldValidatorModel.message = accountNameField.resources.getString(R.string.account_name_already_exist) - - } else { - - /* - * Passed all validations - * */ - accountNameField.fieldValidatorModel.setValid() - - /* - * Deliver the response - * */ - if (uiValidatorListener != null) { - uiValidatorListener.onValidationSucceeded(globalCustomValidationField) - } - } + if (uiValidatorListener != null) { + uiValidatorListener.onValidationSucceeded(this) } - CryptoNetInfoRequests.getInstance().addRequest(request) - } /* * Passed initial validations, next final validations diff --git a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/AmountValidationField.java b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/AmountValidationField.java index b033d3a..3b44223 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/AmountValidationField.java +++ b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/AmountValidationField.java @@ -30,7 +30,18 @@ public class AmountValidationField extends ValidationField { try { final float newAmountValue = Float.parseFloat(amountField.getText().toString()); final CryptoCurrency cryptoCurrency = (CryptoCurrency)assetSpinner.getSelectedItem(); - final String mixedValues = newAmountValue+"_"+cryptoCurrency.getId(); + + /* + * Validation for the money + * */ + if(cryptoCurrency==null){ + setMessageForValue("",amountField.getContext().getString(R.string.send_assets_error_invalid_cypto_coin_selected)); + setValidForValue("", false); + return; + } + + final String idCurrency = cryptoCurrency==null?"null ":Long.toString(cryptoCurrency.getId()); + final String mixedValues = newAmountValue + "_" + idCurrency; this.setLastValue(mixedValues); this.startValidating(); final ValidationField field = this; diff --git a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/BitsharesAccountMnemonicValidationField.java b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/BitsharesAccountMnemonicValidationField.java index cbbbe72..8187320 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/BitsharesAccountMnemonicValidationField.java +++ b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/validators/validationfields/BitsharesAccountMnemonicValidationField.java @@ -31,7 +31,7 @@ public class BitsharesAccountMnemonicValidationField extends ValidationField { this.startValidating(); final ValidationField field = this; - final ValidateImportBitsharesAccountRequest request = new ValidateImportBitsharesAccountRequest(newAccountNameValue,newMnemonicValue); + final ValidateImportBitsharesAccountRequest request = new ValidateImportBitsharesAccountRequest(newAccountNameValue,newMnemonicValue,accountNameField.getContext()); request.setListener(new CryptoNetInfoRequestListener() { @Override public void onCarryOut() { diff --git a/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/CryptoNetAccountsSpinner.kt b/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/CryptoNetAccountsSpinner.kt new file mode 100644 index 0000000..f6db966 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/CryptoNetAccountsSpinner.kt @@ -0,0 +1,165 @@ +package cy.agorise.crystalwallet.views.natives.spinners + +import android.R +import android.content.Context +import android.util.AttributeSet +import android.view.View +import cy.agorise.crystalwallet.models.CryptoNetAccount +import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests +import cy.agorise.crystalwallet.requestmanagers.ValidateExistBitsharesAccountRequest +import cy.agorise.crystalwallet.viewmodels.validators.validationfields.ValidationField +import cy.agorise.crystalwallet.views.CryptoNetAccountAdapter + +class CryptoNetAccountsSpinner : InternalMaterialSpinner { + + /* + * Contains the list of accounts + * */ + private var cryptoNetAccounts: MutableList? = null + + /* + * Contains the current adapter + * */ + private var fromSpinnerAdapter:CryptoNetAccountAdapter? = null + + /* + * Listeners + * */ + private var onValidationField:OnValidationFailed? = null + private var onValidationSucceeded:OnValidationSucceeded? = null + private var onAccountNotExists:OnAccountNotExists? = null + private var onItemSelectedListener:OnItemSelectedListener? = null + private var onAccountExists:OnAccountExists? = null + + /* + * Current selected account + * */ + private var cryptoNetAccount:CryptoNetAccount? = null + + + + + constructor(context: Context?, attrs: AttributeSet?) : super(context,attrs){ + + /* + * Initialy starts with the android layout + * */ + setAndroidLayout() + + /* + * When the user changes the item selection save the model + * */ + setOnItemSelectedListener(OnItemSelectedListener { view, position, id, item -> + + /* + * Save the current model + * */ + cryptoNetAccount = cryptoNetAccounts?.get(position) + + /* + * Deliver response + * */ + if(onItemSelectedListener != null){ + onItemSelectedListener?.onItemSelectedListener(cryptoNetAccount!!) + } + }) + } + + /* + * Return the current selected cryptonetaccount + * */ + fun getCryptoNetAccountSelected() : CryptoNetAccount{ + return this.cryptoNetAccount!! + } + + + /* + * Set the current layoutview + * */ + fun setLayout(layout:Int){ + this.layout = layout + } + + /* + * Init the spinner, before call this method, this list of items should be set + * */ + fun initCryptoNetAccountAdapter(){ + + fromSpinnerAdapter = CryptoNetAccountAdapter(context, this.layout!!, cryptoNetAccounts) + setAdapter(fromSpinnerAdapter!!) + } + + + fun setCryptoAccountItems(cryptoNetAccounts:MutableList){ + this.cryptoNetAccounts = cryptoNetAccounts + } + + /* + * Validate if the "selected" account exists + * */ + fun validateExistBitsharesAccountRequest(){ + + if(cryptoNetAccount != null){ + + val request = ValidateExistBitsharesAccountRequest(cryptoNetAccount?.name) + request.setListener { + if (!request.accountExists) { + if(onAccountNotExists != null){ + onAccountNotExists?.onAccountNotExists(this_!!) + } + + } + else { + if(onAccountExists != null){ + onAccountExists?.onAccountExists(this_!!) + } + } + } + CryptoNetInfoRequests.getInstance().addRequest(request) + } + } + + + /* + * Listener for validations + * */ + fun onValidationFailed(onValidationField:OnValidationFailed){ + this.onValidationField = onValidationField + } + fun onValidationSucceeded(onValidationSucceeded: OnValidationSucceeded){ + this.onValidationSucceeded = onValidationSucceeded + } + fun onAccountNotExists(onAccountNotExists: OnAccountNotExists){ + this.onAccountNotExists = onAccountNotExists + } + fun onItemSelectedListener(onItemSelectedListener: OnItemSelectedListener){ + this.onItemSelectedListener = onItemSelectedListener + } + fun onAccountExists(onAccountExists: OnAccountExists){ + this.onAccountExists = onAccountExists + } + /* + * End of Listener for validations + * */ + + /* + * Add the items list to the spinner + * */ + fun getCryptoAccountsList() : List{ + return this.cryptoNetAccounts!! + } + + + /* + * Interface for validation failed + * */ + interface OnAccountNotExists{ + fun onAccountNotExists(field: View) + } + interface OnAccountExists{ + fun onAccountExists(field: View) + } + interface OnItemSelectedListener{ + fun onItemSelectedListener(cryptoNetAccount: CryptoNetAccount) + } +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/InternalMaterialSpinner.kt b/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/InternalMaterialSpinner.kt new file mode 100644 index 0000000..cd6065e --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/views/natives/spinners/InternalMaterialSpinner.kt @@ -0,0 +1,80 @@ +package cy.agorise.crystalwallet.views.natives.spinners + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.view.View +import com.jaredrummler.materialspinner.MaterialSpinner +import cy.agorise.crystalwallet.viewmodels.validators.UIValidatorListener +import cy.agorise.crystalwallet.viewmodels.validators.validationfields.ValidationField + +open class InternalMaterialSpinner : MaterialSpinner { + + /* + * Contains the current layout for the rows + * */ + protected var layout:Int? = null + + /* + * Listeners + * */ + private var onItemNotSelected: OnItemNotSelected? = null + + /* + * Contains the this for interfaces + * */ + protected var this_: View? = null + + + + + constructor(context: Context?, attrs: AttributeSet?) : super(context,attrs){ + + /* + * Save the current this + * */ + this_ = this + } + + /* + * Select the first item in the spinner + * */ + fun selectFirstItem(){ + this.selectedIndex = 0 + } + + /* + * Set the default android layout + * */ + fun setAndroidLayout(){ + this.layout = android.R.layout.simple_spinner_item + } + + fun onItemNotSelected(onItemNotSelected:OnItemNotSelected){ + this.onItemNotSelected = onItemNotSelected + } + + /* + * Validation with listener for item selected or not + * */ + fun validateOnItemNotSelected(){ + if(this.selectedIndex == -1){ + if(onItemNotSelected != null){ + onItemNotSelected?.onItemNotSelected() + } + } + } + + /* + * Interface for validation failed + * */ + interface OnValidationFailed{ + fun onValidationFailed(field: ValidationField) + } + interface OnValidationSucceeded{ + fun onValidationSucceeded(field: ValidationField) + } + interface OnItemNotSelected{ + fun onItemNotSelected() + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/cycle_7.xml b/app/src/main/res/anim/cycle_7.xml new file mode 100644 index 0000000..c396f74 --- /dev/null +++ b/app/src/main/res/anim/cycle_7.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/shake.xml b/app/src/main/res/anim/shake.xml new file mode 100644 index 0000000..c79b244 --- /dev/null +++ b/app/src/main/res/anim/shake.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/square_color.xml b/app/src/main/res/drawable-xhdpi/square_color.xml new file mode 100644 index 0000000..6a2990e --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/square_color.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/square.xml b/app/src/main/res/drawable/square.xml new file mode 100644 index 0000000..efde959 --- /dev/null +++ b/app/src/main/res/drawable/square.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/backup_seed.xml b/app/src/main/res/layout/backup_seed.xml index 0a50ef8..2898319 100644 --- a/app/src/main/res/layout/backup_seed.xml +++ b/app/src/main/res/layout/backup_seed.xml @@ -3,88 +3,85 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:background="@color/white" android:paddingBottom="0dp" - android:paddingLeft="0dp" - android:paddingRight="0dp" + android:paddingLeft="25dp" + android:paddingRight="25dp" android:paddingTop="@dimen/activity_vertical_margin"> + android:background="@color/white" + android:padding="20dp" + android:layout_alignParentStart="true" + android:layout_centerVertical="true"> - + android:layout_marginTop="35dp" + android:background="@drawable/square" + android:padding="10dp"> - + + + + +