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 & 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;