diff --git a/.gitignore b/.gitignore index 30e159db9..1bb826df9 100644 --- a/.gitignore +++ b/.gitignore @@ -69,4 +69,11 @@ Paco-iOS/Paco.xcodeproj/project.xcworkspace/xcshareddata/* Paco-iOS/Paco.xcodeproj/xcuserdata/* Paco-iOS/ParseKit/ParseKit.xcodeproj/xcuserdata/* Paco-iOS/ParseKit/lib/OCMock/OCMock.xcodeproj/xcuserdata/* -Paco-iOS/ParseKit/include* \ No newline at end of file +Paco-iOS/ParseKit/include* + +### Android Studio ### +/Android_studio/.idea/workspace.xml +/Android_studio/.gradle/* +/Android_studio/paco/paco.iml +/Android_studio/paco/*.log +/Shared/Shared.iml diff --git a/Android_studio/.idea/compiler.xml b/Android_studio/.idea/compiler.xml new file mode 100644 index 000000000..96cc43efa --- /dev/null +++ b/Android_studio/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/copyright/profiles_settings.xml b/Android_studio/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..e7bedf337 --- /dev/null +++ b/Android_studio/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Android_studio/.idea/gradle.xml b/Android_studio/.idea/gradle.xml new file mode 100644 index 000000000..92c0a301b --- /dev/null +++ b/Android_studio/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/Android_Languages.xml b/Android_studio/.idea/libraries/Android_Languages.xml new file mode 100644 index 000000000..c1bc129e7 --- /dev/null +++ b/Android_studio/.idea/libraries/Android_Languages.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/antlr_runtime_3_2.xml b/Android_studio/.idea/libraries/antlr_runtime_3_2.xml new file mode 100644 index 000000000..5d4667060 --- /dev/null +++ b/Android_studio/.idea/libraries/antlr_runtime_3_2.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/appcompat_v7_22_2_1.xml b/Android_studio/.idea/libraries/appcompat_v7_22_2_1.xml new file mode 100644 index 000000000..015f4fdbb --- /dev/null +++ b/Android_studio/.idea/libraries/appcompat_v7_22_2_1.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/effects_android_22.xml b/Android_studio/.idea/libraries/effects_android_22.xml new file mode 100644 index 000000000..b5ce1b25d --- /dev/null +++ b/Android_studio/.idea/libraries/effects_android_22.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/gps_stripped.xml b/Android_studio/.idea/libraries/gps_stripped.xml new file mode 100644 index 000000000..757a97e11 --- /dev/null +++ b/Android_studio/.idea/libraries/gps_stripped.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/guava_16_0_1.xml b/Android_studio/.idea/libraries/guava_16_0_1.xml new file mode 100644 index 000000000..2eb7964a8 --- /dev/null +++ b/Android_studio/.idea/libraries/guava_16_0_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/jackson_all_1_9_11.xml b/Android_studio/.idea/libraries/jackson_all_1_9_11.xml new file mode 100644 index 000000000..12714245d --- /dev/null +++ b/Android_studio/.idea/libraries/jackson_all_1_9_11.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/joda_time_2_9_3.xml b/Android_studio/.idea/libraries/joda_time_2_9_3.xml new file mode 100644 index 000000000..5ede0367b --- /dev/null +++ b/Android_studio/.idea/libraries/joda_time_2_9_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/js.xml b/Android_studio/.idea/libraries/js.xml new file mode 100644 index 000000000..a673eabe9 --- /dev/null +++ b/Android_studio/.idea/libraries/js.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/js_1_7R2.xml b/Android_studio/.idea/libraries/js_1_7R2.xml new file mode 100644 index 000000000..9b19639e6 --- /dev/null +++ b/Android_studio/.idea/libraries/js_1_7R2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/json_1_5.xml b/Android_studio/.idea/libraries/json_1_5.xml new file mode 100644 index 000000000..1d9898071 --- /dev/null +++ b/Android_studio/.idea/libraries/json_1_5.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/junit_4_10.xml b/Android_studio/.idea/libraries/junit_4_10.xml new file mode 100644 index 000000000..092503f21 --- /dev/null +++ b/Android_studio/.idea/libraries/junit_4_10.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/logback_android_1_1_1_6.xml b/Android_studio/.idea/libraries/logback_android_1_1_1_6.xml new file mode 100644 index 000000000..146b6b8a7 --- /dev/null +++ b/Android_studio/.idea/libraries/logback_android_1_1_1_6.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/maps_android_22.xml b/Android_studio/.idea/libraries/maps_android_22.xml new file mode 100644 index 000000000..dc4b06955 --- /dev/null +++ b/Android_studio/.idea/libraries/maps_android_22.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/slf4j_api_1_7_21.xml b/Android_studio/.idea/libraries/slf4j_api_1_7_21.xml new file mode 100644 index 000000000..638db0d22 --- /dev/null +++ b/Android_studio/.idea/libraries/slf4j_api_1_7_21.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/support_annotations_22_2_1.xml b/Android_studio/.idea/libraries/support_annotations_22_2_1.xml new file mode 100644 index 000000000..c8608eb09 --- /dev/null +++ b/Android_studio/.idea/libraries/support_annotations_22_2_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/support_v4_22_2_1.xml b/Android_studio/.idea/libraries/support_v4_22_2_1.xml new file mode 100644 index 000000000..791efc369 --- /dev/null +++ b/Android_studio/.idea/libraries/support_v4_22_2_1.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/libraries/usb_android_22.xml b/Android_studio/.idea/libraries/usb_android_22.xml new file mode 100644 index 000000000..ede0f189c --- /dev/null +++ b/Android_studio/.idea/libraries/usb_android_22.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/misc.xml b/Android_studio/.idea/misc.xml new file mode 100644 index 000000000..5d1998103 --- /dev/null +++ b/Android_studio/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/modules.xml b/Android_studio/.idea/modules.xml new file mode 100644 index 000000000..c020eb703 --- /dev/null +++ b/Android_studio/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/.idea/runConfigurations.xml b/Android_studio/.idea/runConfigurations.xml new file mode 100644 index 000000000..7f68460d8 --- /dev/null +++ b/Android_studio/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/Android_studio/Android_studio.iml b/Android_studio/Android_studio.iml new file mode 100644 index 000000000..f53ab8c07 --- /dev/null +++ b/Android_studio/Android_studio.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Paco/android_keystore/placeholder.txt b/Android_studio/android_keystore/placeholder.txt similarity index 100% rename from Paco/android_keystore/placeholder.txt rename to Android_studio/android_keystore/placeholder.txt diff --git a/Android_studio/build.gradle b/Android_studio/build.gradle new file mode 100644 index 000000000..2e3698033 --- /dev/null +++ b/Android_studio/build.gradle @@ -0,0 +1,15 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/Paco/build.xml b/Android_studio/build.xml similarity index 100% rename from Paco/build.xml rename to Android_studio/build.xml diff --git a/Paco/build_as_library.xml b/Android_studio/build_as_library.xml similarity index 100% rename from Paco/build_as_library.xml rename to Android_studio/build_as_library.xml diff --git a/Paco/build_multidex.xml b/Android_studio/build_multidex.xml similarity index 100% rename from Paco/build_multidex.xml rename to Android_studio/build_multidex.xml diff --git a/Paco/experiment_json_form.txt b/Android_studio/experiment_json_form.txt similarity index 100% rename from Paco/experiment_json_form.txt rename to Android_studio/experiment_json_form.txt diff --git a/Android_studio/gradle/wrapper/gradle-wrapper.jar b/Android_studio/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..13372aef5 Binary files /dev/null and b/Android_studio/gradle/wrapper/gradle-wrapper.jar differ diff --git a/Android_studio/gradle/wrapper/gradle-wrapper.properties b/Android_studio/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..04e285f34 --- /dev/null +++ b/Android_studio/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 28 10:00:20 PST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/Android_studio/gradlew b/Android_studio/gradlew new file mode 100755 index 000000000..9d82f7891 --- /dev/null +++ b/Android_studio/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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 +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# 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 + +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" ] ; 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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Android_studio/gradlew.bat b/Android_studio/gradlew.bat new file mode 100644 index 000000000..aec99730b --- /dev/null +++ b/Android_studio/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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 Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_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=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +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_studio/import-summary.txt b/Android_studio/import-summary.txt new file mode 100644 index 000000000..a6b92296e --- /dev/null +++ b/Android_studio/import-summary.txt @@ -0,0 +1,128 @@ +ECLIPSE ANDROID PROJECT IMPORT SUMMARY +====================================== + +Manifest Merging: +----------------- +Your project uses libraries that provide manifests, and your Eclipse +project did not explicitly turn on manifest merging. In Android Gradle +projects, manifests are always merged (meaning that contents from your +libraries' manifests will be merged into the app manifest. If you had +manually copied contents from library manifests into your app manifest +you may need to remove these for the app to build correctly. + +Ignored Files: +-------------- +The following files were *not* copied into the new Gradle project; you +should evaluate whether these are still needed in your project and if +so manually move them: + +From Paco: +* android_keystore/ +* android_keystore/placeholder.txt +* ant.properties +* build.xml +* build_as_library.xml +* build_multidex.xml +* experiment_json_form.txt +* jarsign.sh +* proguard-project.txt +* proguard-project2.txt +* zipalign.sh +From Shared: +* .gitignore +* build.xml +* j2objcprefixes.properties +* lib/ +* lib/guava-16.0.1.jar +* lib/joda-time-2.9.3.jar +* lib/junit-4.10.jar + +Replaced Jars with Dependencies: +-------------------------------- +The importer recognized the following .jar files as third party +libraries and replaced them with Gradle dependencies instead. This has +the advantage that more explicit version information is known, and the +libraries can be updated automatically. However, it is possible that +the .jar file in your project was of an older version than the +dependency we picked, which could render the project not compileable. +You can disable the jar replacement in the import wizard and try again: + +guava-16.0.1.jar => com.google.guava:guava:16.0.1 +joda-time-2.9.3.jar => joda-time:joda-time:2.9.3 +android-support-v4.jar => com.android.support:support-v4:22.2.1 +android-support-v7-appcompat.jar => com.android.support:appcompat-v7:22.2.1 +guava-16.0.1.jar => com.google.guava:guava:16.0.1 +joda-time-2.9.3.jar => joda-time:joda-time:2.9.3 + +Potentially Missing Dependency: +------------------------------- +When we replaced the following .jar files with a Gradle dependency, we +inferred the dependency version number from the filename. This +specific version may not actually be available from the repository. +If you get a build error stating that the dependency is missing, edit +the version number to for example "+" to pick up the latest version +instead. (This may require you to update your code if the library APIs +have changed.) + +guava-16.0.1.jar => version 16.0.1 in com.google.guava:guava:16.0.1 +guava-16.0.1.jar => version 16.0.1 in com.google.guava:guava:16.0.1 +joda-time-2.9.3.jar => version 2.9.3 in joda-time:joda-time:2.9.3 +joda-time-2.9.3.jar => version 2.9.3 in joda-time:joda-time:2.9.3 + +Replaced Libraries with Dependencies: +------------------------------------- +The importer recognized the following library projects as third party +libraries and replaced them with Gradle dependencies instead. This has +the advantage that more explicit version information is known, and the +libraries can be updated automatically. However, it is possible that +the source files in your project were of an older version than the +dependency we picked, which could render the project not compileable. +You can disable the library replacement in the import wizard and try +again: + +android-support-v7-appcompat => [com.android.support:appcompat-v7:22.2.1] + +Moved Files: +------------ +Android Gradle projects use a different directory structure than ADT +Eclipse projects. Here's how the projects were restructured: + +In Shared: +* lib/jackson-all-1.9.11.jar => shared/lib/jackson-all-1.9.11.jar +* lib/js.jar => shared/lib/js.jar +* lib/json-1.5.jar => shared/lib/json-1.5.jar +* src/ => shared/src/main/java/ +* src_non_j2objc/ => shared/src/main/java/ +* test/ => shared/src/main/java/ +In Paco: +* AndroidManifest.xml => paco/src/main/AndroidManifest.xml +* assets/ => paco/src/main/assets/ +* libs/Android-Languages.jar => paco/libs/Android-Languages.jar +* libs/antlr-runtime-3.2.jar => paco/libs/antlr-runtime-3.2.jar +* libs/gps-stripped.jar => paco/libs/gps-stripped.jar +* libs/jackson-all-1.9.11.jar => paco/libs/jackson-all-1.9.11.jar +* libs/logback-android-1.1.1-6.jar => paco/libs/logback-android-1.1.1-6.jar +* libs/slf4j-api-1.7.21.jar => paco/libs/slf4j-api-1.7.21.jar +* res/ => paco/src/main/res/ +* src/ => paco/src/main/java/ +* src/com/bodymedia/mobile/jrs/JawboneDataService.aidl => paco/src/main/aidl/com/bodymedia/mobile/jrs/JawboneDataService.aidl +* src/com/google/android/apps/paco/questioncondparser/QuestionCondition.g => paco/src/main/resources/com/google/android/apps/paco/questioncondparser/QuestionCondition.g +* src/com/google/android/apps/paco/questioncondparser/QuestionCondition.tokens => paco/src/main/resources/com/google/android/apps/paco/questioncondparser/QuestionCondition.tokens +* Test/libs/junit-4.10.jar => paco/libs/junit-4.10.jar +* Test/res/ => paco/src/androidTest/res/ +* Test/src/ => paco/src/androidTest/java/ + +Next Steps: +----------- +You can now build the project. The Gradle project needs network +connectivity to download dependencies. + +Bugs: +----- +If for some reason your project does not build, and you determine that +it is due to a bug or limitation of the Eclipse to Gradle importer, +please file a bug at http://b.android.com with category +Component-Tools. + +(This import summary is for your information only, and can be deleted +after import once you are satisfied with the results.) diff --git a/Paco/jarsign.sh b/Android_studio/jarsign.sh similarity index 100% rename from Paco/jarsign.sh rename to Android_studio/jarsign.sh diff --git a/Android_studio/paco/build.gradle b/Android_studio/paco/build.gradle new file mode 100644 index 000000000..401ce0da1 --- /dev/null +++ b/Android_studio/paco/build.gradle @@ -0,0 +1,48 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 'Google Inc.:Google APIs:22' + buildToolsVersion "25.0.2" + + defaultConfig { + applicationId "com.pacoapp.paco" + minSdkVersion 14 + targetSdkVersion 22 + + testApplicationId "com.google.android.apps.paco.tests" + testInstrumentationRunner "android.test.InstrumentationTestRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + lintOptions { + disable 'MissingTranslation' + disable 'ExtraTranslation' //JodliDev: it would be better to just remove all the unused translations + // - but I wasnt confident enough to decide that on myself + } + } +} + +dependencies { + compile project(':Shared') + compile 'com.google.guava:guava:16.0.1' + compile 'joda-time:joda-time:2.9.3' + compile 'com.android.support:appcompat-v7:22.2.1' + + compile 'rhino:js:1.7R2' +//JodliDev: I dont think its needed, but just in case, Ill leave it in here for a while: +// compile 'com.google.android.gms:play-services-auth:8.3.0' + + //JodliDev: to keep the switch to Android Studio simple, I kept these - but we may want to + //download other dependencies from the repositories as well + compile files('libs/Android-Languages.jar') + compile files('libs/antlr-runtime-3.2.jar') + compile files('libs/gps-stripped.jar') + compile files('libs/jackson-all-1.9.11.jar') + compile files('libs/logback-android-1.1.1-6.jar') + compile files('libs/slf4j-api-1.7.21.jar') + androidTestCompile files('libs/junit-4.10.jar') +} diff --git a/Paco/libs/Android-Languages.jar b/Android_studio/paco/libs/Android-Languages.jar similarity index 100% rename from Paco/libs/Android-Languages.jar rename to Android_studio/paco/libs/Android-Languages.jar diff --git a/Paco/libs/antlr-runtime-3.2.jar b/Android_studio/paco/libs/antlr-runtime-3.2.jar similarity index 100% rename from Paco/libs/antlr-runtime-3.2.jar rename to Android_studio/paco/libs/antlr-runtime-3.2.jar diff --git a/Paco/libs/gps-stripped.jar b/Android_studio/paco/libs/gps-stripped.jar similarity index 100% rename from Paco/libs/gps-stripped.jar rename to Android_studio/paco/libs/gps-stripped.jar diff --git a/Paco/libs/jackson-all-1.9.11.jar b/Android_studio/paco/libs/jackson-all-1.9.11.jar similarity index 100% rename from Paco/libs/jackson-all-1.9.11.jar rename to Android_studio/paco/libs/jackson-all-1.9.11.jar diff --git a/Android_studio/paco/libs/junit-4.10.jar b/Android_studio/paco/libs/junit-4.10.jar new file mode 100644 index 000000000..bf5c0b9c6 Binary files /dev/null and b/Android_studio/paco/libs/junit-4.10.jar differ diff --git a/Paco/libs/logback-android-1.1.1-6.jar b/Android_studio/paco/libs/logback-android-1.1.1-6.jar similarity index 100% rename from Paco/libs/logback-android-1.1.1-6.jar rename to Android_studio/paco/libs/logback-android-1.1.1-6.jar diff --git a/Paco/libs/slf4j-api-1.7.21.jar b/Android_studio/paco/libs/slf4j-api-1.7.21.jar similarity index 100% rename from Paco/libs/slf4j-api-1.7.21.jar rename to Android_studio/paco/libs/slf4j-api-1.7.21.jar diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/AlarmCreator2Test.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/AlarmCreator2Test.java new file mode 100644 index 000000000..155d0bbd8 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/AlarmCreator2Test.java @@ -0,0 +1,19 @@ +package com.google.android.apps.paco.test; + +import com.pacoapp.paco.triggering.AlarmCreator2; + +import android.app.AlarmManager; +import android.app.Service; +import android.content.Context; +import android.test.InstrumentationTestCase; + +public class AlarmCreator2Test extends InstrumentationTestCase { + + public void testAlarmCreatorNoExperiments() throws Exception { + Context targetContext = getInstrumentation().getTargetContext(); + AlarmCreator2 ac = AlarmCreator2.createAlarmCreator(targetContext); + ac.updateAlarm(); + AlarmManager am = (AlarmManager)targetContext.getSystemService(Service.ALARM_SERVICE); + assertNotNull(am); + } +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/BroadcastTriggerReceiverTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/BroadcastTriggerReceiverTest.java new file mode 100644 index 000000000..b00899c6b --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/BroadcastTriggerReceiverTest.java @@ -0,0 +1,65 @@ +package com.google.android.apps.paco.test; + +import java.lang.reflect.Method; + +import org.junit.Test; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.test.AndroidTestCase; +import android.test.mock.MockContext; + +import com.pacoapp.paco.sensors.android.BroadcastTriggerReceiver; + +/** + * TODO: this test class needs to be extended to cover other parts of the + * BroadcastTriggerReceiver, notably the onReceive() call. This would however + * require some refactoring of that class, as e.g. the PowerManager is not + * mockable in its current state. + */ +public class BroadcastTriggerReceiverTest extends AndroidTestCase { + class FakeContext extends MockContext { + private Intent startedService; + + @Override + public String getPackageName() { + return "com.pacoapp.paco"; + } + @Override + public ComponentName startService(Intent intent) { + startedService = intent; + return null; + } + public Intent getStartedService() { + return startedService; + } + } + + @Test + public void testAppInstall() throws Exception { + Context context = new FakeContext(); + Intent installIntent = new Intent(Intent.ACTION_PACKAGE_ADDED); + Uri.Builder uriBuilder = new Uri.Builder(); + installIntent.setData(uriBuilder.build()); + BroadcastTriggerReceiver broadcastTriggerReceiver = new BroadcastTriggerReceiver(); + Method isPackageAdded = broadcastTriggerReceiver.getClass().getDeclaredMethod("isPackageAdded", Context.class, Intent.class); + isPackageAdded.setAccessible(true); + assertEquals(isPackageAdded.invoke(broadcastTriggerReceiver, context, installIntent), true); + } + + @Test + public void testAppUpdate() throws Exception { + Context context = new FakeContext(); + Intent updateIntent = new Intent(Intent.ACTION_PACKAGE_ADDED); + Uri.Builder uriBuilder = new Uri.Builder(); + updateIntent.setData(uriBuilder.build()); + updateIntent.putExtra(Intent.EXTRA_REPLACING, true); + BroadcastTriggerReceiver broadcastTriggerReceiver = new BroadcastTriggerReceiver(); + // Use reflection to test a private method + Method isPackageAdded = broadcastTriggerReceiver.getClass().getDeclaredMethod("isPackageAdded", Context.class, Intent.class); + isPackageAdded.setAccessible(true); + assertEquals(isPackageAdded.invoke(broadcastTriggerReceiver, context, updateIntent), false); + } +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/CryptoTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/CryptoTest.java new file mode 100644 index 000000000..4ec6aabb2 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/CryptoTest.java @@ -0,0 +1,281 @@ +package com.google.android.apps.paco.test; + +import android.test.AndroidTestCase; +import android.util.Base64; +import android.util.Log; + +import com.pacoapp.paco.model.Event; +import com.pacoapp.paco.model.Experiment; +import com.pacoapp.paco.model.ExperimentProviderUtil; +import com.pacoapp.paco.model.Output; +import com.pacoapp.paco.net.Crypto; +import com.pacoapp.paco.shared.model2.ExperimentDAO; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; +import org.junit.Before; +import org.junit.Test; + +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.KeyGenerator; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class CryptoTest extends AndroidTestCase { + private static final long ENCRYPTED_EXPERIMENT_ID = 1L; + private static final long UNENCRYPTED_EXPERIMENT_ID = 2L; + private static final long BADKEY_EXPERIMENT_ID = 3L; + private static final long NONEXISTENT_EXPERIMENT_ID = 4L; + + private Crypto crypto; + private Method base64ToPublicKey; + private Method encryptAnswer; + private KeyPair keyPair; + private Output output; + private List outputList; + private ExperimentProviderUtil experimentProviderUtil; + private IvParameterSpec ivParameterSpec; + private SecretKey secretKey; + + @Before + public void setUp() throws Exception { + experimentProviderUtil = new MockExperimentProviderUtil(getContext()); + crypto = new Crypto(experimentProviderUtil); + + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + keyPair = keyGen.genKeyPair(); + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + byte[] iv = new byte[16]; + secureRandom.nextBytes(iv); + ivParameterSpec = new IvParameterSpec(iv); + + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + keyGenerator.init(192); + secretKey = keyGenerator.generateKey(); + + output = new Output(); + output.setName("name"); + output.setAnswer("answer"); + outputList = Arrays.asList(output); + + ExperimentDAO dao = new ExperimentDAO(); + dao.setPublicKey(Base64.encodeToString(keyPair.getPublic().getEncoded(), Base64.NO_WRAP)); + Experiment experiment = new Experiment(); + experiment.setExperimentDAO(dao); + experiment.setServerId(ENCRYPTED_EXPERIMENT_ID); + experimentProviderUtil.insertFullJoinedExperiment(experiment); + + // Make necessary methods accessible + base64ToPublicKey = crypto.getClass().getDeclaredMethod("base64ToPublicKey", String.class); + base64ToPublicKey.setAccessible(true); + encryptAnswer = crypto.getClass().getDeclaredMethod("encryptAnswer", Output.class, SecretKey.class, IvParameterSpec.class); + encryptAnswer.setAccessible(true); + } + + @Test + public void testBase64Decode() throws NoSuchAlgorithmException, InvocationTargetException, IllegalAccessException, UnsupportedEncodingException { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded(); + String encoded64 = Base64.encodeToString(publicKey, Base64.NO_WRAP); + + PublicKey decoded = (PublicKey) base64ToPublicKey.invoke(crypto, encoded64); + + assertArrayEquals(publicKey, decoded.getEncoded()); + } + + @Test + public void testEncryptAnswer() throws NoSuchAlgorithmException, InvocationTargetException, IllegalAccessException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidAlgorithmParameterException { + Output encryptedOutput = null; + try { + encryptedOutput = (Output) encryptAnswer.invoke(crypto, output, secretKey, ivParameterSpec); + } catch (Exception e) { + fail("Exception when trying to encrypt: " + e); + } + + byte[] decryptedBytes = decryptSymmetric(encryptedOutput.getAnswer(), secretKey, ivParameterSpec); + String decryptedAnswer = new String(decryptedBytes, "UTF-8"); + + assertEquals(decryptedAnswer, "answer"); + } + + @Test + public void testCompleteEncryption() throws NoSuchPaddingException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException, InvalidKeySpecException { + Event event = new Event(); + event.setResponses(outputList); + event.setServerExperimentId(ENCRYPTED_EXPERIMENT_ID); + + Event encryptedEvent = crypto.encryptAnswers(event); + String encryptionKeyEncrypted = null; + String encryptionIvEncrypted = null; + String answerEncrypted = null; + for (Output response: encryptedEvent.getResponses()) { + if (response.getName().equals(Crypto.ENCRYPTION_KEY)) + encryptionKeyEncrypted = response.getAnswer(); + else if (response.getName().equals(Crypto.ENCRYPTION_IV)) + encryptionIvEncrypted = response.getAnswer(); + else if (response.getName().equals("name")) + answerEncrypted = response.getAnswer(); + } + + byte[] symmetricKeyBytes = decryptAsymmetric(encryptionKeyEncrypted, keyPair.getPrivate()); + byte[] ivBytes = decryptAsymmetric(encryptionIvEncrypted, keyPair.getPrivate()); + SecretKeySpec privKey = new SecretKeySpec(symmetricKeyBytes, "AES"); + IvParameterSpec ivspec = new IvParameterSpec(ivBytes); + + String decryptedAnswer = new String(decryptSymmetric(answerEncrypted, privKey, ivspec), "UTF-8"); + + assertEquals(decryptedAnswer, "answer"); + } + + @Test + public void testDontEncryptIfNoKey() throws NoSuchPaddingException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException, InvalidKeySpecException { + ExperimentDAO daoUnencrypted = new ExperimentDAO(); + Experiment experimentUnencrypted = new Experiment(); + experimentUnencrypted.setExperimentDAO(daoUnencrypted); + experimentUnencrypted.setServerId(UNENCRYPTED_EXPERIMENT_ID); + experimentProviderUtil.insertFullJoinedExperiment(experimentUnencrypted); + + Event event = new Event(); + event.setResponses(outputList); + event.setServerExperimentId(UNENCRYPTED_EXPERIMENT_ID); + + Event encryptedEvent = crypto.encryptAnswers(event); + + boolean nameStillThere = false; + for (Output response: encryptedEvent.getResponses()) { + if (response.getName().equals("name")) { + // Make sure the answer was not encrypted + assertEquals(response.getAnswer(), "answer"); + nameStillThere = true; + } + } + assert(nameStillThere); + } + + @Test + public void testDontEncryptIfNoCorrespondingExperiment() throws NoSuchPaddingException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException, InvalidKeySpecException { + Event event = new Event(); + event.setResponses(outputList); + // Experiment ID does not exist in DB, will return null. + event.setServerExperimentId(NONEXISTENT_EXPERIMENT_ID); + + Event encryptedEvent = crypto.encryptAnswers(event); + + boolean nameStillThere = false; + for (Output response : encryptedEvent.getResponses()) { + if (response.getName().equals("name")) { + // Make sure the answer was not encrypted + assertEquals(response.getAnswer(), "answer"); + nameStillThere = true; + } + } + assert (nameStillThere); + } + + @Test + public void testDontFallbackIfException() throws NoSuchPaddingException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException, InvalidKeySpecException { + ExperimentDAO daoBadKey = new ExperimentDAO(); + daoBadKey.setPublicKey("badkey"); + Experiment experimentBadKey = new Experiment(); + experimentBadKey.setExperimentDAO(daoBadKey); + experimentBadKey.setServerId(BADKEY_EXPERIMENT_ID); + experimentProviderUtil.insertFullJoinedExperiment(experimentBadKey); + + Event event = new Event(); + event.setResponses(outputList); + event.setServerExperimentId(BADKEY_EXPERIMENT_ID); + + Event eventEncrypted = new Event(); + eventEncrypted.setResponses(outputList); + eventEncrypted.setServerExperimentId(ENCRYPTED_EXPERIMENT_ID); + + List events = Arrays.asList(event, eventEncrypted); + List encryptedEvents = crypto.encryptAnswers(events); + + // Make sure the experiment with the bad key got ignored + assertEquals(encryptedEvents.size(), 1); + assertEquals(encryptedEvents.get(0).getExperimentServerId(), ENCRYPTED_EXPERIMENT_ID); + } + + /** + * This test makes sure that encrypting the same string twice would yield a different result for + * different Events. This is important, as we don't want information to leak about two answers + * that were the same for different events. + */ + @Test + public void testNonDeterminism() { + try { + Event event1 = new Event(); + event1.setResponses(outputList); + event1.setServerExperimentId(ENCRYPTED_EXPERIMENT_ID); + + Event event2 = new Event(); + Output output2 = new Output(); + output2.setName(output.getName()); + output2.setAnswer(output.getAnswer()); + event2.setResponses(Arrays.asList(output2)); + event2.setServerExperimentId(ENCRYPTED_EXPERIMENT_ID); + + Event encryptedEvent1 = crypto.encryptAnswers(event1); + Event encryptedEvent2 = crypto.encryptAnswers(event2); + + String answer1 = null; + for (Output output : encryptedEvent1.getResponses()) { + if (output.getName().equals("name")) + answer1 = output.getAnswer(); + } + String answer2 = null; + for (Output output : encryptedEvent2.getResponses()) { + if (output.getName().equals("name")) + answer2 = output.getAnswer(); + } + + assertThat(answer1, not(equalTo(answer2))); + } catch (Exception e) { + fail("Exception when trying to encrypt: " + e); + } + } + + /** + * Decrypt a byte array using a given private RSA key. + * @param encrypted The byte array that was encrypted using the corresponding RSA public key + * @param privateKey A private RSA key. + * @return The unencrypted byte array. + */ + private byte[] decryptAsymmetric(String encrypted, PrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] encryptedBytes = Base64.decode(encrypted, Base64.NO_WRAP); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return decryptedBytes; + } + + private byte[] decryptSymmetric(String encrypted, SecretKey secretKey, IvParameterSpec ivSpec) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); + byte[] encryptedBytes = Base64.decode(encrypted, Base64.NO_WRAP); + return cipher.doFinal(encryptedBytes); + } +} \ No newline at end of file diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentScheduleActivityTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentScheduleActivityTest.java new file mode 100644 index 000000000..135b8fdf9 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentScheduleActivityTest.java @@ -0,0 +1,292 @@ +package com.google.android.apps.paco.test; + +import java.io.IOException; + +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; +import org.joda.time.DateTime; + +import android.content.Context; +import android.content.Intent; +import android.test.ActivityUnitTestCase; + +import com.google.android.apps.paco.ExperimentScheduleActivity; +import com.google.android.apps.paco.SignalTime; +import com.pacoapp.paco.model.Experiment; +import com.pacoapp.paco.model.ExperimentProviderUtil; +import com.pacoapp.paco.shared.model2.Schedule; +import com.pacoapp.paco.shared.util.TimeUtil; + +/* + * TODO: Make this into instrumentation testing, changing the experiment schedule + * by using button clicks. + * To do this, change the class to ActivityInstrumentationTestCase2. + * Change the ExperimentScheduleActivity.setActivityProperties method to display + * the appropriate layout, and be sure to call activity.setActivityProperties(...) + * within a call to activity.runOnUiThread(...). + * + * TODO rewrite this class for the new schedule editing. + */ +public class ExperimentScheduleActivityTest extends ActivityUnitTestCase { + + private static final Long START_TIME = Long.valueOf(500000); + private static final Long END_TIME = Long.valueOf(1000000); + private static final Integer REPEAT_RATE = 4; + private static final SignalTime ADAPTER_TIME = new SignalTime(75000); + private static final Integer DAY_OF_MONTH = 4; + private static final Integer DAY_OF_WEEK = 2; + + private ExperimentScheduleActivity activity; + private MockExperimentProviderUtil experimentProviderUtil; + private Context context; + private Intent intent; + private long experimentId = 0; + private Schedule schedule; + + public ExperimentScheduleActivityTest() { + super(ExperimentScheduleActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getContext(); + experimentProviderUtil = new MockExperimentProviderUtil(context); + intent = new Intent(); + startActivity(intent, null, null); + activity = getActivity(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + activity.finish(); + } + + public void testEsmScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.FIXED_ESM); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + setActivityExperimentEsmSchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentEsmSchedule(savedExperiment); + } + + public void testWeekdayScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.FIXED_WEEKDAY); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + int timesLength = setActivityExperimentWeekdaySchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentWeekdaySchedule(timesLength, savedExperiment); + } + + public void testDailyScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.ONGOING_DAILY); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + int timesLength = setActivityExperimentDailySchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentDailySchedule(timesLength, savedExperiment); + } + + public void testWeeklyScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.ONGOING_WEEKLY); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + int timesLength = setActivityExperimentWeeklySchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentWeeklySchedule(timesLength, savedExperiment); + } + + private Schedule getSchedule(Experiment experiment) { + return schedule; + } + + public void testWeeklySchedulingSetsOnlyCorrectDays() { +// Experiment experiment = getTestExperiment(ExperimentTestConstants.ONGOING_WEEKLY); +// joinExperiment(experiment); +// configureActivityForTesting(experiment); +// +// int timesLength = setActivityExperimentRepeatRateAndTimes(); +// getSchedule(activity.getExperiment()).setWeekDaysScheduled(0); +// getSchedule(activity.getExperiment()).setWeekDayToSchedule(SignalSchedule.SUNDAY); +// saveExperimentSchedule(); +// +// Experiment savedExperiment = getSavedExperiment(experiment); +// checkSavedExperimentRepeatRateAndTimes(timesLength, savedExperiment); +// assertTrue(getSchedule(activity.getExperiment()).getWeekDaysScheduled() | SignalSchedule.SUNDAY); +// for (int i = 1; i < 7; ++i) { +// assertFalse(getSchedule(activity.getExperiment()).isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[i])); +// } + } + + public void testMonthlyDayOfMonthScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.ONGOING_MONTHLY); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + setActivityExperimentMonthlyDayOfMonthSchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentMonthlyDayOfMonthSchedule(savedExperiment); + } + + public void testMonthlyNthOfMonthScheduling() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.ONGOING_MONTHLY); + joinExperiment(experiment); + configureActivityForTesting(experiment); + + setActivityExperimentMonthlyNthOfMonthSchedule(); + saveExperimentSchedule(); + + Experiment savedExperiment = getSavedExperiment(experiment); + checkSavedExperimentMonthlyNthOfMonthSchedule(savedExperiment); + } + + private Experiment getTestExperiment(String experimentTitle) { + Experiment experiment = getExperimentFromJson(experimentTitle); + experiment.setId(experimentId++); + return experiment; + } + + private Experiment getExperimentFromJson(String contentAsString) { + try { + Experiment experiment = ExperimentProviderUtil.getSingleExperimentFromJson(contentAsString); + return experiment; + } catch (JsonParseException e) { + assertTrue(false); + return null; + } catch (JsonMappingException e) { + assertTrue(false); + return null; + } catch (IOException e) { + assertTrue(false); + return null; + } + } + + private Experiment getSavedExperiment(Experiment experiment) { + Experiment savedExperiment = experimentProviderUtil.getExperiment(experiment.getId()); + assertNotNull(savedExperiment); + return savedExperiment; + } + + private void joinExperiment(Experiment experiment) { + String now = TimeUtil.formatDateWithZone(new DateTime()); + experiment.setJoinDate(now); + experimentProviderUtil.insertFullJoinedExperiment(experiment); + } + + private void configureActivityForTesting(Experiment experiment) { + activity.setActivityProperties(experiment, experimentProviderUtil); + } + + private void saveExperimentSchedule() { +// activity.scheduleExperiment(); + } + + private void checkSavedExperimentEsmSchedule(Experiment savedExperiment) { + assertEquals(getSchedule(savedExperiment).getEsmStartHour(), START_TIME); + assertEquals(getSchedule(savedExperiment).getEsmEndHour(), END_TIME); + } + + private void setActivityExperimentEsmSchedule() { + getSchedule(activity.getExperiment()).setEsmStartHour(START_TIME); + getSchedule(activity.getExperiment()).setEsmEndHour(END_TIME); + } + + private void checkSavedExperimentWeekdaySchedule(int timesLength, Experiment savedExperiment) { + checkSavedExperimentRepeatRateAndTimes(timesLength, savedExperiment); + } + + private int setActivityExperimentWeekdaySchedule() { + return setActivityExperimentRepeatRateAndTimes(); + } + + private void checkSavedExperimentDailySchedule(int timesLength, Experiment savedExperiment) { + checkSavedExperimentRepeatRateAndTimes(timesLength, savedExperiment); + } + + private int setActivityExperimentDailySchedule() { + return setActivityExperimentRepeatRateAndTimes(); + } + + private void checkSavedExperimentWeeklySchedule(int timesLength, Experiment savedExperiment) { +// checkSavedExperimentRepeatRateAndTimes(timesLength, savedExperiment); +// assertTrue(getSchedule(activity.getExperiment()).isWeekDayScheduled(SignalSchedule.WEDNESDAY)); +// assertTrue(getSchedule(activity.getExperiment()).isWeekDayScheduled(SignalSchedule.FRIDAY)); + } + + private int setActivityExperimentWeeklySchedule() { + return 0; +// int timesLength = setActivityExperimentRepeatRateAndTimes(); +// getSchedule(activity.getExperiment()).addWeekDayToSchedule(SignalSchedule.WEDNESDAY); +// getSchedule(activity.getExperiment()).addWeekDayToSchedule(SignalSchedule.FRIDAY); +// return timesLength; + } + + private void checkSavedExperimentMonthlyDayOfMonthSchedule(Experiment savedExperiment) { + assertEquals(getSchedule(savedExperiment).getRepeatRate(), REPEAT_RATE); + assertEquals(getSchedule(savedExperiment).getDayOfMonth(), DAY_OF_MONTH); + } + + private void setActivityExperimentMonthlyDayOfMonthSchedule() { + getSchedule(activity.getExperiment()).setRepeatRate(REPEAT_RATE); + getSchedule(activity.getExperiment()).setDayOfMonth(DAY_OF_MONTH); + } + + private void checkSavedExperimentMonthlyNthOfMonthSchedule(Experiment savedExperiment) { + assertEquals(getSchedule(savedExperiment).getRepeatRate(), REPEAT_RATE); + assertEquals(getSchedule(savedExperiment).getNthOfMonth(), DAY_OF_MONTH); + assertEquals(getSchedule(savedExperiment).getWeekDaysScheduled(), DAY_OF_WEEK); + } + + private void setActivityExperimentMonthlyNthOfMonthSchedule() { + getSchedule(activity.getExperiment()).setRepeatRate(REPEAT_RATE); + getSchedule(activity.getExperiment()).setNthOfMonth(DAY_OF_MONTH); + getSchedule(activity.getExperiment()).setWeekDaysScheduled(DAY_OF_WEEK); + } + + private void checkSavedExperimentRepeatRateAndTimes(int timesLength, Experiment savedExperiment) { + assertEquals(getSchedule(savedExperiment).getRepeatRate(), REPEAT_RATE); + checkExperimentTimesList(timesLength, savedExperiment); + } + + private int setActivityExperimentRepeatRateAndTimes() { + getSchedule(activity.getExperiment()).setRepeatRate(REPEAT_RATE); + int timesLength = setExperimentTimes(); + return timesLength; + } + + private int setExperimentTimes() { + return 0; +// List times = getSchedule(activity.getExperiment()).getSignalTimes(); +// int timesLength = times.size(); +// for (int i = 0; i < timesLength; ++i) { +// times.set(i, ADAPTER_TIME); +// } +// return timesLength; + } + + private void checkExperimentTimesList(int timesLength, Experiment savedExperiment) { +// List newTimes = getSchedule(savedExperiment).getSignalTimes(); +// assertEquals(newTimes.size(), timesLength); +// for (int j = 0; j < timesLength; ++j) { +// assertEquals(newTimes.get(j), ADAPTER_TIME); +// } + } +} \ No newline at end of file diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentTestConstants.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentTestConstants.java new file mode 100644 index 000000000..b9661caf1 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/ExperimentTestConstants.java @@ -0,0 +1,40 @@ +package com.google.android.apps.paco.test; + +import java.util.List; + +import com.google.common.base.Joiner; + +public class ExperimentTestConstants { + + public static final String FIXED_ESM_TITLE = "AndroidTest - Fixed, ESM"; + public static final String FIXED_ESM_TITLE_MODIFIED = "Booyah!"; + + public static final String FIXED_ESM = "{\"title\":\"" + FIXED_ESM_TITLE + + "\",\"description\":\"Description\",\"informedConsentForm\":\"Informed consent text\",\"creator\":\"donti@google.com\",\"fixedDuration\":true,\"startDate\":\"2013/07/15\",\"endDate\":\"2013/07/25\",\"id\":4051,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4052,\"scheduleType\":4,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4052,\"scheduleType\":4,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/06/28\",\"inputs\":[{\"id\":4054,\"questionType\":\"question\",\"text\":\"question1\",\"mandatory\":false,\"responseType\":\"open text\",\"likertSteps\":5,\"name\":\"question1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false},{\"id\":4055,\"questionType\":\"question\",\"text\":\"\",\"mandatory\":false,\"responseType\":\"location\",\"likertSteps\":5,\"name\":\"question2\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":true}],\"feedback\":[{\"id\":4373,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":3}"; + public static final String FIXED_ESM_RETITLED = "{\"title\":\"" + FIXED_ESM_TITLE_MODIFIED + + "\",\"description\":\"Description\",\"informedConsentForm\":\"Informed consent text\",\"creator\":\"donti@google.com\",\"fixedDuration\":true,\"startDate\":\"2013/07/15\",\"endDate\":\"2013/07/25\",\"id\":4051,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4052,\"scheduleType\":4,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4052,\"scheduleType\":4,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/06/28\",\"inputs\":[{\"id\":4054,\"questionType\":\"question\",\"text\":\"question1\",\"mandatory\":false,\"responseType\":\"open text\",\"likertSteps\":5,\"name\":\"question1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false},{\"id\":4055,\"questionType\":\"question\",\"text\":\"\",\"mandatory\":false,\"responseType\":\"location\",\"likertSteps\":5,\"name\":\"question2\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":true}],\"feedback\":[{\"id\":4373,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":3}"; + public static final Long FIXED_ESM_SERVERID = Long.valueOf(4051); + + public static final String ONGOING_DAILY = "{\"title\":\"AndroidTest - Ongoing, Daily\",\"description\":\"Description\",\"informedConsentForm\":\"Informed Consent Text\",\"creator\":\"donti@google.com\",\"fixedDuration\":false,\"id\":4040,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4041,\"scheduleType\":0,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000,61200000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4041,\"scheduleType\":0,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[57600000,61200000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/06/28\",\"inputs\":[{\"id\":4043,\"questionType\":\"question\",\"text\":\"question1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"question1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false},{\"id\":4044,\"questionType\":\"question\",\"text\":\"question2\",\"mandatory\":false,\"responseType\":\"list\",\"likertSteps\":5,\"name\":\"question2\",\"conditional\":false,\"listChoices\":[\"choice1\",\"choice2\",\"choice3\"],\"invisibleInput\":false}],\"feedback\":[{\"id\":4138,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":2}"; + public static final Long ONGOING_DAILY_SERVERID = Long.valueOf(4040); + + public static final String ONGOING_TRIGGERED = "{\"title\":\"AndroidTest - Ongoing, Triggered\",\"description\":\"Description\",\"informedConsentForm\":\"Informed Consent Text\",\"creator\":\"donti@google.com\",\"fixedDuration\":false,\"id\":4046,\"signalingMechanisms\":[{\"type\":\"trigger\",\"eventCode\":0,\"delay\":5000,\"id\":4047}],\"schedule\":{\"type\":\"signalSchedule\",\"scheduleType\":5,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/06/28\",\"inputs\":[{\"id\":4049,\"questionType\":\"question\",\"text\":\"question1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"question1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false}],\"feedback\":[{\"id\":4142,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":2}"; + public static final Long ONGOING_TRIGGERED_SERVERID = Long.valueOf(4046); + + public static final String ONGOING_WEEKLY = "{\"title\":\"AndroidTest - Ongoing, Weekly\",\"description\":\"\",\"informedConsentForm\":\"\",\"creator\":\"donti@google.com\",\"fixedDuration\":false,\"id\":4064,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4065,\"scheduleType\":2,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":2,\"weekDaysScheduled\":4,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4065,\"scheduleType\":2,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":2,\"weekDaysScheduled\":4,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/07/01\",\"inputs\":[{\"id\":4067,\"questionType\":\"question\",\"text\":\"q1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"q1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false}],\"feedback\":[{\"id\":4066,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":1}"; + public static final Long ONGOING_WEEKLY_SERVERID = Long.valueOf(4064); + + public static final String ONGOING_MONTHLY = "{\"title\":\"AndroidTest - Ongoing, Monthly\",\"description\":\"\",\"informedConsentForm\":\"\",\"creator\":\"donti@google.com\",\"fixedDuration\":false,\"id\":4069,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4070,\"scheduleType\":3,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4070,\"scheduleType\":3,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/07/01\",\"inputs\":[{\"id\":4072,\"questionType\":\"question\",\"text\":\"q1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"q1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false}],\"feedback\":[{\"id\":4140,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":2}"; + public static final Long ONGOING_MONTHLY_SERVERID = Long.valueOf(4069); + + public static final String FIXED_WEEKDAY = "{\"title\":\"AndroidTest - Fixed, Weekday\",\"description\":\"\",\"informedConsentForm\":\"\",\"creator\":\"donti@google.com\",\"fixedDuration\":true,\"startDate\":\"2013/07/01\",\"endDate\":\"2013/07/31\",\"id\":4074,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4075,\"scheduleType\":1,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4075,\"scheduleType\":1,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/07/01\",\"inputs\":[{\"id\":4077,\"questionType\":\"question\",\"text\":\"q1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"q1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false}],\"feedback\":[{\"id\":4076,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":1}"; + public static final Long FIXED_WEEKDAY_SERVERID = Long.valueOf(4074); + + public static final String FIXED_SELFREPORT = "{\"title\":\"AndroidTest - Fixed, Self-Report\",\"description\":\"\",\"informedConsentForm\":\"\",\"creator\":\"donti@google.com\",\"fixedDuration\":true,\"startDate\":\"2013/07/01\",\"endDate\":\"2013/07/31\",\"id\":4079,\"signalingMechanisms\":[{\"type\":\"signalSchedule\",\"id\":4080,\"scheduleType\":5,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false}],\"schedule\":{\"type\":\"signalSchedule\",\"id\":4080,\"scheduleType\":5,\"esmFrequency\":3,\"esmPeriodInDays\":0,\"esmStartHour\":32400000,\"esmEndHour\":61200000,\"times\":[54000000],\"repeatRate\":1,\"weekDaysScheduled\":0,\"nthOfMonth\":1,\"byDayOfMonth\":true,\"dayOfMonth\":1,\"esmWeekends\":false,\"byDayOfWeek\":false},\"questionsChange\":false,\"modifyDate\":\"2013/07/01\",\"inputs\":[{\"id\":4082,\"questionType\":\"question\",\"text\":\"q1\",\"mandatory\":false,\"responseType\":\"likert\",\"likertSteps\":5,\"name\":\"q1\",\"conditional\":false,\"listChoices\":[],\"invisibleInput\":false}],\"feedback\":[{\"id\":4081,\"feedbackType\":\"display\",\"text\":\"Thanks for Participating!\"}],\"publishedUsers\":[],\"deleted\":false,\"webRecommended\":false,\"version\":1}"; + public static final Long FIXED_SELFREPORT_SERVERID = Long.valueOf(4079); + + public static String joinExperimentJsons(List experimentJsons) { + String experimentList = Joiner.on(",").join(experimentJsons); + return "[" + experimentList + "]"; + } +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/FindExperimentsActivityTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/FindExperimentsActivityTest.java new file mode 100644 index 000000000..3169489c6 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/FindExperimentsActivityTest.java @@ -0,0 +1,95 @@ +package com.google.android.apps.paco.test; + +import java.io.IOException; + +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; + +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; +import android.widget.ListView; +import android.widget.TextView; + +import com.pacoapp.paco.R; +import com.pacoapp.paco.model.ExperimentProviderUtil; +import com.pacoapp.paco.ui.FindExperimentsActivity; + +public class FindExperimentsActivityTest extends ActivityInstrumentationTestCase2 { + + private ExperimentProviderUtil experimentProviderUtil; + + private FindExperimentsActivity activity; + + public FindExperimentsActivityTest(String name) { + super(FindExperimentsActivity.class); + setName(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + setActivityInitialTouchMode(false); + activity = getActivity(); + experimentProviderUtil = new ExperimentProviderUtil(activity); + } + +//TODO: this test does not work, as the adapter does not reload. + public void testExperimentRefreshAdapterReload() throws JsonParseException, JsonMappingException, IOException { + +// List oldExperiments = experimentProviderUtil.loadExperimentsFromDisk(); +// Experiment insertingExperiment = ExperimentProviderUtil.getSingleExperimentFromJson(ExperimentTestConstants.FIXED_ESM); +// oldExperiments.add(insertingExperiment); +// List experimentJsons = experimentProviderUtil.getJsonList(oldExperiments); +// experimentProviderUtil.saveExperimentsToDisk(ExperimentTestConstants.joinExperimentJsons(experimentJsons)); +// +// final ListView experimentListView = (ListView) activity.findViewById(R.id.find_experiments_list); +// final int numExperiments = experimentListView.getAdapter().getCount(); +// +// // TODO: somehow reload the view and the adapter. +// activity.runOnUiThread(new Runnable() { +// public void run() { +// experimentListView.requestFocus(); +// activity.reloadAdapter(); +// BaseAdapter adapter = (BaseAdapter) experimentListView.getAdapter(); +// adapter.notifyDataSetChanged(); +// } +// }); +// +// checkExperimentIsInList(experimentListView, ExperimentTestConstants.FIXED_ESM_TITLE); +// +// List modifiedExperimentJsons = Arrays.asList(ExperimentTestConstants.FIXED_ESM_RETITLED); +// final String contentAsString = ExperimentTestConstants.joinExperimentJsons(modifiedExperimentJsons); +// +// // TODO: somehow reload the view and the adapter +// activity.runOnUiThread(new Runnable() { +// public void run() { +// experimentListView.requestFocus(); +// activity.updateDownloadedExperiments(contentAsString); +// BaseAdapter adapter = (BaseAdapter) experimentListView.getAdapter(); +// adapter.notifyDataSetChanged(); +// } +// }); +// +// assertEquals(numExperiments, experimentListView.getCount()); +// +// checkExperimentIsInList(experimentListView, ExperimentTestConstants.FIXED_ESM_TITLE_MODIFIED); +// +// List oldExperimentJsons = experimentProviderUtil.getJsonList(oldExperiments); +// experimentProviderUtil.saveExperimentsToDisk(ExperimentTestConstants.joinExperimentJsons(oldExperimentJsons)); + } + + private void checkExperimentIsInList(final ListView experimentListView, String experimentTitle) { + final int numExperiments = experimentListView.getAdapter().getCount(); + boolean experimentTitleExists = false; + for (int i = 0; i < numExperiments; ++i) { + View experimentPanel = experimentListView.getAdapter().getView(i, null, null); + TextView experimentTitleView = (TextView) experimentPanel.findViewById(R.id.experimentListRowTitle); + if (experimentTitleView.getText().toString().equals(experimentTitle)) { + experimentTitleExists = true; + break; + } + } + assertTrue(experimentTitleExists); + } + +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/InformedConsentActivityTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/InformedConsentActivityTest.java new file mode 100644 index 000000000..2311637e0 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/InformedConsentActivityTest.java @@ -0,0 +1,90 @@ +package com.google.android.apps.paco.test; + +import java.io.IOException; + +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; + +import android.content.Context; +import android.content.Intent; +import android.test.ActivityUnitTestCase; + +import com.pacoapp.paco.model.Experiment; +import com.pacoapp.paco.model.ExperimentProviderUtil; +import com.pacoapp.paco.ui.InformedConsentActivity; + +public class InformedConsentActivityTest extends ActivityUnitTestCase { + + private InformedConsentActivity activity; + private MockExperimentProviderUtil experimentProviderUtil; + private Context context; + private Intent intent; + private long experimentId = 0; + + public InformedConsentActivityTest() { + super(InformedConsentActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + context = getInstrumentation().getContext(); + experimentProviderUtil = new MockExperimentProviderUtil(context); + intent = new Intent(); + startActivity(intent, null, null); + activity = getActivity(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + activity.finish(); + } + + public void testExperimentJoining() { + Experiment experiment = getTestExperiment(ExperimentTestConstants.FIXED_ESM); + configureActivityForTesting(experiment); + + simulateDownloadingAndSavingExperiment(experiment); + + Experiment savedExperiment = experimentProviderUtil.getExperiment(experiment.getId()); + checkExperimentProperlyJoined(savedExperiment); + + } + + private Experiment getTestExperiment(String experimentTitle) { + Experiment experiment = getExperimentFromJson(experimentTitle); + experiment.setId(experimentId++); + return experiment; + } + + private Experiment getExperimentFromJson(String contentAsString) { + try { + Experiment experiment = ExperimentProviderUtil.getSingleExperimentFromJson(contentAsString); + return experiment; + } catch (JsonParseException e) { + assertTrue(false); + return null; + } catch (JsonMappingException e) { + assertTrue(false); + return null; + } catch (IOException e) { + assertTrue(false); + return null; + } + } + + private void configureActivityForTesting(Experiment experiment) { + activity.setActivityProperties(experiment, experimentProviderUtil); + } + + private void simulateDownloadingAndSavingExperiment(Experiment experiment) { + activity.saveDownloadedExperimentBeforeScheduling(experiment); + } + + private void checkExperimentProperlyJoined(Experiment savedExperiment) { + assertNotNull(savedExperiment); + assertNotNull(savedExperiment.getJoinDate()); + } + +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/MockExperimentProviderUtil.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/MockExperimentProviderUtil.java new file mode 100644 index 000000000..b35b49d53 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/MockExperimentProviderUtil.java @@ -0,0 +1,79 @@ +package com.google.android.apps.paco.test; + +import java.util.List; + +import android.content.Context; +import android.net.Uri; + +import com.google.common.collect.Lists; +import com.pacoapp.paco.model.Experiment; +import com.pacoapp.paco.model.ExperimentColumns; +import com.pacoapp.paco.model.ExperimentProviderUtil; + +class MockExperimentProviderUtil extends ExperimentProviderUtil { + + private List experimentList; + + MockExperimentProviderUtil(Context context) { + super(context); + experimentList = Lists.newArrayList(); + } + + @Override + public Uri insertFullJoinedExperiment(Experiment experiment) { + experimentList.add(experiment); + // The uri of a joined experiment has this as its first segment. + return Uri.parse(ExperimentColumns.JOINED_EXPERIMENTS_CONTENT_URI.getPathSegments().get(0)); + } + + @Override + public int deleteNotificationsForExperiment(Long experimentId) { + return 0; + } + + @Override + public Experiment getExperimentByServerId(long id) { + for (Experiment experiment : experimentList) { + if (experiment.getServerId() != null && experiment.getServerId().equals(id)) + return experiment; + } + return null; + } + + @Override + public void updateJoinedExperiment(Experiment experiment) { + Experiment experimentToDelete = null; + for (Experiment e : experimentList) { + if (e.getId().equals(experiment.getId())) { + experimentToDelete = e; + } + } + if (experimentToDelete != null) { + experimentList.remove(experimentToDelete); + experimentList.add(experiment); + } + } + + public Experiment getExperiment(long experimentId) { + for (Experiment e : experimentList) { + if (e.getId().equals(experimentId)) { + return e; + } + } + return null; + } + + @Override + public void deleteExperiment(long experimentId) { + Experiment experimentToDelete = null; + for (Experiment e : experimentList) { + if (e.getId().equals(experimentId)) { + experimentToDelete = e; + } + } + if (experimentToDelete != null) { + experimentList.remove(experimentToDelete); + } + } + +} \ No newline at end of file diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RunningExperimentsActivityTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RunningExperimentsActivityTest.java new file mode 100644 index 000000000..865bd015f --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RunningExperimentsActivityTest.java @@ -0,0 +1,88 @@ +package com.google.android.apps.paco.test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; + +import com.google.android.apps.paco.RunningExperimentsActivity; +import com.pacoapp.paco.R; +import com.pacoapp.paco.model.ExperimentProviderUtil; + +import android.os.SystemClock; +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; +import android.widget.BaseAdapter; +import android.widget.CursorAdapter; +import android.widget.ListView; +import android.widget.TextView; + +public class RunningExperimentsActivityTest extends ActivityInstrumentationTestCase2 { + + private ExperimentProviderUtil experimentProviderUtil; + + private RunningExperimentsActivity activity; + + public RunningExperimentsActivityTest(String name) { + super(RunningExperimentsActivity.class); + setName(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + setActivityInitialTouchMode(false); + activity = getActivity(); + experimentProviderUtil = new ExperimentProviderUtil(activity); + } + + // TODO: this test does not work, as the adapter does not reload. + public void testExperimentRefreshAdapterReload() throws JsonParseException, JsonMappingException, IOException { + +// experimentProviderUtil.insertFullJoinedExperiment(ExperimentTestConstants.FIXED_ESM); +// +// final ListView experimentListView = (ListView) activity.findViewById(R.id.find_experiments_list); +// final int numExperiments = experimentListView.getAdapter().getCount(); +// +// checkExperimentIsInList(experimentListView, ExperimentTestConstants.FIXED_ESM_TITLE); +// +// List modifiedExperimentJsons = Arrays.asList(ExperimentTestConstants.FIXED_ESM_RETITLED); +// String contentAsString = ExperimentTestConstants.joinExperimentJsons(modifiedExperimentJsons); +// activity.saveDownloadedExperiments(contentAsString); +// +// // TODO: somehow reload the view and the adapter. +// activity.runOnUiThread(new Runnable() { +// public void run() { +// CursorAdapter adapter = (CursorAdapter) experimentListView.getAdapter(); +// adapter.notifyDataSetChanged(); +// } +// }); +// +// assertEquals(numExperiments, experimentListView.getAdapter().getCount()); +// +// Long fixedEsmId = checkExperimentIsInList(experimentListView, +// ExperimentTestConstants.FIXED_ESM_TITLE_MODIFIED); +// activity.deleteExperiment(fixedEsmId); + } + + + private Long checkExperimentIsInList(final ListView experimentListView, String experimentTitle) { + final int numExperiments = experimentListView.getAdapter().getCount(); + boolean experimentTitleExists = false; + Long fixedEsmId = Long.valueOf(-1); + for (int i = 0; i < numExperiments; ++i) { + View experimentPanel = experimentListView.getAdapter().getView(i, null, null); + TextView experimentTitleView = (TextView) experimentPanel.findViewById(R.id.experimentListRowTitle); + if (experimentTitleView.getText().toString().equals(experimentTitle)) { + experimentTitleExists = true; + fixedEsmId = Long.parseLong((String) experimentTitleView.getTag()); + break; + } + } + assertTrue(experimentTitleExists); + return fixedEsmId; + } + +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RuntimePermissionMonitorServiceTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RuntimePermissionMonitorServiceTest.java new file mode 100644 index 000000000..a712ccfe2 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/RuntimePermissionMonitorServiceTest.java @@ -0,0 +1,91 @@ +package com.google.android.apps.paco.test; + + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import com.pacoapp.paco.sensors.android.RuntimePermissionsAccessibilityEventHandler; +import com.pacoapp.paco.sensors.android.procmon.EncounteredPermissionRequest; + +import android.annotation.TargetApi; +import android.os.Build; +import android.test.AndroidTestCase; + +public class RuntimePermissionMonitorServiceTest extends AndroidTestCase { + RuntimePermissionsAccessibilityEventHandler runtimePermissionMonitorService; + Method extractInformationFromEventText; + Method setCurrentlyHandledAppName; + Field previouslyEncounteredPermissionRequests; + + @Before + public void setUp() throws Exception { + runtimePermissionMonitorService = new RuntimePermissionsAccessibilityEventHandler(null); + // Initialize variables + // Make necessary methods and fields accessible + extractInformationFromEventText = runtimePermissionMonitorService.getClass().getDeclaredMethod("extractInformationFromEventText", List.class); + extractInformationFromEventText.setAccessible(true); + setCurrentlyHandledAppName = runtimePermissionMonitorService.getClass().getDeclaredMethod("setCurrentlyHandledAppName", CharSequence.class); + setCurrentlyHandledAppName.setAccessible(true); + previouslyEncounteredPermissionRequests = runtimePermissionMonitorService.getClass().getDeclaredField("previouslyEncounteredPermissionRequests"); + previouslyEncounteredPermissionRequests.setAccessible(true); + } + + @Test + public void testEventTextExtraction() throws Exception { + List input = new ArrayList(); + input.add("Allow Bramapp to access this device's location?"); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input); + EncounteredPermissionRequest lastRequest = runtimePermissionMonitorService.getLastEncounteredPermissionRequest(); + assertEquals(lastRequest.getAppName(), "Bramapp"); + assertEquals(lastRequest.getPermissionString(), "Location"); + } + + @Test + public void testEventTextExtraction2() throws Exception { + List input = new ArrayList(); + input.add("Allow Bramapp to take pictures and record video?"); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input); + EncounteredPermissionRequest lastRequest = runtimePermissionMonitorService.getLastEncounteredPermissionRequest(); + assertEquals(lastRequest.getAppName(), "Bramapp"); + assertEquals(lastRequest.getPermissionString(), "Camera"); + } + + @TargetApi(Build.VERSION_CODES.GINGERBREAD) + @Test + public void testDuplicateAdd() throws Exception { + List input1 = new ArrayList(); + input1.add("Allow Bramapp to access this device's location?"); + List input2 = new ArrayList(); + input2.add("Allow Bramapp to take pictures and record video?"); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input1); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input2); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input2); + + Deque encounteredPermissionRequests = (Deque) previouslyEncounteredPermissionRequests.get(runtimePermissionMonitorService); + + // Make sure the last add was ignored + assertEquals(encounteredPermissionRequests.size(), 2); + assertThat(encounteredPermissionRequests.getFirst().getPermissionString(), not(equalTo(encounteredPermissionRequests.getLast().getPermissionString()))); + } + + @Test + public void testEventTextExtractionUnknownPermission() throws Exception { + List input = new ArrayList(); + input.add("Allow Bramapp2 to access an as of yet unknown thing?"); + extractInformationFromEventText.invoke(runtimePermissionMonitorService, input); + EncounteredPermissionRequest lastRequest = runtimePermissionMonitorService.getLastEncounteredPermissionRequest(); + assertEquals(lastRequest.getAppName(), "Bramapp2"); + assertEquals(lastRequest.getPermissionString(), "access an as of yet unknown thing"); + } + +} diff --git a/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/SignalScheduleTest.java b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/SignalScheduleTest.java new file mode 100644 index 000000000..2c54fcf36 --- /dev/null +++ b/Android_studio/paco/src/androidTest/java/com/google/android/apps/paco/test/SignalScheduleTest.java @@ -0,0 +1,69 @@ +package com.google.android.apps.paco.test; + +import com.google.android.apps.paco.SignalSchedule; + +import android.test.AndroidTestCase; + +public class SignalScheduleTest extends AndroidTestCase { + + private SignalSchedule schedule; + + protected void setUp() { + schedule = new SignalSchedule(); + schedule.setScheduleType(SignalSchedule.WEEKLY); + } + + public void testAddWeekDayToSchedule() { + schedule.addWeekDayToSchedule(SignalSchedule.SATURDAY); + assertTrue(schedule.isWeekDayScheduled(SignalSchedule.SATURDAY)); + for (int i = 0; i < 6; ++i) { + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[i])); + } + } + + public void testAddMultipleWeekDaysToSchedule() { + schedule.addWeekDayToSchedule(SignalSchedule.FRIDAY); + schedule.addWeekDayToSchedule(SignalSchedule.SATURDAY); + for (int i = 0; i < 5; ++i) { + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[i])); + } + for (int j = 5; j < 6; ++j) { + assertTrue(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[j])); + } + + } + + public void testRemoveAllWeekDaysScheduled() { + schedule.addWeekDayToSchedule(SignalSchedule.SATURDAY); + schedule.addWeekDayToSchedule(SignalSchedule.THURSDAY); + schedule.removeAllWeekDaysScheduled(); + for (int i = 0; i < 7; ++i) { + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[i])); + } + } + + public void testRemoveWeekDayFromSchedule() { + for (int i = 0; i < 7; ++i) { + schedule.addWeekDayToSchedule(SignalSchedule.DAYS_OF_WEEK[i]); + } + schedule.removeWeekDayFromSchedule(SignalSchedule.SUNDAY); + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.SUNDAY)); + for (int j = 1; j < 7; ++j) { + assertTrue(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[j])); + } + } + + public void testRemoveMultipleWeekDaysFromSchedule() { + for (int i = 0; i < 7; ++i) { + schedule.addWeekDayToSchedule(SignalSchedule.DAYS_OF_WEEK[i]); + } + schedule.removeWeekDayFromSchedule(SignalSchedule.SUNDAY); + schedule.removeWeekDayFromSchedule(SignalSchedule.MONDAY); + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.SUNDAY)); + assertFalse(schedule.isWeekDayScheduled(SignalSchedule.MONDAY)); + for (int j = 2; j < 7; ++j) { + assertTrue(schedule.isWeekDayScheduled(SignalSchedule.DAYS_OF_WEEK[j])); + } + } + +} diff --git a/Paco/res/drawable-hdpi/icon.png b/Android_studio/paco/src/androidTest/res/drawable-hdpi/icon.png similarity index 100% rename from Paco/res/drawable-hdpi/icon.png rename to Android_studio/paco/src/androidTest/res/drawable-hdpi/icon.png diff --git a/Paco/res/drawable-ldpi/icon.png b/Android_studio/paco/src/androidTest/res/drawable-ldpi/icon.png similarity index 100% rename from Paco/res/drawable-ldpi/icon.png rename to Android_studio/paco/src/androidTest/res/drawable-ldpi/icon.png diff --git a/Paco/res/drawable-mdpi/icon.png b/Android_studio/paco/src/androidTest/res/drawable-mdpi/icon.png similarity index 100% rename from Paco/res/drawable-mdpi/icon.png rename to Android_studio/paco/src/androidTest/res/drawable-mdpi/icon.png diff --git a/Android_studio/paco/src/androidTest/res/layout/main.xml b/Android_studio/paco/src/androidTest/res/layout/main.xml new file mode 100644 index 000000000..fb9311a51 --- /dev/null +++ b/Android_studio/paco/src/androidTest/res/layout/main.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/Android_studio/paco/src/androidTest/res/values/strings.xml b/Android_studio/paco/src/androidTest/res/values/strings.xml new file mode 100644 index 000000000..c546482bd --- /dev/null +++ b/Android_studio/paco/src/androidTest/res/values/strings.xml @@ -0,0 +1,20 @@ + + + + Hello World! + PacoAndroidLibDummyAppTest + diff --git a/Paco/AndroidManifest.xml b/Android_studio/paco/src/main/AndroidManifest.xml similarity index 97% rename from Paco/AndroidManifest.xml rename to Android_studio/paco/src/main/AndroidManifest.xml index 2a51ab050..8fbae78ab 100644 --- a/Paco/AndroidManifest.xml +++ b/Android_studio/paco/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/paco/src/main/res/drawable/seekbar_progress.xml b/Android_studio/paco/src/main/res/drawable/seekbar_progress.xml new file mode 100644 index 000000000..5334e60fe --- /dev/null +++ b/Android_studio/paco/src/main/res/drawable/seekbar_progress.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_studio/paco/src/main/res/drawable/seekbar_progress_fill.xml b/Android_studio/paco/src/main/res/drawable/seekbar_progress_fill.xml new file mode 100644 index 000000000..500fe551d --- /dev/null +++ b/Android_studio/paco/src/main/res/drawable/seekbar_progress_fill.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Paco/res/drawable/smile_icon1.png b/Android_studio/paco/src/main/res/drawable/smile_icon1.png similarity index 100% rename from Paco/res/drawable/smile_icon1.png rename to Android_studio/paco/src/main/res/drawable/smile_icon1.png diff --git a/Paco/res/drawable/smile_icon1_re.png b/Android_studio/paco/src/main/res/drawable/smile_icon1_re.png old mode 100755 new mode 100644 similarity index 100% rename from Paco/res/drawable/smile_icon1_re.png rename to Android_studio/paco/src/main/res/drawable/smile_icon1_re.png diff --git a/Paco/res/drawable/smile_icon2.png b/Android_studio/paco/src/main/res/drawable/smile_icon2.png similarity index 100% rename from Paco/res/drawable/smile_icon2.png rename to Android_studio/paco/src/main/res/drawable/smile_icon2.png diff --git a/Paco/res/drawable/smile_icon2_re.png b/Android_studio/paco/src/main/res/drawable/smile_icon2_re.png old mode 100755 new mode 100644 similarity index 100% rename from Paco/res/drawable/smile_icon2_re.png rename to Android_studio/paco/src/main/res/drawable/smile_icon2_re.png diff --git a/Paco/res/drawable/smile_icon3.png b/Android_studio/paco/src/main/res/drawable/smile_icon3.png similarity index 100% rename from Paco/res/drawable/smile_icon3.png rename to Android_studio/paco/src/main/res/drawable/smile_icon3.png diff --git a/Paco/res/drawable/smile_icon3_re.png b/Android_studio/paco/src/main/res/drawable/smile_icon3_re.png old mode 100755 new mode 100644 similarity index 100% rename from Paco/res/drawable/smile_icon3_re.png rename to Android_studio/paco/src/main/res/drawable/smile_icon3_re.png diff --git a/Paco/res/drawable/smile_icon4.png b/Android_studio/paco/src/main/res/drawable/smile_icon4.png similarity index 100% rename from Paco/res/drawable/smile_icon4.png rename to Android_studio/paco/src/main/res/drawable/smile_icon4.png diff --git a/Paco/res/drawable/smile_icon4_re.png b/Android_studio/paco/src/main/res/drawable/smile_icon4_re.png old mode 100755 new mode 100644 similarity index 100% rename from Paco/res/drawable/smile_icon4_re.png rename to Android_studio/paco/src/main/res/drawable/smile_icon4_re.png diff --git a/Paco/res/drawable/smile_icon5.png b/Android_studio/paco/src/main/res/drawable/smile_icon5.png similarity index 100% rename from Paco/res/drawable/smile_icon5.png rename to Android_studio/paco/src/main/res/drawable/smile_icon5.png diff --git a/Paco/res/drawable/smile_icon5_re.png b/Android_studio/paco/src/main/res/drawable/smile_icon5_re.png old mode 100755 new mode 100644 similarity index 100% rename from Paco/res/drawable/smile_icon5_re.png rename to Android_studio/paco/src/main/res/drawable/smile_icon5_re.png diff --git a/Paco/res/drawable/smiley1_button.xml b/Android_studio/paco/src/main/res/drawable/smiley1_button.xml similarity index 100% rename from Paco/res/drawable/smiley1_button.xml rename to Android_studio/paco/src/main/res/drawable/smiley1_button.xml diff --git a/Paco/res/drawable/smiley2_button.xml b/Android_studio/paco/src/main/res/drawable/smiley2_button.xml similarity index 100% rename from Paco/res/drawable/smiley2_button.xml rename to Android_studio/paco/src/main/res/drawable/smiley2_button.xml diff --git a/Paco/res/drawable/smiley3_button.xml b/Android_studio/paco/src/main/res/drawable/smiley3_button.xml similarity index 100% rename from Paco/res/drawable/smiley3_button.xml rename to Android_studio/paco/src/main/res/drawable/smiley3_button.xml diff --git a/Paco/res/drawable/smiley4_button.xml b/Android_studio/paco/src/main/res/drawable/smiley4_button.xml similarity index 100% rename from Paco/res/drawable/smiley4_button.xml rename to Android_studio/paco/src/main/res/drawable/smiley4_button.xml diff --git a/Paco/res/drawable/smiley5_button.xml b/Android_studio/paco/src/main/res/drawable/smiley5_button.xml similarity index 100% rename from Paco/res/drawable/smiley5_button.xml rename to Android_studio/paco/src/main/res/drawable/smiley5_button.xml diff --git a/Paco/res/drawable/timepicker_down_btn.xml b/Android_studio/paco/src/main/res/drawable/timepicker_down_btn.xml similarity index 100% rename from Paco/res/drawable/timepicker_down_btn.xml rename to Android_studio/paco/src/main/res/drawable/timepicker_down_btn.xml diff --git a/Paco/res/drawable/timepicker_input.xml b/Android_studio/paco/src/main/res/drawable/timepicker_input.xml similarity index 100% rename from Paco/res/drawable/timepicker_input.xml rename to Android_studio/paco/src/main/res/drawable/timepicker_input.xml diff --git a/Paco/res/drawable/timepicker_up_btn.xml b/Android_studio/paco/src/main/res/drawable/timepicker_up_btn.xml similarity index 100% rename from Paco/res/drawable/timepicker_up_btn.xml rename to Android_studio/paco/src/main/res/drawable/timepicker_up_btn.xml diff --git a/Paco/res/layout/about.xml b/Android_studio/paco/src/main/res/layout/about.xml similarity index 100% rename from Paco/res/layout/about.xml rename to Android_studio/paco/src/main/res/layout/about.xml diff --git a/Paco/res/layout/account_chooser_list.xml b/Android_studio/paco/src/main/res/layout/account_chooser_list.xml similarity index 100% rename from Paco/res/layout/account_chooser_list.xml rename to Android_studio/paco/src/main/res/layout/account_chooser_list.xml diff --git a/Paco/res/layout/activity_current_experiments.xml b/Android_studio/paco/src/main/res/layout/activity_current_experiments.xml similarity index 100% rename from Paco/res/layout/activity_current_experiments.xml rename to Android_studio/paco/src/main/res/layout/activity_current_experiments.xml diff --git a/Paco/res/layout/activity_experiment_group_picker.xml b/Android_studio/paco/src/main/res/layout/activity_experiment_group_picker.xml similarity index 100% rename from Paco/res/layout/activity_experiment_group_picker.xml rename to Android_studio/paco/src/main/res/layout/activity_experiment_group_picker.xml diff --git a/Paco/res/layout/activity_find_my_or_all_experiments_chooser.xml b/Android_studio/paco/src/main/res/layout/activity_find_my_or_all_experiments_chooser.xml similarity index 100% rename from Paco/res/layout/activity_find_my_or_all_experiments_chooser.xml rename to Android_studio/paco/src/main/res/layout/activity_find_my_or_all_experiments_chooser.xml diff --git a/Paco/res/layout/activity_fragment.xml b/Android_studio/paco/src/main/res/layout/activity_fragment.xml similarity index 100% rename from Paco/res/layout/activity_fragment.xml rename to Android_studio/paco/src/main/res/layout/activity_fragment.xml diff --git a/Paco/res/layout/activity_login_syncing.xml b/Android_studio/paco/src/main/res/layout/activity_login_syncing.xml similarity index 100% rename from Paco/res/layout/activity_login_syncing.xml rename to Android_studio/paco/src/main/res/layout/activity_login_syncing.xml diff --git a/Paco/res/layout/activity_opensource_libs.xml b/Android_studio/paco/src/main/res/layout/activity_opensource_libs.xml similarity index 100% rename from Paco/res/layout/activity_opensource_libs.xml rename to Android_studio/paco/src/main/res/layout/activity_opensource_libs.xml diff --git a/Paco/res/layout/activity_schedule_detail.xml b/Android_studio/paco/src/main/res/layout/activity_schedule_detail.xml similarity index 100% rename from Paco/res/layout/activity_schedule_detail.xml rename to Android_studio/paco/src/main/res/layout/activity_schedule_detail.xml diff --git a/Paco/res/layout/activity_schedule_list.xml b/Android_studio/paco/src/main/res/layout/activity_schedule_list.xml similarity index 100% rename from Paco/res/layout/activity_schedule_list.xml rename to Android_studio/paco/src/main/res/layout/activity_schedule_list.xml diff --git a/Paco/res/layout/activity_schedule_pager.xml b/Android_studio/paco/src/main/res/layout/activity_schedule_pager.xml similarity index 100% rename from Paco/res/layout/activity_schedule_pager.xml rename to Android_studio/paco/src/main/res/layout/activity_schedule_pager.xml diff --git a/Paco/res/layout/activity_schedule_twopane.xml b/Android_studio/paco/src/main/res/layout/activity_schedule_twopane.xml similarity index 100% rename from Paco/res/layout/activity_schedule_twopane.xml rename to Android_studio/paco/src/main/res/layout/activity_schedule_twopane.xml diff --git a/Paco/res/layout/activity_settings.xml b/Android_studio/paco/src/main/res/layout/activity_settings.xml similarity index 100% rename from Paco/res/layout/activity_settings.xml rename to Android_studio/paco/src/main/res/layout/activity_settings.xml diff --git a/Paco/res/layout/activity_troubleshooting.xml b/Android_studio/paco/src/main/res/layout/activity_troubleshooting.xml similarity index 100% rename from Paco/res/layout/activity_troubleshooting.xml rename to Android_studio/paco/src/main/res/layout/activity_troubleshooting.xml diff --git a/Paco/res/layout/activity_twopane.xml b/Android_studio/paco/src/main/res/layout/activity_twopane.xml similarity index 100% rename from Paco/res/layout/activity_twopane.xml rename to Android_studio/paco/src/main/res/layout/activity_twopane.xml diff --git a/Paco/res/layout/audio_input.xml b/Android_studio/paco/src/main/res/layout/audio_input.xml similarity index 100% rename from Paco/res/layout/audio_input.xml rename to Android_studio/paco/src/main/res/layout/audio_input.xml diff --git a/Paco/res/layout/contact_options.xml b/Android_studio/paco/src/main/res/layout/contact_options.xml similarity index 100% rename from Paco/res/layout/contact_options.xml rename to Android_studio/paco/src/main/res/layout/contact_options.xml diff --git a/Paco/res/layout/could_not_load_experiment.xml b/Android_studio/paco/src/main/res/layout/could_not_load_experiment.xml similarity index 100% rename from Paco/res/layout/could_not_load_experiment.xml rename to Android_studio/paco/src/main/res/layout/could_not_load_experiment.xml diff --git a/Paco/res/layout/daily_schedule.xml b/Android_studio/paco/src/main/res/layout/daily_schedule.xml similarity index 100% rename from Paco/res/layout/daily_schedule.xml rename to Android_studio/paco/src/main/res/layout/daily_schedule.xml diff --git a/Paco/res/layout/esm_schedule.xml b/Android_studio/paco/src/main/res/layout/esm_schedule.xml similarity index 100% rename from Paco/res/layout/esm_schedule.xml rename to Android_studio/paco/src/main/res/layout/esm_schedule.xml diff --git a/Paco/res/layout/eula.xml b/Android_studio/paco/src/main/res/layout/eula.xml similarity index 100% rename from Paco/res/layout/eula.xml rename to Android_studio/paco/src/main/res/layout/eula.xml diff --git a/Paco/res/layout/event_list.xml b/Android_studio/paco/src/main/res/layout/event_list.xml similarity index 100% rename from Paco/res/layout/event_list.xml rename to Android_studio/paco/src/main/res/layout/event_list.xml diff --git a/Paco/res/layout/experiment_detail.xml b/Android_studio/paco/src/main/res/layout/experiment_detail.xml similarity index 100% rename from Paco/res/layout/experiment_detail.xml rename to Android_studio/paco/src/main/res/layout/experiment_detail.xml diff --git a/Paco/res/layout/experiment_detail_part.xml b/Android_studio/paco/src/main/res/layout/experiment_detail_part.xml similarity index 100% rename from Paco/res/layout/experiment_detail_part.xml rename to Android_studio/paco/src/main/res/layout/experiment_detail_part.xml diff --git a/Paco/res/layout/experiment_executor.xml b/Android_studio/paco/src/main/res/layout/experiment_executor.xml similarity index 100% rename from Paco/res/layout/experiment_executor.xml rename to Android_studio/paco/src/main/res/layout/experiment_executor.xml diff --git a/Paco/res/layout/experiment_executor_custom_rendering.xml b/Android_studio/paco/src/main/res/layout/experiment_executor_custom_rendering.xml similarity index 100% rename from Paco/res/layout/experiment_executor_custom_rendering.xml rename to Android_studio/paco/src/main/res/layout/experiment_executor_custom_rendering.xml diff --git a/Paco/res/layout/experiment_list.xml b/Android_studio/paco/src/main/res/layout/experiment_list.xml similarity index 100% rename from Paco/res/layout/experiment_list.xml rename to Android_studio/paco/src/main/res/layout/experiment_list.xml diff --git a/Paco/res/layout/experiment_list_row.xml b/Android_studio/paco/src/main/res/layout/experiment_list_row.xml similarity index 100% rename from Paco/res/layout/experiment_list_row.xml rename to Android_studio/paco/src/main/res/layout/experiment_list_row.xml diff --git a/Paco/res/layout/experiment_manager_main.xml b/Android_studio/paco/src/main/res/layout/experiment_manager_main.xml similarity index 100% rename from Paco/res/layout/experiment_manager_main.xml rename to Android_studio/paco/src/main/res/layout/experiment_manager_main.xml diff --git a/Paco/res/layout/experiment_save_buttons.xml b/Android_studio/paco/src/main/res/layout/experiment_save_buttons.xml similarity index 100% rename from Paco/res/layout/experiment_save_buttons.xml rename to Android_studio/paco/src/main/res/layout/experiment_save_buttons.xml diff --git a/Paco/res/layout/experiment_web_recommended_buttons.xml b/Android_studio/paco/src/main/res/layout/experiment_web_recommended_buttons.xml similarity index 100% rename from Paco/res/layout/experiment_web_recommended_buttons.xml rename to Android_studio/paco/src/main/res/layout/experiment_web_recommended_buttons.xml diff --git a/Paco/res/layout/experiments_available_list_row.xml b/Android_studio/paco/src/main/res/layout/experiments_available_list_row.xml similarity index 100% rename from Paco/res/layout/experiments_available_list_row.xml rename to Android_studio/paco/src/main/res/layout/experiments_available_list_row.xml diff --git a/Paco/res/layout/explore_data.xml b/Android_studio/paco/src/main/res/layout/explore_data.xml similarity index 100% rename from Paco/res/layout/explore_data.xml rename to Android_studio/paco/src/main/res/layout/explore_data.xml diff --git a/Paco/res/layout/feedback.xml b/Android_studio/paco/src/main/res/layout/feedback.xml similarity index 100% rename from Paco/res/layout/feedback.xml rename to Android_studio/paco/src/main/res/layout/feedback.xml diff --git a/Paco/res/layout/find_experiments.xml b/Android_studio/paco/src/main/res/layout/find_experiments.xml similarity index 100% rename from Paco/res/layout/find_experiments.xml rename to Android_studio/paco/src/main/res/layout/find_experiments.xml diff --git a/Paco/res/layout/fragment_navigation_drawer.xml b/Android_studio/paco/src/main/res/layout/fragment_navigation_drawer.xml similarity index 100% rename from Paco/res/layout/fragment_navigation_drawer.xml rename to Android_studio/paco/src/main/res/layout/fragment_navigation_drawer.xml diff --git a/Paco/res/layout/fragment_schedule_detail.xml b/Android_studio/paco/src/main/res/layout/fragment_schedule_detail.xml similarity index 100% rename from Paco/res/layout/fragment_schedule_detail.xml rename to Android_studio/paco/src/main/res/layout/fragment_schedule_detail.xml diff --git a/Paco/res/layout/fragment_schedule_list.xml b/Android_studio/paco/src/main/res/layout/fragment_schedule_list.xml similarity index 100% rename from Paco/res/layout/fragment_schedule_list.xml rename to Android_studio/paco/src/main/res/layout/fragment_schedule_list.xml diff --git a/Paco/res/layout/help.xml b/Android_studio/paco/src/main/res/layout/help.xml similarity index 100% rename from Paco/res/layout/help.xml rename to Android_studio/paco/src/main/res/layout/help.xml diff --git a/Paco/res/layout/informed_consent.xml b/Android_studio/paco/src/main/res/layout/informed_consent.xml similarity index 100% rename from Paco/res/layout/informed_consent.xml rename to Android_studio/paco/src/main/res/layout/informed_consent.xml diff --git a/Paco/res/layout/likert_smiley.xml b/Android_studio/paco/src/main/res/layout/likert_smiley.xml similarity index 100% rename from Paco/res/layout/likert_smiley.xml rename to Android_studio/paco/src/main/res/layout/likert_smiley.xml diff --git a/Paco/res/layout/list_choices.xml b/Android_studio/paco/src/main/res/layout/list_choices.xml similarity index 100% rename from Paco/res/layout/list_choices.xml rename to Android_studio/paco/src/main/res/layout/list_choices.xml diff --git a/Paco/res/layout/list_choices_multiselect.xml b/Android_studio/paco/src/main/res/layout/list_choices_multiselect.xml similarity index 100% rename from Paco/res/layout/list_choices_multiselect.xml rename to Android_studio/paco/src/main/res/layout/list_choices_multiselect.xml diff --git a/Paco/res/layout/list_header.xml b/Android_studio/paco/src/main/res/layout/list_header.xml similarity index 100% rename from Paco/res/layout/list_header.xml rename to Android_studio/paco/src/main/res/layout/list_header.xml diff --git a/Paco/res/layout/list_item_schedule.xml b/Android_studio/paco/src/main/res/layout/list_item_schedule.xml similarity index 100% rename from Paco/res/layout/list_item_schedule.xml rename to Android_studio/paco/src/main/res/layout/list_item_schedule.xml diff --git a/Paco/res/layout/location_text.xml b/Android_studio/paco/src/main/res/layout/location_text.xml similarity index 100% rename from Paco/res/layout/location_text.xml rename to Android_studio/paco/src/main/res/layout/location_text.xml diff --git a/Paco/res/layout/monthly_schedule.xml b/Android_studio/paco/src/main/res/layout/monthly_schedule.xml similarity index 100% rename from Paco/res/layout/monthly_schedule.xml rename to Android_studio/paco/src/main/res/layout/monthly_schedule.xml diff --git a/Paco/res/layout/multiline_spinner_item.xml b/Android_studio/paco/src/main/res/layout/multiline_spinner_item.xml similarity index 100% rename from Paco/res/layout/multiline_spinner_item.xml rename to Android_studio/paco/src/main/res/layout/multiline_spinner_item.xml diff --git a/Paco/res/layout/multiselect_list_button.xml b/Android_studio/paco/src/main/res/layout/multiselect_list_button.xml similarity index 100% rename from Paco/res/layout/multiselect_list_button.xml rename to Android_studio/paco/src/main/res/layout/multiselect_list_button.xml diff --git a/Paco/res/layout/number_picker.xml b/Android_studio/paco/src/main/res/layout/number_picker.xml similarity index 100% rename from Paco/res/layout/number_picker.xml rename to Android_studio/paco/src/main/res/layout/number_picker.xml diff --git a/Paco/res/layout/number_picker_vertical.xml b/Android_studio/paco/src/main/res/layout/number_picker_vertical.xml similarity index 100% rename from Paco/res/layout/number_picker_vertical.xml rename to Android_studio/paco/src/main/res/layout/number_picker_vertical.xml diff --git a/Paco/res/layout/open_text.xml b/Android_studio/paco/src/main/res/layout/open_text.xml similarity index 100% rename from Paco/res/layout/open_text.xml rename to Android_studio/paco/src/main/res/layout/open_text.xml diff --git a/Paco/res/layout/paging_hours.xml b/Android_studio/paco/src/main/res/layout/paging_hours.xml similarity index 100% rename from Paco/res/layout/paging_hours.xml rename to Android_studio/paco/src/main/res/layout/paging_hours.xml diff --git a/Paco/res/layout/photo_input.xml b/Android_studio/paco/src/main/res/layout/photo_input.xml similarity index 100% rename from Paco/res/layout/photo_input.xml rename to Android_studio/paco/src/main/res/layout/photo_input.xml diff --git a/Paco/res/layout/post_install_instructions.xml b/Android_studio/paco/src/main/res/layout/post_install_instructions.xml similarity index 100% rename from Paco/res/layout/post_install_instructions.xml rename to Android_studio/paco/src/main/res/layout/post_install_instructions.xml diff --git a/Paco/res/layout/radio_group_10.xml b/Android_studio/paco/src/main/res/layout/radio_group_10.xml similarity index 100% rename from Paco/res/layout/radio_group_10.xml rename to Android_studio/paco/src/main/res/layout/radio_group_10.xml diff --git a/Paco/res/layout/radio_group_10_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_10_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_10_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_10_inline.xml diff --git a/Paco/res/layout/radio_group_2.xml b/Android_studio/paco/src/main/res/layout/radio_group_2.xml similarity index 100% rename from Paco/res/layout/radio_group_2.xml rename to Android_studio/paco/src/main/res/layout/radio_group_2.xml diff --git a/Paco/res/layout/radio_group_2_stacked.xml b/Android_studio/paco/src/main/res/layout/radio_group_2_stacked.xml similarity index 100% rename from Paco/res/layout/radio_group_2_stacked.xml rename to Android_studio/paco/src/main/res/layout/radio_group_2_stacked.xml diff --git a/Paco/res/layout/radio_group_3.xml b/Android_studio/paco/src/main/res/layout/radio_group_3.xml similarity index 100% rename from Paco/res/layout/radio_group_3.xml rename to Android_studio/paco/src/main/res/layout/radio_group_3.xml diff --git a/Paco/res/layout/radio_group_3_stacked.xml b/Android_studio/paco/src/main/res/layout/radio_group_3_stacked.xml similarity index 100% rename from Paco/res/layout/radio_group_3_stacked.xml rename to Android_studio/paco/src/main/res/layout/radio_group_3_stacked.xml diff --git a/Paco/res/layout/radio_group_4.xml b/Android_studio/paco/src/main/res/layout/radio_group_4.xml similarity index 100% rename from Paco/res/layout/radio_group_4.xml rename to Android_studio/paco/src/main/res/layout/radio_group_4.xml diff --git a/Paco/res/layout/radio_group_4_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_4_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_4_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_4_inline.xml diff --git a/Paco/res/layout/radio_group_5.xml b/Android_studio/paco/src/main/res/layout/radio_group_5.xml similarity index 100% rename from Paco/res/layout/radio_group_5.xml rename to Android_studio/paco/src/main/res/layout/radio_group_5.xml diff --git a/Paco/res/layout/radio_group_5_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_5_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_5_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_5_inline.xml diff --git a/Paco/res/layout/radio_group_6.xml b/Android_studio/paco/src/main/res/layout/radio_group_6.xml similarity index 100% rename from Paco/res/layout/radio_group_6.xml rename to Android_studio/paco/src/main/res/layout/radio_group_6.xml diff --git a/Paco/res/layout/radio_group_6_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_6_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_6_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_6_inline.xml diff --git a/Paco/res/layout/radio_group_7.xml b/Android_studio/paco/src/main/res/layout/radio_group_7.xml similarity index 100% rename from Paco/res/layout/radio_group_7.xml rename to Android_studio/paco/src/main/res/layout/radio_group_7.xml diff --git a/Paco/res/layout/radio_group_7_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_7_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_7_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_7_inline.xml diff --git a/Paco/res/layout/radio_group_8.xml b/Android_studio/paco/src/main/res/layout/radio_group_8.xml similarity index 100% rename from Paco/res/layout/radio_group_8.xml rename to Android_studio/paco/src/main/res/layout/radio_group_8.xml diff --git a/Paco/res/layout/radio_group_8_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_8_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_8_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_8_inline.xml diff --git a/Paco/res/layout/radio_group_9.xml b/Android_studio/paco/src/main/res/layout/radio_group_9.xml similarity index 100% rename from Paco/res/layout/radio_group_9.xml rename to Android_studio/paco/src/main/res/layout/radio_group_9.xml diff --git a/Paco/res/layout/radio_group_9_inline.xml b/Android_studio/paco/src/main/res/layout/radio_group_9_inline.xml similarity index 100% rename from Paco/res/layout/radio_group_9_inline.xml rename to Android_studio/paco/src/main/res/layout/radio_group_9_inline.xml diff --git a/Paco/res/layout/radio_group_error.xml b/Android_studio/paco/src/main/res/layout/radio_group_error.xml similarity index 100% rename from Paco/res/layout/radio_group_error.xml rename to Android_studio/paco/src/main/res/layout/radio_group_error.xml diff --git a/Paco/res/layout/repeat_every_n_schedule.xml b/Android_studio/paco/src/main/res/layout/repeat_every_n_schedule.xml similarity index 100% rename from Paco/res/layout/repeat_every_n_schedule.xml rename to Android_studio/paco/src/main/res/layout/repeat_every_n_schedule.xml diff --git a/Paco/res/layout/repeat_on_dow_schedule.xml b/Android_studio/paco/src/main/res/layout/repeat_on_dow_schedule.xml similarity index 100% rename from Paco/res/layout/repeat_on_dow_schedule.xml rename to Android_studio/paco/src/main/res/layout/repeat_on_dow_schedule.xml diff --git a/Paco/res/layout/schedule_list.xml b/Android_studio/paco/src/main/res/layout/schedule_list.xml similarity index 100% rename from Paco/res/layout/schedule_list.xml rename to Android_studio/paco/src/main/res/layout/schedule_list.xml diff --git a/Paco/res/layout/schedule_row.xml b/Android_studio/paco/src/main/res/layout/schedule_row.xml similarity index 100% rename from Paco/res/layout/schedule_row.xml rename to Android_studio/paco/src/main/res/layout/schedule_row.xml diff --git a/Paco/res/layout/self_report_schedule.xml b/Android_studio/paco/src/main/res/layout/self_report_schedule.xml similarity index 100% rename from Paco/res/layout/self_report_schedule.xml rename to Android_studio/paco/src/main/res/layout/self_report_schedule.xml diff --git a/Paco/res/layout/server_configuration.xml b/Android_studio/paco/src/main/res/layout/server_configuration.xml similarity index 100% rename from Paco/res/layout/server_configuration.xml rename to Android_studio/paco/src/main/res/layout/server_configuration.xml diff --git a/Paco/res/layout/splash_screen.xml b/Android_studio/paco/src/main/res/layout/splash_screen.xml similarity index 97% rename from Paco/res/layout/splash_screen.xml rename to Android_studio/paco/src/main/res/layout/splash_screen.xml index c30de8d0b..00d1bf03c 100644 --- a/Paco/res/layout/splash_screen.xml +++ b/Android_studio/paco/src/main/res/layout/splash_screen.xml @@ -15,7 +15,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:text="Paco" + android:text="@string/app_name" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#ffffff"/> diff --git a/Paco/res/layout/timelist_item.xml b/Android_studio/paco/src/main/res/layout/timelist_item.xml similarity index 100% rename from Paco/res/layout/timelist_item.xml rename to Android_studio/paco/src/main/res/layout/timelist_item.xml diff --git a/Paco/res/layout/times_schedule.xml b/Android_studio/paco/src/main/res/layout/times_schedule.xml similarity index 100% rename from Paco/res/layout/times_schedule.xml rename to Android_studio/paco/src/main/res/layout/times_schedule.xml diff --git a/Android_studio/paco/src/main/res/layout/va_scale.xml b/Android_studio/paco/src/main/res/layout/va_scale.xml new file mode 100644 index 000000000..5ed918b72 --- /dev/null +++ b/Android_studio/paco/src/main/res/layout/va_scale.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Paco/res/layout/weekly_schedule.xml b/Android_studio/paco/src/main/res/layout/weekly_schedule.xml similarity index 100% rename from Paco/res/layout/weekly_schedule.xml rename to Android_studio/paco/src/main/res/layout/weekly_schedule.xml diff --git a/Paco/res/layout/welcome.xml b/Android_studio/paco/src/main/res/layout/welcome.xml similarity index 100% rename from Paco/res/layout/welcome.xml rename to Android_studio/paco/src/main/res/layout/welcome.xml diff --git a/Paco/res/menu/experiment_popup.xml b/Android_studio/paco/src/main/res/menu/experiment_popup.xml similarity index 100% rename from Paco/res/menu/experiment_popup.xml rename to Android_studio/paco/src/main/res/menu/experiment_popup.xml diff --git a/Paco/res/menu/global.xml b/Android_studio/paco/src/main/res/menu/global.xml similarity index 100% rename from Paco/res/menu/global.xml rename to Android_studio/paco/src/main/res/menu/global.xml diff --git a/Paco/res/menu/main.xml b/Android_studio/paco/src/main/res/menu/main.xml similarity index 100% rename from Paco/res/menu/main.xml rename to Android_studio/paco/src/main/res/menu/main.xml diff --git a/Paco/res/raw/eula b/Android_studio/paco/src/main/res/raw/eula similarity index 100% rename from Paco/res/raw/eula rename to Android_studio/paco/src/main/res/raw/eula diff --git a/Paco/res/raw/eula_bn b/Android_studio/paco/src/main/res/raw/eula_bn similarity index 100% rename from Paco/res/raw/eula_bn rename to Android_studio/paco/src/main/res/raw/eula_bn diff --git a/Paco/res/raw/eula_el b/Android_studio/paco/src/main/res/raw/eula_el similarity index 100% rename from Paco/res/raw/eula_el rename to Android_studio/paco/src/main/res/raw/eula_el diff --git a/Paco/res/raw/eula_fi b/Android_studio/paco/src/main/res/raw/eula_fi similarity index 100% rename from Paco/res/raw/eula_fi rename to Android_studio/paco/src/main/res/raw/eula_fi diff --git a/Paco/res/raw/eula_gu b/Android_studio/paco/src/main/res/raw/eula_gu similarity index 100% rename from Paco/res/raw/eula_gu rename to Android_studio/paco/src/main/res/raw/eula_gu diff --git a/Paco/res/raw/eula_hi b/Android_studio/paco/src/main/res/raw/eula_hi similarity index 100% rename from Paco/res/raw/eula_hi rename to Android_studio/paco/src/main/res/raw/eula_hi diff --git a/Paco/res/raw/eula_ja b/Android_studio/paco/src/main/res/raw/eula_ja similarity index 100% rename from Paco/res/raw/eula_ja rename to Android_studio/paco/src/main/res/raw/eula_ja diff --git a/Paco/res/raw/eula_kn b/Android_studio/paco/src/main/res/raw/eula_kn similarity index 100% rename from Paco/res/raw/eula_kn rename to Android_studio/paco/src/main/res/raw/eula_kn diff --git a/Paco/res/raw/eula_mr b/Android_studio/paco/src/main/res/raw/eula_mr similarity index 100% rename from Paco/res/raw/eula_mr rename to Android_studio/paco/src/main/res/raw/eula_mr diff --git a/Paco/res/raw/eula_pt b/Android_studio/paco/src/main/res/raw/eula_pt similarity index 100% rename from Paco/res/raw/eula_pt rename to Android_studio/paco/src/main/res/raw/eula_pt diff --git a/Paco/res/raw/eula_ta b/Android_studio/paco/src/main/res/raw/eula_ta similarity index 100% rename from Paco/res/raw/eula_ta rename to Android_studio/paco/src/main/res/raw/eula_ta diff --git a/Paco/res/values-bn/strings.xml b/Android_studio/paco/src/main/res/values-bn/strings.xml similarity index 99% rename from Paco/res/values-bn/strings.xml rename to Android_studio/paco/src/main/res/values-bn/strings.xml index fd3effc5b..842af40da 100644 --- a/Paco/res/values-bn/strings.xml +++ b/Android_studio/paco/src/main/res/values-bn/strings.xml @@ -1,4 +1,4 @@ - + সহায়তা: টিম: diff --git a/Paco/res/values-el/strings.xml b/Android_studio/paco/src/main/res/values-el/strings.xml similarity index 99% rename from Paco/res/values-el/strings.xml rename to Android_studio/paco/src/main/res/values-el/strings.xml index 8a8005f3f..c666dc38c 100644 --- a/Paco/res/values-el/strings.xml +++ b/Android_studio/paco/src/main/res/values-el/strings.xml @@ -1,4 +1,4 @@ - + Υποστήριξη: Ομάδα: diff --git a/Paco/res/values-gu/strings.xml b/Android_studio/paco/src/main/res/values-gu/strings.xml similarity index 99% rename from Paco/res/values-gu/strings.xml rename to Android_studio/paco/src/main/res/values-gu/strings.xml index 61305fdcc..154b47baa 100644 --- a/Paco/res/values-gu/strings.xml +++ b/Android_studio/paco/src/main/res/values-gu/strings.xml @@ -1,4 +1,4 @@ - + સમર્થન: ટીમ: diff --git a/Paco/res/values-hi/strings.xml b/Android_studio/paco/src/main/res/values-hi/strings.xml similarity index 99% rename from Paco/res/values-hi/strings.xml rename to Android_studio/paco/src/main/res/values-hi/strings.xml index 1682ae91d..696f6c2d8 100644 --- a/Paco/res/values-hi/strings.xml +++ b/Android_studio/paco/src/main/res/values-hi/strings.xml @@ -1,4 +1,4 @@ - + समर्थन: टीम: diff --git a/Paco/res/values-id/strings.xml b/Android_studio/paco/src/main/res/values-id/strings.xml similarity index 99% rename from Paco/res/values-id/strings.xml rename to Android_studio/paco/src/main/res/values-id/strings.xml index 182d6383f..dde421845 100644 --- a/Paco/res/values-id/strings.xml +++ b/Android_studio/paco/src/main/res/values-id/strings.xml @@ -1,4 +1,4 @@ - + (belum terverifikasi) Tentang Paco diff --git a/Paco/res/values-ja/strings.xml b/Android_studio/paco/src/main/res/values-ja/strings.xml similarity index 93% rename from Paco/res/values-ja/strings.xml rename to Android_studio/paco/src/main/res/values-ja/strings.xml index 1687ecae4..c4f549750 100644 --- a/Paco/res/values-ja/strings.xml +++ b/Android_studio/paco/src/main/res/values-ja/strings.xml @@ -1,4 +1,4 @@ - + - PACO - - quantifiedself.appspot.com - com.google.android.apps.paco - paco-users@googlegroups.com - paco-users@googlegroups.com - - https://groups.google.com/group/paco-users - pacoapp.com - - Bob Evans - Alberto Savoia - Arun Saigal - CP Lim - Stephen Uhler - Tina Malm - Brian Ong - Kanwal Safdar - - + + + + 利用規約 同意する 同意しない @@ -46,8 +30,7 @@ 利用ガイド チーム: バージョン: - Support - サポート: + サポート: Pacoについて diff --git a/Paco/res/values-kn/strings.xml b/Android_studio/paco/src/main/res/values-kn/strings.xml similarity index 99% rename from Paco/res/values-kn/strings.xml rename to Android_studio/paco/src/main/res/values-kn/strings.xml index 68dd2c195..29e265d85 100644 --- a/Paco/res/values-kn/strings.xml +++ b/Android_studio/paco/src/main/res/values-kn/strings.xml @@ -1,4 +1,4 @@ - + ಬೆಂಬಲ: ತಂಡ: diff --git a/Paco/res/values-large/refs.xml b/Android_studio/paco/src/main/res/values-large/refs.xml similarity index 100% rename from Paco/res/values-large/refs.xml rename to Android_studio/paco/src/main/res/values-large/refs.xml diff --git a/Paco/res/values-mr/strings.xml b/Android_studio/paco/src/main/res/values-mr/strings.xml similarity index 99% rename from Paco/res/values-mr/strings.xml rename to Android_studio/paco/src/main/res/values-mr/strings.xml index d15a713c7..c91d4a52e 100644 --- a/Paco/res/values-mr/strings.xml +++ b/Android_studio/paco/src/main/res/values-mr/strings.xml @@ -1,4 +1,4 @@ - + समर्थन: कार्यसंघ: diff --git a/Paco/res/values-pt-rPT/strings.xml b/Android_studio/paco/src/main/res/values-pt-rPT/strings.xml similarity index 99% rename from Paco/res/values-pt-rPT/strings.xml rename to Android_studio/paco/src/main/res/values-pt-rPT/strings.xml index 7cf47f383..2cdb0ed6d 100644 --- a/Paco/res/values-pt-rPT/strings.xml +++ b/Android_studio/paco/src/main/res/values-pt-rPT/strings.xml @@ -1,4 +1,4 @@ - + (não verificado) Acerca do Paco diff --git a/Paco/res/values-sw600dp/dimens.xml b/Android_studio/paco/src/main/res/values-sw600dp/dimens.xml similarity index 100% rename from Paco/res/values-sw600dp/dimens.xml rename to Android_studio/paco/src/main/res/values-sw600dp/dimens.xml diff --git a/Paco/res/values-sw600dp/refs.xml b/Android_studio/paco/src/main/res/values-sw600dp/refs.xml similarity index 100% rename from Paco/res/values-sw600dp/refs.xml rename to Android_studio/paco/src/main/res/values-sw600dp/refs.xml diff --git a/Paco/res/values-sw720dp-land/dimens.xml b/Android_studio/paco/src/main/res/values-sw720dp-land/dimens.xml similarity index 100% rename from Paco/res/values-sw720dp-land/dimens.xml rename to Android_studio/paco/src/main/res/values-sw720dp-land/dimens.xml diff --git a/Paco/res/values-ta/strings.xml b/Android_studio/paco/src/main/res/values-ta/strings.xml similarity index 99% rename from Paco/res/values-ta/strings.xml rename to Android_studio/paco/src/main/res/values-ta/strings.xml index 96ad59836..448468dfe 100644 --- a/Paco/res/values-ta/strings.xml +++ b/Android_studio/paco/src/main/res/values-ta/strings.xml @@ -1,4 +1,4 @@ - + ஆதரவு: குழு: diff --git a/Paco/res/values-te/strings.xml b/Android_studio/paco/src/main/res/values-te/strings.xml similarity index 99% rename from Paco/res/values-te/strings.xml rename to Android_studio/paco/src/main/res/values-te/strings.xml index 161594bee..309a819db 100644 --- a/Paco/res/values-te/strings.xml +++ b/Android_studio/paco/src/main/res/values-te/strings.xml @@ -1,4 +1,4 @@ - + (ధృవీకరించలేదు) Paco గురించి diff --git a/Paco/res/values-tr/strings.xml b/Android_studio/paco/src/main/res/values-tr/strings.xml similarity index 96% rename from Paco/res/values-tr/strings.xml rename to Android_studio/paco/src/main/res/values-tr/strings.xml index 26b956da7..cf6f6cd8f 100644 --- a/Paco/res/values-tr/strings.xml +++ b/Android_studio/paco/src/main/res/values-tr/strings.xml @@ -15,22 +15,7 @@ ~ under the License. --> - "Paco" - "www.pacoapp.com" - "com.pacoapp.paco" - "paco-users@googlegroups.com" - "paco-users@googlegroups.com" - "https://groups.google.com/group/paco-users" "Destek:" - "pacoapp.com" - "Bob Evans" - "Alberto Savoia" - "Arun Saigal" - "CP Lim" - "Stephen Uhler" - "Tina Malm" - "Brian Ong" - "Kanwal Safdar" "Takım:" "Sürüm:" "Paco Sürümü" diff --git a/Paco/res/values-v21/styles.xml b/Android_studio/paco/src/main/res/values-v21/styles.xml similarity index 100% rename from Paco/res/values-v21/styles.xml rename to Android_studio/paco/src/main/res/values-v21/styles.xml diff --git a/Paco/res/values-w820dp/dimens.xml b/Android_studio/paco/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from Paco/res/values-w820dp/dimens.xml rename to Android_studio/paco/src/main/res/values-w820dp/dimens.xml diff --git a/Paco/res/values/colors.xml b/Android_studio/paco/src/main/res/values/colors.xml similarity index 100% rename from Paco/res/values/colors.xml rename to Android_studio/paco/src/main/res/values/colors.xml diff --git a/Paco/res/values/dimens.xml b/Android_studio/paco/src/main/res/values/dimens.xml similarity index 100% rename from Paco/res/values/dimens.xml rename to Android_studio/paco/src/main/res/values/dimens.xml diff --git a/Paco/res/values/google_play_services_version.xml b/Android_studio/paco/src/main/res/values/google_play_services_version.xml similarity index 100% rename from Paco/res/values/google_play_services_version.xml rename to Android_studio/paco/src/main/res/values/google_play_services_version.xml diff --git a/Paco/res/values/ids.xml b/Android_studio/paco/src/main/res/values/ids.xml similarity index 100% rename from Paco/res/values/ids.xml rename to Android_studio/paco/src/main/res/values/ids.xml diff --git a/Paco/res/values/strings.xml b/Android_studio/paco/src/main/res/values/strings.xml similarity index 95% rename from Paco/res/values/strings.xml rename to Android_studio/paco/src/main/res/values/strings.xml index 3b195a6c1..6e186e48b 100644 --- a/Paco/res/values/strings.xml +++ b/Android_studio/paco/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + - - - PACO - - quantifiedself.appspot.com - com.google.android.apps.paco - paco-users@googlegroups.com - paco-users@googlegroups.com - - https://groups.google.com/group/paco-users - pacoapp.com - - Bob Evans - Alberto Savoia - Arun Saigal - CP Lim - Stephen Uhler - Tina Malm - Brian Ong - Kanwal Safdar - - - End User License Agreement - Accept - Decline - - - About - User Guide - Team: - Version: - Support - Support: - About Paco - - - Welcome - Ok - Paco Version - - No - Yes - OK - Error - Success - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - - - - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - - - - First - Second - Third - Fourth - Fifth - - Experiment Title - Refresh Questions - Save Response - Contact us - Find experiments - Current experiments - Personal Analytics COmpanion - Welcome to PACO! - Browse Website - Browse user group - Email user group - Ways to Talk to Paco - Explore Data - Create an experiment - Getting Started - Choose an Account - I will respond here anyway - I will respond on the web - NOTE: It is recommended that you fill this study out on your computer instead. - Current Account - Experiment Refresh - Checking Server for New and Updated Experiment Definitions - Selected Experiment does not exist on the phone. Refresh Experiments from Server? - ongoing - Day - Week - Month - Daily - Weekdays - Weekly - Monthly - Random sampling (ESM) - Self report only - Advanced - " Please point your computer browser to " - This survey request has expired. No need to enter a response - "Use GPS for improved location (outside only)? " - Enable - Cancel - "You must enable some form of Location Service if you want to include location data. " - Required Answers Missing - "Must answer: " - I found new questions. - I did not find new questions on the server. - Experiment may be invalid now. Closing screen. Please reopen. - Since creating experiments involves a fair amount of text entry, a phone is not so well-suited to creating experiments. \n\nPlease point your browser to http://%1$s/ to create an experiment. - How to Create an Experiment - About Paco - Debug - Server Address - Check Updates - Choose Account - Choose Alert - Send Log - Select Signal Tone - Cannot find the experiment! - Save - Start Time - End Time - Modify Time - Days of Week - Start hour must be before end hour - You haven\'t loaded any experiments yet, so this option does not make sense. Please come back after your have loaded an experiment and input data. - " Show Trends " - " Show Relationships " - " Show Distributions " - You didn\'t pick a proper experiment. - Make selections - Experiment does not exist! - Sorry, please select exactly one variable. - Sorry, please select exactly two variables. - Thanks for Participating! - Edit Schedule - Stop Experiment - Explore Data - Running Experiments - Available Experiments - Stop the Experiment? - Are you sure you want to stop the experiment? - unknown author - Retrieving - Cannot find image file from camera! - Unknown - Cannot Open Camera - Done - Time to participate! - "Time for " - Refresh Experiment - Main Page - Missed - This version is current. - Update Found - Please Choose an Accounts to use with Paco - "Daily Scheduled Times for: " - Scheduled Times - Save Schedule - Experiment Name - Suggested signalling schedule: - "Schedule Period: " - Times per period: - Weekends? - Start Hour - 9:30am - "End Hour: " - 5:30am - Responses - No data - Description: - "Schedule: " - "Start Date: " - "End Date: " - "ESM Frequency: " - "Scheduled Time: " - creator - Join this Experiment - Title - Edit Schedule - Stop Experiment - List of Experiments - How would you like to explore your data? - Trends - Relationships - Distributions - Go to Raw Data - Your Current Experiments - Refresh Experiments List From Server - Data Handling &amp; Privacy Agreement between You and the Experiment Creator - By joining this experiment, you may be sharing data with the creator and administrators of this experiment. Read the data handling policy they have provided below to decide on whether you want to participate in this experiment. - " I consent" - Available Experiments - Retrieving... - Location Settings - "Daily Scheduled Time for: " - " By Day of Month" - " Day of Week" - Day of Month: - Day of Week: - End Hour - Signals per week (3-10) - Save - Take Picture - Refresh Experiments - "Repeat Every " - Days - Months - Weeks - Days of Week - This experiment is self-reporting only. - There is no schedule to configure - Finish - WARNING: Only change this if you know what you are doing. - Enter Server Address - Checking for Updates... - Install - Which variable(s) would you like to explore? - No Google accounts on your phone. Go to Settings/Account to add one. - You have already joined this experiment. Do you really want to join it again? - Paco Update - New Version Available - Paco Update - A new version of Paco is available - - Retrieving Your Joined Experiment From the Server - Experiment Retrieval - OK - Could Not Retrieve Experiment. - Something went wrong with retrieving experiment data. - Something went wrong with the server. - Network Required - You will need a network connection to join the experiment. Enable connection now? - No, Thanks. - Network Settings - Last Refreshed - Answer by speaking - Oops! Your device doesn\'t support Speech to Text - Success! Please go to Current Experiments for a list of all joined experiments. - Updating Your Joined Experiments From the Server - Please choose the source of your image - Camera - Gallery - Settings - Find My Experiments - Find All Public Experiments - diff --git a/Shared/build.gradle b/Shared/build.gradle new file mode 100644 index 000000000..1110fcd50 --- /dev/null +++ b/Shared/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'java' + +dependencies { + compile 'com.google.guava:guava:16.0.1' + compile 'joda-time:joda-time:2.9.3' + compile files('lib/jackson-all-1.9.11.jar') + compile files('lib/js.jar') + compile files('lib/json-1.5.jar') + + sourceCompatibility = 1.7 + targetCompatibility = 1.7 +} + +sourceSets { + main { + java { + srcDirs = ['src', 'src_non_j2objc'] + } + } +} \ No newline at end of file diff --git a/Shared/src/com/pacoapp/paco/shared/model2/Input2.java b/Shared/src/com/pacoapp/paco/shared/model2/Input2.java old mode 100755 new mode 100644 index dbb93ae1d..197f98bde --- a/Shared/src/com/pacoapp/paco/shared/model2/Input2.java +++ b/Shared/src/com/pacoapp/paco/shared/model2/Input2.java @@ -34,6 +34,7 @@ public class Input2 extends ModelBase implements Validatable, Serializable { public static final String SOUND = "sound"; public static final String ACTIVITY = "activity"; public static final String AUDIO = "audio"; + public static final String VA_SCALE = "va_scale"; public static String[] RESPONSE_TYPES = {LIKERT_SMILEYS, LIKERT, OPEN_TEXT, LIST, NUMBER, LOCATION, PHOTO, SOUND, ACTIVITY, AUDIO}; diff --git a/Shared/src_non_j2objc/com/pacoapp/paco/shared/model/InputDAO.java b/Shared/src_non_j2objc/com/pacoapp/paco/shared/model/InputDAO.java old mode 100755 new mode 100644 index a8d43e27b..4b8542d69 --- a/Shared/src_non_j2objc/com/pacoapp/paco/shared/model/InputDAO.java +++ b/Shared/src_non_j2objc/com/pacoapp/paco/shared/model/InputDAO.java @@ -45,9 +45,10 @@ public class InputDAO implements Serializable { public static final String PHOTO = "photo"; public static final String SOUND = "sound"; public static final String ACTIVITY = "activity"; + public static final String VA_SCALE = "va_scale"; public static String[] RESPONSE_TYPES = {LIKERT_SMILEYS, LIKERT, OPEN_TEXT, LIST, NUMBER, - LOCATION, PHOTO, SOUND, ACTIVITY}; + LOCATION, PHOTO, SOUND, ACTIVITY, VA_SCALE}; private Long id; private String questionType;