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 7ac8255..fa3cd44 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java @@ -28,7 +28,7 @@ import cy.agorise.crystalwallet.dialogs.material.PositiveResponse; import cy.agorise.crystalwallet.dialogs.material.QuestionDialog; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestListener; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests; -import cy.agorise.crystalwallet.requestmanagers.ValidateImportBitsharesAccountRequest; +import cy.agorise.crystalwallet.requestmanagers.ImportBitsharesAccountRequest; import cy.agorise.crystalwallet.viewmodels.AccountSeedViewModel; import cy.agorise.crystalwallet.viewmodels.validators.ImportSeedValidator; import cy.agorise.crystalwallet.viewmodels.validators.UIValidatorListener; @@ -210,6 +210,7 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator clearErrors(); } }); + /* etAccountName.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -224,14 +225,14 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator @Override public void afterTextChanged(Editable s) { - /* - * Validate that PINs are equals - * */ + // + // Validate that PINs are equals + // validatePINS(); - /* - * If all is ready to continue enable the button, contrarie case disable it - * */ + // + // If all is ready to continue enable the button, contrarie case disable it + // if(allFieldsAreOK()){ enableCreate(); } @@ -240,6 +241,7 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator } } }); + */ accountSeedViewModel = ViewModelProviders.of(this).get(AccountSeedViewModel.class); importSeedValidator = new ImportSeedValidator(this.getApplicationContext(),etPin,etPinConfirmation,etAccountName,etSeedWords); @@ -285,8 +287,8 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator boolean complete = false; if( etPin.getText().toString().trim().compareTo("")!=0 && etPinConfirmation.getText().toString().trim().compareTo("")!=0 && - etSeedWords.getText().toString().trim().compareTo("")!=0 && - etAccountName.getText().toString().trim().compareTo("")!=0){ + etSeedWords.getText().toString().trim().compareTo("")!=0 /*&& + etAccountName.getText().toString().trim().compareTo("")!=0*/){ if(pinsOK){ complete = true; } @@ -311,11 +313,11 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator void afterSeedWordsChanged(Editable editable) { this.importSeedValidator.validate(); } - @OnTextChanged(value = R.id.etAccountName, + /*@OnTextChanged(value = R.id.etAccountName, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void afterAccountNameChanged(Editable editable) { this.importSeedValidator.validate(); - } + }*/ @OnClick(R.id.btnCancel) public void cancel(){ @@ -356,11 +358,11 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator /* * Validate mnemonic with the server * */ - /*final ValidateImportBitsharesAccountRequest request = new ValidateImportBitsharesAccountRequest(etAccountName.getText().toString().trim(),etSeedWords.getText().toString().trim(),activity); + /*final ImportBitsharesAccountRequest request = new ImportBitsharesAccountRequest(etSeedWords.getText().toString().trim(),activity); request.setListener(new CryptoNetInfoRequestListener() { @Override public void onCarryOut() { - if(request.getStatus().equals(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED)){ + if(request.getStatus().equals(ImportBitsharesAccountRequest.StatusCode.SUCCEEDED)){ //Correct @@ -391,8 +393,8 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator final ImportSeedActivity thisActivity = this; - final ValidateImportBitsharesAccountRequest validatorRequest = - new ValidateImportBitsharesAccountRequest(etAccountName.getText().toString(), etSeedWords.getText().toString(), getApplicationContext(), true); + final ImportBitsharesAccountRequest validatorRequest = + new ImportBitsharesAccountRequest(etSeedWords.getText().toString(), getApplicationContext(), true); validatorRequest.setListener(new CryptoNetInfoRequestListener() { @Override @@ -403,7 +405,7 @@ public class ImportSeedActivity extends AppCompatActivity implements UIValidator * */ crystalLoading.dismiss(); - if (!validatorRequest.getStatus().equals(ValidateImportBitsharesAccountRequest.StatusCode.SUCCEEDED)) { + if (!validatorRequest.getStatus().equals(ImportBitsharesAccountRequest.StatusCode.SUCCEEDED)) { switch (validatorRequest.getStatus()){ case PETITION_FAILED: diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/PatternRequestActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/PatternRequestActivity.java index 56ec8b1..f9378bf 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/PatternRequestActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/PatternRequestActivity.java @@ -25,6 +25,8 @@ import butterknife.ButterKnife; import butterknife.OnTextChanged; import cy.agorise.crystalwallet.R; import cy.agorise.crystalwallet.application.CrystalSecurityMonitor; +//import cy.agorise.crystalwallet.interfaces.OnResponse; +import cy.agorise.crystalwallet.interfaces.OnResponse; import cy.agorise.crystalwallet.models.GeneralSetting; import cy.agorise.crystalwallet.util.PasswordManager; import cy.agorise.crystalwallet.viewmodels.GeneralSettingListViewModel; @@ -39,6 +41,11 @@ public class PatternRequestActivity extends AppCompatActivity { @BindView(R.id.txtBadtry) TextView txtBadtry; + /* + * External listener for success or fail + * */ + private static OnResponse onResponse; + /* * Contains the bad tries * */ @@ -67,6 +74,8 @@ public class PatternRequestActivity extends AppCompatActivity { setContentView(R.layout.activity_pattern_request); ButterKnife.bind(this); + //onResponse = null; + GeneralSettingListViewModel generalSettingListViewModel = ViewModelProviders.of(this).get(GeneralSettingListViewModel.class); LiveData> generalSettingsLiveData = generalSettingListViewModel.getGeneralSettingList(); @@ -100,11 +109,24 @@ public class PatternRequestActivity extends AppCompatActivity { if (CrystalSecurityMonitor.getInstance(null).is2ndFactorSet()) { //CrystalSecurityMonitor.getInstance(null).call2ndFactor(thisActivity); thisActivity.finish(); + + /*if(onResponse != null){ + onResponse.onSuccess(); + }*/ + } else { thisActivity.finish(); + + /*if(onResponse != null){ + onResponse.onSuccess(); + }*/ } } else { incorrect(); + + /*if(onResponse != null){ + onResponse.onFailed(); + }*/ } } @@ -122,6 +144,10 @@ public class PatternRequestActivity extends AppCompatActivity { }); } + public static void setOnResponse(OnResponse onResponse) { + PatternRequestActivity.onResponse = onResponse; + } + private void incorrect(){ /* diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/PinRequestActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/PinRequestActivity.java index b90ed6e..1f6d546 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/PinRequestActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/PinRequestActivity.java @@ -31,6 +31,7 @@ import cy.agorise.crystalwallet.dialogs.material.DialogMaterial; import cy.agorise.crystalwallet.dialogs.material.NegativeResponse; import cy.agorise.crystalwallet.dialogs.material.PositiveResponse; import cy.agorise.crystalwallet.dialogs.material.QuestionDialog; +import cy.agorise.crystalwallet.interfaces.OnResponse; import cy.agorise.crystalwallet.models.AccountSeed; import cy.agorise.crystalwallet.models.GeneralSetting; import cy.agorise.crystalwallet.util.PasswordManager; @@ -46,15 +47,19 @@ public class PinRequestActivity extends AppCompatActivity { TextView txtBadtry; /* - * Contains the bad tries - * */ + * Contains the bad tries + * */ private int tries = 0; /* - * Seconds counter - * */ + * Seconds counter + * */ private int seconds = 15; + /* + * External listener for success or fail + * */ + private static OnResponse onResponse; @@ -72,9 +77,11 @@ public class PinRequestActivity extends AppCompatActivity { setContentView(R.layout.activity_pin_request); ButterKnife.bind(this); + //onResponse = null; + /* - * Initially the button is disabled till the user type a valid PIN - * */ + * Initially the button is disabled till the user type a valid PIN + * */ btnOK.setEnabled(false); GeneralSettingListViewModel generalSettingListViewModel = ViewModelProviders.of(this).get(GeneralSettingListViewModel.class); @@ -105,15 +112,24 @@ public class PinRequestActivity extends AppCompatActivity { if (PasswordManager.checkPassword(passwordEncrypted, etPassword.getText().toString())) { if (CrystalSecurityMonitor.getInstance(null).is2ndFactorSet()) { CrystalSecurityMonitor.getInstance(null).call2ndFactor(this); + + if(onResponse != null){ + onResponse.onSuccess(); + } + } else { this.finish(); + + if(onResponse != null){ + onResponse.onFailed(); + } } } else{ /* - * One more bad try - * */ + * One more bad try + * */ ++tries; final Activity activity = this; @@ -121,8 +137,8 @@ public class PinRequestActivity extends AppCompatActivity { etPassword.setTextColor(Color.RED); /* - * User can not go more up to 5 bad tries - * */ + * User can not go more up to 5 bad tries + * */ if(tries==4){ tries = 0; @@ -177,8 +193,8 @@ public class PinRequestActivity extends AppCompatActivity { } /* - * Set in red the rext and reset the password after a period of time - * */ + * Set in red the rext and reset the password after a period of time + * */ final Timer t = new Timer(); //Set the schedule function and rate t.scheduleAtFixedRate(new TimerTask() { @@ -197,21 +213,26 @@ public class PinRequestActivity extends AppCompatActivity { } }, - //Set how long before to start calling the TimerTask (in milliseconds) + //Set how long before to start calling the TimerTask (in milliseconds) 500, - //Set the amount of time between each execution (in milliseconds) + //Set the amount of time between each execution (in milliseconds) 500); } } + public static void setOnResponse(OnResponse onResponse) { + PinRequestActivity.onResponse = onResponse; + } + + @OnTextChanged(value = R.id.etPassword, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void afterPasswordChanged(Editable editable) { /* - * If it is valid length enable button - * */ + * If it is valid length enable button + * */ if(etPassword.getText().length()>=6){ btnOK.setEnabled(true); } @@ -219,6 +240,4 @@ public class PinRequestActivity extends AppCompatActivity { btnOK.setEnabled(false); } } -} - - +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/SendTransactionActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/SendTransactionActivity.java index adfa17c..26adfa1 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/SendTransactionActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/SendTransactionActivity.java @@ -1,5 +1,6 @@ package cy.agorise.crystalwallet.activities; +import android.app.Activity; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.Observer; import android.os.Bundle; @@ -11,6 +12,7 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; import com.jaredrummler.materialspinner.MaterialSpinner; 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 b654b48..d2451f4 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java +++ b/app/src/main/java/cy/agorise/crystalwallet/apigenerator/GrapheneApiGenerator.java @@ -124,13 +124,25 @@ public abstract class GrapheneApiGenerator { new WitnessResponseListener() { @Override public void onSuccess(WitnessResponse response) { - final List> resp = (List>) response.result; - if(resp.size() > 0){ - List accounts = resp.get(0); - if(accounts.size() > 0){ - for(UserAccount account : accounts) { - request.getListener().success(account,request.getId());}}} - request.getListener().fail(request.getId()); + try { + final List> resp = (List>) response.result; + if (resp.size() > 0) { + List accounts = resp.get(0); + if (accounts.size() > 0) { + for (UserAccount account : accounts) { + request.getListener().success(account, request.getId()); + break; + } + }else{ + request.getListener().fail(request.getId()); + } + } else { + request.getListener().fail(request.getId()); + } + }catch(Exception e){ + e.printStackTrace(); + request.getListener().fail(request.getId()); + } } @Override diff --git a/app/src/main/java/cy/agorise/crystalwallet/application/CrystalSecurityMonitor.java b/app/src/main/java/cy/agorise/crystalwallet/application/CrystalSecurityMonitor.java index e027107..9f6297b 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/application/CrystalSecurityMonitor.java +++ b/app/src/main/java/cy/agorise/crystalwallet/application/CrystalSecurityMonitor.java @@ -16,6 +16,8 @@ import java.util.List; import cy.agorise.crystalwallet.activities.PatternRequestActivity; import cy.agorise.crystalwallet.activities.PinRequestActivity; import cy.agorise.crystalwallet.activities.PocketRequestActivity; +import cy.agorise.crystalwallet.fragments.PatternSecurityFragment; +import cy.agorise.crystalwallet.interfaces.OnResponse; import cy.agorise.crystalwallet.models.GeneralSetting; import cy.agorise.crystalwallet.notifiers.CrystalWalletNotifier; import cy.agorise.crystalwallet.viewmodels.GeneralSettingListViewModel; @@ -129,7 +131,7 @@ public class CrystalSecurityMonitor implements Application.ActivityLifecycleCall public void onActivityStarted(Activity activity) { if (numStarted == 0) { if (!actualSecurity().equals("")){ - callPasswordRequest(activity); + callPasswordRequest(activity,null); } } numStarted++; @@ -140,18 +142,39 @@ public class CrystalSecurityMonitor implements Application.ActivityLifecycleCall numStarted--; if (numStarted == 0) { if (!actualSecurity().equals("")){ - callPasswordRequest(activity); + callPasswordRequest(activity,null); } } } - public void callPasswordRequest(Activity activity){ + public void callPasswordRequest(Activity activity, final OnResponse onResponsePattern){ if ((!activity.getIntent().hasExtra("ACTIVITY_TYPE")) || (!activity.getIntent().getStringExtra("ACTIVITY_TYPE").equals("PASSWORD_REQUEST"))) { Intent intent = null; if ((this.passwordEncrypted != null) && (!this.passwordEncrypted.equals(""))) { + intent = new Intent(activity, PinRequestActivity.class); + + PinRequestActivity.setOnResponse(null); + + /* + * Connect error and success listeners + * */ + if(onResponsePattern != null){ + PinRequestActivity.setOnResponse(onResponsePattern); + } + } else if ((this.patternEncrypted != null) && (!this.patternEncrypted.equals(""))) { + intent = new Intent(activity, PatternRequestActivity.class); + + PatternRequestActivity.setOnResponse(null); + + /* + * Connect error and success listeners + * */ + if(onResponsePattern != null){ + PatternRequestActivity.setOnResponse(onResponsePattern); + } } if (intent != null) { intent.putExtra("ACTIVITY_TYPE", "PASSWORD_REQUEST"); @@ -197,7 +220,4 @@ public class CrystalSecurityMonitor implements Application.ActivityLifecycleCall public void onActivityDestroyed(Activity activity) { // } - - - -} +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/PatternSecurityFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/PatternSecurityFragment.java index 63e15d7..9fa4865 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/PatternSecurityFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/PatternSecurityFragment.java @@ -1,5 +1,6 @@ package cy.agorise.crystalwallet.fragments; +import android.app.Activity; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; @@ -8,6 +9,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.text.Editable; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,7 +29,10 @@ import butterknife.ButterKnife; import butterknife.OnTextChanged; import cy.agorise.crystalwallet.R; import cy.agorise.crystalwallet.application.CrystalSecurityMonitor; +import cy.agorise.crystalwallet.dialogs.material.CrystalDialog; +import cy.agorise.crystalwallet.interfaces.OnResponse; import cy.agorise.crystalwallet.models.GeneralSetting; +import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests; import cy.agorise.crystalwallet.util.ChildViewPager; import cy.agorise.crystalwallet.util.PasswordManager; import cy.agorise.crystalwallet.viewmodels.GeneralSettingListViewModel; @@ -47,8 +52,8 @@ public class PatternSecurityFragment extends Fragment { TextView tvPatternText; /* - * Contains the ChildViewPager to block the viewpager when the user is using the pattern control - * */ + * Contains the ChildViewPager to block the viewpager when the user is using the pattern control + * */ private ChildViewPager childViewPager; private PatternLockViewListener actualPatternListener; @@ -169,8 +174,8 @@ public class PatternSecurityFragment extends Fragment { private void resetPattern(){ /* - * Show error - * */ + * Show error + * */ tvPatternText.setText(getActivity().getResources().getString(R.string.Incorrect_pattern)); tvPatternText.setTextColor(Color.RED); final Timer t = new Timer(); @@ -199,7 +204,20 @@ public class PatternSecurityFragment extends Fragment { public void savePattern(String pattern){ String patternEncripted = PasswordManager.encriptPassword(pattern); CrystalSecurityMonitor.getInstance(null).setPatternEncrypted(patternEncripted); - //CrystalSecurityMonitor.getInstance(null).callPasswordRequest(this.getActivity()); + /*CrystalSecurityMonitor.getInstance(null).callPasswordRequest(this.getActivity(), new OnResponse() { + @Override + public void onSuccess() { + + Log.i("onSuccess","onSuccess"); + Toast.makeText(getActivity(), "onSuccess", Toast.LENGTH_LONG).show(); + } + + @Override + public void onFailed() { + Log.i("onFailed","onFailed"); + Toast.makeText(getActivity(), "onFailed", Toast.LENGTH_LONG).show(); + } + });*/ /* * Show success @@ -209,20 +227,20 @@ public class PatternSecurityFragment extends Fragment { final Timer t_ = new Timer(); t_.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { + @Override + public void run() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { - t_.cancel(); - showNewPatternUI(); - } - }); - } + t_.cancel(); + showNewPatternUI(); + } + }); + } - }, + }, //Set how long before to start calling the TimerTask (in milliseconds) 1000, //Set the amount of time between each execution (in milliseconds) diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/ReceiveTransactionFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/ReceiveTransactionFragment.java index 747d89f..acc1872 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/ReceiveTransactionFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/ReceiveTransactionFragment.java @@ -152,6 +152,16 @@ public class ReceiveTransactionFragment extends DialogFragment implements UIVali } List cryptoCurrencyList = db.cryptoCurrencyDao().getByIds(assetIds); + /* + * Test + * */ + CryptoCurrency crypto1 = new CryptoCurrency(); + crypto1.setId(1); + crypto1.setName("BITCOIN"); + crypto1.setPrecision(1); + cryptoCurrencyList.add(crypto1); + + CryptoCurrencyAdapter assetAdapter = new CryptoCurrencyAdapter(getContext(), android.R.layout.simple_spinner_item, cryptoCurrencyList); spAsset.setAdapter(assetAdapter); } 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 a61d330..d3ed69a 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java @@ -83,6 +83,11 @@ public class SecuritySettingsFragment extends Fragment { View v = inflater.inflate(R.layout.fragment_security_settings, container, false); ButterKnife.bind(this, v); + /* + * For now this will not be implemented + * */ + sPocketSecurity.setEnabled(false); + securityPagerAdapter = new SecurityPagerAdapter(getChildFragmentManager()); mPager.setAdapter(securityPagerAdapter); 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 eaa4445..767c87f 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/SendTransactionFragment.java @@ -58,8 +58,10 @@ import butterknife.OnClick; import butterknife.OnItemSelected; import butterknife.OnTextChanged; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.application.CrystalSecurityMonitor; import cy.agorise.crystalwallet.dialogs.material.CrystalDialog; import cy.agorise.crystalwallet.dialogs.material.ToastIt; +import cy.agorise.crystalwallet.interfaces.OnResponse; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestListener; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequests; import cy.agorise.crystalwallet.requestmanagers.ValidateBitsharesSendRequest; @@ -132,8 +134,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat View viewCamera; /* - * Flag to control when the camera is visible and when is hide - * */ + * Flag to control when the camera is visible and when is hide + * */ private boolean cameraVisible = true; Button btnScanQrCode; @@ -180,53 +182,10 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat 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); + final Activity activity = getActivity(); + /* * Add style to the spinner android * */ @@ -237,9 +196,9 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat this.cryptoNetAccount = db.cryptoNetAccountDao().getById(this.cryptoNetAccountId); /* - * this is only for graphene accounts. - * - **/ + * this is only for graphene accounts. + * + **/ this.grapheneAccount = new GrapheneAccount(this.cryptoNetAccount); this.grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getByAccountId(this.cryptoNetAccountId)); @@ -253,6 +212,15 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat } List cryptoCurrencyList = db.cryptoCurrencyDao().getByIds(assetIds); + /* + * Test + * */ + /*CryptoCurrency crypto1 = new CryptoCurrency(); + crypto1.setId(1); + crypto1.setName("BITCOIN"); + crypto1.setPrecision(1); + cryptoCurrencyList.add(crypto1);*/ + assetAdapter = new CryptoCurrencyAdapter(getContext(), android.R.layout.simple_spinner_item, cryptoCurrencyList); spAsset.setAdapter(assetAdapter); } @@ -266,8 +234,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat CryptoNetAccountAdapter fromSpinnerAdapter = new CryptoNetAccountAdapter(this.getContext(), android.R.layout.simple_spinner_item, cryptoNetAccounts); /* - * If only one account block the control - * */ + * If only one account block the control + * */ if(cryptoNetAccounts.size()==1){ spFrom.setEnabled(false); } @@ -276,8 +244,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat //spFrom.setSelection(0); /* - * Custom material spinner implementation - * */ + * Custom material spinner implementation + * */ spFrom.setItems(cryptoNetAccounts); //spFrom.setSelectedIndex(0); spFrom.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener() { @@ -307,8 +275,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat // Your Permission granted already .Do next code /* - * Init the camera - * */ + * Init the camera + * */ try { beginScanQrCode(); }catch(Exception e){ @@ -344,8 +312,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat Toast.makeText(getActivity(), getActivity().getString(R.string.permission_denied_camera), Toast.LENGTH_LONG).show(); /* - * Disable the button of the camera visibility - * */ + * Disable the button of the camera visibility + * */ disableVisibilityCamera(); } else { @@ -490,8 +458,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat mScannerView.stopCamera(); /* - * Hide the camera or show it - * */ + * Hide the camera or show it + * */ if(cameraVisible){ hideCamera(); } @@ -522,31 +490,31 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat cameraVisible = true; /* - * Star the camera again - * */ + * Star the camera again + * */ beginScanQrCode(); } /* - * Hide the camera and show the black background - * */ + * Hide the camera and show the black background + * */ private void hideCamera(){ /* - * Change visibilities of views - * */ + * Change visibilities of views + * */ viewCamera.setVisibility(View.VISIBLE); mScannerView.setVisibility(View.INVISIBLE); /* - * Change icon - * */ + * Change icon + * */ btnCloseCamera.setImageDrawable(getResources().getDrawable(R.drawable.ok)); /* - * Reset variable - * */ + * Reset variable + * */ cameraVisible = false; } @@ -627,12 +595,12 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat Long amount = (long)Math.floor(amountFromEditText*Math.round(Math.pow(10,((CryptoCurrency)spAsset.getSelectedItem()).getPrecision()))); final ValidateBitsharesSendRequest sendRequest = new ValidateBitsharesSendRequest( - this.getContext(), - grapheneAccountSelected, - this.etTo.getText().toString(), - amount, - ((CryptoCurrency)spAsset.getSelectedItem()).getName(), - etMemo.getText().toString() + this.getContext(), + grapheneAccountSelected, + this.etTo.getText().toString(), + amount, + ((CryptoCurrency)spAsset.getSelectedItem()).getName(), + etMemo.getText().toString() ); sendRequest.setListener(new CryptoNetInfoRequestListener() { @@ -653,14 +621,28 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat }); /* - * Show loading dialog + * If exists mode scurity show it and valide events in case of success or fail * */ - crystalDialog = new CrystalDialog((Activity) getContext()); - crystalDialog.setText("Sending"); - crystalDialog.progress(); - crystalDialog.show(); + CrystalSecurityMonitor.getInstance(null).callPasswordRequest(this.getActivity(), new OnResponse() { + @Override + public void onSuccess() { - CryptoNetInfoRequests.getInstance().addRequest(sendRequest); + /* + * Show loading dialog + * */ + crystalDialog = new CrystalDialog((Activity) getContext()); + crystalDialog.setText("Sending"); + crystalDialog.progress(); + crystalDialog.show(); + + CryptoNetInfoRequests.getInstance().addRequest(sendRequest); + } + + @Override + public void onFailed() { + + } + }); } } @@ -761,4 +743,4 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat e.printStackTrace(); } } -} +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/interfaces/OnResponse.java b/app/src/main/java/cy/agorise/crystalwallet/interfaces/OnResponse.java new file mode 100644 index 0000000..ad6cac6 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/interfaces/OnResponse.java @@ -0,0 +1,6 @@ +package cy.agorise.crystalwallet.interfaces; + +public interface OnResponse { + void onSuccess(); + void onFailed(); +} 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 ec5edb2..32ae22e 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java +++ b/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java @@ -28,6 +28,7 @@ import cy.agorise.crystalwallet.requestmanagers.CryptoNetEquivalentRequest; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequest; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestsListener; import cy.agorise.crystalwallet.requestmanagers.GetBitsharesAccountNameCacheRequest; +import cy.agorise.crystalwallet.requestmanagers.ImportBitsharesAccountRequest; import cy.agorise.crystalwallet.requestmanagers.ValidateBitsharesLTMUpgradeRequest; import cy.agorise.crystalwallet.requestmanagers.ValidateBitsharesSendRequest; import cy.agorise.crystalwallet.requestmanagers.ValidateCreateBitsharesAccountRequest; @@ -222,7 +223,9 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI @Override public void onNewRequest(CryptoNetInfoRequest request) { if(request.getCoin().equals(CryptoCoin.BITSHARES)) { - if (request instanceof ValidateImportBitsharesAccountRequest) { + if (request instanceof ImportBitsharesAccountRequest) { + this.importAccount((ImportBitsharesAccountRequest) request); + } else if (request instanceof ValidateImportBitsharesAccountRequest) { this.validateImportAccount((ValidateImportBitsharesAccountRequest) request); } else if (request instanceof ValidateExistBitsharesAccountRequest) { this.validateExistAcccount((ValidateExistBitsharesAccountRequest) request); @@ -244,6 +247,78 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI } } + private void importAccount(final ImportBitsharesAccountRequest importRequest){ + final CrystalDatabase db = CrystalDatabase.getAppDatabase(importRequest.getContext()); + final AccountSeedDao accountSeedDao = db.accountSeedDao(); + ApiRequest getAccountNamesBK = new ApiRequest(0, new ApiRequestListener() { + @Override + public void success(Object answer, int idPetition) { + if(answer != null && importRequest.getStatus().equals(ImportBitsharesAccountRequest.StatusCode.NOT_STARTED)) { + UserAccount userAccount = (UserAccount) answer; + importRequest.setSeedType(SeedType.BRAINKEY); + importRequest.setStatus(ImportBitsharesAccountRequest.StatusCode.SUCCEEDED); + + AccountSeed seed = new AccountSeed(); + seed.setName(userAccount.getName()); + 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.setAccountId(userAccount.getObjectId()); + importAccountFromSeed(account, importRequest.getContext()); + } + } + } + + @Override + public void fail(int idPetition) { + BIP39 bip39 = new BIP39(-1, importRequest.getMnemonic()); + ApiRequest getAccountNamesBP39 = new ApiRequest(0, new ApiRequestListener() { + @Override + public void success(Object answer, int idPetition) { + if(answer != null && importRequest.getStatus().equals(ImportBitsharesAccountRequest.StatusCode.NOT_STARTED)) { + UserAccount userAccount = (UserAccount) answer; + importRequest.setSeedType(SeedType.BIP39); + importRequest.setStatus(ImportBitsharesAccountRequest.StatusCode.SUCCEEDED); + + AccountSeed seed = new AccountSeed(); + seed.setName(userAccount.getName()); + 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.setAccountId(userAccount.getObjectId()); + importAccountFromSeed(account, importRequest.getContext()); + } + } + } + + @Override + public void fail(int idPetition) { + importRequest.setStatus(ImportBitsharesAccountRequest.StatusCode.BAD_SEED); + } + }); + GrapheneApiGenerator.getAccountByOwnerOrActiveAddress(new Address(ECKey.fromPublicOnly(bip39.getBitsharesActiveKey(0).getPubKey())),getAccountNamesBP39); + } + }); + + + + BrainKey bk = new BrainKey(importRequest.getMnemonic(), 0); + + GrapheneApiGenerator.getAccountByOwnerOrActiveAddress(bk.getPublicAddress("BTS"),getAccountNamesBK); + + + } + /** * Process the import account request */ diff --git a/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java b/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java index dfb4cb0..fd3e2c7 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java +++ b/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java @@ -31,9 +31,16 @@ public class GrapheneAccount extends CryptoNetAccount { } public void loadInfo(GrapheneAccountInfo info){ - this.name = info.getName(); - this.accountId = info.getAccountId(); - this.upgradedToLtm = info.getUpgradedToLtm(); + if(info != null){ + this.name = info.getName(); + this.accountId = info.getAccountId(); + this.upgradedToLtm = info.getUpgradedToLtm(); + } + else{ + this.name = ""; + this.accountId = "-1"; + this.upgradedToLtm = false; + } } public String getName() { diff --git a/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ImportBitsharesAccountRequest.java b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ImportBitsharesAccountRequest.java new file mode 100644 index 0000000..14113b2 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ImportBitsharesAccountRequest.java @@ -0,0 +1,90 @@ +package cy.agorise.crystalwallet.requestmanagers; + +import android.content.Context; + +import cy.agorise.crystalwallet.enums.CryptoCoin; +import cy.agorise.crystalwallet.enums.SeedType; + +/** + * Imports a bitshares accounts, + * + * return true if the account exist, and the mnemonic (brainkey provide is for that account + * Created by Henry Varona on 10/24/2018. + */ + +public class ImportBitsharesAccountRequest extends CryptoNetInfoRequest { + + /** + * The status code of this request + */ + public enum StatusCode{ + NOT_STARTED, + SUCCEEDED, + NO_INTERNET, + NO_SERVER_CONNECTION, + ACCOUNT_DOESNT_EXIST, + BAD_SEED, + NO_ACCOUNT_DATA, + PETITION_FAILED + } + + /** + * The mnemonic words + */ + private final String mnemonic; + + /** + * If this seed is BIP39 or Brainkey + */ + private SeedType seedType; + + /** + * The status of this request + */ + private StatusCode status = StatusCode.NOT_STARTED; + + private Context context; + + public ImportBitsharesAccountRequest(String mnemonic, Context context){ + super(CryptoCoin.BITSHARES); + this.mnemonic = mnemonic; + this.context = context; + } + + public ImportBitsharesAccountRequest(String mnemonic, Context context, boolean addAccountIfValid){ + super(CryptoCoin.BITSHARES); + this.mnemonic = mnemonic; + this.context = context; + } + + public void validate(){ + if (!(this.status.equals(StatusCode.NOT_STARTED))){ + this._fireOnCarryOutEvent(); + } + } + + public String getMnemonic() { + return mnemonic; + } + + public SeedType getSeedType() { + return seedType; + } + + public Context getContext() { + return context; + } + + public void setSeedType(SeedType seedType) { + this.seedType = seedType; + } + + public void setStatus(StatusCode status) { + this.status = status; + this._fireOnCarryOutEvent(); + } + + public StatusCode getStatus() { + return status; + } +} 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 3b44223..a01f1a8 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 @@ -48,7 +48,12 @@ public class AmountValidationField extends ValidationField { CryptoCoinBalance balance = CrystalDatabase.getAppDatabase(amountField.getContext()).cryptoCoinBalanceDao().getBalanceFromAccount(this.account.getId(),cryptoCurrency.getId()); - if (newAmountValue > balance.getBalance()){ + double balanceDouble = 0; + if(balance != null){ + balanceDouble = balance.getBalance(); + } + + if (newAmountValue > balanceDouble){ setMessageForValue(mixedValues, validator.getContext().getResources().getString(R.string.insufficient_amount)); setValidForValue(mixedValues, false); } else if (newAmountValue == 0){ diff --git a/app/src/main/res/layout/import_seed.xml b/app/src/main/res/layout/import_seed.xml index 59e5f6e..5b29d02 100644 --- a/app/src/main/res/layout/import_seed.xml +++ b/app/src/main/res/layout/import_seed.xml @@ -84,8 +84,9 @@ android:layout_width="330dp" android:layout_height="wrap_content" android:layout_below="@+id/etSeedWordsLayout" + android:layout_centerHorizontal="true" android:layout_marginTop="8dp" - android:layout_centerHorizontal="true"> + android:visibility="gone"> + android:singleLine="true" + android:visibility="gone" /> diff --git a/app/src/main/res/layout/receive_transaction.xml b/app/src/main/res/layout/receive_transaction.xml index fba49b2..38ee0ff 100644 --- a/app/src/main/res/layout/receive_transaction.xml +++ b/app/src/main/res/layout/receive_transaction.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - @@ -18,11 +18,10 @@ android:layout_marginEnd="0dp" android:layout_marginStart="0dp" android:layout_marginTop="0dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_alignParentTop="true"/> + android:layout_alignParentTop="true" /> + android:layout_marginTop="30dp" + android:src="@drawable/avatar_placeholder" /> + android:layout_width="200dp" + android:layout_height="50dp" + android:layout_marginTop="30dp" + android:layout_below="@+id/txtTittle" + android:layout_alignParentRight="true" + android:layout_marginRight="20dp"/> + android:layout_below="@+id/gravatar" + android:layout_marginTop="10dp"/> + android:inputType="numberDecimal" + android:textSize="20sp" /> + android:layout_below="@+id/etAmount"/> + android:layout_alignParentRight="true" + android:layout_marginRight="20dp"/> + android:background="@color/gray" /> + android:layout_below="@+id/spAsset"/> + android:layout_below="@+id/tvAmountError" + android:layout_centerHorizontal="true"/> + android:layout_below="@+id/ivQrCode" /> + android:layout_below="@+id/ivQrCode" + android:layout_alignParentRight="true"/> - + \ No newline at end of file