- Import Account
- Create Account (miss seed) - Created bitshares faucet api generator - Created GrapheneAccount constructor and info loader - Added funcion to daos
This commit is contained in:
parent
454644fc38
commit
119f4ea12b
9 changed files with 172 additions and 45 deletions
|
@ -4,5 +4,19 @@ package cy.agorise.crystalwallet.apigenerator;
|
|||
* Created by henry on 15/10/2017.
|
||||
*/
|
||||
|
||||
public class BitsharesFaucetApiGenerator {
|
||||
public abstract class BitsharesFaucetApiGenerator {
|
||||
|
||||
/**
|
||||
* Class to register a new Bitshares Account
|
||||
*
|
||||
* @param accountName The name of the Account to be register
|
||||
* @param ownerKey The owner key public address
|
||||
* @param activeKey The active key public address
|
||||
* @param memoKey the memo key public address
|
||||
* @return The bitshares id of the registered account, or null
|
||||
*/
|
||||
public static String registerBitsharesAccount(String accountName, String ownerKey, String activeKey, String memoKey){
|
||||
//TODO faucet function
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package cy.agorise.crystalwallet.apigenerator;
|
||||
|
||||
import android.app.Application;
|
||||
import android.arch.lifecycle.LiveData;
|
||||
import android.content.Context;
|
||||
|
||||
|
@ -7,7 +8,9 @@ import java.io.Serializable;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import cy.agorise.crystalwallet.dao.CryptoCoinBalanceDao;
|
||||
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
||||
import cy.agorise.crystalwallet.manager.BitsharesAccountManager;
|
||||
import cy.agorise.crystalwallet.models.BitsharesAsset;
|
||||
import cy.agorise.crystalwallet.models.CryptoCoinBalance;
|
||||
import cy.agorise.crystalwallet.models.CryptoNetBalance;
|
||||
|
@ -295,8 +298,10 @@ public abstract class GrapheneApiGenerator {
|
|||
thread.start();
|
||||
}
|
||||
|
||||
public static void subscribeBitsharesAccount(long accountId, final String accountBitsharesId, Context context){
|
||||
final LiveData<List<CryptoCoinBalance>> balances = CrystalDatabase.getAppDatabase(context).cryptoCoinBalanceDao().getBalancesFromAccount(accountId);
|
||||
public static void subscribeBitsharesAccount(final long accountId, final String accountBitsharesId, final Context context){
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
final LiveData<List<CryptoCoinBalance>> balances = db.cryptoCoinBalanceDao().getBalancesFromAccount(accountId);
|
||||
final CryptoCoinBalanceDao balanceDao = db.cryptoCoinBalanceDao();
|
||||
SubscriptionListener balanceListener = new SubscriptionListener() {
|
||||
@Override
|
||||
public ObjectType getInterestObjectType() {
|
||||
|
@ -313,12 +318,19 @@ public abstract class GrapheneApiGenerator {
|
|||
if(balanceUpdate.owner.equals(accountBitsharesId)){
|
||||
boolean find = false;
|
||||
for(CryptoCoinBalance balance : balances.getValue()){
|
||||
|
||||
}
|
||||
if(!find){
|
||||
CryptoCoinBalance balance = new CryptoCoinBalance();
|
||||
|
||||
balanceDao.insertCryptoCoinBalance(balance);
|
||||
}
|
||||
//TODO balance function
|
||||
//TODO refresh transactions
|
||||
BitsharesAccountManager.refreshAccountTransactions(accountId,context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -337,8 +349,8 @@ public abstract class GrapheneApiGenerator {
|
|||
}
|
||||
|
||||
public static void getAccountBalance(final long accountId, final String accountGrapheneId, final Context context){
|
||||
|
||||
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
final CryptoCoinBalanceDao balanceDao = db.cryptoCoinBalanceDao();
|
||||
WebSocketThread thread = new WebSocketThread(new GetAccountBalances(new UserAccount(accountGrapheneId), null, new WitnessResponseListener() {
|
||||
@Override
|
||||
public void onSuccess(WitnessResponse response) {
|
||||
|
@ -347,9 +359,11 @@ public abstract class GrapheneApiGenerator {
|
|||
CryptoCoinBalance ccBalance = new CryptoCoinBalance();
|
||||
ccBalance.setAccountId(accountId);
|
||||
ccBalance.setBalance(balance.getAmount().longValue());
|
||||
//TODO find asset
|
||||
//ccBalance.setCryptoCurrency();
|
||||
|
||||
//TODO cryptocyrrency
|
||||
CrystalDatabase.getAppDatabase(context).cryptoCoinBalanceDao().insertCryptoCoinBalance(ccBalance);
|
||||
|
||||
balanceDao.insertCryptoCoinBalance(ccBalance);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@ public interface CryptoNetAccountDao {
|
|||
@Query("SELECT * FROM crypto_net_account")
|
||||
List<CryptoNetAccount> getAll();
|
||||
|
||||
@Query("SELECT * FROM crypto_net_account WHERE id = :accountId")
|
||||
LiveData<CryptoNetAccount> getById( long accountId);
|
||||
|
||||
@Query("SELECT * FROM crypto_net_account WHERE crypto_net = 'BITSHARES'")
|
||||
LiveData<List<CryptoNetAccount>> getBitsharesAccounts();
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ public interface GrapheneAccountInfoDao {
|
|||
LiveData<List<GrapheneAccountInfo>> getAll();
|
||||
|
||||
@Query("SELECT * FROM graphene_account WHERE crypto_net_account_id = :cryptoNetAccountId")
|
||||
LiveData<GrapheneAccountInfo> getGrapheneAccountInfo(int cryptoNetAccountId);
|
||||
LiveData<GrapheneAccountInfo> getGrapheneAccountInfo(long cryptoNetAccountId);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
public long[] insertGrapheneAccountInfo(GrapheneAccountInfo... accounts);
|
||||
|
|
|
@ -13,6 +13,7 @@ import java.util.Objects;
|
|||
|
||||
import cy.agorise.crystalwallet.apigenerator.ApiRequest;
|
||||
import cy.agorise.crystalwallet.apigenerator.ApiRequestListener;
|
||||
import cy.agorise.crystalwallet.apigenerator.BitsharesFaucetApiGenerator;
|
||||
import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator;
|
||||
import cy.agorise.crystalwallet.cryptonetinforequests.CryptoNetInfoRequest;
|
||||
import cy.agorise.crystalwallet.cryptonetinforequests.CryptoNetInfoRequestsListener;
|
||||
|
@ -20,12 +21,14 @@ import cy.agorise.crystalwallet.cryptonetinforequests.ValidateBitsharesSendReque
|
|||
import cy.agorise.crystalwallet.cryptonetinforequests.ValidateExistBitsharesAccountRequest;
|
||||
import cy.agorise.crystalwallet.cryptonetinforequests.ValidateImportBitsharesAccountRequest;
|
||||
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
||||
import cy.agorise.crystalwallet.enums.CryptoNet;
|
||||
import cy.agorise.crystalwallet.models.AccountSeed;
|
||||
import cy.agorise.crystalwallet.models.BitsharesAsset;
|
||||
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
|
||||
import cy.agorise.crystalwallet.models.CryptoCurrency;
|
||||
import cy.agorise.crystalwallet.models.CryptoNetAccount;
|
||||
import cy.agorise.crystalwallet.models.GrapheneAccount;
|
||||
import cy.agorise.crystalwallet.models.GrapheneAccountInfo;
|
||||
import cy.agorise.graphenej.Address;
|
||||
import cy.agorise.graphenej.Asset;
|
||||
import cy.agorise.graphenej.AssetAmount;
|
||||
|
@ -36,6 +39,7 @@ import cy.agorise.graphenej.Transaction;
|
|||
import cy.agorise.graphenej.UserAccount;
|
||||
import cy.agorise.graphenej.models.AccountProperties;
|
||||
import cy.agorise.graphenej.models.HistoricalTransfer;
|
||||
import cy.agorise.graphenej.objects.Memo;
|
||||
import cy.agorise.graphenej.operations.TransferOperationBuilder;
|
||||
|
||||
/**
|
||||
|
@ -45,10 +49,24 @@ import cy.agorise.graphenej.operations.TransferOperationBuilder;
|
|||
public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetInfoRequestsListener {
|
||||
@Override
|
||||
public CryptoNetAccount createAccountFromSeed(CryptoNetAccount account, Context context) {
|
||||
//TODO generate account keys
|
||||
//TODO register account faucet api
|
||||
//TODO save account on DB
|
||||
//TODO subscribe account
|
||||
if(account instanceof GrapheneAccount) {
|
||||
|
||||
GrapheneAccount grapheneAccount = (GrapheneAccount) account;
|
||||
|
||||
BitsharesFaucetApiGenerator.registerBitsharesAccount(grapheneAccount.getName(),
|
||||
new Address(grapheneAccount.getOwnerKey(),"BTS").toString(),
|
||||
new Address(grapheneAccount.getActiveKey(),"BTS").toString(),
|
||||
new Address(grapheneAccount.getMemoKey(),"BTS").toString());
|
||||
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
db.cryptoNetAccountDao().insertCryptoNetAccount(grapheneAccount);
|
||||
db.grapheneAccountInfoDao().insertGrapheneAccountInfo(new GrapheneAccountInfo(grapheneAccount));
|
||||
|
||||
GrapheneApiGenerator.subscribeBitsharesAccount(grapheneAccount.getId(), grapheneAccount.getAccountId(), context);
|
||||
this.refreshAccountTransactions(account.getId(), context);
|
||||
GrapheneApiGenerator.getAccountBalance(grapheneAccount.getId(), grapheneAccount.getAccountId(), context);
|
||||
return grapheneAccount;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -63,10 +81,14 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI
|
|||
}else if(grapheneAccount.getName() == null){
|
||||
grapheneAccount = this.getAccountInfoById(grapheneAccount.getAccountId());
|
||||
}
|
||||
//TODO grapaheneAccount null, error fetching
|
||||
if(grapheneAccount == null) {
|
||||
//TODO grapaheneAccount null, error fetching
|
||||
return null;
|
||||
}
|
||||
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
//TODO save account on DB
|
||||
db.cryptoNetAccountDao().insertCryptoNetAccount(grapheneAccount);
|
||||
db.grapheneAccountInfoDao().insertGrapheneAccountInfo(new GrapheneAccountInfo(grapheneAccount));
|
||||
|
||||
GrapheneApiGenerator.subscribeBitsharesAccount(grapheneAccount.getId(), grapheneAccount.getAccountId(), context);
|
||||
this.refreshAccountTransactions(account.getId(), context);
|
||||
|
@ -80,12 +102,18 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI
|
|||
public void loadAccountFromDB(CryptoNetAccount account, Context context) {
|
||||
if(account instanceof GrapheneAccount){
|
||||
GrapheneAccount grapheneAccount = (GrapheneAccount) account;
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getGrapheneAccountInfo(account.getId()).getValue());
|
||||
if(grapheneAccount.getAccountId() == null){
|
||||
grapheneAccount = this.getAccountInfoByName(grapheneAccount.getName());
|
||||
}else if(grapheneAccount.getName() == null){
|
||||
grapheneAccount = this.getAccountInfoById(grapheneAccount.getAccountId());
|
||||
}
|
||||
//TODO grapaheneAccount null, error fetching
|
||||
|
||||
if(grapheneAccount == null) {
|
||||
//TODO grapaheneAccount null, error fetching
|
||||
return;
|
||||
}
|
||||
|
||||
GrapheneApiGenerator.subscribeBitsharesAccount(grapheneAccount.getId(),grapheneAccount.getAccountId(),context);
|
||||
this.refreshAccountTransactions(account.getId(),context);
|
||||
|
@ -163,19 +191,21 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI
|
|||
|
||||
private void validateSendRequest(final ValidateBitsharesSendRequest sendRequest){
|
||||
Asset feeAsset = new Asset(sendRequest.getFeeAsset());
|
||||
UserAccount fromUserAccount =new UserAccount(sendRequest.getSourceAccount().getAccountId());
|
||||
UserAccount toUserAccount = new UserAccount(sendRequest.getToAccount());
|
||||
TransferOperationBuilder builder = new TransferOperationBuilder()
|
||||
.setSource(new UserAccount(sendRequest.getSourceAccount().getAccountId()))
|
||||
.setDestination(new UserAccount(sendRequest.getToAccount()))
|
||||
.setSource(fromUserAccount)
|
||||
.setDestination(toUserAccount)
|
||||
.setTransferAmount(new AssetAmount(UnsignedLong.valueOf(sendRequest.getBaseAmount()), new Asset(sendRequest.getBaseAsset())))
|
||||
.setFee(new AssetAmount(UnsignedLong.valueOf(sendRequest.getFeeAmount()), feeAsset));
|
||||
//TODO memo
|
||||
if(sendRequest.getMemo() != null) {
|
||||
//builder.setMemo(new Memo(fromUserAccount,toUserAccount,0,sendRequest.getMemo().getBytes()));
|
||||
//TODO memo
|
||||
}
|
||||
ArrayList<BaseOperation> operationList = new ArrayList();
|
||||
operationList.add(builder.build());
|
||||
|
||||
//TODO get privateKey with seed model
|
||||
LiveData<AccountSeed> seed = CrystalDatabase.getAppDatabase(sendRequest.getContext()).accountSeedDao().findById(sendRequest.getSourceAccount().getSeedId());
|
||||
|
||||
ECKey privateKey = new BrainKey(seed.getValue().getMasterSeed(),0).getPrivateKey();
|
||||
ECKey privateKey = sendRequest.getSourceAccount().getActiveKey();
|
||||
Transaction transaction = new Transaction(privateKey, null, operationList);
|
||||
|
||||
ApiRequest transactionRequest = new ApiRequest(0, new ApiRequestListener() {
|
||||
|
@ -237,22 +267,29 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI
|
|||
return listener.account;
|
||||
}
|
||||
|
||||
public void refreshAccountTransactions(final long idAccount, Context context){
|
||||
final CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
final LiveData<List<CryptoCoinTransaction>> transactions = db.transactionDao().getByIdAccount(idAccount);
|
||||
final LiveData<GrapheneAccount> account = null;
|
||||
//TODO find account
|
||||
int start = transactions.getValue().size();
|
||||
int limit = 50;
|
||||
int stop = start + limit;
|
||||
public static void refreshAccountTransactions(long idAccount, Context context){
|
||||
CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
||||
LiveData<List<CryptoCoinTransaction>> transactions = db.transactionDao().getByIdAccount(idAccount);
|
||||
LiveData<CryptoNetAccount> account = db.cryptoNetAccountDao().getById(idAccount);
|
||||
if(account.getValue().getCryptoNet() == CryptoNet.BITSHARES) {
|
||||
|
||||
ApiRequest transactionRequest = new ApiRequest(0, new TransactionRequestListener(start,stop,limit,account.getValue(),db));
|
||||
GrapheneAccount grapheneAccount = new GrapheneAccount(account.getValue());
|
||||
|
||||
grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getGrapheneAccountInfo(idAccount).getValue());
|
||||
|
||||
|
||||
GrapheneApiGenerator.getAccountTransaction(account.getValue().getName(),start,stop,limit,transactionRequest);
|
||||
int start = transactions.getValue().size();
|
||||
int limit = 50;
|
||||
int stop = start + limit;
|
||||
|
||||
ApiRequest transactionRequest = new ApiRequest(0, new TransactionRequestListener(start, stop, limit, grapheneAccount, db));
|
||||
|
||||
|
||||
GrapheneApiGenerator.getAccountTransaction(grapheneAccount.getName(), start, stop, limit, transactionRequest);
|
||||
}
|
||||
}
|
||||
|
||||
private class TransactionRequestListener implements ApiRequestListener{
|
||||
private static class TransactionRequestListener implements ApiRequestListener{
|
||||
|
||||
int start;
|
||||
int stop;
|
||||
|
|
|
@ -34,8 +34,8 @@ public class CryptoCoinBalance {
|
|||
@ColumnInfo(name="account_id")
|
||||
private long mAccountId;
|
||||
|
||||
@ColumnInfo(name = "coin")
|
||||
private CryptoCoin mCoin;
|
||||
@ColumnInfo(name = "crypto_currency_id")
|
||||
private long mCryptoCurrencyId;
|
||||
|
||||
@ColumnInfo(name = "balance")
|
||||
private long mBalance;
|
||||
|
@ -56,12 +56,12 @@ public class CryptoCoinBalance {
|
|||
this.mAccountId = accountId;
|
||||
}
|
||||
|
||||
public CryptoCoin getCoin() {
|
||||
return mCoin;
|
||||
public long getCryptoCurrency() {
|
||||
return mCryptoCurrencyId;
|
||||
}
|
||||
|
||||
public void setCoin(CryptoCoin coin) {
|
||||
this.mCoin = coin;
|
||||
public void setCryptoCurrency(long cryptoCurrencyId) {
|
||||
this.mCryptoCurrencyId = cryptoCurrencyId;
|
||||
}
|
||||
|
||||
public long getBalance() {
|
||||
|
@ -76,7 +76,7 @@ public class CryptoCoinBalance {
|
|||
@Override
|
||||
public boolean areItemsTheSame(
|
||||
@NonNull CryptoCoinBalance oldBalance, @NonNull CryptoCoinBalance newBalance) {
|
||||
return oldBalance.getCoin() == newBalance.getCoin();
|
||||
return oldBalance.getCryptoCurrency() == newBalance.getCryptoCurrency();
|
||||
}
|
||||
@Override
|
||||
public boolean areContentsTheSame(
|
||||
|
@ -94,7 +94,7 @@ public class CryptoCoinBalance {
|
|||
|
||||
if (mAccountId != that.mAccountId) return false;
|
||||
if (mBalance != that.mBalance) return false;
|
||||
return mCoin == that.mCoin;
|
||||
return mCryptoCurrencyId == that.mCryptoCurrencyId;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,16 @@ public class CryptoNetAccount {
|
|||
@ColumnInfo(name = "crypto_net")
|
||||
private CryptoNet mCryptoNet;
|
||||
|
||||
public CryptoNetAccount() {
|
||||
}
|
||||
|
||||
public CryptoNetAccount(long mId, long mSeedId, int mAccountIndex, CryptoNet mCryptoNet) {
|
||||
this.mId = mId;
|
||||
this.mSeedId = mSeedId;
|
||||
this.mAccountIndex = mAccountIndex;
|
||||
this.mCryptoNet = mCryptoNet;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return mId;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package cy.agorise.crystalwallet.models;
|
||||
|
||||
import org.bitcoinj.core.ECKey;
|
||||
|
||||
/**
|
||||
*
|
||||
* Created by henry on 24/9/2017.
|
||||
*/
|
||||
|
||||
|
@ -10,6 +13,18 @@ public class GrapheneAccount extends CryptoNetAccount {
|
|||
protected String name;
|
||||
protected String accountId;
|
||||
|
||||
public GrapheneAccount() {
|
||||
}
|
||||
|
||||
public GrapheneAccount(CryptoNetAccount account) {
|
||||
super(account.getId(),account.getSeedId(),account.getAccountIndex(),account.getCryptoNet());
|
||||
}
|
||||
|
||||
public void loadInfo(GrapheneAccountInfo info){
|
||||
this.name = info.getName();
|
||||
this.accountId = info.getAccountId();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
@ -25,4 +40,28 @@ public class GrapheneAccount extends CryptoNetAccount {
|
|||
public void setAccountId(String accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the owner key, generates from the seed if it has not been generated. null if it can't be generated
|
||||
*/
|
||||
public ECKey getOwnerKey(){
|
||||
//TODO implement
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the active key, generates from the seed if it has not been generated. null if it can't be generated
|
||||
*/
|
||||
public ECKey getActiveKey(){
|
||||
//TODO implement
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the memo key, generates from the seed if it has not been generated. null if it can't be generated
|
||||
*/
|
||||
public ECKey getMemoKey(){
|
||||
//TODO implement
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ import android.arch.persistence.room.Index;
|
|||
public class GrapheneAccountInfo {
|
||||
|
||||
@ColumnInfo(name = "crypto_net_account_id")
|
||||
protected String cryptoNetAccountId;
|
||||
protected long cryptoNetAccountId;
|
||||
|
||||
@ColumnInfo(name = "account_name")
|
||||
protected String name;
|
||||
|
@ -25,11 +25,21 @@ public class GrapheneAccountInfo {
|
|||
@ColumnInfo(name = "account_id")
|
||||
protected String accountId;
|
||||
|
||||
public String getCryptoNetAccountId() {
|
||||
public GrapheneAccountInfo(long cryptoNetAccountId) {
|
||||
this.cryptoNetAccountId = cryptoNetAccountId;
|
||||
}
|
||||
|
||||
public GrapheneAccountInfo(GrapheneAccount account) {
|
||||
this.cryptoNetAccountId = account.getId();
|
||||
this.name = account.getName();
|
||||
this.accountId = account.getAccountId();
|
||||
}
|
||||
|
||||
public long getCryptoNetAccountId() {
|
||||
return cryptoNetAccountId;
|
||||
}
|
||||
|
||||
public void setCryptoNetAccountId(String cryptoNetAccountId) {
|
||||
public void setCryptoNetAccountId(long cryptoNetAccountId) {
|
||||
this.cryptoNetAccountId = cryptoNetAccountId;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue