diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 187790fd58..809b7cba1a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -27,7 +27,6 @@ diff --git a/android/build.gradle b/android/build.gradle index eb73d12235..496c8d0e35 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 4db8c48fe5..e902309aef 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 20 10:42:35 EEST 2016 +#Sun Jan 22 10:12:39 EET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/externs/externs.js b/externs/externs.js index c2cb380fba..299e247aa1 100644 --- a/externs/externs.js +++ b/externs/externs.js @@ -84,6 +84,7 @@ var TopLevel = { "isMatches" : function () {}, "isMobile" : function () {}, "isSyncing" : function () {}, +"getSyncing" : function () {}, "isValid" : function () {}, "Item" : function () {}, "JSON" : function () {}, diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/ServiceConnector.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/ServiceConnector.java index 860a216d98..43afd90118 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/ServiceConnector.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/ServiceConnector.java @@ -6,11 +6,13 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.*; +import android.util.Log; import java.util.ArrayList; public class ServiceConnector { + private static final String TAG = "ServiceConnector"; /** Context of the activity from which this connector was launched */ private Context context; @@ -41,15 +43,15 @@ public class ServiceConnector { boolean isClaimed = false; //if (message.obj != null) { - // String identifier = ((Bundle) message.obj).getString("identifier"); - //if (identifier != null) { + // String identifier = ((Bundle) message.obj).getString("identifier"); + //if (identifier != null) { - for (ConnectorHandler handler : handlers) { + for (ConnectorHandler handler : handlers) { // if (identifier.equals(handler.getID())) { - isClaimed = handler.handleMessage(message); - // } - } - // } + isClaimed = handler.handleMessage(message); + // } + } + // } //} if (!isClaimed) { super.handleMessage(message); @@ -136,4 +138,16 @@ public class ServiceConnector { handlers.remove(handler); } + + public void sendMessage() { + + Message msg = Message.obtain(null, 0, 0, 0); + msg.replyTo = clientMessenger; + try { + Log.d(TAG, "Sending message to service: "); + serviceMessenger.send(msg); + } catch (RemoteException e) { + Log.e(TAG, "Exception sending message(" + msg.toString() + ") to service: ", e); + } + } } diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusConnector.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusConnector.java deleted file mode 100644 index e44645ae06..0000000000 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusConnector.java +++ /dev/null @@ -1,156 +0,0 @@ -package im.status.ethereum.module; - - -import android.content.Context; -import android.os.Bundle; -import android.os.Message; -import android.os.RemoteException; -import android.util.Log; - -public class StatusConnector extends ServiceConnector { - - private static final String TAG = "StatusConnector"; - - public static final String CALLBACK_IDENTIFIER = "callbackIdentifier"; - - public StatusConnector(Context context, Class serviceClass) { - - super(context, serviceClass); - } - - public void startNode(String callbackIdentifier) { - - if (checkBound()) { - sendMessage(callbackIdentifier, StatusMessages.MSG_START_NODE, null); - } - } - - public void stopNode(String callbackIdentifier) { - - if (checkBound()) { - sendMessage(callbackIdentifier, StatusMessages.MSG_STOP_NODE, null); - } - } - - public void startRPC() { - if (checkBound()) { - sendMessage(null, StatusMessages.MSG_START_RPC, null); - } - } - - public void stopRPC() { - if (checkBound()) { - sendMessage(null, StatusMessages.MSG_STOP_RPC, null); - } - } - - public void login(String callbackIdentifier, String address, String password) { - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("address", address); - data.putString("password", password); - sendMessage(callbackIdentifier, StatusMessages.MSG_LOGIN, data); - } - } - - public void createAccount(String callbackIdentifier, String password) { - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("password", password); - sendMessage(callbackIdentifier, StatusMessages.MSG_CREATE_ACCOUNT, data); - } - } - - public void recoverAccount(String callbackIdentifier, String passphrase, String password) { - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("passphrase", passphrase); - data.putString("password", password); - sendMessage(callbackIdentifier, StatusMessages.MSG_RECOVER_ACCOUNT, data); - } - } - - public void completeTransaction(String callbackIdentifier, String hash, String password){ - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("hash", hash); - data.putString("password", password); - sendMessage(callbackIdentifier, StatusMessages.MSG_COMPLETE_TRANSACTION, data); - } - } - - public void discardTransaction(String id){ - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("id", id); - sendMessage(null, StatusMessages.MSG_DISCARD_TRANSACTION, data); - } - } - - public void initJail(String callbackIdentifier, String js){ - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("js", js); - sendMessage(callbackIdentifier, StatusMessages.MSG_JAIL_INIT, data); - } - } - - public void parseJail(String callbackIdentifier, String chatId, String js){ - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("chatId", chatId); - data.putString("js", js); - sendMessage(callbackIdentifier, StatusMessages.MSG_JAIL_PARSE, data); - } - } - - public void callJail(String callbackIdentifier, String chatId, String path, String params){ - - if (checkBound()) { - Bundle data = new Bundle(); - data.putString("chatId", chatId); - data.putString("path", path); - data.putString("params", params); - sendMessage(callbackIdentifier, StatusMessages.MSG_JAIL_CALL, data); - } - } - - private boolean checkBound() { - - if (!isBound) { - Log.d(TAG, "StatusConnector not bound!"); - return false; - } - return true; - } - - private 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) { - data = new Bundle(); - } - data.putString(CALLBACK_IDENTIFIER, callbackIdentifier); - msg.setData(data); - return msg; - } - - private void sendMessage(String callbackIdentifier, int idMessage, Bundle data) { - - Message msg = createMessage(callbackIdentifier, idMessage, data); - try { - serviceMessenger.send(msg); - } catch (RemoteException e) { - Log.e(TAG, "Exception sending message(" + msg.toString() + ") to service: ", e); - } - } -} diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusMessages.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusMessages.java deleted file mode 100644 index 4113dfe3a7..0000000000 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusMessages.java +++ /dev/null @@ -1,72 +0,0 @@ -package im.status.ethereum.module; - - -public class StatusMessages { - - /** - * Start the node - */ - static final int MSG_START_NODE = 1; - - /** - * Stop the node - */ - static final int MSG_STOP_NODE = 2; - - /** - * Unlock an account - */ - static final int MSG_LOGIN = 3; - - /** - * Create an account - */ - static final int MSG_CREATE_ACCOUNT = 4; - - /** - * Create an account - */ - static final int MSG_RECOVER_ACCOUNT = 5; - - /** - * Account complete transaction event - */ - static final int MSG_COMPLETE_TRANSACTION = 6; - - /** - * Geth event - */ - public static final int MSG_GETH_EVENT = 7; - - /** - * Initialize jail - */ - public static final int MSG_JAIL_INIT = 8; - - - /** - * Parse js in jail - */ - public static final int MSG_JAIL_PARSE = 9; - - /** - * Parse js in jail - */ - public static final int MSG_JAIL_CALL = 10; - - /** - * Account discard transaction event - */ - public static final int MSG_DISCARD_TRANSACTION = 11; - - /** - * Start RPC server - */ - static final int MSG_START_RPC = 12; - - /** - * Stop RPC server - */ - static final int MSG_STOP_RPC = 13; - -} diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java index 9f4bec33da..6c2d7c8ffd 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java @@ -1,11 +1,9 @@ package im.status.ethereum.module; import android.app.Activity; +import android.os.*; +import android.os.Process; import android.view.WindowManager; -import android.os.Build; -import android.os.Bundle; -import android.os.Message; -import android.os.RemoteException; import android.util.Log; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; @@ -13,20 +11,29 @@ import android.webkit.WebStorage; import com.facebook.react.bridge.*; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.github.status_im.status_go.cmd.Statusgo; +import java.io.File; import java.util.HashMap; import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventListener, ConnectorHandler { private static final String TAG = "StatusModule"; - private StatusConnector status = null; - private HashMap callbacks = new HashMap<>(); + private static StatusModule module; + private ServiceConnector status = null; + private ExecutorService executor = null; + StatusModule(ReactApplicationContext reactContext) { super(reactContext); + if (executor == null) { + executor = Executors.newCachedThreadPool(); + } reactContext.addLifecycleEventListener(this); } @@ -37,84 +44,34 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL @Override public void onHostResume() { // Actvity `onResume` + module = this; Activity currentActivity = getCurrentActivity(); if (currentActivity == null) { Log.d(TAG, "On host Activity doesn't exist"); return; } + if (status == null) { - status = new StatusConnector(currentActivity, StatusService.class); + status = new ServiceConnector(currentActivity, StatusService.class); status.registerHandler(this); + } status.bindService(); - WritableMap params = Arguments.createMap(); - Log.d(TAG, "Send module.initialized event"); - params.putString("jsonEvent", "{\"type\":\"module.initialized\"}"); - getReactApplicationContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("gethEvent", params); + signalEvent("{\"type\":\"module.initialized\"}"); } @Override - public void onHostPause() { // Actvity `onPause` + public void onHostPause() { if (status != null) { status.unbindService(); } } @Override - public void onHostDestroy() { // Actvity `onDestroy` - if (status != null) { - status.stopNode(null); - } - } + public void onHostDestroy() { - @Override - public void onConnectorConnected() { - } - - @Override - public void onConnectorDisconnected() { - } - - @Override - public boolean handleMessage(Message message) { - - Log.d(TAG, "Received message: " + message.toString()); - boolean isClaimed = true; - Bundle bundle = message.getData(); - String callbackIdentifier = bundle.getString(StatusConnector.CALLBACK_IDENTIFIER); - String data = bundle.getString("data"); - Callback callback = callbacks.remove(callbackIdentifier); - switch (message.what) { - case StatusMessages.MSG_START_NODE: - case StatusMessages.MSG_STOP_NODE: - case StatusMessages.MSG_LOGIN: - case StatusMessages.MSG_CREATE_ACCOUNT: - case StatusMessages.MSG_RECOVER_ACCOUNT: - case StatusMessages.MSG_COMPLETE_TRANSACTION: - case StatusMessages.MSG_JAIL_INIT: - case StatusMessages.MSG_JAIL_PARSE: - case StatusMessages.MSG_JAIL_CALL: - if (callback == null) { - Log.d(TAG, "Could not find callback: " + callbackIdentifier); - } else { - callback.invoke(data); - } - break; - case StatusMessages.MSG_GETH_EVENT: - String event = bundle.getString("event"); - WritableMap params = Arguments.createMap(); - params.putString("jsonEvent", event); - getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params); - break; - default: - isClaimed = false; - } - - return isClaimed; } private boolean checkAvailability() { @@ -125,28 +82,58 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL return false; } - if (status == null) { - Log.d(TAG, "Status connector is null"); - return false; - } - return true; } // Geth + private void signalEvent(String jsonEvent) { + Log.d(TAG, "Signal event: " + jsonEvent); + WritableMap params = Arguments.createMap(); + params.putString("jsonEvent", jsonEvent); + this.getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params); + } + + private void doStartNode() { + + Activity currentActivity = getCurrentActivity(); + + File extStore = Environment.getExternalStorageDirectory(); + String dataFolder = extStore.exists() ? + extStore.getAbsolutePath() + "/ethereum" : + currentActivity.getApplicationInfo().dataDir + "/ethereum"; + Log.d(TAG, "Starting Geth node in folder: " + dataFolder); + + try { + final File newFile = new File(dataFolder); + // todo handle error? + newFile.mkdir(); + } catch (Exception e) { + Log.e(TAG, "error making folder: " + dataFolder, e); + } + + Statusgo.StartNode(dataFolder); + Log.d(TAG, "Geth node started"); + } @ReactMethod public void startNode(Callback callback) { Log.d(TAG, "startNode"); + status.sendMessage(); if (!checkAvailability()) { callback.invoke(false); return; } - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + Thread thread = new Thread() { + @Override + public void run() { + doStartNode(); + } + }; - status.startNode(callbackIdentifier); + thread.start(); + + callback.invoke(false); } @ReactMethod @@ -157,7 +144,14 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL return; } - status.startRPC(); + Thread thread = new Thread() { + @Override + public void run() { + Statusgo.StartNodeRPCServer(); + } + }; + + thread.start(); } @ReactMethod @@ -168,49 +162,72 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL return; } - status.stopRPC(); + Thread thread = new Thread() { + @Override + public void run() { + Statusgo.StopNodeRPCServer(); + } + }; + + thread.start(); } @ReactMethod - public void login(String address, String password, Callback callback) { + public void login(final String address, final String password, final Callback callback) { Log.d(TAG, "login"); if (!checkAvailability()) { callback.invoke(false); return; } + Thread thread = new Thread() { + @Override + public void run() { + String result = Statusgo.Login(address, password); - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + callback.invoke(result); + } + }; - status.login(callbackIdentifier, address, password); + thread.start(); } @ReactMethod - public void createAccount(String password, Callback callback) { + public void createAccount(final String password, final Callback callback) { Log.d(TAG, "createAccount"); if (!checkAvailability()) { callback.invoke(false); return; } - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + Thread thread = new Thread() { + @Override + public void run() { + String res = Statusgo.CreateAccount(password); - status.createAccount(callbackIdentifier, password); + callback.invoke(res); + } + }; + + thread.start(); } @ReactMethod - public void recoverAccount(String passphrase, String password, Callback callback) { + public void recoverAccount(final String passphrase, final String password, final Callback callback) { Log.d(TAG, "recoverAccount"); if (!checkAvailability()) { callback.invoke(false); return; } + Thread thread = new Thread() { + @Override + public void run() { + String res = Statusgo.RecoverAccount(password, passphrase); - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + callback.invoke(res); + } + }; - status.recoverAccount(callbackIdentifier, passphrase, password); + thread.start(); } private String createIdentifier() { @@ -218,74 +235,103 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL } @ReactMethod - public void completeTransaction(String hash, String password, Callback callback) { + public void completeTransaction(final String hash, final String password, final Callback callback) { Log.d(TAG, "completeTransaction"); if (!checkAvailability()) { callback.invoke(false); return; } - Log.d(TAG, "Complete transaction: " + hash); - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + Thread thread = new Thread() { + @Override + public void run() { + String res = Statusgo.CompleteTransaction(hash, password); - status.completeTransaction(callbackIdentifier, hash, password); + callback.invoke(res); + } + }; + + thread.start(); } @ReactMethod - public void discardTransaction(String id) { + public void discardTransaction(final String id) { Log.d(TAG, "discardTransaction"); if (!checkAvailability()) { return; } - Log.d(TAG, "Discard transaction: " + id); - status.discardTransaction(id); + Thread thread = new Thread() { + @Override + public void run() { + Statusgo.DiscardTransaction(id); + } + }; + + thread.start(); } // Jail @ReactMethod - public void initJail(String js, Callback callback) { + public void initJail(final String js, final Callback callback) { Log.d(TAG, "initJail"); if (!checkAvailability()) { callback.invoke(false); return; } - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + Thread thread = new Thread() { + @Override + public void run() { + Statusgo.InitJail(js); - status.initJail(callbackIdentifier, js); + callback.invoke(false); + } + }; + + thread.start(); } @ReactMethod - public void parseJail(String chatId, String js, Callback callback) { + public void parseJail(final String chatId, final String js, final Callback callback) { Log.d(TAG, "parseJail"); if (!checkAvailability()) { callback.invoke(false); return; } - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); + Thread thread = new Thread() { + @Override + public void run() { + String res = Statusgo.Parse(chatId, js); + Log.d(TAG, "endParseJail"); + callback.invoke(res); + } + }; - status.parseJail(callbackIdentifier, chatId, js); + thread.start(); } @ReactMethod - public void callJail(String chatId, String path, String params, Callback callback) { + public void callJail(final String chatId, final String path, final String params, final Callback callback) { Log.d(TAG, "callJail"); + Log.d(TAG, path); if (!checkAvailability()) { callback.invoke(false); return; } - String callbackIdentifier = createIdentifier(); - callbacks.put(callbackIdentifier, callback); - - status.callJail(callbackIdentifier, chatId, path, params); + executor.execute(new Runnable() { + @Override + public void run() { + Log.d(TAG, "startCallJail"); + String res = Statusgo.Call(chatId, path, params); + Log.d(TAG, "endCallJail"); + callback.invoke(res); + } + }); } @ReactMethod @@ -372,4 +418,26 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL storage.deleteAllData(); } } + + @Override + public boolean handleMessage(Message message) { + + Log.d(TAG, "Received message: " + message.toString()); + Bundle bundle = message.getData(); + + String event = bundle.getString("event"); + signalEvent(event); + + return true; + } + + @Override + public void onConnectorConnected() { + + } + + @Override + public void onConnectorDisconnected() { + + } } diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.java index 1606184d5c..5a6644ac00 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusPackage.java @@ -5,7 +5,6 @@ import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; -import im.status.ethereum.module.StatusService; import java.util.ArrayList; import java.util.Collections; diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusService.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusService.java index b23bcc8706..41754b3350 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusService.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusService.java @@ -5,28 +5,16 @@ import android.content.Intent; import android.os.*; import android.support.annotation.Nullable; import android.util.Log; -import java.util.concurrent.Callable; import java.lang.ref.WeakReference; -import com.github.status_im.status_go.cmd.Statusgo; - -import java.io.File; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - public class StatusService extends Service { private static final String TAG = "StatusService"; - private boolean isNodeInitialized = false; - private final Handler handler = new Handler(); - - private ExecutorService executor = null; - - private static String dataFolder; - - private static Messenger applicationMessenger = null; + public StatusService() { + super(); + } private static class IncomingHandler extends Handler { @@ -51,14 +39,22 @@ public class StatusService extends Service { private final Messenger serviceMessenger = new Messenger(new IncomingHandler(this)); + private static Messenger applicationMessenger = null; + + private boolean handleMessage(Message message) { + Log.d(TAG, "Received service message." + message.toString()); + applicationMessenger = message.replyTo; + + return true; + } public static void signalEvent(String jsonEvent) { - + Log.d(TAG, "Signal event: " + jsonEvent); Bundle replyData = new Bundle(); replyData.putString("event", jsonEvent); - Message replyMessage = Message.obtain(null, StatusMessages.MSG_GETH_EVENT, 0, 0, null); + Message replyMessage = Message.obtain(null, 0, 0, 0, null); replyMessage.setData(replyData); sendReply(applicationMessenger, replyMessage); } @@ -71,301 +67,28 @@ public class StatusService extends Service { @Override public void onCreate() { - super.onCreate(); + Log.d(TAG, "Status Service created!"); } @Override public void onDestroy() { - super.onDestroy(); - if (executor != null) { - executor.shutdownNow(); - } - //TODO: stop geth - stopNode(null); - isNodeInitialized = false; - Log.d(TAG, "Status Service stopped !"); + Log.d(TAG, "Status Service stopped!"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { - - if (executor == null) { - executor = Executors.newCachedThreadPool(); - } return Service.START_STICKY; } - private boolean handleMessage(Message message) { - Log.d(TAG, "Received service message." + message.toString()); - applicationMessenger = message.replyTo; - doStartNode(); - switch (message.what) { - - case StatusMessages.MSG_START_NODE: - startNode(message); - break; - - case StatusMessages.MSG_STOP_NODE: - stopNode(message); - break; - - case StatusMessages.MSG_CREATE_ACCOUNT: - createAccount(message); - break; - - case StatusMessages.MSG_RECOVER_ACCOUNT: - recoverAccount(message); - break; - - case StatusMessages.MSG_LOGIN: - login(message); - break; - - case StatusMessages.MSG_COMPLETE_TRANSACTION: - completeTransaction(message); - break; - - case StatusMessages.MSG_DISCARD_TRANSACTION: - discardTransaction(message); - break; - - case StatusMessages.MSG_JAIL_INIT: - initJail(message); - break; - - case StatusMessages.MSG_JAIL_PARSE: - parseJail(message); - break; - - case StatusMessages.MSG_JAIL_CALL: - callJail(message); - break; - - case StatusMessages.MSG_START_RPC: - startRPC(); - break; - - case StatusMessages.MSG_STOP_RPC: - stopRPC(); - break; - - default: - return false; - } - - return true; - } - - public void doStartNode() { - if (!isNodeInitialized) { - - File extStore = Environment.getExternalStorageDirectory(); - dataFolder = extStore.exists() ? - extStore.getAbsolutePath() + "/ethereum" : - getApplicationInfo().dataDir + "/ethereum"; - Log.d(TAG, "Starting Geth node in folder: " + dataFolder); - - try { - final File newFile = new File(dataFolder); - // todo handle error? - newFile.mkdir(); - } catch (Exception e) { - Log.e(TAG, "error making folder: " + dataFolder, e); - } - - Statusgo.StartNode(dataFolder); - Log.d(TAG, "Geth node started"); - Log.w(TAG, "adding peer"); - - Statusgo.AddPeer("enode://e19d89e6faf2772e2f250e9625478ee7f313fcc0bb5e9310d5d407371496d9d7d73ccecd9f226cc2a8be34484525f72ba9db9d26f0222f4efc3c6d9d995ee224@198.199.105.122:30303"); - Statusgo.AddPeer("enode://1ad53266faaa9258ae71eef4d162022ba0d39498e1a3488e6c65fd86e0fb528e2aa68ad0e199da69fd39f4a3a38e9e8e95ac53ba5cc7676dfeaacf5fd6c0ad27@139.59.212.114:30303"); - isNodeInitialized = true; - } - } - - private void startNode(Message message) { - doStartNode(); - createAndSendReply(message, StatusMessages.MSG_START_NODE, null); - } - - private void stopNode(Message message) { - // TODO: stop node - - createAndSendReply(message, StatusMessages.MSG_STOP_NODE, null); - } - - private void startRPC() { - Statusgo.StartNodeRPCServer(); - } - - private void stopRPC() { - Statusgo.StopNodeRPCServer(); - } - - private void createAccount(Message message) { - - Bundle data = message.getData(); - String password = data.getString("password"); - Log.d(TAG, "Creating account: " + password); - String jsonData = Statusgo.CreateAccount(password); - Log.d(TAG, "Created account: " + jsonData); - - Bundle replyData = new Bundle(); - replyData.putString("data", jsonData); - createAndSendReply(message, StatusMessages.MSG_CREATE_ACCOUNT, replyData); - } - - private void recoverAccount(Message message) { - - Bundle data = message.getData(); - String passphrase = data.getString("passphrase"); - String password = data.getString("password"); - Log.d(TAG, "Recovering account: " + passphrase + " - " + password); - String jsonData = Statusgo.RecoverAccount(password, passphrase); - Log.d(TAG, "Recovered account: " + jsonData); - - Bundle replyData = new Bundle(); - replyData.putString("data", jsonData); - createAndSendReply(message, StatusMessages.MSG_RECOVER_ACCOUNT, replyData); - } - - private void login(Message message) { - - applicationMessenger = message.replyTo; - Bundle data = message.getData(); - String address = data.getString("address"); - String password = data.getString("password"); - String result = Statusgo.Login(address, password); - Log.d(TAG, "Loggedin account: " + result); - - Bundle replyData = new Bundle(); - replyData.putString("data", result); - createAndSendReply(message, StatusMessages.MSG_LOGIN, replyData); - } - - private void completeTransaction(Message message){ - - Bundle data = message.getData(); - String hash = data.getString("hash"); - String password = data.getString("password"); - - Log.d(TAG, "Before CompleteTransaction: " + hash); - String result = Statusgo.CompleteTransaction(hash, password); - Log.d(TAG, "After CompleteTransaction: " + result); - - Bundle replyData = new Bundle(); - replyData.putString("data", result); - createAndSendReply(message, StatusMessages.MSG_COMPLETE_TRANSACTION, replyData); - } - - private void discardTransaction(Message message){ - - Bundle data = message.getData(); - String id = data.getString("id"); - - Log.d(TAG, "Before DiscardTransaction: " + id); - String result = Statusgo.DiscardTransaction(id); - Log.d(TAG, "After DiscardTransaction: " + result); - } - - private void initJail(Message message){ - - Bundle data = message.getData(); - String js = data.getString("js"); - - Statusgo.InitJail(js); - - Bundle replyData = new Bundle(); - createAndSendReply(message, StatusMessages.MSG_JAIL_INIT, replyData); - } - - private void parseJail(Message message){ - - Bundle data = message.getData(); - String chatId = data.getString("chatId"); - String js = data.getString("js"); - - String result = Statusgo.Parse(chatId, js); - - Bundle replyData = new Bundle(); - replyData.putString("data", result); - createAndSendReply(message, StatusMessages.MSG_JAIL_PARSE, replyData); - } - - private void callJail(Message message){ - - Bundle data = message.getData(); - String chatId = data.getString("chatId"); - String path = data.getString("path"); - String params = data.getString("params"); - String callbackIdentifier = data.getString(StatusConnector.CALLBACK_IDENTIFIER); - - Log.d(TAG, "Before StatusGo.Call"); - Callable callable = new JailRequest(message.replyTo, chatId, path, params, callbackIdentifier); - executor.submit(callable); - } - - public class JailRequest implements Callable { - - String chatId; - String path; - String params; - String callbackIdentifier; - Messenger messenger; - - JailRequest(Messenger messenger, String chatId, String path, String params, String callbackIdentifier) { - - this.messenger = messenger; - this.chatId = chatId; - this.path = path; - this.params = params; - this.callbackIdentifier = callbackIdentifier; - } - - public String call() throws Exception { - Log.d(TAG, "StatusGo.Call"); - String result = Statusgo.Call(chatId, path, params); - - Bundle replyData = new Bundle(); - replyData.putString("data", result); - Message replyMessage = Message.obtain(null, StatusMessages.MSG_JAIL_CALL, 0, 0, null); - Log.d(TAG, "Callback identifier: " + callbackIdentifier); - replyData.putString(StatusConnector.CALLBACK_IDENTIFIER, callbackIdentifier); - replyMessage.setData(replyData); - sendReply(messenger, replyMessage); - - return result; - } - - } - - public boolean isNodeInitialized() { - return isNodeInitialized; - } - - private static void createAndSendReply(Message message, int replyIdMessage, Bundle replyData) { - - if (message == null) { - return; - } - Message replyMessage = Message.obtain(null, replyIdMessage, 0, 0, message.obj); - if (replyData == null) { - replyData = new Bundle(); - } - Bundle data = message.getData(); - String callbackIdentifier = data.getString(StatusConnector.CALLBACK_IDENTIFIER); - Log.d(TAG, "Callback identifier: " + callbackIdentifier); - replyData.putString(StatusConnector.CALLBACK_IDENTIFIER, callbackIdentifier); - replyMessage.setData(replyData); - - sendReply(message.replyTo, replyMessage); - } - private static void sendReply(Messenger messenger, Message message) { - try { + boolean ex = false; + if (messenger != null) { + ex = true; + } + Log.d(TAG, "before sendReply " + ex); messenger.send(message); } catch (Exception e) { Log.e(TAG, "Exception sending message id: " + message.what, e); diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index 2f6c0561b2..6f5c66434c 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -363,8 +363,8 @@ (dispatch [:cancel-command])) (dispatch [:load-requests! chat-id]) ;; todo rewrite this. temporary fix for https://github.com/status-im/status-react/issues/607 - (dispatch [:load-commands! chat-id]) - #_(if-not commands-loaded? + #_(dispatch [:load-commands! chat-id]) + (if-not commands-loaded? (dispatch [:load-commands! chat-id]) (dispatch [:invoke-chat-loaded-callbacks chat-id])) (if (and (seq messages) diff --git a/src/status_im/chat/handlers/receive_message.cljs b/src/status_im/chat/handlers/receive_message.cljs index a33f39fbd5..fa48e3a229 100644 --- a/src/status_im/chat/handlers/receive_message.cljs +++ b/src/status_im/chat/handlers/receive_message.cljs @@ -100,7 +100,7 @@ (defn commands-loaded? [db chat-id] (get-in db [:chats chat-id :commands-loaded])) -(def timeout 50) +(def timeout 400) (register-handler :received-message-when-commands-loaded (u/side-effect! diff --git a/src/status_im/db.cljs b/src/status_im/db.cljs index f5d1776a3e..b7adefea48 100644 --- a/src/status_im/db.cljs +++ b/src/status_im/db.cljs @@ -21,7 +21,7 @@ :new-contact-identity "" :contacts {} :discoveries {} - :discover-search-tags [] + :discover-search-tags [] :tags {} :chats {} @@ -45,7 +45,7 @@ :loading-allowed true :sync-state :done - :sync-listener nil + :sync-listening-started nil :status-module-initialized? (or p/ios? js/goog.DEBUG) :edit-mode {} :network :testnet}) diff --git a/src/status_im/handlers.cljs b/src/status_im/handlers.cljs index 2e0e7223c0..c4583c4ef7 100644 --- a/src/status_im/handlers.cljs +++ b/src/status_im/handlers.cljs @@ -87,7 +87,6 @@ (dispatch [:load-accounts]) (dispatch [:init-console-chat]) (dispatch [:load-default-contacts!]) - (dispatch [:load-commands! console-chat-id]) (dispatch [:load-commands!])))) (def ecc (js/require "eccjs")) diff --git a/src/status_im/protocol/handlers.cljs b/src/status_im/protocol/handlers.cljs index 3cc3ec143b..ea990bf3b6 100644 --- a/src/status_im/protocol/handlers.cljs +++ b/src/status_im/protocol/handlers.cljs @@ -17,7 +17,8 @@ [taoensso.timbre :as log :refer-macros [debug]] [status-im.constants :as c] [status-im.components.status :as status] - [clojure.string :refer [join]])) + [clojure.string :refer [join]] + [status-im.utils.scheduler :as s])) (register-handler :initialize-protocol (fn [db [_ current-account-id]] @@ -71,16 +72,24 @@ (when (and (not= sync-data state) (= :in-progress new-state)) (dispatch [:set :sync-data state])) (when (not= sync-state new-state) - (dispatch [:set :sync-state new-state])))))) + (dispatch [:set :sync-state new-state])) + (let [timeout (if (#{:done :synced} new-state) 60 10)] + (s/execute-later #(dispatch [:check-sync]) (s/s->ms timeout))))))) + +(register-handler :check-sync + (u/side-effect! + (fn [{:keys [web3] :as db}] + (.getSyncing + (.-eth web3) + (fn [error sync] + (dispatch [:update-sync-state error sync])))))) (register-handler :initialize-sync-listener - (fn [{:keys [web3 sync-listener] :as db} _] - (if-not sync-listener - (let [sync-listener (.isSyncing - (.-eth web3) - (fn [error sync] - (dispatch [:update-sync-state error sync])))] - (assoc db :sync-listener sync-listener)) + (fn [{:keys [sync-listening-started] :as db} _] + (if-not sync-listening-started + (do + (dispatch [:check-sync]) + (assoc db :sync-listening-started true)) db))) (register-handler :incoming-message