diff --git a/.gitmodules b/.gitmodules index 83cb4c40f..44270ed11 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,7 +4,3 @@ [submodule "test-app/app/src/main/assets/app/shared"] path = test-app/app/src/main/assets/app/shared url = https://github.com/NativeScript/common-runtime-tests-app.git -[submodule "test-app/build-tools/android-dts-generator"] - path = test-app/build-tools/android-dts-generator - url = https://github.com/NativeScript/android-dts-generator.git - branch = master diff --git a/.travis.yml b/.travis.yml index 34abaf3ec..25b2b5bdb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,22 @@ env: matrix: include: + - stage: "Static Binding Generator Parser Tests" + language: node_js + node_js: "6" + git: + submodules: false + script: + - cd android-static-binding-generator + - npm install && node run-tests + - cd .. + - stage: "Static Binding Generator Class Generator Tests" + language: android + jdk: oraclejdk8 + git: + submodules: false + script: + - "android-static-binding-generator/project/staticbindinggenerator/gradlew test --project-dir android-static-binding-generator/project/staticbindinggenerator/" - stage: "Build and Tests" sudo: true language: android @@ -25,13 +41,15 @@ matrix: submodules: false script: # (master branch) build the runtime twice - optimized, and regular packages, skip on PRs - # test-app/gradlew runtests will take care of building the runtime for its testing needs + # test-app/gradlew runtest will take care of building the runtime for its testing needs - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./gradlew -PpreReleaseVersion=$PACKAGE_VERSION -PgitCommitVersion=$TRAVIS_COMMIT --stacktrace; fi' - echo no | android create avd --force -n $EMULATOR_NAME-$EMULATOR_API_LEVEL -t android-$EMULATOR_API_LEVEL --abi $ANDROID_ABI -c 12M - emulator -avd $EMULATOR_NAME-$EMULATOR_API_LEVEL -no-skin -no-audio -no-window & - android-wait-for-emulator + - cd test-app - "./gradlew runtest --stacktrace" - adb -e logcat -d 300 + - cd .. before_install: - echo "y" | sdkmanager "cmake;3.6.4111459" - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules diff --git a/test-app/build-tools/android-metadata-generator/.gitattributes b/android-metadata-generator/.gitattributes similarity index 100% rename from test-app/build-tools/android-metadata-generator/.gitattributes rename to android-metadata-generator/.gitattributes diff --git a/test-app/build-tools/android-metadata-generator/.gitignore b/android-metadata-generator/.gitignore similarity index 100% rename from test-app/build-tools/android-metadata-generator/.gitignore rename to android-metadata-generator/.gitignore diff --git a/test-app/build-tools/android-metadata-generator/LICENCE b/android-metadata-generator/LICENCE similarity index 100% rename from test-app/build-tools/android-metadata-generator/LICENCE rename to android-metadata-generator/LICENCE diff --git a/test-app/build-tools/android-metadata-generator/README.md b/android-metadata-generator/README.md similarity index 100% rename from test-app/build-tools/android-metadata-generator/README.md rename to android-metadata-generator/README.md diff --git a/android-metadata-generator/build.gradle b/android-metadata-generator/build.gradle new file mode 100644 index 000000000..c686991a2 --- /dev/null +++ b/android-metadata-generator/build.gradle @@ -0,0 +1,131 @@ +/* +* Packs metadata generator in a .tgz file in ~/dist folder +* To build .tgz +* gradlew packmg +* To build jar +* gradlew jarmg +*/ +apply plugin: "java" + +sourceCompatibility = 1.6 +targetCompatibility = 1.6 + +def isWinOs = System.properties['os.name'].toLowerCase().contains('windows') + +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:1.5.0' + } +} + +sourceSets { + main { + java { + srcDir 'src/src' + } + } + main.output.classesDir = "$rootDir/dist/classes" +} + +dependencies { + compile files("./src/libs/bcel-5.2.jar") + compile files("./src/libs/dx.jar") +} + +task makeDistDir { + def distDir = new File("$rootDir/dist") + distDir.mkdirs() +} + +task cleanDist (type: Delete) { + delete "$rootDir/dist" +} + +task cleanDistForJar (type: Delete) { + delete "$rootDir/dist" +} + +task cleanBuildDir (type: Delete){ + delete "$rootDir/build" +} + +task cleanBuildDirForJar (type: Delete){ + delete "$rootDir/build" +} + +task cleanBin (type: Delete) { + delete "$rootDir/src/bin" +} + +task copyNecessaryFiles { + doLast { + copy { + from "$rootDir/helpers" + into "$rootDir/dist/bin" + } + + copy { + from "$rootDir/package.json" + into "$rootDir/dist" + } + } +} + +task packMetadataGenerator (type: Exec) { + workingDir "$rootDir/dist" + + if(isWinOs) { + commandLine "cmd", "/c", "npm", "pack" + } + else { + commandLine "npm", "pack" + } +} + +jar { + manifest { + attributes("Manifest-Version": "1.0", + "Main-Class": "com.telerik.metadata.Generator") + } + + from { + + configurations.runtime.collect { + it.isDirectory() ? it : zipTree(it) + } + + configurations.compile.collect { + it.isDirectory() ? it : zipTree(it) + } + } +} + +task copyJarToDist (type: Copy) { + from "$rootDir/build/libs/android-metadata-generator.jar" + into "$rootDir/dist" +} + +makeDistDir.dependsOn(cleanDist) +cleanBin.dependsOn(makeDistDir) +compileJava.dependsOn(cleanBin) +cleanBuildDir.dependsOn(compileJava) +copyNecessaryFiles.dependsOn(cleanBuildDir) +packMetadataGenerator.dependsOn(copyNecessaryFiles) + +task packmg { + dependsOn packMetadataGenerator +} + +cleanDistForJar.dependsOn(jar) +copyJarToDist.dependsOn(cleanDistForJar) +cleanBuildDirForJar.dependsOn(copyJarToDist) + +task jarmg { + dependsOn cleanBuildDirForJar +} + + diff --git a/android-metadata-generator/gradle/wrapper/gradle-wrapper.jar b/android-metadata-generator/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7a3265ee9 Binary files /dev/null and b/android-metadata-generator/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android-metadata-generator/gradle/wrapper/gradle-wrapper.properties b/android-metadata-generator/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..f16d26666 --- /dev/null +++ b/android-metadata-generator/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip diff --git a/android-metadata-generator/gradlew b/android-metadata-generator/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/android-metadata-generator/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android-metadata-generator/gradlew.bat b/android-metadata-generator/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/android-metadata-generator/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/test-app/build-tools/android-metadata-generator/helpers/generate-metadata.js b/android-metadata-generator/helpers/generate-metadata.js similarity index 100% rename from test-app/build-tools/android-metadata-generator/helpers/generate-metadata.js rename to android-metadata-generator/helpers/generate-metadata.js diff --git a/test-app/build-tools/android-metadata-generator/helpers/generate-metadata.sh b/android-metadata-generator/helpers/generate-metadata.sh similarity index 100% rename from test-app/build-tools/android-metadata-generator/helpers/generate-metadata.sh rename to android-metadata-generator/helpers/generate-metadata.sh diff --git a/test-app/build-tools/android-metadata-generator/jars/android17.jar b/android-metadata-generator/jars/android17.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/jars/android17.jar rename to android-metadata-generator/jars/android17.jar diff --git a/test-app/build-tools/android-metadata-generator/jars/gson-2.2.4.jar b/android-metadata-generator/jars/gson-2.2.4.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/jars/gson-2.2.4.jar rename to android-metadata-generator/jars/gson-2.2.4.jar diff --git a/test-app/build-tools/android-metadata-generator/jars/nativescript.jar b/android-metadata-generator/jars/nativescript.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/jars/nativescript.jar rename to android-metadata-generator/jars/nativescript.jar diff --git a/test-app/build-tools/android-metadata-generator/jars/support-v4-r13.jar b/android-metadata-generator/jars/support-v4-r13.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/jars/support-v4-r13.jar rename to android-metadata-generator/jars/support-v4-r13.jar diff --git a/test-app/build-tools/android-metadata-generator/jars/test_app.jar b/android-metadata-generator/jars/test_app.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/jars/test_app.jar rename to android-metadata-generator/jars/test_app.jar diff --git a/test-app/build-tools/android-metadata-generator/package.json b/android-metadata-generator/package.json similarity index 100% rename from test-app/build-tools/android-metadata-generator/package.json rename to android-metadata-generator/package.json diff --git a/test-app/build-tools/android-metadata-generator/src/.classpath b/android-metadata-generator/src/.classpath similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/.classpath rename to android-metadata-generator/src/.classpath diff --git a/test-app/build-tools/android-metadata-generator/src/build.xml b/android-metadata-generator/src/build.xml similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/build.xml rename to android-metadata-generator/src/build.xml diff --git a/test-app/build-tools/android-metadata-generator/src/libs/bcel-5.2.jar b/android-metadata-generator/src/libs/bcel-5.2.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/libs/bcel-5.2.jar rename to android-metadata-generator/src/libs/bcel-5.2.jar diff --git a/test-app/build-tools/android-metadata-generator/src/libs/dx.jar b/android-metadata-generator/src/libs/dx.jar similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/libs/dx.jar rename to android-metadata-generator/src/libs/dx.jar diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Builder.java b/android-metadata-generator/src/src/com/telerik/metadata/Builder.java similarity index 99% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Builder.java rename to android-metadata-generator/src/src/com/telerik/metadata/Builder.java index 17269cc32..5620e10fc 100644 --- a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Builder.java +++ b/android-metadata-generator/src/src/com/telerik/metadata/Builder.java @@ -28,7 +28,7 @@ public int compare(MethodDescriptor o1, MethodDescriptor o2) { private static MethodNameComparator methodNameComparator = new MethodNameComparator(); - public static TreeNode build(List paths) throws Exception { + public static TreeNode build(String[] paths) throws Exception { for (String path : paths) { File file = new File(path); if (file.exists()) { diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassDirectory.java b/android-metadata-generator/src/src/com/telerik/metadata/ClassDirectory.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassDirectory.java rename to android-metadata-generator/src/src/com/telerik/metadata/ClassDirectory.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassMapProvider.java b/android-metadata-generator/src/src/com/telerik/metadata/ClassMapProvider.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassMapProvider.java rename to android-metadata-generator/src/src/com/telerik/metadata/ClassMapProvider.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassRepo.java b/android-metadata-generator/src/src/com/telerik/metadata/ClassRepo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassRepo.java rename to android-metadata-generator/src/src/com/telerik/metadata/ClassRepo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassUtil.java b/android-metadata-generator/src/src/com/telerik/metadata/ClassUtil.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/ClassUtil.java rename to android-metadata-generator/src/src/com/telerik/metadata/ClassUtil.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/FileStreamWriter.java b/android-metadata-generator/src/src/com/telerik/metadata/FileStreamWriter.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/FileStreamWriter.java rename to android-metadata-generator/src/src/com/telerik/metadata/FileStreamWriter.java diff --git a/android-metadata-generator/src/src/com/telerik/metadata/Generator.java b/android-metadata-generator/src/src/com/telerik/metadata/Generator.java new file mode 100644 index 000000000..5eed78077 --- /dev/null +++ b/android-metadata-generator/src/src/com/telerik/metadata/Generator.java @@ -0,0 +1,61 @@ +package com.telerik.metadata; + +import java.io.File; +import java.io.FileOutputStream; +import java.security.InvalidParameterException; + +public class Generator { + + /** + * @param args + */ + public static void main(String[] args) throws Exception { + String outName = "bin"; + String[] params = null; + + if (args != null && args.length > 0) { + outName = args[0]; + File out = new File(outName); + if (!out.exists()) { + out.mkdir(); + System.out + .println(String + .format("We didn't find the folder you specified ( %s ), so it's going to be created!", + out.getAbsolutePath())); + } + + } else { + throw new InvalidParameterException( + "You need to pass an output directory!"); + } + + if (args.length > 1) { + params = new String[args.length - 1]; + for (int i = 1; i < args.length; i++) { + params[i - 1] = args[i]; + } + } + + if (params == null) { + throw new InvalidParameterException( + "You need to pass a list of jar paths, so metadata can be generated for them!"); + } + + TreeNode root = Builder.build(params); + + FileOutputStream ovs = new FileOutputStream(new File(outName, + "treeValueStream.dat")); + FileStreamWriter outValueStream = new FileStreamWriter(ovs); + + FileOutputStream ons = new FileOutputStream(new File(outName, + "treeNodeStream.dat")); + FileStreamWriter outNodeStream = new FileStreamWriter(ons); + + FileOutputStream oss = new FileOutputStream(new File(outName, + "treeStringsStream.dat")); + FileStreamWriter outStringsStream = new FileStreamWriter(oss); + + new Writer(outNodeStream, outValueStream, outStringsStream) + .writeTree(root); + } +} diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/MemoryStreamWriter.java b/android-metadata-generator/src/src/com/telerik/metadata/MemoryStreamWriter.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/MemoryStreamWriter.java rename to android-metadata-generator/src/src/com/telerik/metadata/MemoryStreamWriter.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/StreamWriter.java b/android-metadata-generator/src/src/com/telerik/metadata/StreamWriter.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/StreamWriter.java rename to android-metadata-generator/src/src/com/telerik/metadata/StreamWriter.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/TreeNode.java b/android-metadata-generator/src/src/com/telerik/metadata/TreeNode.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/TreeNode.java rename to android-metadata-generator/src/src/com/telerik/metadata/TreeNode.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Writer.java b/android-metadata-generator/src/src/com/telerik/metadata/Writer.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Writer.java rename to android-metadata-generator/src/src/com/telerik/metadata/Writer.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/ClassInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/bcl/ClassInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/ClassInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/bcl/ClassInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/FieldInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/bcl/FieldInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/FieldInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/bcl/FieldInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/JarFile.java b/android-metadata-generator/src/src/com/telerik/metadata/bcl/JarFile.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/JarFile.java rename to android-metadata-generator/src/src/com/telerik/metadata/bcl/JarFile.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/MethodInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/bcl/MethodInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/MethodInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/bcl/MethodInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/TypeInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/bcl/TypeInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/bcl/TypeInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/bcl/TypeInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/ClassDescriptor.java b/android-metadata-generator/src/src/com/telerik/metadata/desc/ClassDescriptor.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/ClassDescriptor.java rename to android-metadata-generator/src/src/com/telerik/metadata/desc/ClassDescriptor.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/FieldDescriptor.java b/android-metadata-generator/src/src/com/telerik/metadata/desc/FieldDescriptor.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/FieldDescriptor.java rename to android-metadata-generator/src/src/com/telerik/metadata/desc/FieldDescriptor.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/MetadataInfoAnnotationDescriptor.java b/android-metadata-generator/src/src/com/telerik/metadata/desc/MetadataInfoAnnotationDescriptor.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/MetadataInfoAnnotationDescriptor.java rename to android-metadata-generator/src/src/com/telerik/metadata/desc/MetadataInfoAnnotationDescriptor.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/MethodDescriptor.java b/android-metadata-generator/src/src/com/telerik/metadata/desc/MethodDescriptor.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/MethodDescriptor.java rename to android-metadata-generator/src/src/com/telerik/metadata/desc/MethodDescriptor.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/TypeDescriptor.java b/android-metadata-generator/src/src/com/telerik/metadata/desc/TypeDescriptor.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/desc/TypeDescriptor.java rename to android-metadata-generator/src/src/com/telerik/metadata/desc/TypeDescriptor.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/ClassInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/ClassInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/ClassInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/ClassInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/DexFile.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/DexFile.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/DexFile.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/DexFile.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/FieldInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/FieldInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/FieldInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/FieldInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/MetadataInfoAnnotationInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/MetadataInfoAnnotationInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/MetadataInfoAnnotationInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/MetadataInfoAnnotationInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/MethodInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/MethodInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/MethodInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/MethodInfo.java diff --git a/test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/TypeInfo.java b/android-metadata-generator/src/src/com/telerik/metadata/dx/TypeInfo.java similarity index 100% rename from test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/dx/TypeInfo.java rename to android-metadata-generator/src/src/com/telerik/metadata/dx/TypeInfo.java diff --git a/android-static-binding-generator/.gitignore b/android-static-binding-generator/.gitignore new file mode 100644 index 000000000..c715e8568 --- /dev/null +++ b/android-static-binding-generator/.gitignore @@ -0,0 +1,2 @@ +.vscode +project/interfaces-names.txt \ No newline at end of file diff --git a/android-static-binding-generator/README.md b/android-static-binding-generator/README.md new file mode 100644 index 000000000..00f1bfdbb --- /dev/null +++ b/android-static-binding-generator/README.md @@ -0,0 +1,29 @@ +# android-static-binding-generator +This is a tool for javascript static analysis. +* Input: valid javascript code. +* Output: should be generated file with necessary information that is [NativeScript](https://www.nativescript.org/) specific. + +## How to install + +open project folder and run: +``` +npm install +``` + +## Usage with Sublime Text 3 + +* Open `project/parse.js` in Sublime Text 3 +* in Editor, select `Tools/BuildSystem/NodeJs`. You need to have [nodejs](https://nodejs.org/en/) installed. I'm using latest LTS(long term support) currently 4.2.5. +* `Alt+R` to run nodejs in editor + +## How to test +* `npm install` +* `npm test` + +## More information: +* babel: javasript transpiler +* [babylon](https://github.com/babel/babel/tree/master/packages/babylon): babel javascript parser +* [babel handbook](https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/README.md) +* learning from [plugin handbook](https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md) + + diff --git a/test-app/build-tools/jsparser/tests/jasmine.json b/android-static-binding-generator/jasmine.json similarity index 66% rename from test-app/build-tools/jsparser/tests/jasmine.json rename to android-static-binding-generator/jasmine.json index cf96adbdc..981b040b0 100644 --- a/test-app/build-tools/jsparser/tests/jasmine.json +++ b/android-static-binding-generator/jasmine.json @@ -1,7 +1,7 @@ { - "spec_dir": "specs", + "spec_dir": "tests/specs", "spec_files": [ "**.js" ], "helpers": [] -} +} \ No newline at end of file diff --git a/test-app/build-tools/jsparser/tests/package.json b/android-static-binding-generator/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/package.json rename to android-static-binding-generator/package.json diff --git a/android-static-binding-generator/project/build.gradle b/android-static-binding-generator/project/build.gradle new file mode 100644 index 000000000..c4f5d04c8 --- /dev/null +++ b/android-static-binding-generator/project/build.gradle @@ -0,0 +1,309 @@ +/* +* The android static binding generator will generate bindings for the Javascript code you specify. +*/ + +import groovy.json.JsonSlurper +import groovy.io.FileType +import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Paths + +def interfaceNamesFileP = "$projectDir/interfaces-names.txt" +def bindingsFileP = "$projectDir/bindings.txt" +def cachedJarsFilePath = "$projectDir/cached.txt" +def jsParserP = "$projectDir/parser/js_parser.js" +def jsFilesParametersP = "$projectDir/jsFilesParameters.txt" + +def webpackWorkersExcludePath = "$rootDir/app/src/main/assets/app/__worker-chunks.json" +def webpackWorkersExcludesList = []; + +def workersExcludeFile = file(webpackWorkersExcludePath); +if (workersExcludeFile.exists()) { + // in case the file exists but is malformed + try { + webpackWorkersExcludesList = new JsonSlurper().parseText(workersExcludeFile.text) + } catch (all) { + println "Malformed workers exclude file at ${webpackWorkersExcludePath}" + } +} + +def absoluteOutDir; +if (project.hasProperty("outDir")) { + absoluteOutDir = project.outDir; + + if (!absoluteOutDir.exists()) { + absoluteOutDir.mkdirs() + } +} + +// def absoluteJsCodeDir = new File("./jsCodeDir").getAbsolutePath()//project.jsCodeDir +def absoluteJsCodeDir; +def jsCodeAbsolutePath; +if (!project.hasProperty("test")) { + println project.jsCodeDir.equals(null) + if(project.jsCodeDir.exists()) { + absoluteJsCodeDir = project.jsCodeDir + jsCodeAbsolutePath = absoluteJsCodeDir.getAbsolutePath() + } else { + logger.log(LogLevel.WARN, "The input jsCodeDir: ${jsCodeDir} folder could not be found. Please make sure you've passed the correct folder containing the .js files that need to be parsed."); + } +} + +def utf8 = StandardCharsets.UTF_8 +def jarsList = "" + +def shouldRun = true +def rootTraversed = false; +def inputJsFiles = new LinkedList (); + +// depends on passed jars and generated interface-names +task generateInterfaceNamesList { + doFirst { + if(!project.hasProperty("test")) { + jarsList = project.jarFiles + def cache = new File(cachedJarsFilePath) + + if (cache.exists()) { + def contents = new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(cachedJarsFilePath)), utf8).trim() + shouldRun = !contents.equals(jarsList.toString()) + } + + if (shouldRun) { + javaexec { + main "-jar" + + def jarsAsStr = jarsList.toString(); + def jarsArr = jarsAsStr.replaceAll(/[\[\]]/, "").split(", ") + + def str = new LinkedList (); + str.add("interfacenamegenerator.jar") + str.addAll(jarsArr) + + logger.info("Task: generateInterfaceNamesList: Call interfacenamegenerator.jar with arguments: " + str.toString().replaceAll(',', '')) + + args str.toArray() + } + Files.write(Paths.get(cachedJarsFilePath), [jarsList.toString()], utf8) + } + } + } +} + +def isJsFile = { fileName -> return fileName.substring(fileName.length() - 3, fileName.length()).equals(".js") } + +def isWorkerScript = { fileName -> + // Read __worker-chunks.json file containing a list of webpacked workers + // ignore worker scripts, so as to not attempt to generate bindings for them + return webpackWorkersExcludesList.any{element -> file(element).getAbsolutePath() == fileName} +} + +def traverseDirectory +traverseDirectory = { dir, traverseExplicitly -> + def currentDir = new File(dir) + def pJsonFile = false; + + if (!traverseExplicitly) { + if (rootTraversed || !dir.equals(jsCodeAbsolutePath)) { + currentDir.eachFile(FileType.FILES) { File f -> + if (f.getName().equals("package.json")) { + pJsonFile = true; + return true; //break + } + } + + if (pJsonFile) { + def jsonFile = new File(dir, "package.json"); + def pjson = new JsonSlurper().parseText(jsonFile.text) + + if (pjson.nativescript == null) { + return; + } else { + if (pjson.nativescript['recursive-static-bindings']) { + logger.info("Task: traverseDirectory: Folder will be traversed completely: " + dir) + traverseExplicitly = true; + } + } + } + } else { + rootTraversed = true; + } + + } + + currentDir.eachFile(FileType.FILES) { File f -> + def currFile = f.getAbsolutePath(); + if (isJsFile(currFile) && !isWorkerScript(currFile)) { + inputJsFiles.add(currFile) + } + } + + currentDir.eachFile FileType.DIRECTORIES, { d -> + traverseDirectory(d.getAbsolutePath(), traverseExplicitly) + } +} + +task traverseJsFilesArgs { //(jsCodeDir, bindingsFilePath, interfaceNamesFilePath, jsParserPath, jsFilesParameter) { + doLast { + jsCodeAbsolutePath = jsCodeDir; + inputJsFiles = new LinkedList(); + traverseDirectory(jsCodeDir, false); + + new File(jsFilesParameter).withWriter { out -> + inputJsFiles.each {out.println it} + } + + def list = new ArrayList(); + list.add("node") + list.add(jsParserPath) + list.add(jsCodeDir) + list.add(bindingsFilePath) + list.add(interfaceNamesFilePath) + list.add(jsFilesParameter) + + logger.info("Task: traverseJsFilesArgs: executed with arguments: " + list.toString().replaceAll(',', '')) + def proc = list.execute() + proc.in.eachLine { line -> println line } + proc.out.close() + proc.waitFor() + + if (proc.exitValue()) { + println "gave the following error: " + println "[ERROR] ${proc.getErrorStream()}" + } + } +} + +// runs the ast parser only with changed js files +task runAstParser(type: RunAstParserTask) { + outputFiles = files(bindingsFileP) + inputFiles = files(inputJsFiles) + + //ast parser configuration + jsParserPath = jsParserP + jsCodeDir = jsCodeAbsolutePath + bindingsFilePath = bindingsFileP + interfaceNamesFilePath = interfaceNamesFileP + jsFilesParametersPath = jsFilesParametersP + +} + +// traverses the javascript code input directory +// 1. traverses all root directory files +// 2. all subdirectories that do not have a package.json containing a "nativescript" key are skipped +task traverseJsFiles { + doFirst { + // invalidate previously generated bindings.txt file + // todo: remove when removing previously generated bindings is implemented + new File(bindingsFileP).delete() + traverseDirectory(jsCodeAbsolutePath, false) + } +} + +// custom incremental task that runs the ast parser +class RunAstParserTask extends DefaultTask { + @InputFiles + def FileCollection inputFiles + + @OutputFiles + def FileCollection outputFiles + + @Input + def jsParserPath + + @Input + def jsCodeDir + + @Input + def bindingsFilePath + + @Input + def interfaceNamesFilePath + + @Input + jsFilesParametersPath + + @TaskAction + void execute(IncrementalTaskInputs inputs) { + println inputs.incremental ? "Running incremental build" : "Running full build" + + def runCommand = { strList -> + assert ( strList instanceof String || ( strList instanceof List && strList.each{ it instanceof String } )) + def proc = strList.execute() + proc.in.eachLine { line -> println line } + proc.out.close() + proc.waitFor() + + if (proc.exitValue()) { + println "gave the following error: " + println "[ERROR] ${proc.getErrorStream()}" + } + // assert !proc.exitValue() + } + + def jsDependencies = new ArrayList(); + inputs.outOfDate { change -> + jsDependencies.add(change.getFile().getAbsolutePath()) + // println change.getFile(); + } + new File(jsFilesParametersPath).withWriter { out -> + jsDependencies.each {out.println it} + } + + def list = new ArrayList(); + list.add("node") + list.add(jsParserPath) + list.add(jsCodeDir) + list.add(bindingsFilePath) + list.add(interfaceNamesFilePath) + list.add(jsFilesParametersPath) + + if(project.gradle.startParameter.logLevel.equals(LogLevel.DEBUG)) { + list.add("enableVerboseLogging") + } + logger.info("Task: RunAstParserTask: running node with arguments: " + list.toString().replaceAll(',', '')) + runCommand(list) + + // inputs.removed { change -> + // implement later (pass information to dex generator) + // } + } +} + +// run the static binding generator +task generateBindings() { + + def bindingsFile = new File(bindingsFileP); + outputs.dir(absoluteOutDir) + inputs.dir (bindingsFile) + + doFirst { + if (!file(bindingsFileP).exists()) { + throw new GradleException("No ${bindingsFileP} was found after runAstParser task was ran! Check to see if there are any .js files inside ${jsCodeDir}") + } + + javaexec { + main "-jar" + + def str = new LinkedList (); + str.add("staticbindinggenerator.jar") + str.add(bindingsFileP) + str.add(absoluteOutDir) + + def jarsAsStr = jarsList.toString(); + def jarsArr = jarsAsStr.replaceAll(/[\[\]]/, "").split(", ") + str.addAll(jarsArr) + + logger.info("Task generateBindings: Call staticbindinggenerator.jar with arguments: " + str.toString().replaceAll(',', '')) + args str.toArray() + } + } +} + +traverseJsFiles.dependsOn(generateInterfaceNamesList) +runAstParser.dependsOn(traverseJsFiles) +generateBindings.dependsOn(runAstParser) + +///////// CUSTOM CLEAN //////////// +task clean(type: Delete) { + delete files(["$projectDir/bindings.txt", "$projectDir/cached.txt", "$projectDir/interfaces-names.txt", "$projectDir/jsFilesParameters.txt"]) +} diff --git a/android-static-binding-generator/project/interface-name-generator/.gitignore b/android-static-binding-generator/project/interface-name-generator/.gitignore new file mode 100644 index 000000000..50b4f7b0f --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/.gitignore @@ -0,0 +1,8 @@ +/build +*.iml +.gradle +/local.properties +/.idea +!/.idea/misc.xml +/a +!.gitignore diff --git a/android-static-binding-generator/project/interface-name-generator/build.gradle b/android-static-binding-generator/project/interface-name-generator/build.gradle new file mode 100644 index 000000000..ad0ec6761 --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/build.gradle @@ -0,0 +1,21 @@ +group 'interfacenamegenerator' +version '1.0-SNAPSHOT' + +apply plugin: 'java' +jar.archiveName = "interfacenamegenerator.jar" + +sourceCompatibility = 1.5 + +repositories { + mavenCentral() +} + +jar { + manifest { + attributes 'Main-Class': 'com.ig.GetInterfaceNames' + } +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' +} diff --git a/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.jar b/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7a3265ee9 Binary files /dev/null and b/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.properties b/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..f16d26666 --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip diff --git a/android-static-binding-generator/project/interface-name-generator/gradlew b/android-static-binding-generator/project/interface-name-generator/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android-static-binding-generator/project/interface-name-generator/gradlew.bat b/android-static-binding-generator/project/interface-name-generator/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android-static-binding-generator/project/interface-name-generator/settings.gradle b/android-static-binding-generator/project/interface-name-generator/settings.gradle new file mode 100644 index 000000000..bfbb2158e --- /dev/null +++ b/android-static-binding-generator/project/interface-name-generator/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'interfacenamegenerator' + diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java b/android-static-binding-generator/project/interface-name-generator/src/main/java/com/ig/GetInterfaceNames.java similarity index 82% rename from test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java rename to android-static-binding-generator/project/interface-name-generator/src/main/java/com/ig/GetInterfaceNames.java index 80a412ca8..e981c718f 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java +++ b/android-static-binding-generator/project/interface-name-generator/src/main/java/com/ig/GetInterfaceNames.java @@ -1,4 +1,4 @@ -package org.nativescript.staticbindinggenerator; +package com.ig; import java.io.BufferedWriter; import java.io.File; @@ -9,24 +9,27 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; -import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class GetInterfaceNames { private static String currentDir; - public static void generateInterfaceFile(List rows) + public static void main(String[] args) throws IOException, ClassNotFoundException { currentDir = System.getProperty("user.dir"); - String outputFileName = Main.SBG_INTERFACE_NAMES; + String outputFileName = "interfaces-names.txt"; + + if ((args != null) && + (args.length < 1)) { + throw new IllegalArgumentException("There are no parameters passed!"); + } PrintWriter out = ensureOutputFile(outputFileName); - for (DataRow dr : rows) { - String pathToDependency = dr.getRow(); - if (pathToDependency .endsWith(".jar")) { - generateInterfaceNames(pathToDependency, out); + for (String pathToJar : args) { + if (pathToJar.endsWith(".jar")) { + generateInterfaceNames(pathToJar, out); } } @@ -66,7 +69,7 @@ private static void generateInterfaceNames(String pathToJar, PrintWriter out) th jarFile.close(); } - public static PrintWriter ensureOutputFile(String outputFileName) throws IOException { + private static PrintWriter ensureOutputFile(String outputFileName) throws IOException { File checkFile = new File(currentDir, outputFileName); if (checkFile.exists()) { checkFile.delete(); diff --git a/test-app/build-tools/jsparser/helpers/file_helpers.js b/android-static-binding-generator/project/parser/helpers/file_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/helpers/file_helpers.js rename to android-static-binding-generator/project/parser/helpers/file_helpers.js diff --git a/test-app/build-tools/jsparser/helpers/json_extension.js b/android-static-binding-generator/project/parser/helpers/json_extension.js similarity index 100% rename from test-app/build-tools/jsparser/helpers/json_extension.js rename to android-static-binding-generator/project/parser/helpers/json_extension.js diff --git a/test-app/build-tools/jsparser/helpers/logger.js b/android-static-binding-generator/project/parser/helpers/logger.js similarity index 100% rename from test-app/build-tools/jsparser/helpers/logger.js rename to android-static-binding-generator/project/parser/helpers/logger.js diff --git a/test-app/build-tools/jsparser/js_parser.js b/android-static-binding-generator/project/parser/js_parser.js similarity index 98% rename from test-app/build-tools/jsparser/js_parser.js rename to android-static-binding-generator/project/parser/js_parser.js index e8f006699..74df5899b 100644 --- a/test-app/build-tools/jsparser/js_parser.js +++ b/android-static-binding-generator/project/parser/js_parser.js @@ -40,8 +40,7 @@ var fs = require("fs"), interfacesDecoratorName = "Interfaces", outFile = "out/out_parsed_typescript.txt", // default out file inputDir = "input_parced_typescript", // default input folder - SBG_INTERFACE_NAMES = "sbg-interface-names.txt", - interfacesNamesFilePath = "../" + SBG_INTERFACE_NAMES, //default interace_names file path + interfacesNamesFilePath = "../interfaces-names.txt", //default interace_names file path interfaceNames = [], inputFiles = []; diff --git a/test-app/build-tools/jsparser/logs/.gitignore b/android-static-binding-generator/project/parser/logs/.gitignore similarity index 50% rename from test-app/build-tools/jsparser/logs/.gitignore rename to android-static-binding-generator/project/parser/logs/.gitignore index cf57c3b0f..c96a04f00 100644 --- a/test-app/build-tools/jsparser/logs/.gitignore +++ b/android-static-binding-generator/project/parser/logs/.gitignore @@ -1,2 +1,2 @@ -.gitignore +* !.gitignore \ No newline at end of file diff --git a/test-app/build-tools/jsparser/out/.gitignore b/android-static-binding-generator/project/parser/out/.gitignore similarity index 50% rename from test-app/build-tools/jsparser/out/.gitignore rename to android-static-binding-generator/project/parser/out/.gitignore index cf57c3b0f..c96a04f00 100644 --- a/test-app/build-tools/jsparser/out/.gitignore +++ b/android-static-binding-generator/project/parser/out/.gitignore @@ -1,2 +1,2 @@ -.gitignore +* !.gitignore \ No newline at end of file diff --git a/test-app/build-tools/jsparser/package.json b/android-static-binding-generator/project/parser/package.json similarity index 74% rename from test-app/build-tools/jsparser/package.json rename to android-static-binding-generator/project/parser/package.json index f832f6d3d..1aaafed18 100644 --- a/test-app/build-tools/jsparser/package.json +++ b/android-static-binding-generator/project/parser/package.json @@ -14,7 +14,5 @@ "babylon": "6.4.5", "filewalker": "0.1.2", "lazy": "1.0.11" - }, - "repository": "https://github.com/NativeScript/android-runtime", - "description": "javascript static analysis tool" + } } \ No newline at end of file diff --git a/test-app/build-tools/jsparser/visitors/es5-visitors.js b/android-static-binding-generator/project/parser/visitors/es5-visitors.js similarity index 100% rename from test-app/build-tools/jsparser/visitors/es5-visitors.js rename to android-static-binding-generator/project/parser/visitors/es5-visitors.js diff --git a/test-app/build-tools/static-binding-generator/.gitignore b/android-static-binding-generator/project/staticbindinggenerator/.gitignore similarity index 100% rename from test-app/build-tools/static-binding-generator/.gitignore rename to android-static-binding-generator/project/staticbindinggenerator/.gitignore diff --git a/test-app/build-tools/static-binding-generator/build.gradle b/android-static-binding-generator/project/staticbindinggenerator/build.gradle similarity index 52% rename from test-app/build-tools/static-binding-generator/build.gradle rename to android-static-binding-generator/project/staticbindinggenerator/build.gradle index 691e2e25c..1bbb6c806 100644 --- a/test-app/build-tools/static-binding-generator/build.gradle +++ b/android-static-binding-generator/project/staticbindinggenerator/build.gradle @@ -1,19 +1,22 @@ -apply plugin: 'java-library' +apply plugin: 'java' -dependencies { - compile 'org.apache.bcel:bcel:5.2' - compile group: 'org.json', name: 'json', version: '20090211' - compile 'commons-io:commons-io:2.5' - testCompile 'junit:junit:4.+' +buildscript { + repositories { + jcenter() + } } -sourceCompatibility = "1.7" -targetCompatibility = "1.7" +allprojects { + repositories { + jcenter() + } +} -task copyJarToBuildTools (type: Copy) { - inputs.dir("$projectDir/build/libs/static-binding-generator.jar") - from "$projectDir/build/libs/static-binding-generator.jar" - into "$projectDir/../" +dependencies { + compile 'org.apache.bcel:bcel:5.2' + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.+' + testCompile 'commons-io:commons-io:2.5' } jar { @@ -21,6 +24,7 @@ jar { attributes("Manifest-Version": "1.0", "Main-Class": "org.nativescript.staticbindinggenerator.Main") } + from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) @@ -31,5 +35,3 @@ jar { } } } - -jar.finalizedBy(copyJarToBuildTools) \ No newline at end of file diff --git a/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.jar b/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7a3265ee9 Binary files /dev/null and b/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.properties b/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..f16d26666 --- /dev/null +++ b/android-static-binding-generator/project/staticbindinggenerator/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip diff --git a/android-static-binding-generator/project/staticbindinggenerator/gradlew b/android-static-binding-generator/project/staticbindinggenerator/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/android-static-binding-generator/project/staticbindinggenerator/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android-static-binding-generator/project/staticbindinggenerator/gradlew.bat b/android-static-binding-generator/project/staticbindinggenerator/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/android-static-binding-generator/project/staticbindinggenerator/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Binding.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Binding.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Binding.java rename to android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Binding.java diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java similarity index 88% rename from test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java rename to android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java index 91a8e57fc..06cc05eae 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/DataRow.java @@ -47,8 +47,7 @@ public String[] getInterfaces() { private void parse(String row) { String[] data = row.split(DELIMITER, -1); if (data.length != ELEMENT_NUMBER) { -// throw new IllegalArgumentException("Wrong number of elements " + data.length + " (Expected " + ELEMENT_NUMBER +")\n" + row); - return; + throw new IllegalArgumentException("Wrong number of elements " + data.length + " (Expected " + ELEMENT_NUMBER +")\n" + row); } baseClassname = data[0]; diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java similarity index 97% rename from test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java rename to android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java index 40c50e643..55c73109b 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java @@ -11,10 +11,12 @@ import java.nio.file.Paths; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.jar.JarInputStream; @@ -25,6 +27,8 @@ import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.Type; +import javafx.util.Pair; + public class Generator { private static final String JAVA_EXT = ".java"; @@ -32,15 +36,15 @@ public class Generator { private static final String DEFAULT_PACKAGE_NAME = "com.tns.gen"; - private final File outputDir; - private final List libs; + private final String outputDir; + private final String[] libs; private final Map classes; - public Generator(File outputDir, List libs) throws IOException { + public Generator(String outputDir, String[] libs) throws IOException { this(outputDir, libs, false); } - public Generator(File outputDir, List libs, boolean throwOnError) throws IOException { + public Generator(String outputDir, String[] libs, boolean throwOnError) throws IOException { this.outputDir = outputDir; this.libs = libs; this.classes = readClasses(libs, throwOnError); @@ -121,7 +125,7 @@ public Binding generateBinding(DataRow dataRow) throws ClassNotFoundException { return generateBinding(dataRow, new HashSet()); } - public static List getRows(String filename) throws IOException { + private List getRows(String filename) throws IOException { List rows = new ArrayList(); BufferedReader br = null; try { @@ -131,8 +135,6 @@ public static List getRows(String filename) throws IOException { DataRow row = new DataRow(line); rows.add(row); } - } catch (Exception e) { - e.printStackTrace(); } finally { if (br != null) { br.close(); @@ -234,11 +236,10 @@ private Map getPublicApi(JavaClass clazz) throws ClassNotFo return api; } - private Map readClasses(List libs, boolean throwOnError) throws FileNotFoundException, IOException { + private Map readClasses(String[] libs, boolean throwOnError) throws FileNotFoundException, IOException { Map map = new HashMap(); if (libs != null) { - for (DataRow dr : libs) { - String lib = dr.getRow(); + for (String lib : libs) { File f = new File(lib); Map classes = f.isFile() ? readJar(lib, throwOnError) : readDir(lib, throwOnError); map.putAll(classes); diff --git a/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java new file mode 100644 index 000000000..9b663f699 --- /dev/null +++ b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java @@ -0,0 +1,17 @@ +package org.nativescript.staticbindinggenerator; + +import java.io.IOException; +import java.util.Arrays; + +public class Main { + public static void main(String[] args) throws IOException, ClassNotFoundException { + if (args.length < 3) { + throw new IllegalArgumentException("Expects at least three arguments"); + } + String inputBindingFilename = args[0]; + String outputDir = args[1]; + String[] libs = Arrays.copyOfRange(args, 2, args.length); + + new Generator(outputDir, libs).writeBindings(inputBindingFilename); + } +} diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Writer.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Writer.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Writer.java rename to android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Writer.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/ListView.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/ListView.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/ListView.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/ListView.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/MyAbstractClass.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyAbstractClass.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/MyAbstractClass.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyAbstractClass.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/MyAbstractClass2.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyAbstractClass2.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/MyAbstractClass2.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyAbstractClass2.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/MyClass.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyClass.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/MyClass.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyClass.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/MyInterface.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyInterface.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/MyInterface.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/MyInterface.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/example/View.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/View.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/example/View.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/example/View.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/tns/JavaScriptImplementation.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/JavaScriptImplementation.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/tns/JavaScriptImplementation.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/JavaScriptImplementation.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/tns/NativeScriptHashCodeProvider.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/NativeScriptHashCodeProvider.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/tns/NativeScriptHashCodeProvider.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/NativeScriptHashCodeProvider.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/com/tns/Runtime.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/Runtime.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/com/tns/Runtime.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/com/tns/Runtime.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/CompiledCode.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/CompiledCode.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/CompiledCode.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/CompiledCode.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/DynamicClassLoader.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/DynamicClassLoader.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/DynamicClassLoader.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/DynamicClassLoader.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java similarity index 79% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java index b36e8a9b1..4e1cd0bf3 100644 --- a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/ExtendedStandardJavaFileManager.java @@ -28,12 +28,12 @@ protected ExtendedStandardJavaFileManager(JavaFileManager fileManager, CompiledC } @Override - public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { + public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { return compiledCode; } @Override - public ClassLoader getClassLoader(Location location) { + public ClassLoader getClassLoader(JavaFileManager.Location location) { return cl; } } diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/InMemoryJavaCompiler.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/InMemoryJavaCompiler.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/InMemoryJavaCompiler.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/InMemoryJavaCompiler.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/Main.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/Main.java similarity index 78% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/Main.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/Main.java index bf55e7796..d17b21d57 100644 --- a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/Main.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/Main.java @@ -1,4 +1,4 @@ -package org.mdkt.compiler; +package java.org.mdkt.compiler; /** * Created by slavchev on 6/17/2016. diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/SourceCode.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/SourceCode.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/mdkt/compiler/SourceCode.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/mdkt/compiler/SourceCode.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/DataRowTest.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/DataRowTest.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/DataRowTest.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/DataRowTest.java diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java similarity index 89% rename from test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java index 3b382a669..49ba7e152 100644 --- a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java @@ -44,9 +44,8 @@ public void testCanCompileBinding() throws Exception { List lines = Utils.getDataRowsFromResource("datarow-named-extend.txt"); DataRow dataRow = new DataRow(lines.get(0)); - File outputDir = null; - List libs = new ArrayList<>(); - libs.add(new DataRow(runtimePath)); + String outputDir = null; + String[] libs = {runtimePath}; Generator generator = new Generator(outputDir, libs); Binding binding = generator.generateBinding(dataRow); @@ -72,10 +71,8 @@ public void testCanCompileBindingOfInterfaceWithStaticInitializer() throws Excep List lines = IOUtils.readLines(new StringReader(s)); DataRow dataRow = new DataRow(lines.get(0)); - File outputDir = null; - List libs = new ArrayList<>(); - libs.add(new DataRow(rt.getAbsolutePath())); - libs.add(new DataRow(f.getAbsolutePath())); + String outputDir = null; + String[] libs = {rt.getAbsolutePath(), f.getAbsolutePath()}; Generator generator = new Generator(outputDir, libs); Binding binding = generator.generateBinding(dataRow); @@ -94,9 +91,8 @@ public void testCanCompileBindingClassImplementingMultipleInterfaces() throws Ex List lines = Utils.getDataRowsFromResource("datarow-class-extends-interfaces.txt"); DataRow dataRow = new DataRow(lines.get(0)); - File outputDir = null; - List libs = new ArrayList<>(); - libs.add(new DataRow(runtimePath)); + String outputDir = null; + String[] libs = {runtimePath}; Generator generator = new Generator(outputDir, libs); Binding binding = generator.generateBinding(dataRow); @@ -120,10 +116,8 @@ public void testCanCompileBindingClassExtendingAnExtendedClassWithMethodsWithThe System.out.println(dataRowString); - File outputDir = null; - List libs = new ArrayList<>(); - libs.add(new DataRow(runtimePath)); - libs.add(new DataRow(f.getAbsolutePath())); + String outputDir = null; + String[] libs = {runtimePath, f.getAbsolutePath()}; Generator generator = new Generator(outputDir, libs); Binding binding = generator.generateBinding(dataRow); @@ -147,10 +141,8 @@ public void testCanCompileBindingClassExtendingAnAbstractClassThatExtendsAbstrac System.out.println(dataRowString); - File outputDir = null; - List libs = new ArrayList<>(); - libs.add(new DataRow(runtimePath)); - libs.add(new DataRow(f.getAbsolutePath())); + String outputDir = null; + String[] libs = {runtimePath, f.getAbsolutePath()}; Generator generator = new Generator(outputDir, libs); Binding binding = generator.generateBinding(dataRow); diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/Utils.java b/android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/Utils.java similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/Utils.java rename to android-static-binding-generator/project/staticbindinggenerator/src/test/java/org/nativescript/staticbindinggenerator/test/Utils.java diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-class-extends-interfaces.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-class-extends-interfaces.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-class-extends-interfaces.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-class-extends-interfaces.txt diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-classctor.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-classctor.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-classctor.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-classctor.txt diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-abstract-class-extending-abstract-class.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-abstract-class-extending-abstract-class.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-abstract-class-extending-abstract-class.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-abstract-class-extending-abstract-class.txt diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-class-with-same-method-signature.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-class-with-same-method-signature.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-class-with-same-method-signature.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-extend-class-with-same-method-signature.txt diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-interface.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-interface.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-interface.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-interface.txt diff --git a/test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-named-extend.txt b/android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-named-extend.txt similarity index 100% rename from test-app/build-tools/static-binding-generator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-named-extend.txt rename to android-static-binding-generator/project/staticbindinggenerator/src/test/resources/org/nativescript/staticbindinggenerator/test/datarow-named-extend.txt diff --git a/test-app/build-tools/jsparser/tests/run-tests.js b/android-static-binding-generator/run-tests.js similarity index 100% rename from test-app/build-tools/jsparser/tests/run-tests.js rename to android-static-binding-generator/run-tests.js diff --git a/test-app/build-tools/jsparser/tests/cases/.gitignore b/android-static-binding-generator/tests/cases/.gitignore similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/.gitignore rename to android-static-binding-generator/tests/cases/.gitignore diff --git a/test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity.android.ts b/android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity.android.ts similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity.android.ts rename to android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity.android.ts diff --git a/test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.0.10.android.js b/android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.0.10.android.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.0.10.android.js rename to android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.0.10.android.js diff --git a/test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.1.4.android.js b/android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.1.4.android.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.1.4.android.js rename to android-static-binding-generator/tests/cases/decorated_extends_ts/app/myCustomActivity_ts2.1.4.android.js diff --git a/test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/decorated_extends_ts/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/decorated_extends_ts/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/decorated_extends_ts/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/directory_with_dashes/app/dir-with-dashes/file-with-dashes.js b/android-static-binding-generator/tests/cases/directory_with_dashes/app/dir-with-dashes/file-with-dashes.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/directory_with_dashes/app/dir-with-dashes/file-with-dashes.js rename to android-static-binding-generator/tests/cases/directory_with_dashes/app/dir-with-dashes/file-with-dashes.js diff --git a/test-app/build-tools/jsparser/tests/cases/directory_with_dashes/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/directory_with_dashes/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/directory_with_dashes/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/directory_with_dashes/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends/app/normal_ns_extends.js b/android-static-binding-generator/tests/cases/extends/app/normal_ns_extends.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends/app/normal_ns_extends.js rename to android-static-binding-generator/tests/cases/extends/app/normal_ns_extends.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/extends/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/extends/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends_with_interfaces/app/normal_ns_extends.js b/android-static-binding-generator/tests/cases/extends_with_interfaces/app/normal_ns_extends.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends_with_interfaces/app/normal_ns_extends.js rename to android-static-binding-generator/tests/cases/extends_with_interfaces/app/normal_ns_extends.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends_with_interfaces/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/extends_with_interfaces/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends_with_interfaces/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/extends_with_interfaces/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends_with_interfaces_ts/app/normal_ts_extends.js b/android-static-binding-generator/tests/cases/extends_with_interfaces_ts/app/normal_ts_extends.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends_with_interfaces_ts/app/normal_ts_extends.js rename to android-static-binding-generator/tests/cases/extends_with_interfaces_ts/app/normal_ts_extends.js diff --git a/test-app/build-tools/jsparser/tests/cases/extends_with_interfaces_ts/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/extends_with_interfaces_ts/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/extends_with_interfaces_ts/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/extends_with_interfaces_ts/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/file_names_with_dots/app/file.with.dots.js b/android-static-binding-generator/tests/cases/file_names_with_dots/app/file.with.dots.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/file_names_with_dots/app/file.with.dots.js rename to android-static-binding-generator/tests/cases/file_names_with_dots/app/file.with.dots.js diff --git a/test-app/build-tools/jsparser/tests/cases/file_names_with_dots/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/file_names_with_dots/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/file_names_with_dots/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/file_names_with_dots/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/app.css b/android-static-binding-generator/tests/cases/mini_app/app/app.css similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/app.css rename to android-static-binding-generator/tests/cases/mini_app/app/app.css diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/app.js b/android-static-binding-generator/tests/cases/mini_app/app/app.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/app.js rename to android-static-binding-generator/tests/cases/mini_app/app/app.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/package.json b/android-static-binding-generator/tests/cases/mini_app/app/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/not_ns_subcomponent/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/subcomponent/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/subcomponent/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/component/subcomponent/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/component/subcomponent/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component1/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component1/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component1/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component1/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component1/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component1/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component1/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component1/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/component2/subcomponent2.1/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/components_collection/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/components_collection/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/mock.js b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/mock.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/mock.js rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/mock.js diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/not_ns_module_submodule/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/not_ns_module/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/not_ns_module/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/package.json b/android-static-binding-generator/tests/cases/mini_app/app/tns_modules/package.json similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/app/tns_modules/package.json rename to android-static-binding-generator/tests/cases/mini_app/app/tns_modules/package.json diff --git a/test-app/build-tools/jsparser/tests/cases/mini_app/internal/ts_helpers.js b/android-static-binding-generator/tests/cases/mini_app/internal/ts_helpers.js similarity index 100% rename from test-app/build-tools/jsparser/tests/cases/mini_app/internal/ts_helpers.js rename to android-static-binding-generator/tests/cases/mini_app/internal/ts_helpers.js diff --git a/test-app/build-tools/jsparser/tests/interfaces-names.txt b/android-static-binding-generator/tests/interfaces-names.txt similarity index 100% rename from test-app/build-tools/jsparser/tests/interfaces-names.txt rename to android-static-binding-generator/tests/interfaces-names.txt diff --git a/test-app/build-tools/jsparser/tests/specs/ast-parser-tests.spec.js b/android-static-binding-generator/tests/specs/ast-parser-tests.spec.js similarity index 100% rename from test-app/build-tools/jsparser/tests/specs/ast-parser-tests.spec.js rename to android-static-binding-generator/tests/specs/ast-parser-tests.spec.js diff --git a/build-artifacts/project-template-gradle/app/build.gradle b/build-artifacts/project-template-gradle/app/build.gradle new file mode 100644 index 000000000..a16dfea58 --- /dev/null +++ b/build-artifacts/project-template-gradle/app/build.gradle @@ -0,0 +1,710 @@ +/* +* Script builds apk in release or debug mode +* To run: +* gradle assembleRelease -Prelease (release mode) +* gradle assembleDebug (debug mode -> default) +* Options: +* -Prelease //this flag will run build in release mode +* -PksPath=[path_to_keystore_file] +* -PksPassword=[password_for_keystore_file] +* -Palias=[alias_to_use_from_keystore_file] +* -Ppassword=[password_for_alias] +* +* -PtargetSdk=[target_sdk] +* -PbuildToolsVersion=[build_tools_version] +* -PsupportVersion=[support_version] +* -PcompileSdk=[compile_sdk_version] + +* -PdontRunSbg=[true/false] +*/ + +import groovy.json.JsonSlurper + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +apply plugin: "com.android.application" + +def metadataParams = new LinkedList () +def allJarPaths = new LinkedList () +def configStage = "\tconfig phase: " +def nodeModulesDir = "../../node_modules/" +def dependenciesJson = file("$rootDir/dependencies.json") + +// the build script will not work with previous versions of the CLI (3.1 or earlier) +if (!dependenciesJson.exists()) { + throw new BuildCancelledException(""" +'dependencies.json' file not found. Check whether the NativeScript CLI has prepared the project beforehand, +and that your NativeScript version is 3.3, or a more recent one. To build an android project with the current +version of the {N} CLI install a previous version of the runtime package - 'tns platform add android@3.2'. +""") +} + +project.ext.extractedDependenciesDir = "${project.buildDir}/exploded-dependencies"; +def nativescriptDependencies = new JsonSlurper().parseText(dependenciesJson.text) + +def packageJsonContents = [:] + +def dontRunSbg = project.hasProperty("dontRunSbg"); +def asbgProject = project(":asbg") +asbgProject.ext.outDir = new File("$projectDir", "src/main/java") +asbgProject.ext.jsCodeDir = new File("$projectDir", "src/main/assets/app") + +def computeCompileSdkVersion = { -> project.hasProperty("compileSdk") ? compileSdk : 26 } +def computeTargetSdkVersion = { -> project.hasProperty("targetSdk") ? targetSdk : 26 } +def computeBuildToolsVersion = { -> project.hasProperty("buildToolsVersion") ? buildToolsVersion : "26.0.1" } + +project.ext.selectedBuildType = project.hasProperty("release") ? "release" : "debug" + +def renameResultApks = { variant -> + def name + variant.outputs.each { output -> + def apkDirectory = output.packageApplication.outputFile.parentFile + def abiName = ""; + if (output.getFilter(com.android.build.OutputFile.ABI)) { + abiName = "-" + output.getFilter(com.android.build.OutputFile.ABI); + } + def apkNamePrefix = rootProject.name + "-" + variant.buildType.name + abiName + name = apkNamePrefix + ".apk" + output.packageApplication.outputFile = new File(apkDirectory, name); + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// CONFIGURATIONS /////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + +def applyPluginsIncludeGradleConfigurations = { -> + def taskNames = project.getGradle().startParameter.taskNames + + // don't apply plugin configurations if clean is invoked + if (taskNames && taskNames.size() > 0 && taskNames.getAt(0).equals("clean")) { + return [] + } + + def configurationsDir = new File(projectDir, "build/configurations") + configurationsDir.deleteDir() + + def dimensions = [] + def includes = new ArrayList() + def flavorNumber = 0 + + nativescriptDependencies.each { dep -> + def androidDir = file("$rootDir/${dep.directory}/platforms/android") + if (!androidDir.exists()) { + return + } + + FileTree allFilesExceptForAars = fileTree(dir: androidDir, exclude: "**/*.aar"); + if(allFilesExceptForAars.size() <= 0) { + return; + } + + def includeGradleFile = new File(androidDir, "include.gradle") + + def packageJsonPath = file("$rootDir/${dep.directory}/package.json") + def packageJson = new JsonSlurper().parseText(packageJsonPath.text) + def pluginName = packageJson.name + def dimensionName = sanitizeDimensionName(pluginName) + + dimensions.add(dimensionName) + def flavor = "F${flavorNumber++}" + + def destinationDir = file("${configurationsDir}/${pluginName}/") + def destinationIncludeGradleFile = file("${configurationsDir}/${pluginName}/include.gradle") + + Files.createDirectories(Paths.get(destinationDir.getAbsolutePath())) + + if (includeGradleFile.exists()) { + println "\t + add include.gradle from ${includeGradleFile}" + destinationIncludeGradleFile.text = modifyProductFlavorInContent(includeGradleFile.text, dimensionName, flavor) + } else { + println "\t + creating include.gradle for plugin ${file(dep.directory)}" + destinationIncludeGradleFile.text = createProductFlavorsContent(flavor, dimensionName) + } + + includes.add(destinationIncludeGradleFile.getAbsolutePath()); + + copyAndRenamePluginDirToFlavorName(androidDir, flavor); + } + + includes.each { + println "\t + applying plugin configuration from ${it}" + apply from: it + } + + return dimensions +} + +def applyAppGradleConfiguration = { -> + def pathToAppGradle = "$rootDir/../../app/App_Resources/Android/app.gradle" + def appGradle = file(pathToAppGradle) + if (appGradle.exists()) { + println "\t + applying user-defined configuration from ${appGradle}" + apply from: pathToAppGradle + } else { + println "\t + couldn't load user-defined configuration from ${appGradle}. File doesn't exist." + } +} + +android { + compileSdkVersion computeCompileSdkVersion() + buildToolsVersion computeBuildToolsVersion() + + defaultConfig { + minSdkVersion 17 + targetSdkVersion computeTargetSdkVersion() + ndk { + abiFilters "armeabi-v7a", "x86" + } + } + + sourceSets.main { + jniLibs.srcDir "$projectDir/libs/jni" + } + + signingConfigs { + release { + if (project.hasProperty("release")) { + if (project.hasProperty("ksPath") && + project.hasProperty("ksPassword") && + project.hasProperty("alias") && + project.hasProperty("password")) { + + storeFile file(ksPath) + storePassword ksPassword + keyAlias alias + keyPassword password + } + } + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } + + applicationVariants.all { variant -> + renameResultApks(variant) + } + + applyAppGradleConfiguration() + + def dimensions = applyPluginsIncludeGradleConfigurations() + + flavorDimensions(*dimensions) +} + +def externalRuntimeExists = !findProject(':runtime').is(null) + +repositories { + + // used for local *.AAR files + def pluginDependencies = nativescriptDependencies.collect { "$rootDir/${it.directory}/platforms/android" } + if(!externalRuntimeExists) { + pluginDependencies.add("libs/runtime-libs") + } + + flatDir { + dirs pluginDependencies + } +} + +dependencies { + def supportVer = "25.3.1" + if (project.hasProperty("supportVersion")) { + supportVer = supportVersion + } + + compile "com.android.support:support-v4:$supportVer" + compile "com.android.support:appcompat-v7:$supportVer" + debugCompile "com.android.support:design:$supportVer" +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// CONFIGURATION PHASE ////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + +task addNativeScriptRuntimePackageDependency { + def useV8Symbols = nativescriptDependencies.any { + def packageJsonPath = file("$rootDir/${it.directory}/package.json"); + def packageJson = new JsonSlurper().parseText(packageJsonPath.text); + return packageJson.nativescript.useV8Symbols; + } + + if(!externalRuntimeExists) { + def runtime = useV8Symbols ? "nativescript-regular" : "nativescript-optimized"; + println "\t + adding nativescript runtime package dependency: $runtime" + project.dependencies.add("compile", [name: runtime, ext: "aar"]) + } else { + project.dependencies.add("compile", project(':runtime')) + } +} + +task addDependenciesFromNativeScriptPlugins { + nativescriptDependencies.each { dep -> + def aarFiles = fileTree(dir: file("$rootDir/${dep.directory}/platforms/android"), include: ["**/*.aar"]) + aarFiles.each { aarFile -> + def length = aarFile.name.length() - 4 + def fileName = aarFile.name[0.. + println "\t + adding jar plugin dependency: " + jarFile.getAbsolutePath() + } + + project.dependencies.add("compile", jarFiles) + } +} + +static def updateProductFlavorsContent(flavor, dimensionName, oldContent) { + def endIndex = oldContent.length() - 1; + def index = 0; + def newContent = ""; + def level = -1; + def dimensionFound = false; + + while(index <= endIndex) { + if (level == 0 && (oldContent[index] == '"' || oldContent[index] == "'")) { + def closingQuotes = oldContent.indexOf('"', index + 1); + if (closingQuotes == -1) { + closingQuotes = oldContent.indexOf("'", index + 1); + } + + index = closingQuotes + 1; + newContent += "\"${flavor}\""; + continue; + } + + if (oldContent[index] == "{") { + level++; + } + + if (oldContent[index] == "}") { + level--; + } + + if (level > 0) { + if (!dimensionFound && oldContent.indexOf("dimension", index) == index) { + newContent += "dimension \"${dimensionName}\""; + dimensionFound = true; + index += "dimension ".length(); + def openingQuoutes = oldContent.indexOf('"', index); + if (openingQuoutes == -1) { + openingQuoutes = oldContent.indexOf("'", index); + } + + def closingQuotes = oldContent.indexOf('"', openingQuoutes + 1); + if (closingQuotes == -1) { + closingQuotes = oldContent.indexOf("'", openingQuoutes + 1); + } + + index = closingQuotes + 1; + } + } + + newContent += oldContent[index]; + + index++; + } + + return newContent; +} + +static def createProductFlavorsContent(flavor, dimensionName, includeAndroidContent = true) { + if (includeAndroidContent) + { + def content = """ +android { + productFlavors { + "${flavor}" { + dimension "${dimensionName}" + } + } +} +""" + return content; + } + else + { + def content = """ + productFlavors { + "${flavor}" { + dimension "${dimensionName}" + } + } +""" + return content; + } +} + +static def sanitizeDimensionName(str) { + return str.replaceAll(/\W/, "") +} + +static def modifyProductFlavorInContent(content, dimension, flavor) { + def indexStart = content.indexOf("productFlavors"); + def index = indexStart + "productFlavors".length(); + def indexEnd = -1; + def nestedOpenBracketsCount = 0; + + while (index < content.length()) + { + // print content[index]; + if (content[index] == "}") + { + nestedOpenBracketsCount--; + + if (nestedOpenBracketsCount == 0) + { + indexEnd = index; + break; + } + } + else if (content[index] == "{") + { + nestedOpenBracketsCount++; + } + + index++; + } + + if (indexEnd != -1) + { + // full content of productFlavors { ... } -> the substring is parenthesis to parenthesis -> { ... } + def oldProductFlavorsText = content.substring(indexStart, indexEnd + 1); + + def newProductFlavorsContent = updateProductFlavorsContent(flavor, dimension, oldProductFlavorsText); + + return content.replace(oldProductFlavorsText, newProductFlavorsContent); + } + else + { + def androidContentExists = content.indexOf("android {") != -1; + def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, !androidContentExists); + + if (androidContentExists) + { + return content.replace("android {", "android { ${newProductFlavorsContent}"); + } + else + { + return "${newProductFlavorsContent} \t ${content}" + } + } +} + +def copyFolder(source, destination) { + if (source.isDirectory()) { + Files.createDirectories(destination.toPath()); + + def sourceFiles = source.list(); + + sourceFiles.each { file -> + def srcFile = new File(source, file); + def destFile = new File(destination, file); + + //Recursive function call + copyFolder(srcFile, destFile); + } + } + else { + // Copy the file content from one place to another + def fileName = source.getName() + def extension = fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0 ? fileName.substring(fileName.lastIndexOf(".") + 1) : ""; + // exclude aars from package, as we've already included it in the compile dependencies, and don't want it taking up space + if (extension == "aar") { + return + } + + Files.copy(source.toPath(), destination.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); + } +} + +def copyAndRenamePluginDirToFlavorName(directory, flavor) { + def targetDir = file("src/${flavor}") + + copyFolder(directory, targetDir) +} + +task ensureMetadataOutDir { + doLast { + def outputDir = file("$projectDir/metadata/output/assets/metadata") + outputDir.mkdirs() + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// EXECUTUION PHASE ///////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + +tasks.whenTaskAdded({ org.gradle.api.DefaultTask currentTask -> + if(currentTask =~ /generate.+BuildConfig/ ) { + currentTask.finalizedBy(extractAllJars) + extractAllJars.finalizedBy(collectAllJars) + collectAllJars.finalizedBy(setProperties) + } + if(currentTask =~ /compile.+JavaWithJavac/ ) { + currentTask.dependsOn(":asbg:generateBindings") + currentTask.finalizedBy(ensureMetadataOutDir) + ensureMetadataOutDir.finalizedBy(buildMetadata) + } + if(currentTask.equals("assembleDebug") || currentTask.equals("assembleRelease")) { + currentTask.finalizedBy("validateAppIdMatch"); + } +}) + +def explodeAar (File compileDependency, String outputDir) { + if(compileDependency.name.endsWith(".aar")) { + JarFile jar = new JarFile(compileDependency) + Enumeration enumEntries = jar.entries() + while (enumEntries.hasMoreElements()) { + JarEntry file = (JarEntry) enumEntries.nextElement(); + if(file.name.endsWith(".jar")) { + def f = new File(outputDir , file.name); + new File(f.parent).mkdirs(); + InputStream is = jar.getInputStream(file); + FileOutputStream fos = new FileOutputStream(f); + while (is.available() > 0) { + fos.write(is.read()) + } + fos.close() + is.close() + } + if (file.isDirectory()) { + continue + } + } + jar.close() + } + else if(compileDependency.name.endsWith(".jar")) { + copy { + from compileDependency.absolutePath + into outputDir + } + } +} + +task extractAllJars { + + outputs.dir extractedDependenciesDir + + doLast { + def iter = configurations.compile.resolvedConfiguration.resolvedArtifacts.iterator() + def dependencyCounter = 0; + while(iter.hasNext()) { + //declaring variable as specific class for getting code completion in Android Studio + org.gradle.api.internal.artifacts.DefaultResolvedArtifact nextDependency = iter.next(); + + def outputDir = java.nio.file.Paths.get(extractedDependenciesDir, ""+dependencyCounter).normalize().toString(); + explodeAar(nextDependency.file, outputDir) + dependencyCounter++; + } + } +} + +task collectAllJars { + description "gathers all paths to jar dependencies before building metadata with them" + + def sdkPath = android.sdkDirectory.getAbsolutePath(); + def androidJar = sdkPath + "/platforms/" + android.compileSdkVersion + "/android.jar" + + doFirst { + configurations.compile.each { File dependencyFile -> + logger.info("Task: collectAllJars: dependency file: " + dependencyFile.getAbsolutePath()) + allJarPaths.add(dependencyFile.getAbsolutePath()) + } + + allJarPaths.add(androidJar); + + def ft = fileTree(dir: extractedDependenciesDir, include: "**/*.jar") + ft.each { currentJarFile -> + allJarPaths.add(currentJarFile.getAbsolutePath()) + } + + metadataParams.add("metadata-generator.jar"); + metadataParams.add("$projectDir/metadata/output/assets/metadata"); + def jars = new LinkedList() + for (def i = 0; i < allJarPaths.size(); i++) { + metadataParams.add(allJarPaths.get(i)); + def f = new File(allJarPaths.get(i)) + if (f.getName().endsWith(".jar")) { + jars.add(f) + } + } + + asbgProject.ext.jarFiles = jars + } +} + +task buildMetadata (type: JavaExec) { + description "builds metadata with provided jar dependencies" + + inputs.files(allJarPaths) + inputs.dir("$buildDir/intermediates/classes") + + outputs.files("metadata/output/assets/metadata/treeNodeStream.dat", "metadata/output/assets/metadata/treeStringsStream.dat", "metadata/output/assets/metadata/treeValueStream.dat") + + doFirst { + // get compiled classes to pass to metadata generator + // these need to be called after the classes have compiled + def classesDir = "$buildDir/intermediates/classes" + + def classesSubDirs = new File(classesDir).listFiles() + def selectedBuildType = project.ext.selectedBuildType + + for (File subDir: classesSubDirs) { + if (!subDir.getName().equals(selectedBuildType)) { + def subDirBuildType = new File(subDir, selectedBuildType) + if (subDirBuildType.exists()) { + metadataParams.add(subDirBuildType.getAbsolutePath()); + } + } + } + + def classesDirBuildType = new File(classesDir, selectedBuildType) + if (classesDirBuildType.exists()) { + metadataParams.add(classesDirBuildType.getAbsolutePath()) + } + + workingDir "$rootDir/build-tools" + main "-jar" + + logger.info("Task buildMetadata: Call metadata-generator.jar with arguments: " + metadataParams.toString().replaceAll(',', '')) + args metadataParams.toArray() + } + + doLast { + copy { + from "$projectDir/metadata/output/assets/metadata" + into "$projectDir/src/main/assets/metadata" + } + } +} + +task generateTypescriptDefinitions (type: JavaExec) { + def paramz = new ArrayList(); + def includeDirs = ["com.android.support", "/platforms/" + android.compileSdkVersion] + + doFirst { + delete "$rootDir/build-tools/typings" + + workingDir "$rootDir/build-tools" + + main "-jar" + + paramz.add("dts-generator.jar"); + paramz.add("-input"); + + for (String jarPath: project.jarFiles) { + // don't generate typings for runtime jars and classes + if (shouldIncludeDirForTypings(jarPath, includeDirs)) { + paramz.add(jarPath); + } + } + + paramz.add("-output"); + paramz.add("typings"); + + logger.info("Task generateTypescriptDefinitions: Call dts-generator.jar with arguments: " + paramz.toString().replaceAll(',', '')) + args paramz.toArray(); + } +} + +generateTypescriptDefinitions.onlyIf { + project.hasProperty("generateTypings") && Boolean.parseBoolean(project.generateTypings) +} + +static def shouldIncludeDirForTypings(path, includeDirs) { + for (String p: includeDirs) { + if (path.indexOf(p) > -1) { + return true; + } + } + + return false; +} + +task copyTypings { + doLast { + println "Copied generated typings to application root level. Make sure to import android.d.ts in reference.d.ts" + + copy { + from "$rootDir/build-tools/typings" + into "$rootDir/../../" + } + } +} + +copyTypings.onlyIf { generateTypescriptDefinitions.didWork } + +task validateAppIdMatch { + doLast { + def packageJsonFile = new File("$rootDir/../../package.json"); + def lineSeparator = System.getProperty("line.separator"); + + if (packageJsonFile.exists() && !project.hasProperty("release")) { + String content = packageJsonFile.getText("UTF-8") + def jsonSlurper = new JsonSlurper() + def packageJsonMap = jsonSlurper.parseText(content) + + if (packageJsonMap.nativescript.id != android.defaultConfig.applicationId) { + def errorMessage = "${lineSeparator}WARNING: The Application identifier is different from the one inside 'package.json' file.$lineSeparator" + + "NativeScript CLI might not work properly.$lineSeparator" + + "Update the application identifier in package.json and app.gradle so that they match."; + logger.error(errorMessage); + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////////// +////////////////////////////// OPTIONAL TASKS ////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + +task setProperties { + project.ext.jarFiles = [] + doLast { + def list = []; + allJarPaths.each({f -> + if(f.endsWith(".jar")) { + list.add(f); + } + }) + project.jarFiles = list; + } +} + +//////// custom clean /////////// +task deleteMetadata (type: Delete){ + delete "$projectDir/metadata/output", "$projectDir/src/main/assets/metadata" +} + +task deleteFlavors (type: Delete){ + doLast { + def srcDir = new File("$projectDir/src") + srcDir.listFiles().each({ f -> + def dirName = f.getName() + if (dirName != "main" && + dirName != "debug" && + dirName != "release") { + delete f + } + }) + } +} + +task deleteGeneratedBindings(type: Delete) { + delete "$projectDir/src/main/java/com/tns/gen" +} + +deleteMetadata.dependsOn(":asbg:clean") +deleteFlavors.dependsOn(deleteMetadata) +deleteGeneratedBindings.dependsOn(deleteFlavors) +clean.dependsOn(deleteGeneratedBindings) diff --git a/test-app/app/src/debug/res/layout/error_activity.xml b/build-artifacts/project-template-gradle/app/src/debug/res/layout/error_activity.xml similarity index 100% rename from test-app/app/src/debug/res/layout/error_activity.xml rename to build-artifacts/project-template-gradle/app/src/debug/res/layout/error_activity.xml diff --git a/test-app/app/src/debug/res/layout/exception_tab.xml b/build-artifacts/project-template-gradle/app/src/debug/res/layout/exception_tab.xml similarity index 100% rename from test-app/app/src/debug/res/layout/exception_tab.xml rename to build-artifacts/project-template-gradle/app/src/debug/res/layout/exception_tab.xml diff --git a/test-app/app/src/debug/res/layout/logcat_tab.xml b/build-artifacts/project-template-gradle/app/src/debug/res/layout/logcat_tab.xml similarity index 100% rename from test-app/app/src/debug/res/layout/logcat_tab.xml rename to build-artifacts/project-template-gradle/app/src/debug/res/layout/logcat_tab.xml diff --git a/test-app/app/src/debug/res/values/colors.xml b/build-artifacts/project-template-gradle/app/src/debug/res/values/colors.xml similarity index 100% rename from test-app/app/src/debug/res/values/colors.xml rename to build-artifacts/project-template-gradle/app/src/debug/res/values/colors.xml diff --git a/build-artifacts/project-template-gradle/build-tools/dts-generator.jar b/build-artifacts/project-template-gradle/build-tools/dts-generator.jar new file mode 100644 index 000000000..aa46fd88c Binary files /dev/null and b/build-artifacts/project-template-gradle/build-tools/dts-generator.jar differ diff --git a/build-artifacts/project-template-gradle/build.gradle b/build-artifacts/project-template-gradle/build.gradle new file mode 100644 index 000000000..f6050738b --- /dev/null +++ b/build-artifacts/project-template-gradle/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.3' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.jar b/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..3e68357b7 Binary files /dev/null and b/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.jar differ diff --git a/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.properties b/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..666911124 --- /dev/null +++ b/build-artifacts/project-template-gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Oct 26 15:50:33 EEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/build-artifacts/project-template-gradle/gradlew b/build-artifacts/project-template-gradle/gradlew new file mode 100755 index 000000000..4453ccea3 --- /dev/null +++ b/build-artifacts/project-template-gradle/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/build-artifacts/project-template-gradle/gradlew.bat b/build-artifacts/project-template-gradle/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/build-artifacts/project-template-gradle/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/build.gradle b/build.gradle index 8b1ae4b33..ffb8813d9 100644 --- a/build.gradle +++ b/build.gradle @@ -14,15 +14,12 @@ import groovy.json.JsonBuilder import groovy.json.JsonOutput def isWinOs = System.properties['os.name'].toLowerCase().contains('windows') +def localMetadataGen = "../android-metadata-generator/dist/tns-android-metadata-generator-0.0.1.tgz" +def distDir = "$projectDir/dist" def pVersion = "no package version was provided by build.gradle build" def arVersion = "no commit sha was provided by build.gradle build" def generateRegularRuntimePackage = !project.hasProperty("skipUnoptimized"); -def DIST_PATH = "$rootDir/dist" -def TEST_APP_PATH = "$rootDir/test-app" -def BUILD_TOOLS_PATH = "$TEST_APP_PATH/build-tools" -def DIST_FRAMEWORK_PATH = "$DIST_PATH/framework" - task checkEnvironmentVariables { if ("$System.env.JAVA_HOME" == "" || "$System.env.JAVA_HOME" == "null") { throw new GradleException("Set JAVA_HOME to point to the correct Jdk location\n"); @@ -42,16 +39,55 @@ task checkEnvironmentVariables { } task cleanDistDir(type: Delete) { - delete DIST_PATH + delete distDir } task createDistDir { doLast { - def distF = new File(DIST_PATH) + def distF = new File(distDir) distF.mkdirs() } } +task copyFilesToProjectTemeplate { + doLast { + copy { + from "$rootDir/test-app/app/src/main/java/com/tns/ErrorReport.java" + from "$rootDir/test-app/app/src/main/java/com/tns/ErrorReportActivity.java" + from "$rootDir/test-app/app/src/main/java/com/tns/NativeScriptSyncService.java" + into "$rootDir/build-artifacts/project-template-gradle/app/src/debug/java/com/tns/" + } + copy { + from "$rootDir/test-app/app/src/main/assets/internal" + into "$rootDir/build-artifacts/project-template-gradle/app/src/main/assets/internal" + } + copy { + from "$rootDir/test-app/app/src/main/java/com/tns/AndroidJsV8Inspector.java" + from "$rootDir/test-app/app/src/main/java/com/tns/DefaultExtractPolicy.java" + from "$rootDir/test-app/app/src/main/java/com/tns/LogcatLogger.java" + from "$rootDir/test-app/app/src/main/java/com/tns/NativeScriptApplication.java" + from "$rootDir/test-app/app/src/main/java/com/tns/NativeScriptUncaughtExceptionHandler.java" + from "$rootDir/test-app/app/src/main/java/com/tns/RuntimeHelper.java" + from "$rootDir/test-app/app/src/main/java/com/tns/Util.java" + into "$rootDir/build-artifacts/project-template-gradle/app/src/main/java/com/tns/" + } + copy { + from "$rootDir/test-app/app/src/main/java/com/tns/internal" + into "$rootDir/build-artifacts/project-template-gradle/app/src/main/java/com/tns/internal" + } + } +} + +task copyProjectTemplate(type: Copy) { + from "$rootDir/build-artifacts/project-template-gradle" + into "$rootDir/dist/framework" +} + +task copyPackageJson(type: Copy) { + from "$rootDir/package.json" + into "$rootDir/dist" +} + task getPackageVersion { doLast { String content = new File("$rootDir/package.json").getText("UTF-8") @@ -92,150 +128,144 @@ task getCommitVersion { } } -task generateDtsgJar(type: Exec) { +task generateRuntime { doFirst { - workingDir "$TEST_APP_PATH" - if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":dts-generator:jar" - } else { - commandLine "./gradlew", ":dts-generator:jar" + tasks.generateOptimizedRuntimeAar.execute(); + + if (generateRegularRuntimePackage) { + tasks.generateRuntimeAar.execute(); } } } -task generateSbgJar(type: Exec) { +task generateOptimizedRuntimeAar(type: Exec) { doFirst { - workingDir "$TEST_APP_PATH" + workingDir "$rootDir/test-app" if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":static-binding-generator:jar" + commandLine "cmd", "/c", "gradlew", "assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}", "-Poptimized" } else { - commandLine "./gradlew", ":static-binding-generator:jar" + commandLine "./gradlew", "assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}", "-Poptimized" } } } -task generateMdgJar(type: Exec) { +task generateRuntimeAar(type: Exec) { doFirst { - workingDir "$TEST_APP_PATH" + workingDir "$rootDir/test-app" if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":android-metadata-generator:jar" + commandLine "cmd", "/c", "gradlew", "assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}" } else { - commandLine "./gradlew", ":android-metadata-generator:jar" + commandLine "./gradlew", "assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}" } } } -task generateRuntime { - doFirst { - tasks.generateOptimizedRuntimeAar.execute(); +task copyGeneratedRuntime { + doLast { + copy { + from "$rootDir/test-app/runtime/build/outputs/aar/runtime-regular-release.aar" + into "$rootDir/dist/framework/app/libs/runtime-libs/" + rename "runtime-regular-release.aar", "nativescript-regular.aar" + } - if (generateRegularRuntimePackage) { - tasks.generateRuntimeAar.execute(); + copy { + from "$rootDir/test-app/runtime/build/outputs/aar/runtime-optimized-release.aar" + into "$rootDir/dist/framework/app/libs/runtime-libs/" + rename "runtime-optimized-release.aar", "nativescript-optimized.aar" } } } -task generateOptimizedRuntimeAar (type: Exec) { +task generateMetadataGeneratorJar(type: Exec) { doFirst { - workingDir "$TEST_APP_PATH" + workingDir "$rootDir/android-metadata-generator" + if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":runtime:assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}", "-Poptimized" + commandLine "cmd", "/c", "gradlew", "jarmg" } else { - commandLine "./gradlew", ":runtime:assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}", "-Poptimized" + commandLine "./gradlew", "jarmg" + } + } +} + +task copyGeneratedMetadataGeneratorJar { + doLast { + copy { + from "$rootDir/android-metadata-generator/dist" + into "$rootDir/dist/framework/build-tools" + rename "android-metadata-generator.jar", "metadata-generator.jar" } } } -task generateRuntimeAar (type: Exec) { +task generateInterfaceNameGenerator(type: Exec) { doFirst { - workingDir "$TEST_APP_PATH" + workingDir "$rootDir/android-static-binding-generator/project/interface-name-generator" + if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":runtime:assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}" + commandLine "cmd", "/c", "gradlew", "assemble" } else { - commandLine "./gradlew", ":runtime:assembleRelease", "-PpackageVersion=${pVersion}", "-PgitCommitVersion=${arVersion}" + commandLine "./gradlew", "assemble" } } } -task copyFilesToProjectTemeplate { +task copyInterfaceNameGeneratorJar { doLast { copy { - from "$TEST_APP_PATH/app/src/debug" - into "$DIST_FRAMEWORK_PATH/app/src/debug" - } - copy { - from "$TEST_APP_PATH/app/src/main/assets/internal" - into "$DIST_FRAMEWORK_PATH/app/src/main/assets/internal" - } - copy { - from "$TEST_APP_PATH/app/src/main/java/com/tns/" - include "*.java" - exclude "NativeScriptApplication.java" - exclude "NativeScriptActivity.java" - into "$DIST_FRAMEWORK_PATH/app/src/main/java/com/tns" - } - copy { - from "$TEST_APP_PATH/app/src/main/java/com/tns/internal" - into "$DIST_FRAMEWORK_PATH/app/src/main/java/com/tns/internal" - } - copy { - from "$BUILD_TOOLS_PATH/static-binding-generator.jar" - into "$DIST_FRAMEWORK_PATH/build-tools" - } - copy { - from "$BUILD_TOOLS_PATH/dts-generator.jar" - into "$DIST_FRAMEWORK_PATH/build-tools" - } - copy { - from "$BUILD_TOOLS_PATH/jsparser" - exclude "logs", "node_modules", "out", "package.json", "tests" - into "$DIST_FRAMEWORK_PATH/build-tools/jsparser" - } - copy { - from "$BUILD_TOOLS_PATH/android-metadata-generator.jar" - into "$DIST_FRAMEWORK_PATH/build-tools" - } - copy { - from "$TEST_APP_PATH/runtime/build/outputs/aar/runtime-regular-release.aar" - into "$DIST_FRAMEWORK_PATH/app/libs/runtime-libs" - rename "runtime-regular-release.aar", "nativescript-regular.aar" + from "$rootDir/android-static-binding-generator/project/interface-name-generator/build/libs" + into "$rootDir/dist/framework/build-tools/android-static-binding-generator" } - copy { - from "$TEST_APP_PATH/runtime/build/outputs/aar/runtime-optimized-release.aar" - into "$DIST_FRAMEWORK_PATH/app/libs/runtime-libs" - rename "runtime-optimized-release.aar", "nativescript-optimized.aar" - } - copy { - from "$TEST_APP_PATH/app/build.gradle" - into "$DIST_FRAMEWORK_PATH/app" - } - copy { - from "$TEST_APP_PATH/build.gradle" - into "$DIST_FRAMEWORK_PATH" - } - copy { - from "$TEST_APP_PATH/gradle" - into "$DIST_FRAMEWORK_PATH/gradle" + } +} + +task generateStaticBindingGeneratorJar(type: Exec) { + doFirst { + workingDir "$rootDir/android-static-binding-generator/project/staticbindinggenerator" + + + def commandArgs = ["assemble"] + + if (isWinOs) { + commandLine "cmd", "/c", "gradlew" + } else { + commandLine "./gradlew" } + + args commandArgs + } + +} +task copyGeneratedStaticBindingGeneratorJar { + doLast { copy { - from "$TEST_APP_PATH/gradlew" - into "$DIST_FRAMEWORK_PATH" + from "$rootDir/android-static-binding-generator/project/staticbindinggenerator/build/libs" + into "$rootDir/dist/framework/build-tools/android-static-binding-generator" } + } +} + +task copyStaticBindingGeneratorProject { + doLast { copy { - from "$TEST_APP_PATH/gradlew.bat" - into "$DIST_FRAMEWORK_PATH" + from "$rootDir/android-static-binding-generator/project" + exclude "staticbindinggenerator", "interface-name-generator", "**/package.json", "*.txt", "**/logs", "**/out", "**/input_parced_typescript" + + into "$rootDir/dist/framework/build-tools/android-static-binding-generator" } } } -task copyProjectTemplate(type: Copy) { - from "$rootDir/build-artifacts/project-template-gradle" - into "$DIST_FRAMEWORK_PATH" -} +task createNpmPackage(type: Exec) { + doFirst { + workingDir "$rootDir/dist" -task copyPackageJson(type: Copy) { - from "$rootDir/package.json" - into "$rootDir/dist" + if (isWinOs) { + commandLine "cmd", "/c", "npm", "pack" + } else { + commandLine "npm", "pack" + } + } } task setPackageVersionInPackageJsonFile { @@ -253,60 +283,83 @@ task copyReadme(type: Copy) { into "$rootDir/dist" } -task createNpmPackage(type: Exec) { - doFirst { - workingDir "$rootDir/dist" - - if (isWinOs) { - commandLine "cmd", "/c", "npm", "pack" - } else { - commandLine "npm", "pack" - } - } +task cleanBuildArtefacts(type: Delete) { + delete "$rootDir/build-artifacts/project-template-gradle/app/src/debug/java" + delete "$rootDir/build-artifacts/project-template-gradle/app/src/main/java" + delete "$rootDir/build-artifacts/project-template-gradle/app/src/main/assets" } -generateSbgJar.dependsOn(generateDtsgJar) -generateMdgJar.dependsOn(generateSbgJar) -createDistDir.dependsOn(generateMdgJar) -getPackageVersion.dependsOn(createDistDir) +//clean and set up dirs +copyFilesToProjectTemeplate.dependsOn(cleanDistDir) + +//copy framework structure +createDistDir.dependsOn(copyFilesToProjectTemeplate) +copyProjectTemplate.dependsOn(createDistDir) +copyPackageJson.dependsOn(copyProjectTemplate) + +copyStaticBindingGeneratorProject.dependsOn(copyPackageJson) +//generate static binding generator and copy into project template +generateInterfaceNameGenerator.dependsOn(copyStaticBindingGeneratorProject) +copyInterfaceNameGeneratorJar.dependsOn(generateInterfaceNameGenerator) +generateStaticBindingGeneratorJar.dependsOn(copyInterfaceNameGeneratorJar) +copyGeneratedStaticBindingGeneratorJar.dependsOn(generateStaticBindingGeneratorJar) + +//get version from package json +getPackageVersion.dependsOn(copyGeneratedStaticBindingGeneratorJar) getCommitVersion.dependsOn(getPackageVersion) + +//generate runtime and copy into framework structure generateRuntime.dependsOn(getCommitVersion) -generateOptimizedRuntimeAar.dependsOn(generateRuntime) -generateRuntimeAar.dependsOn(generateOptimizedRuntimeAar) -copyFilesToProjectTemeplate.dependsOn(generateRuntimeAar) -copyProjectTemplate.dependsOn(copyFilesToProjectTemeplate) -copyPackageJson.dependsOn(copyProjectTemplate) -setPackageVersionInPackageJsonFile.dependsOn(copyPackageJson) -copyReadme.dependsOn(setPackageVersionInPackageJsonFile) -createNpmPackage.dependsOn(copyReadme) -task createPackage { - description "Builds the NativeScript Android cleanBuildArtefactsApp Package using an application project template." - dependsOn createNpmPackage - println "Creating NativeScript Android Package" -} +setPackageVersionInPackageJsonFile.dependsOn(generateRuntime) -task runSbgTests (type: Exec) { - doFirst { - workingDir "$TEST_APP_PATH" - if (isWinOs) { - commandLine "cmd", "/c", "gradlew", ":static-binding-generator:test" - } else { - commandLine "./gradlew", ":static-binding-generator:test" - } - } -} +//generateRuntime.dependsOn(build) -task runTests (type: Exec) { - doFirst { - workingDir "$TEST_APP_PATH" - if (isWinOs) { - commandLine "cmd", "/c", "gradlew", "-b", "runtests.gradle", "runtests" - } else { - commandLine "./gradlew", "-b", "runtests.gradle", "runtests" - } +tasks.whenTaskAdded { task -> + if (task.getName() == "build") { + generateRuntime } } -runSbgTests.dependsOn(generateMdgJar) -runTests.dependsOn(runSbgTests) \ No newline at end of file +copyGeneratedRuntime.dependsOn(generateRuntime) + +//generate metadata generator and copy into framework structure +generateMetadataGeneratorJar.dependsOn(copyGeneratedRuntime) +copyGeneratedMetadataGeneratorJar.dependsOn(generateMetadataGeneratorJar) + +copyReadme.dependsOn(copyGeneratedMetadataGeneratorJar) + +//pack runtime +setPackageVersionInPackageJsonFile.dependsOn(copyReadme) +createNpmPackage.dependsOn(setPackageVersionInPackageJsonFile) +cleanBuildArtefacts.dependsOn(createNpmPackage) + +task createPackage { + description "Builds the NativeScript Android App Package using an application project template." + dependsOn cleanDistDir, + createDistDir, + + copyProjectTemplate, + + copyPackageJson, + + copyStaticBindingGeneratorProject, + generateStaticBindingGeneratorJar, + copyGeneratedStaticBindingGeneratorJar, + + getPackageVersion, + getCommitVersion, + + generateRuntime, + + setPackageVersionInPackageJsonFile, + + copyGeneratedRuntime, + generateMetadataGeneratorJar, + copyGeneratedMetadataGeneratorJar, + copyReadme, + createNpmPackage, + cleanBuildArtefacts + + println "Creating NativeScript Android Package" +} diff --git a/test-app/.gitignore b/test-app/.gitignore index e94ad2aa9..1a019ccb2 100644 --- a/test-app/.gitignore +++ b/test-app/.gitignore @@ -8,19 +8,3 @@ /captures .externalNativeBuild app/app.iml - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/dictionaries -.idea/libraries - - -treeNodeStream.dat -treeStringsStream.dat -treeValueStream.dat -NativeScriptActivity.java -NativeScriptApplication.java -**/com/tns/gen \ No newline at end of file diff --git a/test-app/app/build.gradle b/test-app/app/build.gradle index fc9ef3e1e..92fd302c9 100644 --- a/test-app/app/build.gradle +++ b/test-app/app/build.gradle @@ -1,478 +1,127 @@ -/* -* Script builds apk in release or debug mode -* To run: -* gradle assembleRelease -Prelease (release mode) -* gradle assembleDebug (debug mode -> default) -* Options: -* -Prelease //this flag will run build in release mode -* -PksPath=[path_to_keystore_file] -* -PksPassword=[password_for_keystore_file] -* -Palias=[alias_to_use_from_keystore_file] -* -Ppassword=[password_for_alias] -* -* -PtargetSdk=[target_sdk] -* -PbuildToolsVersion=[build_tools_version] -* -PsupportVersion=[support_version] -* -PcompileSdk=[compile_sdk_version] -*/ - -import groovy.json.JsonSlurper - -apply plugin: "com.android.application" - -//common -def BUILD_TOOLS_PATH = "$rootDir/build-tools" -def TYPINGS_PATH = "$BUILD_TOOLS_PATH/typings" -def USER_PROJECT_ROOT = "$rootDir/../.." -def PLATFORMS_ANDROID = "platforms/android" -def PACKAGE_JSON = "package.json" - -//static binding generator -def SBG_JAVA_DEPENDENCIES = "sbg-java-dependencies.txt" -def SBG_INPUT_OUTPUT_DIRS = "sbg-input-output-dirs.txt" -def SBG_JS_PARCED_FILES = "sbg-js-parced-files.txt" -def SBG_BINDINGS_NAME = "sbg-bindings.txt" -def SBG_INTERFACE_NAMES = "sbg-interface-names.txt" -def INPUT_JS_DIR = "$projectDir/src/main/assets/app" -def OUTPUT_JAVA_DIR = "$projectDir/src/main/java" - -//metadata generator -def MDG_OUTPUT_DIR = "mdg-output-dir.txt" -def MDG_JAVA_DEPENDENCIES = "mdg-java-dependencies.txt" -def METADATA_OUT_PATH = "$projectDir/src/main/assets/metadata" - -// the build script will not work with previous versions of the CLI (3.1 or earlier) -def dependenciesJson = file("$rootDir/dependencies.json") -if (!dependenciesJson.exists()) { - throw new BuildCancelledException(""" -'dependencies.json' file not found. Check whether the NativeScript CLI has prepared the project beforehand, -and that your NativeScript version is 3.3, or a more recent one. To build an android project with the current -version of the {N} CLI install a previous version of the runtime package - 'tns platform add android@3.2'. -""") -} - -project.ext.extractedDependenciesDir = "${project.buildDir}/exploded-dependencies" -def nativescriptDependencies = new JsonSlurper().parseText(dependenciesJson.text) - -def computeCompileSdkVersion = { -> project.hasProperty("compileSdk") ? compileSdk : 26 } -def computeTargetSdkVersion = { -> project.hasProperty("targetSdk") ? targetSdk : 26 } -def computeBuildToolsVersion = { -> - project.hasProperty("buildToolsVersion") ? buildToolsVersion : "26.0.1" -} - -project.ext.selectedBuildType = project.hasProperty("release") ? "release" : "debug" - -//////////////////////////////////////////////////////////////////////////////////// -///////////////////////////// CONFIGURATIONS /////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -def applyAppGradleConfiguration = { -> - def pathToAppGradle = "$USER_PROJECT_ROOT/app/App_Resources/Android/app.gradle" - def appGradle = file(pathToAppGradle) - if (appGradle.exists()) { - println "\t + applying user-defined configuration from ${appGradle}" - apply from: pathToAppGradle - } else { - println "\t + couldn't load user-defined configuration from ${appGradle}. File doesn't exist." - } -} - -def applyPluginGradleConfigurations = { -> - nativescriptDependencies.each {dep -> - def includeGradlePath = "$rootDir/${dep.directory}/$PLATFORMS_ANDROID/include.gradle" - if(file(includeGradlePath).exists()) { - apply from: includeGradlePath - } - } -} - -def renameResultApks = { variant -> - def name - variant.outputs.each { output -> - def apkDirectory = output.packageApplication.outputFile.parentFile - def abiName = ""; - if (output.getFilter(com.android.build.OutputFile.ABI)) { - abiName = "-" + output.getFilter(com.android.build.OutputFile.ABI); - } - def apkNamePrefix = rootProject.name + "-" + variant.buildType.name + abiName - name = apkNamePrefix + ".apk" - output.packageApplication.outputFile = new File(apkDirectory, name); - } -} +apply plugin: 'com.android.application' android { - compileSdkVersion computeCompileSdkVersion() - buildToolsVersion computeBuildToolsVersion() - + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { + applicationId "com.tns.testapplication" minSdkVersion 17 - targetSdkVersion computeTargetSdkVersion() - ndk { - abiFilters "armeabi-v7a", "x86" - } - } - - sourceSets.main { - jniLibs.srcDir "$projectDir/libs/jni" - } - - signingConfigs { - release { - if (project.hasProperty("release")) { - if (project.hasProperty("ksPath") && - project.hasProperty("ksPassword") && - project.hasProperty("alias") && - project.hasProperty("password")) { - - storeFile file(ksPath) - storePassword ksPassword - keyAlias alias - keyPassword password - } - } - } + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { - signingConfig signingConfigs.release - } - } - - applicationVariants.all { variant -> - renameResultApks(variant) - } - - applyAppGradleConfiguration() - applyPluginGradleConfigurations() -} - -def externalRuntimeExists = !findProject(':runtime').is(null) - -repositories { - - // used for local *.AAR files - def pluginDependencies = nativescriptDependencies.collect { - "$rootDir/${it.directory}/$PLATFORMS_ANDROID" - } - if (!externalRuntimeExists) { - pluginDependencies.add("libs/runtime-libs") - } - - if (pluginDependencies.size() > 0) { - flatDir { - dirs pluginDependencies + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { - def supportVer = "26.0.1" - if (project.hasProperty("supportVersion")) { - supportVer = supportVersion - } - compile "com.android.support:support-v4:$supportVer" - compile "com.android.support:appcompat-v7:$supportVer" - debugCompile "com.android.support:design:$supportVer" - def sbgProjectExists = !findProject(':static-binding-generator').is(null) - if (sbgProjectExists) { - provided project(':static-binding-generator') - } - def mdgProjectExists = !findProject(':android-metadata-generator').is(null) - if (mdgProjectExists) { - provided project(':android-metadata-generator') - } - def dtsgProjectExists = !findProject(':dts-generator').is(null) - if (dtsgProjectExists) { - provided project(':dts-generator') - } -} - -//////////////////////////////////////////////////////////////////////////////////// -///////////////////////////// CONFIGURATION PHASE ////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -task addNativeScriptRuntimePackageDependency { - def useV8Symbols = nativescriptDependencies.any { - def packageJsonPath = file("$rootDir/${it.directory}/$PACKAGE_JSON") - def packageJson = new JsonSlurper().parseText(packageJsonPath.text) - return packageJson.nativescript.useV8Symbols - } + releaseCompile project(path: ':runtime', configuration: 'release') + debugCompile project(path: ':runtime', configuration: 'debug') - if (!externalRuntimeExists) { - def runtime = useV8Symbols ? "nativescript-regular" : "nativescript-optimized" - println "\t + adding nativescript runtime package dependency: $runtime" - project.dependencies.add("compile", [name: runtime, ext: "aar"]) - } else { - project.dependencies.add("compile", project(':runtime')) - } + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.android.support:appcompat-v7:26.0.2' + compile 'com.android.support:design:26.0.2' + compile 'com.android.support.constraint:constraint-layout:1.0.2' } -task addDependenciesFromNativeScriptPlugins { - nativescriptDependencies.each { dep -> - def aarFiles = fileTree(dir: file("$rootDir/${dep.directory}/$PLATFORMS_ANDROID"), include: ["**/*.aar"]) - aarFiles.each { aarFile -> - def length = aarFile.name.length() - 4 - def fileName = aarFile.name[0.. - println "\t + adding jar plugin dependency: " + jarFile.getAbsolutePath() - } - - project.dependencies.add("compile", jarFiles) - } -} +def isWinOs = System.properties['os.name'].toLowerCase().contains('windows') +def runOnDevice = project.hasProperty("runOnDevice"); +def runOnDeviceOrEmulator = runOnDevice ? "-d" : "-e"; -tasks.whenTaskAdded({ org.gradle.api.DefaultTask currentTask -> - if (currentTask =~ /generate.+BuildConfig/) { - currentTask.finalizedBy(extractAllJars) - extractAllJars.finalizedBy(collectAllJars) - } - if (currentTask =~ /compile.+JavaWithJavac/) { - currentTask.dependsOn(runSbg) - currentTask.finalizedBy(ensureMetadataOutDir) - ensureMetadataOutDir.finalizedBy(buildMetadata) - } - if (currentTask =~ /assemble.+Debug/ || currentTask =~ /assemble.+Release/) { - currentTask.finalizedBy("validateAppIdMatch") +task deleteDist(type: Delete) { + doFirst { + delete "$rootDir/dist" } -}) - -//////////////////////////////////////////////////////////////////////////////////// -///////////////////////////// EXECUTUION PHASE ///////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -task runSbg(type: JavaExec) { - inputs.dir(INPUT_JS_DIR) - outputs.dir(OUTPUT_JAVA_DIR) - - workingDir "$BUILD_TOOLS_PATH" - main "-jar" - args "static-binding-generator.jar" } -task ensureMetadataOutDir { - doLast { - def outputDir = file("$METADATA_OUT_PATH") - outputDir.mkdirs() - } -} +task installApk(type: Exec) { + doFirst { + println "Attempting to install buit apk" -def explodeAar(File compileDependency, String outputDir) { - if (compileDependency.name.endsWith(".aar")) { - java.util.jar.JarFile jar = new java.util.jar.JarFile(compileDependency) - Enumeration enumEntries = jar.entries() - while (enumEntries.hasMoreElements()) { - java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement() - if (file.name.endsWith(".jar")) { - def f = new File(outputDir, file.name) - new File(f.parent).mkdirs() - InputStream is = jar.getInputStream(file) - FileOutputStream fos = new FileOutputStream(f) - while (is.available() > 0) { - fos.write(is.read()) - } - fos.close() - is.close() - } - if (file.isDirectory()) { - continue - } - } - jar.close() - } else if (compileDependency.name.endsWith(".jar")) { - copy { - from compileDependency.absolutePath - into outputDir + if (isWinOs) { + commandLine "cmd", "/c", "node", "$rootDir\\tools\\deploy-apk.js", "$rootDir\\app\\build\\outputs\\apk\\app-debug.apk", runOnDeviceOrEmulator + } else { + commandLine "node", "$rootDir/tools/deploy-apk.js", "$rootDir/app/build/outputs/apk/app-debug.apk", runOnDeviceOrEmulator } } -} - -task extractAllJars { - - outputs.dir extractedDependenciesDir doLast { - def iter = configurations.compile.resolvedConfiguration.resolvedArtifacts.iterator() - def dependencyCounter = 0 - while (iter.hasNext()) { - //declaring variable as specific class for getting code completion in Android Studio - org.gradle.api.internal.artifacts.DefaultResolvedArtifact nextDependency = iter.next() - - def outputDir = java.nio.file.Paths.get(extractedDependenciesDir, "" + dependencyCounter).normalize().toString() - explodeAar(nextDependency.file, outputDir) - dependencyCounter++ - } + println "Install result:" + execResult } } -task collectAllJars { - description "gathers all paths to jar dependencies before building metadata with them" - - def sdkPath = android.sdkDirectory.getAbsolutePath() - def androidJar = sdkPath + "/platforms/" + android.compileSdkVersion + "/android.jar" - +task deletePreviousResultXml(type: Exec) { doFirst { - def allJarPaths = new LinkedList() - allJarPaths.add(androidJar) - def ft = fileTree(dir: extractedDependenciesDir, include: "**/*.jar") - ft.each { currentJarFile -> - allJarPaths.add(currentJarFile.getAbsolutePath()) - } + println "Removing previous android_unit_test_results.xml" - new File("$BUILD_TOOLS_PATH/$SBG_JAVA_DEPENDENCIES").withWriter { out -> - allJarPaths.each { out.println it } - } - new File("$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES").withWriter { out -> - allJarPaths.each { - if (it.endsWith(".jar")) { - out.println it - } - } - } - new File("$BUILD_TOOLS_PATH/$SBG_INPUT_OUTPUT_DIRS").withWriter { out -> - out.println INPUT_JS_DIR - out.println OUTPUT_JAVA_DIR + if (isWinOs) { + commandLine "cmd", "/c", "adb", "root", "&&", "adb", runOnDeviceOrEmulator, "shell", "rm", "-rf", "/data/data/com.tns.testapplication/android_unit_test_results.xml" + } else { + commandLine "adb", "root", "&&", "adb", runOnDeviceOrEmulator, "shell", "rm", "-rf", "/data/data/com.tns.testapplication/android_unit_test_results.xml" } } } -task buildMetadata(type: JavaExec) { - description "builds metadata with provided jar dependencies" - - inputs.files("$MDG_JAVA_DEPENDENCIES") - inputs.dir("$buildDir/intermediates/classes") - - outputs.files("$METADATA_OUT_PATH/treeNodeStream.dat", "$METADATA_OUT_PATH/treeStringsStream.dat", "$METADATA_OUT_PATH/treeValueStream.dat") - +task startInstalledApk(type: Exec) { doFirst { - // get compiled classes to pass to metadata generator - // these need to be called after the classes have compiled - def classesDir = "$buildDir/intermediates/classes" - - def classesSubDirs = new File(classesDir).listFiles() - def selectedBuildType = project.ext.selectedBuildType + println "Starting test application" - def generatedClasses = new LinkedList() - for (File subDir : classesSubDirs) { - if (subDir.getName().equals(selectedBuildType)) { - generatedClasses.add(subDir.getAbsolutePath()) - } + if (isWinOs) { + commandLine "cmd", "/c", "adb", runOnDeviceOrEmulator, "shell", "am", "start", "-n", "com.tns.testapplication/com.tns.NativeScriptActivity", "-a", "android.intent.action.MAIN", "-c", "android.intent.category.LAUNCHER" + } else { + commandLine "adb", runOnDeviceOrEmulator, "shell", "am", "start", "-n", "com.tns.testapplication/com.tns.NativeScriptActivity", "-a", "android.intent.action.MAIN", "-c", "android.intent.category.LAUNCHER" } - - new File("$BUILD_TOOLS_PATH/$MDG_OUTPUT_DIR").withWriter { out -> - out.println "$METADATA_OUT_PATH" - } - - new File("$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES").withWriterAppend { out -> - generatedClasses.each { out.println it } - } - - workingDir "$BUILD_TOOLS_PATH" - main "-jar" - - args "android-metadata-generator.jar" } } -task generateTypescriptDefinitions(type: JavaExec) { - def paramz = new ArrayList() - def includeDirs = ["com.android.support", "/platforms/" + android.compileSdkVersion] +task createDistFolder { + doLast { + def distDir = file("$rootDir/dist") + distDir.mkdirs() + } +} +task waitForUnitTestResultFile(type: Exec) { doFirst { - delete "$TYPINGS_PATH" - - workingDir "$BUILD_TOOLS_PATH" + println "Waiting for tests to finish..." - main "-jar" - - paramz.add("dts-generator.jar") - paramz.add("-input") - - for (String jarPath : project.jarFiles) { - // don't generate typings for runtime jars and classes - if (shouldIncludeDirForTypings(jarPath, includeDirs)) { - paramz.add(jarPath) - } + if (isWinOs) { + commandLine "cmd", "/c", "node", "$rootDir\\tools\\try_to_find_test_result_file.js", runOnDeviceOrEmulator + } else { + commandLine "node", "$rootDir/tools/try_to_find_test_result_file.js", runOnDeviceOrEmulator } - - paramz.add("-output") - paramz.add("typings") - - logger.info("Task generateTypescriptDefinitions: Call dts-generator.jar with arguments: " + paramz.toString().replaceAll(',', '')) - args paramz.toArray() } } -generateTypescriptDefinitions.onlyIf { - project.hasProperty("generateTypings") && Boolean.parseBoolean(project.generateTypings) +task copyResultToDist(type: Copy) { + from "$rootDir/app/android_unit_test_results.xml" + into "$rootDir/dist" } -static def shouldIncludeDirForTypings(path, includeDirs) { - for (String p : includeDirs) { - if (path.indexOf(p) > -1) { - return true - } - } - - return false +task deleteRootLevelResult(type: Delete) { + delete "$rootDir/app/android_unit_test_results.xml" } -task copyTypings { - doLast { - println "Copied generated typings to application root level. Make sure to import android.d.ts in reference.d.ts" +deletePreviousResultXml.dependsOn(deleteDist) +installApk.dependsOn(deletePreviousResultXml) +startInstalledApk.dependsOn(installApk) +createDistFolder.dependsOn(startInstalledApk) +waitForUnitTestResultFile.dependsOn(createDistFolder) +copyResultToDist.dependsOn(waitForUnitTestResultFile) +deleteRootLevelResult.dependsOn(copyResultToDist) - copy { - from "$TYPINGS_PATH" - into "$USER_PROJECT_ROOT" - } - } +task runtests { + dependsOn deleteRootLevelResult } -copyTypings.onlyIf { generateTypescriptDefinitions.didWork } +tasks.whenTaskAdded { task -> -task validateAppIdMatch { - doLast { - def packageJsonFile = new File("$USER_PROJECT_ROOT/$PACKAGE_JSON") - def lineSeparator = System.getProperty("line.separator") - - if (packageJsonFile.exists() && !project.hasProperty("release")) { - String content = packageJsonFile.getText("UTF-8") - def jsonSlurper = new JsonSlurper() - def packageJsonMap = jsonSlurper.parseText(content) - - if (packageJsonMap.nativescript.id != android.defaultConfig.applicationId) { - def errorMessage = "${lineSeparator}WARNING: The Application identifier is different from the one inside $PACKAGE_JSON file.$lineSeparator" + - "NativeScript CLI might not work properly.$lineSeparator" + - "Update the application identifier in $PACKAGE_JSON and app.gradle so that they match." - logger.error(errorMessage) - } - } + if (task.getName() == "assembleDebug") { + runtests.dependsOn assembleDebug } } - -//////////////////////////////////////////////////////////////////////////////////// -////////////////////////////// OPTIONAL TASKS ////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -//////// custom clean /////////// -task cleanSbg(type: Delete) { - delete "$BUILD_TOOLS_PATH/$SBG_JS_PARCED_FILES", - "$BUILD_TOOLS_PATH/$SBG_JAVA_DEPENDENCIES", - "$BUILD_TOOLS_PATH/$SBG_INTERFACE_NAMES", - "$BUILD_TOOLS_PATH/$SBG_BINDINGS_NAME", - "$BUILD_TOOLS_PATH/$SBG_INPUT_OUTPUT_DIRS", - "$OUTPUT_JAVA_DIR/com/tns/gen" -} - -task cleanMdg(type: Delete) { - delete "$BUILD_TOOLS_PATH/$MDG_OUTPUT_DIR", - "$BUILD_TOOLS_PATH/$MDG_JAVA_DEPENDENCIES", - "$METADATA_OUT_PATH" -} - -cleanSbg.dependsOn(cleanMdg) -clean.dependsOn(cleanSbg) diff --git a/test-app/app/src/main/assets/app/shared b/test-app/app/src/main/assets/app/shared index 7f5544c5a..fe68ba3a8 160000 --- a/test-app/app/src/main/assets/app/shared +++ b/test-app/app/src/main/assets/app/shared @@ -1 +1 @@ -Subproject commit 7f5544c5a1d0cbf1de62147f541bbeddcd1c03e8 +Subproject commit fe68ba3a86daed1dc46d4aa10951f3cf03a0242a diff --git a/test-app/app/src/main/assets/app/tests/package.json b/test-app/app/src/main/assets/app/tests/package.json deleted file mode 100644 index 7a73a41bf..000000000 --- a/test-app/app/src/main/assets/app/tests/package.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/test-app/app/src/main/assets/app/tns_modules/tns-core-modules/shared b/test-app/app/src/main/assets/app/tns_modules/tns-core-modules/shared index 35e217ecc..52e6736e0 160000 --- a/test-app/app/src/main/assets/app/tns_modules/tns-core-modules/shared +++ b/test-app/app/src/main/assets/app/tns_modules/tns-core-modules/shared @@ -1 +1 @@ -Subproject commit 35e217ecc518fd2f9c6ae046ec4b421183409938 +Subproject commit 52e6736e080fc93764c1c087840779ffd7f16f49 diff --git a/test-app/app/src/main/assets/metadata/treeNodeStream.dat b/test-app/app/src/main/assets/metadata/treeNodeStream.dat new file mode 100644 index 000000000..d0356988b Binary files /dev/null and b/test-app/app/src/main/assets/metadata/treeNodeStream.dat differ diff --git a/test-app/app/src/main/assets/metadata/treeStringsStream.dat b/test-app/app/src/main/assets/metadata/treeStringsStream.dat new file mode 100644 index 000000000..bbfda3c7a Binary files /dev/null and b/test-app/app/src/main/assets/metadata/treeStringsStream.dat differ diff --git a/test-app/app/src/main/assets/metadata/treeValueStream.dat b/test-app/app/src/main/assets/metadata/treeValueStream.dat new file mode 100644 index 000000000..d1db92344 Binary files /dev/null and b/test-app/app/src/main/assets/metadata/treeValueStream.dat differ diff --git a/test-app/app/src/debug/java/com/tns/ErrorReport.java b/test-app/app/src/main/java/com/tns/ErrorReport.java similarity index 100% rename from test-app/app/src/debug/java/com/tns/ErrorReport.java rename to test-app/app/src/main/java/com/tns/ErrorReport.java diff --git a/test-app/app/src/debug/java/com/tns/ErrorReportActivity.java b/test-app/app/src/main/java/com/tns/ErrorReportActivity.java similarity index 100% rename from test-app/app/src/debug/java/com/tns/ErrorReportActivity.java rename to test-app/app/src/main/java/com/tns/ErrorReportActivity.java diff --git a/test-app/app/src/main/java/com/tns/NativeScriptActivity.java b/test-app/app/src/main/java/com/tns/NativeScriptActivity.java new file mode 100644 index 000000000..3c0026d8d --- /dev/null +++ b/test-app/app/src/main/java/com/tns/NativeScriptActivity.java @@ -0,0 +1,17 @@ +/* + * Warning: this file may be auto-generated in future. Edit with caution. + */ +package com.tns; + +@JavaScriptImplementation(javaScriptFile = "./MyActivity.js") +public class NativeScriptActivity extends android.app.Activity { + public NativeScriptActivity() { + com.tns.Runtime.initInstance(this); + } + + protected void onCreate(android.os.Bundle param_0) { + Object[] args = new Object[1]; + args[0] = param_0; + com.tns.Runtime.callJSMethod(this, "onCreate", void.class, args); + } +} \ No newline at end of file diff --git a/build-artifacts/project-template-gradle/app/src/main/java/com/tns/NativeScriptApplication.java b/test-app/app/src/main/java/com/tns/NativeScriptApplication.java similarity index 100% rename from build-artifacts/project-template-gradle/app/src/main/java/com/tns/NativeScriptApplication.java rename to test-app/app/src/main/java/com/tns/NativeScriptApplication.java diff --git a/test-app/app/src/debug/java/com/tns/NativeScriptSyncService.java b/test-app/app/src/main/java/com/tns/NativeScriptSyncService.java similarity index 100% rename from test-app/app/src/debug/java/com/tns/NativeScriptSyncService.java rename to test-app/app/src/main/java/com/tns/NativeScriptSyncService.java diff --git a/test-app/app/src/main/res/layout/error_activity.xml b/test-app/app/src/main/res/layout/error_activity.xml new file mode 100644 index 000000000..8720947cf --- /dev/null +++ b/test-app/app/src/main/res/layout/error_activity.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/test-app/app/src/main/res/layout/exception_tab.xml b/test-app/app/src/main/res/layout/exception_tab.xml new file mode 100644 index 000000000..4e9bca2bb --- /dev/null +++ b/test-app/app/src/main/res/layout/exception_tab.xml @@ -0,0 +1,52 @@ + + + +