diff --git a/android/app/build.gradle b/android/app/build.gradle index 301a07656c..c60d4eb2d1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -132,8 +132,8 @@ dependencies { compile project(':ReactNativeAndroidSmsListener') compile project(':react-native-camera') compile project(':react-native-orientation') -// compile(name:'geth', ext:'aar') - compile(group: 'status-im', name: 'status-go', version: '0.1.0-test-callback', ext: 'aar') + compile(name:'statusgo-android-16', ext:'aar') + //compile(group: 'status-im', name: 'status-go', version: '0.1.0-test-callback', ext: 'aar') compile fileTree(dir: "node_modules/realm/android/libs", include: ["*.jar"]) } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a7b7a31725..05008651d2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -25,8 +25,7 @@ + android:exported="true"/> diff --git a/android/app/src/main/java/com/statusim/geth/module/GethModule.java b/android/app/src/main/java/com/statusim/geth/module/GethModule.java index a4bb3e12d0..058ab03667 100644 --- a/android/app/src/main/java/com/statusim/geth/module/GethModule.java +++ b/android/app/src/main/java/com/statusim/geth/module/GethModule.java @@ -8,12 +8,15 @@ import com.statusim.geth.service.ConnectorHandler; import com.statusim.geth.service.GethConnector; import com.statusim.geth.service.GethMessages; import com.statusim.geth.service.GethService; +import android.util.Log; import java.util.HashMap; import java.util.UUID; public class GethModule extends ReactContextBaseJavaModule implements LifecycleEventListener, ConnectorHandler { + private static final String TAG = "GethModule"; + protected GethConnector geth = null; protected String handlerIdentifier = createIdentifier(); @@ -81,15 +84,20 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE @Override public boolean handleMessage(Message message) { + Log.d(TAG, "Received message: " + message.toString()); boolean isClaimed = true; Bundle data = message.getData(); String callbackIdentifier = data.getString(GethConnector.CALLBACK_IDENTIFIER); + Log.d(TAG, "callback identifier: " + callbackIdentifier); Callback callback = null; switch (message.what) { case GethMessages.MSG_NODE_STARTED: + Log.d(TAG, "handle startNodeCallbacks size: " + startNodeCallbacks.size()); callback = startNodeCallbacks.remove(callbackIdentifier); if (callback != null) { - callback.invoke(null); + callback.invoke(true); + } else { + Log.d(TAG, "Could not find callback: " + callbackIdentifier); } break; case GethMessages.MSG_NODE_STOPPED: @@ -97,7 +105,7 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE case GethMessages.MSG_ACCOUNT_CREATED: callback = createAccountCallbacks.remove(callbackIdentifier); if (callback != null) { - callback.invoke(null, "{ \"address\": \"" + data.getString("address") + "\"}"); + callback.invoke(data.getString("data")); } break; case GethMessages.MSG_ACCOUNT_ADDED: @@ -106,7 +114,7 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE callback.invoke(null, "{ \"address\": \"" + data.getString("address") + "\"}"); } break; - case GethMessages.MSG_ACCOUNT_UNLOCKED: + case GethMessages.MSG_LOGGED_IN: callback = unlockAccountCallbacks.remove(callbackIdentifier); if (callback != null) { callback.invoke(null, "{ \"result\": \"" + data.getString("result") + "\"}"); @@ -135,13 +143,15 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE } String callbackIdentifier = createIdentifier(); + Log.d(TAG, "Created callback identifier: " + callbackIdentifier); startNodeCallbacks.put(callbackIdentifier, callback); + Log.d(TAG, "startNodeCallbacks size: " + startNodeCallbacks.size()); geth.startNode(callbackIdentifier); } @ReactMethod - public void unlockAccount(String address, String password, Callback callback) { + public void login(String address, String password, Callback callback) { Activity currentActivity = getCurrentActivity(); @@ -158,11 +168,11 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE String callbackIdentifier = createIdentifier(); unlockAccountCallbacks.put(callbackIdentifier, callback); - geth.unlockAccount(callbackIdentifier, address, password); + geth.login(callbackIdentifier, address, password); } @ReactMethod - public void createAccount(Callback callback) { + public void createAccount(String password, Callback callback) { Activity currentActivity = getCurrentActivity(); @@ -179,7 +189,7 @@ public class GethModule extends ReactContextBaseJavaModule implements LifecycleE String callbackIdentifier = createIdentifier(); createAccountCallbacks.put(callbackIdentifier, callback); - geth.createAccount(callbackIdentifier); + geth.createAccount(callbackIdentifier, password); } @ReactMethod diff --git a/android/app/src/main/java/com/statusim/geth/service/GethConnector.java b/android/app/src/main/java/com/statusim/geth/service/GethConnector.java index 73a1fd74d4..7083dff2d5 100644 --- a/android/app/src/main/java/com/statusim/geth/service/GethConnector.java +++ b/android/app/src/main/java/com/statusim/geth/service/GethConnector.java @@ -42,13 +42,13 @@ public class GethConnector extends ServiceConnector { } } - public void unlockAccount(String callbackIdentifier, String address, String password) { + public void login(String callbackIdentifier, String address, String password) { if (checkBound()) { Bundle data = new Bundle(); data.putString("address", address); data.putString("password", password); - Message msg = createMessage(callbackIdentifier, GethMessages.MSG_UNLOCK_ACCOUNT, data); + Message msg = createMessage(callbackIdentifier, GethMessages.MSG_LOGIN, data); try { serviceMessenger.send(msg); } catch (RemoteException e) { @@ -57,10 +57,12 @@ public class GethConnector extends ServiceConnector { } } - public void createAccount(String callbackIdentifier) { + public void createAccount(String callbackIdentifier, String password) { if (checkBound()) { - Message msg = createMessage(callbackIdentifier, GethMessages.MSG_CREATE_ACCOUNT, null); + Bundle data = new Bundle(); + data.putString("password", password); + Message msg = createMessage(callbackIdentifier, GethMessages.MSG_CREATE_ACCOUNT, data); try { serviceMessenger.send(msg); } catch (RemoteException e) { @@ -95,6 +97,7 @@ public class GethConnector extends ServiceConnector { protected Message createMessage(String callbackIdentifier, int idMessage, Bundle data) { + Log.d(TAG, "Client messenger: " + clientMessenger.toString()); Message msg = Message.obtain(null, idMessage, 0, 0); msg.replyTo = clientMessenger; if (data == null) { diff --git a/android/app/src/main/java/com/statusim/geth/service/GethMessages.java b/android/app/src/main/java/com/statusim/geth/service/GethMessages.java index 080725bca2..f6c3e24737 100644 --- a/android/app/src/main/java/com/statusim/geth/service/GethMessages.java +++ b/android/app/src/main/java/com/statusim/geth/service/GethMessages.java @@ -26,12 +26,12 @@ public class GethMessages { /** * Unlock an account */ - public static final int MSG_UNLOCK_ACCOUNT = 5; + public static final int MSG_LOGIN = 5; /** * Account unlocked event */ - public static final int MSG_ACCOUNT_UNLOCKED = 6; + public static final int MSG_LOGGED_IN = 6; /** * Create an account diff --git a/android/app/src/main/java/com/statusim/geth/service/GethService.java b/android/app/src/main/java/com/statusim/geth/service/GethService.java index 638c4c3657..8a62fcc55f 100644 --- a/android/app/src/main/java/com/statusim/geth/service/GethService.java +++ b/android/app/src/main/java/com/statusim/geth/service/GethService.java @@ -20,6 +20,8 @@ public class GethService extends Service { private static boolean isGethInitialized = false; private final Handler handler = new Handler(); + private static String dataFolder; + static class IncomingHandler extends Handler { private final WeakReference service; @@ -80,6 +82,7 @@ public class GethService extends Service { switch (message.what) { case GethMessages.MSG_START_NODE: + Log.d(TAG, "Received start node message." + message.toString()); startNode(message); break; @@ -95,8 +98,8 @@ public class GethService extends Service { addAccount(message); break; - case GethMessages.MSG_UNLOCK_ACCOUNT: - unlockAccount(message); + case GethMessages.MSG_LOGIN: + login(message); break; default: @@ -109,16 +112,22 @@ public class GethService extends Service { protected void startNode(Message message) { if (!isGethInitialized) { isGethInitialized = true; - new StartTask(message).execute(); + Log.d(TAG, "Client messenger1: " + message.replyTo.toString()); + Bundle data = message.getData(); + String callbackIdentifier = data.getString(GethConnector.CALLBACK_IDENTIFIER); + Log.d(TAG, "Callback identifier: " + callbackIdentifier); + new StartTask(message.replyTo, callbackIdentifier).execute(); } } protected class StartTask extends AsyncTask { - protected Message message; + protected String callbackIdentifier; + protected Messenger messenger; - public StartTask(Message message) { - this.message = message; + public StartTask(Messenger messenger, String callbackIdentifier) { + this.messenger = messenger; + this.callbackIdentifier = callbackIdentifier; } protected Void doInBackground(Void... args) { @@ -127,30 +136,41 @@ public class GethService extends Service { } protected void onPostExecute(Void results) { - onGethStarted(message); + onGethStarted(messenger, callbackIdentifier); } } - protected void onGethStarted(Message message) { + protected void onGethStarted(Messenger messenger, String callbackIdentifier) { Log.d(TAG, "Geth Service started"); isGethStarted = true; - - sendReply(message, GethMessages.MSG_NODE_STARTED, null); + Message replyMessage = Message.obtain(null, GethMessages.MSG_NODE_STARTED, 0, 0, null); + Bundle replyData = new Bundle(); + Log.d(TAG, "Callback identifier: " + callbackIdentifier); + replyData.putString(GethConnector.CALLBACK_IDENTIFIER, callbackIdentifier); + replyMessage.setData(replyData); + sendReply(messenger, replyMessage); } protected void startGeth() { - Log.d(TAG, "Starting background Geth Service"); + File extStore = Environment.getExternalStorageDirectory(); - final String dataFolder = extStore.exists() ? - extStore.getAbsolutePath() : - getApplicationInfo().dataDir; + dataFolder = extStore.exists() ? + extStore.getAbsolutePath() + "/ethereum" : + getApplicationInfo().dataDir + "/ethereum"; + Log.d(TAG, "Starting background Geth Service in folder: " + dataFolder); + try { + final File newFile = new File(dataFolder); + newFile.mkdir(); + } catch (Exception e) { + Log.e(TAG, "error making folder: " + dataFolder, e); + } new Thread(new Runnable() { public void run() { - Statusgo.doStartNode(dataFolder); + Statusgo.StartNode(dataFolder); } }).start(); } @@ -158,19 +178,20 @@ public class GethService extends Service { protected void stopNode(Message message) { // TODO: stop node - sendReply(message, GethMessages.MSG_NODE_STOPPED, null); + createAndSendReply(message, GethMessages.MSG_NODE_STOPPED, null); } protected void createAccount(Message message) { Bundle data = message.getData(); String password = data.getString("password"); // TODO: remove second argument - String address = Statusgo.doCreateAccount(password, ""); - Log.d(TAG, "Created account: " + address); + Log.d(TAG, "Creating account: " + password + " - " + dataFolder); + String jsonData = Statusgo.CreateAccount(password, dataFolder); + Log.d(TAG, "Created account: " + jsonData); Bundle replyData = new Bundle(); - replyData.putString("address", address); - sendReply(message, GethMessages.MSG_ACCOUNT_CREATED, replyData); + replyData.putString("data", jsonData); + createAndSendReply(message, GethMessages.MSG_ACCOUNT_CREATED, replyData); } protected void addAccount(Message message) { @@ -184,27 +205,27 @@ public class GethService extends Service { Bundle replyData = new Bundle(); replyData.putString("address", address); - sendReply(message, GethMessages.MSG_ACCOUNT_ADDED, replyData); + createAndSendReply(message, GethMessages.MSG_ACCOUNT_ADDED, replyData); } - protected void unlockAccount(Message message) { + protected void login(Message message) { Bundle data = message.getData(); String address = data.getString("address"); String password = data.getString("password"); // TODO: remove third argument - String result = Statusgo.doUnlockAccount(address, password, 0); + String result = Statusgo.Login(address, password); Log.d(TAG, "Unlocked account: " + result); Bundle replyData = new Bundle(); replyData.putString("result", result); - sendReply(message, GethMessages.MSG_ACCOUNT_UNLOCKED, replyData); + createAndSendReply(message, GethMessages.MSG_LOGGED_IN, replyData); } public static boolean isRunning() { return isGethInitialized; } - protected void sendReply(Message message, int replyIdMessage, Bundle replyData) { + protected void createAndSendReply(Message message, int replyIdMessage, Bundle replyData) { if (message == null) { return; @@ -214,14 +235,21 @@ public class GethService extends Service { replyData = new Bundle(); } Bundle data = message.getData(); - String callbackIdentifier = data.getString("callbackIdentifier"); - replyData.putString("callbackIdentifier", callbackIdentifier); + String callbackIdentifier = data.getString(GethConnector.CALLBACK_IDENTIFIER); + Log.d(TAG, "Callback identifier: " + callbackIdentifier); + replyData.putString(GethConnector.CALLBACK_IDENTIFIER, callbackIdentifier); replyMessage.setData(replyData); + sendReply(message.replyTo, replyMessage); + } + + protected void sendReply(Messenger messenger, Message message) { try { - message.replyTo.send(replyMessage); - } catch (RemoteException e) { - Log.e(TAG, "Exception sending message id: " + replyIdMessage, e); + messenger.send(message); + + } catch (Exception e) { + + Log.e(TAG, "Exception sending message id: " + message.what, e); } } } diff --git a/android/app/src/main/java/com/statusim/geth/service/ServiceConnector.java b/android/app/src/main/java/com/statusim/geth/service/ServiceConnector.java index 1c70e92992..f20e1fcf66 100644 --- a/android/app/src/main/java/com/statusim/geth/service/ServiceConnector.java +++ b/android/app/src/main/java/com/statusim/geth/service/ServiceConnector.java @@ -52,17 +52,17 @@ public class ServiceConnector { public void handleMessage(Message message) { boolean isClaimed = false; - if (message.obj != null) { - String identifier = ((Bundle) message.obj).getString("identifier"); - if (identifier != null) { + //if (message.obj != null) { + // String identifier = ((Bundle) message.obj).getString("identifier"); + //if (identifier != null) { for (ConnectorHandler handler : handlers) { - if (identifier.equals(handler.getID())) { + // if (identifier.equals(handler.getID())) { isClaimed = handler.handleMessage(message); - } + // } } - } - } + // } + //} if (!isClaimed) { super.handleMessage(message); } diff --git a/src/status_im/android/core.cljs b/src/status_im/android/core.cljs index 38b60a5b77..db4c13c2e0 100644 --- a/src/status_im/android/core.cljs +++ b/src/status_im/android/core.cljs @@ -78,8 +78,10 @@ (defn init [] (dispatch-sync [:initialize-db]) (dispatch [:initialize-crypt]) + (dispatch [:initialize-geth]) (dispatch [:initialize-chats]) - (dispatch [:initialize-protocol]) + ;protocol must be initialized after user enters password and we create account + ;(dispatch [:initialize-protocol]) (dispatch [:load-user-phone-number]) (dispatch [:load-contacts]) ;; load commands from remote server (todo: uncomment) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index ef8ae2d24f..1f05a181bd 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -19,6 +19,9 @@ [status-im.handlers.content-suggestions :refer [get-content-suggestions]] [status-im.utils.phone-number :refer [format-phone-number]] [status-im.utils.datetime :as time] + [status-im.components.react :refer [geth]] + [status-im.utils.logging :as log] + [status-im.utils.types :refer [json->clj]] [status-im.chat.handlers.animation :refer [update-response-height get-response-height]])) @@ -259,6 +262,11 @@ (register-handler :save-password (fn [db [_ password]] + (.createAccount geth password (fn [result] + (let [data (json->clj result) + public-key (:pubkey data)] + (log/debug "Created account: " result) + (when (not (str/blank? public-key)) (dispatch [:initialize-protocol public-key]))))) (sign-up-service/save-password password) (assoc db :password-saved true))) diff --git a/src/status_im/handlers.cljs b/src/status_im/handlers.cljs index ebf835a9c3..fdfc7f64ff 100644 --- a/src/status_im/handlers.cljs +++ b/src/status_im/handlers.cljs @@ -10,6 +10,7 @@ [status-im.utils.logging :as log] [status-im.utils.crypt :refer [gen-random-bytes]] [status-im.utils.handlers :as u] + [status-im.components.react :refer [geth]] status-im.chat.handlers status-im.group-settings.handlers status-im.navigation.handlers @@ -74,6 +75,11 @@ (.toBits (.. js/ecc -sjcl -codec -hex)) (.addEntropy (.. js/ecc -sjcl -random))) (dispatch [:crypt-initialized])))))))) +(register-handler :initialize-geth + (u/side-effect! + (fn [_ _] + (log/debug "Starting node") + (.startNode geth (fn [result] (log/debug "Started Node: " result)))))) (register-handler :crypt-initialized (u/side-effect! diff --git a/src/status_im/protocol/handlers.cljs b/src/status_im/protocol/handlers.cljs index a9b94e5541..14690d6f47 100644 --- a/src/status_im/protocol/handlers.cljs +++ b/src/status_im/protocol/handlers.cljs @@ -17,8 +17,8 @@ (register-handler :initialize-protocol (u/side-effect! - (fn [db [_]] - (init-protocol (make-handler db))))) + (fn [db [_ public-key]] + (init-protocol public-key (make-handler db))))) (register-handler :protocol-initialized (fn [db [_ identity]]