From 528013ba12897c7ba17eb4808a9b220905ad0f70 Mon Sep 17 00:00:00 2001 From: henry Date: Tue, 9 Jan 2018 22:00:46 -0400 Subject: [PATCH] Added faucet function --- app/build.gradle | 2 + .../activities/IntroActivity.java | 3 +- .../BitsharesFaucetApiGenerator.java | 189 +++++++++++++++++- .../manager/BitsharesAccountManager.java | 21 +- .../crystalwallet/models/GrapheneAccount.java | 10 +- 5 files changed, 208 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 59f1e89..1355a52 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,6 +55,8 @@ dependencies { compile 'com.google.zxing:core:3.3.1' compile 'me.dm7.barcodescanner:zxing:1.9.8'; + compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' + testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' annotationProcessor 'android.arch.lifecycle:compiler:1.0.0' 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 2aee5b8..f638df3 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/IntroActivity.java @@ -48,7 +48,8 @@ public class IntroActivity extends AppCompatActivity { //If the user doesn't have any seeds created, then //send the user to create/import an account //Intent intent = new Intent(this, AccountSeedsManagementActivity.class); - Intent intent = new Intent(this, ImportSeedActivity.class); + //Intent intent = new Intent(this, ImportSeedActivity.class); + Intent intent = new Intent(this, CreateSeedActivity.class); startActivity(intent); } else { //Intent intent = new Intent(this, CreateSeedActivity.class); diff --git a/app/src/main/java/cy/agorise/crystalwallet/apigenerator/BitsharesFaucetApiGenerator.java b/app/src/main/java/cy/agorise/crystalwallet/apigenerator/BitsharesFaucetApiGenerator.java index cdc77f7..c203486 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/apigenerator/BitsharesFaucetApiGenerator.java +++ b/app/src/main/java/cy/agorise/crystalwallet/apigenerator/BitsharesFaucetApiGenerator.java @@ -1,7 +1,28 @@ package cy.agorise.crystalwallet.apigenerator; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + import com.google.gson.Gson; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.http.Body; +import retrofit2.http.Headers; +import retrofit2.http.POST; + /** * This maanges the calls for the creation of accounts using the bitshares faucet * @@ -20,10 +41,10 @@ public abstract class BitsharesFaucetApiGenerator { * @param url The url of the faucet * @return The bitshares id of the registered account, or null */ - public static String registerBitsharesAccount(String accountName, String ownerKey, + public static boolean registerBitsharesAccount(String accountName, String ownerKey, String activeKey, String memoKey, String url){ CreateAccountPetition petition = new CreateAccountPetition(); - Account account = new Account(); + final Account account = new Account(); account.name=accountName; account.owner_key=ownerKey; account.active_key=activeKey; @@ -34,7 +55,79 @@ public abstract class BitsharesFaucetApiGenerator { System.out.println("create account petition :" + jsonPetition); //TODO faucet function - return null; + + HashMap hm = new HashMap<>(); + hm.put("name", account.name); + hm.put("owner_key", account.owner_key); + hm.put("active_key", account.active_key); + hm.put("memo_key", account.memo_key); + hm.put("refcode", "agorise"); + hm.put("referrer", "agorise"); + + HashMap hashMap = new HashMap<>(); + hashMap.put("account", hm); + final boolean[] answer = {false}; + final Object SYNC = new Object(); + try { + ServiceGenerator sg = new ServiceGenerator(url); + IWebService service = sg.getService(IWebService.class); + final Call postingService = service.getReg(hashMap); + postingService.enqueue(new Callback() { + + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + RegisterAccountResponse resp = response.body(); + if (resp.account != null) { + try { + if(resp.account.name.equals(account.name)) { + synchronized (SYNC){ + answer[0] = true; + SYNC.notifyAll(); + } + }else{ + //ERROR + synchronized (SYNC) { + SYNC.notifyAll(); + } + } + } catch (Exception e) { + e.printStackTrace(); + synchronized (SYNC) { + SYNC.notifyAll(); + } + } + }else{ + //ERROR + synchronized (SYNC) { + SYNC.notifyAll(); + } + + } + }else{ + //ERROR + synchronized (SYNC) { + SYNC.notifyAll(); + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + t.printStackTrace(); + synchronized (SYNC) { + SYNC.notifyAll(); + } + } + }); + synchronized (SYNC) { + SYNC.wait(60000); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return answer[0]; } /** @@ -66,4 +159,94 @@ public abstract class BitsharesFaucetApiGenerator { */ String memo_key; } + + public static class ServiceGenerator{ + public static String TAG = "ServiceGenerator"; + public static String API_BASE_URL; + private static HttpLoggingInterceptor logging; + private static OkHttpClient.Builder clientBuilder; + private static Retrofit.Builder builder; + + private static HashMap, Object> Services; + + public ServiceGenerator(String apiBaseUrl) { + API_BASE_URL= apiBaseUrl; + logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); + clientBuilder = new OkHttpClient.Builder().addInterceptor(logging); + builder = new Retrofit.Builder().baseUrl(API_BASE_URL).addConverterFactory(GsonConverterFactory.create()); + Services = new HashMap, Object>(); + } + + public static void setService(Class klass, T thing) { + Services.put(klass, thing); + } + + public T getService(Class serviceClass) { + + T service = serviceClass.cast(Services.get(serviceClass)); + if (service == null) { + service = createService(serviceClass); + setService(serviceClass, service); + } + return service; + } + + public static S createService(Class serviceClass) { + + clientBuilder.interceptors().add(new Interceptor() { + @Override + public okhttp3.Response intercept(Chain chain) throws IOException { + okhttp3.Request original = chain.request(); + okhttp3.Request.Builder requestBuilder = original.newBuilder().method(original.method(), original.body()); + + okhttp3.Request request = requestBuilder.build(); + return chain.proceed(request); + } + }); + clientBuilder.readTimeout(5, TimeUnit.MINUTES); + clientBuilder.connectTimeout(5, TimeUnit.MINUTES); + OkHttpClient client = clientBuilder.build(); + Retrofit retrofit = builder.client(client).build(); + return retrofit.create(serviceClass); + + } + + public static IWebService Create() { + OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); + httpClient.interceptors().add(new Interceptor() { + @Override + public okhttp3.Response intercept(Chain chain) throws IOException { + okhttp3.Request original = chain.request(); + + // Customize the request + okhttp3.Request request = original.newBuilder().method(original.method(), original.body()).build(); + + okhttp3.Response response = chain.proceed(request); + + return response; + } + }); + + OkHttpClient client = httpClient.build(); + Retrofit retrofit = new Retrofit.Builder().baseUrl(API_BASE_URL).client(client).build(); + + return retrofit.create(IWebService.class); + + } + } + + public interface IWebService { + @Headers({"Content-Type: application/json"}) + @POST("/api/v1/accounts") + Call getReg(@Body Map params); + } + + public class RegisterAccountResponse { + public Account account; + public Error error; + + public class Error { + public String[] base; + } + } } 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 15babdb..b5859ba 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java +++ b/app/src/main/java/cy/agorise/crystalwallet/manager/BitsharesAccountManager.java @@ -59,22 +59,23 @@ public class BitsharesAccountManager implements CryptoAccountManager, CryptoNetI if(account instanceof GrapheneAccount) { GrapheneAccount grapheneAccount = (GrapheneAccount) account; - String btsIdAccount = BitsharesFaucetApiGenerator.registerBitsharesAccount(grapheneAccount.getName(), + boolean created = BitsharesFaucetApiGenerator.registerBitsharesAccount(grapheneAccount.getName(), new Address(grapheneAccount.getOwnerKey(context),"BTS").toString(), new Address(grapheneAccount.getActiveKey(context),"BTS").toString(), new Address(grapheneAccount.getMemoKey(context),"BTS").toString(),GrapheneApiGenerator.faucetUrl); - if(btsIdAccount !=null) { - grapheneAccount.setAccountId(btsIdAccount); + + if(created) { + GrapheneAccount fetch = this.getAccountInfoByName(grapheneAccount.getName()); CrystalDatabase db = CrystalDatabase.getAppDatabase(context); - long idAccount = db.cryptoNetAccountDao().insertCryptoNetAccount(grapheneAccount)[0]; - grapheneAccount.setId(idAccount); - db.grapheneAccountInfoDao().insertGrapheneAccountInfo(new GrapheneAccountInfo(grapheneAccount)); + long idAccount = db.cryptoNetAccountDao().insertCryptoNetAccount(fetch)[0]; + fetch.setId(idAccount); + db.grapheneAccountInfoDao().insertGrapheneAccountInfo(new GrapheneAccountInfo(fetch)); - GrapheneApiGenerator.subscribeBitsharesAccount(grapheneAccount.getId(), grapheneAccount.getAccountId(), context); - BitsharesAccountManager.refreshAccountTransactions(grapheneAccount.getId(), context); - GrapheneApiGenerator.getAccountBalance(grapheneAccount.getId(), grapheneAccount.getAccountId(), context); - return grapheneAccount; + GrapheneApiGenerator.subscribeBitsharesAccount(fetch.getId(), fetch.getAccountId(), context); + BitsharesAccountManager.refreshAccountTransactions(fetch.getId(), context); + GrapheneApiGenerator.getAccountBalance(fetch.getId(), fetch.getAccountId(), context); + return fetch; } } return null; 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 7b84960..7cf11be 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java +++ b/app/src/main/java/cy/agorise/crystalwallet/models/GrapheneAccount.java @@ -55,11 +55,15 @@ public class GrapheneAccount extends CryptoNetAccount { */ public ECKey getOwnerKey(Context context){ AccountSeed seed = CrystalDatabase.getAppDatabase(context).accountSeedDao().findById(this.getSeedId()).getValue(); - if(seed == null) - return null; + if(seed == null){ + System.out.println("Error: Seed null " + this.getSeedId()); + return null; + } if(seed.getType().equals(SeedType.BRAINKEY)){ + System.out.println("Seed type barinkey"); return seed.getPrivateKey(); }else{ + System.out.println("Seed type bip39"); DeterministicKey masterKey = (DeterministicKey) seed.getPrivateKey(); DeterministicKey purposeKey = HDKeyDerivation.deriveChildKey(masterKey, new ChildNumber(48, true)); @@ -70,7 +74,7 @@ public class GrapheneAccount extends CryptoNetAccount { DeterministicKey permission = HDKeyDerivation.deriveChildKey(accountIndexKey, new ChildNumber(0, true)); DeterministicKey address = HDKeyDerivation.deriveChildKey(permission, - new ChildNumber(0, true)); + new ChildNumber(0, false)); return address; } }