diff --git a/test-app/app/src/main/java/com/tns/RuntimeHelper.java b/test-app/app/src/main/java/com/tns/RuntimeHelper.java index eb817b104..28b584c74 100644 --- a/test-app/app/src/main/java/com/tns/RuntimeHelper.java +++ b/test-app/app/src/main/java/com/tns/RuntimeHelper.java @@ -192,7 +192,7 @@ public static Runtime initRuntime(Application app) { // if app is in debuggable mode run livesync service // runtime needs to be initialized before the NativeScriptSyncService is enabled because it uses runtime.runScript(...) - initLiveSync(runtime, logger, app); + // initLiveSync(runtime, logger, app); } runtime.runScript(new File(appDir, "internal/ts_helpers.js")); @@ -262,6 +262,15 @@ public void onReceive(Context context, Intent intent) { context.registerReceiver(timezoneReceiver, timezoneFilter); } + public static void initLiveSync(Application app) { + Runtime currentRuntime = Runtime.getCurrentRuntime(); + if (!currentRuntime.getIsLiveSyncStarted()) { + initLiveSync(currentRuntime, currentRuntime.getLogger(), app); + currentRuntime.setIsLiveSyncStarted(true); + } + + } + public static void initLiveSync(Runtime runtime, Logger logger, Application app){ boolean isDebuggable = Util.isDebuggableApp(app); diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java index 4a71adade..525764cf6 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java @@ -342,6 +342,8 @@ private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String pac w.writeln(); boolean isApplicationClass = isApplicationClass(clazz, classes); + boolean isActivityClass = isActivityClass(clazz, classes); + if (isApplicationClass && !packageName.equals("com.tns")) { w.writeln("import com.tns.RuntimeHelper;"); w.writeln("import com.tns.Runtime;"); @@ -435,7 +437,7 @@ private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String pac } for (Method m : ifaceMethods) { if (!notImplementedObjectMethods.contains(m)) { - writeMethodBody(m, w, isApplicationClass, true); + writeMethodBody(m, w, isApplicationClass, isActivityClass, true); } } } else { @@ -449,7 +451,7 @@ private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String pac if (interfaceMethods.contains(m)) { isInterfaceMethod = true; } - writeMethodBody(m, w, isApplicationClass, isInterfaceMethod); + writeMethodBody(m, w, isApplicationClass, isActivityClass, isInterfaceMethod); } } } @@ -479,7 +481,7 @@ private boolean isClassApplication(JavaClass clazz) { className.equals("android.test.mock.MockApplication"); } - private void writeMethodBody(Method m, Writer w, boolean isApplicationClass, boolean isInterfaceMethod) { + private void writeMethodBody(Method m, Writer w, boolean isApplicationClass, boolean isActivityClass, boolean isInterfaceMethod) { String visibility = m.isPublic() ? "public" : "protected"; w.write("\t"); w.write(visibility); @@ -491,7 +493,7 @@ private void writeMethodBody(Method m, Writer w, boolean isApplicationClass, boo w.write(" "); writeThrowsClause(m, w); w.writeln(" {"); - writeMethodBody(m, false, isApplicationClass, w, isInterfaceMethod); + writeMethodBody(m, false, isApplicationClass, isActivityClass, w, isInterfaceMethod); w.writeln("\t}"); w.writeln(); } @@ -570,7 +572,7 @@ private void writeConstructors(JavaClass clazz, String classname, boolean hasIni w.writeln("\t\tcom.tns.Runtime.initInstance(this);"); } if (hasInitMethod) { - writeMethodBody(c, true, false, w, false); + writeMethodBody(c, true, false, false, w, false); } if (isClassApplication(clazz)) { //get instance method @@ -584,7 +586,7 @@ private void writeConstructors(JavaClass clazz, String classname, boolean hasIni } } - private void writeMethodBody(Method m, boolean isConstructor, boolean isApplicationClass, Writer w, boolean isInterfaceMethod) { + private void writeMethodBody(Method m, boolean isConstructor, boolean isApplicationClass, boolean isActivityClass, Writer w, boolean isInterfaceMethod) { if (m.getName().equals("onCreate") && isApplicationClass) { w.writeln("\t\tcom.tns.Runtime runtime = RuntimeHelper.initRuntime(this);"); } @@ -651,6 +653,11 @@ private void writeMethodBody(Method m, boolean isConstructor, boolean isApplicat w.writeln("\t\t\truntime.run();"); w.writeln("\t\t}"); } + + // call liveSync initialization + if (m.getName().equals("onCreate") && isActivityClass) { + w.writeln("\t\tcom.tns.RuntimeHelper.initLiveSync(this.getApplication());"); + } } private void writeType(Type t, Writer w) { @@ -715,6 +722,31 @@ private boolean isApplicationClass(JavaClass clazz, Map class return isApplicationClass; } + private boolean isActivityClass(JavaClass clazz, Map classes) throws ClassNotFoundException { + boolean isActivityClass = false; + + String activityClassname = "android.app.Activity"; + + JavaClass currentClass = clazz; + while (true) { + String currentClassname = currentClass.getClassName(); + + isActivityClass = currentClassname.equals(activityClassname); + if (isActivityClass) { + break; + } + + if (currentClassname.endsWith("java.lang.Object")) { + break; + } + + String superClassName = currentClass.getSuperclassName(); + currentClass = getClass(superClassName); + } + + return isActivityClass; + } + private JavaClass getClass(String className) throws ClassNotFoundException { JavaClass clazz = classes.get(className.replace('$', '.')); diff --git a/test-app/runtime/src/main/java/com/tns/Runtime.java b/test-app/runtime/src/main/java/com/tns/Runtime.java index 8aa004798..1ba5c27fd 100644 --- a/test-app/runtime/src/main/java/com/tns/Runtime.java +++ b/test-app/runtime/src/main/java/com/tns/Runtime.java @@ -104,6 +104,14 @@ void passUncaughtExceptionToJs(Throwable ex, String stackTrace) { private Logger logger; + private boolean isLiveSyncStarted; + public boolean getIsLiveSyncStarted() { return this.isLiveSyncStarted; } + public void setIsLiveSyncStarted(boolean value) { this.isLiveSyncStarted = value; } + + public Logger getLogger() { + return this.logger; + } + private ThreadScheduler threadScheduler; private DexFactory dexFactory;