Added the exist account validator (also in the manager)

Added the network packahe with the WebSocketThread to manage the grapahen like connection
Change the GrapehenApiGenerator to use the WebSocketThread
master
henry 2017-10-08 12:02:11 -04:00
parent 2042c37afa
commit a88bbe97e5
4 changed files with 210 additions and 98 deletions

View File

@ -8,6 +8,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cy.agorise.crystalwallet.network.WebSocketThread;
import cy.agorise.graphenej.Address;
import cy.agorise.graphenej.UserAccount;
import cy.agorise.graphenej.api.GetAccountByName;
@ -22,12 +23,14 @@ import cy.agorise.graphenej.models.WitnessResponse;
/**
* This class manage all the api request directly to the Graphene Servers
* Created by henry on 26/9/2017.
*/
public class GrapheneApiGenerator {
//TODO network connections
//TODO make to work with all Graphene stype, not only bitshares
private static int connectionTimeout = 5000;
private static String url = "http://128.0.69.157:8090";
@ -38,46 +41,28 @@ public class GrapheneApiGenerator {
* @param request The Api request object, to answer this petition
*/
public static void getAccountById(String accountId, final ApiRequest request){
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(connectionTimeout);
try {
final WebSocket webSocket = factory.createSocket(url);
webSocket.addListener(new GetAccounts(accountId, new WitnessResponseListener() {
@Override
public void onSuccess(WitnessResponse response) {
if (response.result.getClass() == ArrayList.class) {
List list = (List) response.result;
if (list.size() > 0) {
if (list.get(0).getClass() == AccountProperties.class) {
request.getListener().success(list.get(0),request.getId());
return;
//TODO answer a crystal model
}
WebSocketThread thread = new WebSocketThread(new GetAccounts(accountId, new WitnessResponseListener() {
@Override
public void onSuccess(WitnessResponse response) {
if (response.result.getClass() == ArrayList.class) {
List list = (List) response.result;
if (list.size() > 0) {
if (list.get(0).getClass() == AccountProperties.class) {
request.getListener().success(list.get(0),request.getId());
return;
//TODO answer a crystal model
}
}
request.getListener().fail(request.getId());
}
request.getListener().fail(request.getId());
}
@Override
public void onError(BaseResponse.Error error) {
request.getListener().fail(request.getId());
}
}));
Thread thread = new Thread(){
public void run(){
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try {
webSocket.connect();
} catch (WebSocketException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
};
thread.start();
} catch (IOException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
@Override
public void onError(BaseResponse.Error error) {
request.getListener().fail(request.getId());
}
}),url);
thread.start();
}
/**
@ -87,11 +72,7 @@ public class GrapheneApiGenerator {
* @param request The Api request object, to answer this petition
*/
public static void getAccountByOwnerOrActiveAddress(Address address, final ApiRequest request){
//TODO change address
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(connectionTimeout);
try {
final WebSocket webSocket = factory.createSocket(url);
webSocket.addListener(new GetKeyReferences(address, true, new WitnessResponseListener() {
WebSocketThread thread = new WebSocketThread(new GetKeyReferences(address, true, new WitnessResponseListener() {
@Override
public void onSuccess(WitnessResponse response) {
final List<List<UserAccount>> resp = (List<List<UserAccount>>) response.result;
@ -107,23 +88,9 @@ public class GrapheneApiGenerator {
public void onError(BaseResponse.Error error) {
request.getListener().fail(request.getId());
}
}));
Thread thread = new Thread(){
public void run(){
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try {
webSocket.connect();
} catch (WebSocketException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
};
}),url);
thread.start();
} catch (IOException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
/**
@ -136,10 +103,7 @@ public class GrapheneApiGenerator {
* @param request The Api request object, to answer this petition
*/
public static void getAccountTransaction(String accountId, int start, int stop, int limit, final ApiRequest request){
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(connectionTimeout);
try {
final WebSocket webSocket = factory.createSocket(url);
webSocket.addListener(new GetRelativeAccountHistory(new UserAccount(accountId), stop, limit, start, new WitnessResponseListener() {
WebSocketThread thread = new WebSocketThread(new GetRelativeAccountHistory(new UserAccount(accountId), stop, limit, start, new WitnessResponseListener() {
@Override
public void onSuccess(WitnessResponse response) {
WitnessResponse<List<HistoricalTransfer>> resp = response;
@ -150,23 +114,8 @@ public class GrapheneApiGenerator {
public void onError(BaseResponse.Error error) {
request.getListener().fail(request.getId());
}
}));
Thread thread = new Thread(){
public void run(){
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try {
webSocket.connect();
} catch (WebSocketException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
};
}),url);
thread.start();
} catch (IOException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
/**
@ -176,10 +125,7 @@ public class GrapheneApiGenerator {
* @param request The Api request object, to answer this petition
*/
public static void getAccountIdByName(String accountName, final ApiRequest request){
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(connectionTimeout);
try {
final WebSocket webSocket = factory.createSocket(url);
webSocket.addListener(new GetAccountByName(accountName, new WitnessResponseListener() {
WebSocketThread thread = new WebSocketThread(new GetAccountByName(accountName, new WitnessResponseListener() {
@Override
public void onSuccess(WitnessResponse response) {
AccountProperties accountProperties = ((WitnessResponse<AccountProperties>) response).result;
@ -194,22 +140,7 @@ public class GrapheneApiGenerator {
public void onError(BaseResponse.Error error) {
request.getListener().fail(request.getId());
}
}));
Thread thread = new Thread(){
public void run(){
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try {
webSocket.connect();
} catch (WebSocketException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}
};
thread.start();
} catch (IOException e) {
e.printStackTrace();
request.getListener().fail(request.getId());
}
}),url);
thread.start();
}
}

View File

@ -0,0 +1,39 @@
package cy.agorise.crystalwallet.cryptonetinforequests;
import cy.agorise.crystalwallet.enums.CryptoCoin;
/**
* This class validates that an account name exist, this can be used to verified the existing accounts
* or to verified if the name is available to create an Account
*
* Created by henry on 8/10/2017.
*/
public class ValidateExistBitsharesAccountRequest extends CryptoNetInfoRequest {
// The account name to validate
private String accountName;
// The result of the validation, or null if there isn't a response
private Boolean accountExists;
public ValidateExistBitsharesAccountRequest(CryptoCoin coin, String accountName) {
super(coin);
this.accountName = accountName;
}
public void setAccountExists(boolean value){
this.accountExists = value;
this.validate();
}
public void validate(){
if ((this.accountExists != null)){
this._fireOnCarryOutEvent();
}
}
public String getAccountName() {
return accountName;
}
}

View File

@ -5,6 +5,7 @@ import cy.agorise.crystalwallet.apigenerator.ApiRequestListener;
import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator;
import cy.agorise.crystalwallet.cryptonetinforequests.CryptoNetInfoRequest;
import cy.agorise.crystalwallet.cryptonetinforequests.CryptoNetInfoRequestsListener;
import cy.agorise.crystalwallet.cryptonetinforequests.ValidateExistBitsharesAccountRequest;
import cy.agorise.crystalwallet.cryptonetinforequests.ValidateImportBitsharesAccountRequest;
import cy.agorise.crystalwallet.models.CryptoNetAccount;
import cy.agorise.graphenej.Address;
@ -74,6 +75,21 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI
}
});
GrapheneApiGenerator.getAccountIdByName(importRequest.getAccountName(),checkAccountName);
} else if (request instanceof ValidateExistBitsharesAccountRequest){
final ValidateExistBitsharesAccountRequest importRequest = (ValidateExistBitsharesAccountRequest) request;
ApiRequest checkAccountName = new ApiRequest(0, new ApiRequestListener() {
@Override
public void success(Object answer, int idPetition) {
importRequest.setAccountExists(true);
}
@Override
public void fail(int idPetition) {
//TODO verified
importRequest.setAccountExists(false);
}
});
GrapheneApiGenerator.getAccountIdByName(importRequest.getAccountName(),checkAccountName);
}
}

View File

@ -0,0 +1,126 @@
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;
import java.io.IOException;
import java.util.HashMap;
/**
* Created by henry on 8/10/2017.
*/
public class WebSocketThread extends Thread {
// The tag of this class for the log
private final String TAG = this.getClass().getName();
//This is to manage the differents threads of this app
private static HashMap<Long,WebSocketThread> currentThreads = new HashMap<>();
// The connection tiemout
private static int connectionTimeout = 5000;
// The websocket to be used
private WebSocket mWebSocket;
// The socketListener for the websocket to reponse
private WebSocketListener mWebSocketListener;
// The url to connect
private String mUrl;
// If the parameters of this class can be change
private boolean canChange = true;
/**
* Basic constructor,
*
* TODO make it throw exception is problem creating the socket
*
* @param webSocketListener The socket listener for the wbesocket to response
* @param url The url to connect
*/
public WebSocketThread(WebSocketListener webSocketListener, String url) {
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());
}
}
/**
* Gets the current url where the websocket will connect
* @return the full url
*/
public String getUrl() {
return mUrl;
}
/**
* Sets the url of the websocket to connects, it would not change if this thread was already started
* @param url The full url with the protocol and the ports
*/
public void setUrl(String url) {
if(canChange) {
try {
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(5000);
this.mUrl = url;
mWebSocket = factory.createSocket(mUrl);
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());
}
}
}
/**
* Return the class listening for the websocket response
*/
public WebSocketListener getWebSocketListener() {
return mWebSocketListener;
}
/**
* Sets the class listenening the websocket response, it will not change if this thread was already started
*/
public void setWebSocketListener(WebSocketListener webSocketListener) {
if(canChange) {
try {
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(5000);
this.mWebSocketListener = webSocketListener;
mWebSocket = factory.createSocket(mUrl);
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());
}
}
}
@Override
public void run() {
canChange = false;
// Moves the current Thread into the background
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try {
WebSocketThread.currentThreads.put(this.getId(),this);
mWebSocket.connect();
} 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());
}
}