├── .gitignore ├── AndroidManifest.xml ├── README.md ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs ├── android-support-v4.jar └── baasbox-android-0.7.3.jar ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png ├── drawable-xxhdpi │ └── ic_launcher.png ├── layout │ ├── activity_diary_details.xml │ ├── activity_diary_list.xml │ ├── activity_diary_panes.xml │ ├── activity_edit_list.xml │ ├── activity_login.xml │ ├── add_diary_note.xml │ └── fragment_diary_details.xml ├── menu │ ├── add_note.xml │ ├── login.xml │ └── main.xml ├── values-large │ ├── refs.xml │ └── styles.xml ├── values-sw600dp │ └── refs.xml └── values │ ├── attrs.xml │ ├── dimen.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml └── src └── com └── baasbox └── deardiary ├── DearDiary.java └── ui ├── AddNoteFragment.java ├── EditActivity.java ├── LoginActivity.java ├── NoteDetailsFragment.java ├── NoteListActivity.java ├── NotesAdapter.java ├── NotesDetailsActivity.java └── NotesListFragment.java /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | .idea 4 | *.iml 5 | .DS_Store 6 | .classpath 7 | .project 8 | .settings/* 9 | bin/** 10 | build/** 11 | gen/** 12 | project.properties 13 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 32 | 33 | 34 | 38 | 39 | 40 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dear Diary BaasBox Sample 2 | 3 | BaasBox is a tool that allows you to quickly build a back end for your app. 4 | You can install it on your local machine (ideal for development and testing) or your own server. 5 | It comes with an SDK that simplifies the integration of your Android app with the server. 6 | In this tutorial you will learn how to integrate an existing Android application with BaasBox. 7 | 8 | To complete this walk through you need a working copy of the Android SDK. 9 | You can download the starter project from [DearDiary-Android-Starter](). 10 | 11 | Unzip and run the project to see if it works as expected, it's a simple personal diary 12 | composed of three activities, a list of your notes, the details, and an activity to add 13 | new notes to the diary. 14 | 15 | Even though this pretty simple app works, it has a big shortcoming, if you uninstall it from your 16 | device, you will loose all your notes, and there is no way to restore them. 17 | 18 | Wouldn’t it be cool if we could save them on a back end? That’s exactly what we are going to do in this tutorial. 19 | 20 | ## Installing BaasBox 21 | 22 | The first step is to install BaasBox. For sake of simplicity we will show how to install it on a local machine. You will see that’s very easy. Download the latest version of BaasBox from here. Unzip the file, open Terminal, go to the directory unzipped, type “./start” and hit return. BaasBox is now running on your local machine. To test visit the following link: **http://localhost:9000/** and you should see the following screen. 23 | 24 | 25 | ## Importing the sdk 26 | If you are on eclipse you can download the sdk from [here](). Put the jar in to your libs folder 27 | and you are ready to go. 28 | Using gradle is even simpler you just need to add the following line to your dependencies 29 | 30 | ```groovy 31 | compile 'com.baasbox:baasbox-android:0.7.3-alpha' 32 | ``` 33 | After refreshing your ide, you should be able to use the sdk classes in your project 34 | 35 | ## Setup the client library 36 | The BaasBox service could be installed anywhere on the web 37 | so you probably need to configure it a bit. 38 | We suggest to initialize the client in your 39 | *Application* onCreate method. 40 | The starter project includes an empty DearDiary class. 41 | Open the java file and add the following lines: 42 | ```java 43 | 44 | private BaasBox box; 45 | 46 | @Override 47 | public void onCreate() { 48 | super.onCreate(); 49 | BaasBox.Config config = new BaasBox.Config(); 50 | config.API_DOMAIN = "10.0.0.2"; // the host address 51 | config.APP_CODE = "1234567890"; // your appcode 52 | config.HTTP_PORT = 9000; // your port 53 | 54 | box = BaasBox.initDefault(this,config); 55 | } 56 | ``` 57 | 58 | Also don't forget to add the required internet permissions 59 | to your manifest: 60 | 61 | ```xml 62 | 63 | ``` 64 | 65 | After all you are going to connect to a backend!!! 66 | 67 | With this setup you are ready to use the sdk in your app. 68 | Don't forget to customize the configuration to adapt it to your environment. 69 | 70 | ## Authenticate with the server 71 | BaasBox provides means for authenticatication, so that different user 72 | can be distinguished on the backed. 73 | The sample project includes a barebone LoginActivity, we are going to integrate it in 74 | the app. 75 | 76 | The first thing to do is to check if there is alrady an an authenticated user for this device. 77 | Open the NoteListActivity file and right at the start of onCreate, where is the *todo 1* mark 78 | add the following lines. 79 | 80 | ```java 81 | if (BaasUser.current() == null){ 82 | startLoginScreen(); 83 | return; 84 | } 85 | ``` 86 | 87 | BaasBox sdk remembers the currently logged in user. 88 | ```java BaasUser.current() ``` will return the current one 89 | or null if no one is logged in, in this case we will start the login screen. 90 | 91 | Now in the LoginActivity search for the two todo items for you. 92 | This is your first call to BaasBox: 93 | 94 | ```java 95 | private void signupWithBaasBox(boolean newUser){ 96 | //todo 3.1 97 | BaasUser user = BaasUser.withUserName(mUsername); 98 | user.setPassword(mPassword); 99 | if (newUser) { 100 | user.signup(onComplete); 101 | } else { 102 | user.login(onComplete); 103 | } 104 | } 105 | //todo 3.2 106 | private final BaasHandler onComplete = 107 | new BaasHandler() { 108 | @Override 109 | public void handle(BaasResult result) { 110 | if(result.isSuccess()){ 111 | completeLogin(true); 112 | } else { 113 | Log.d(TAG,result.error().toString()); 114 | completeLogin(false); 115 | } 116 | } 117 | }; 118 | ``` 119 | 120 | you can login or signup using methods of the BaasUser class,they obviously are 121 | *signup* and *login*. 122 | You obtain an instance of a user through the factory method: 123 | ```java 124 | BaasUser.withUserName(...); 125 | ``` 126 | 127 | These methods are executed asynchronously so you need to pass 128 | a callback to be invoked upon completion, in this case the **onComplete** 129 | variable. The callback will receive the result of the rest api call, or possibly 130 | an error you can inspect docs of the methods of BaasResult to see how it works in details. 131 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | mavenCentral() 6 | 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:0.12.+' 10 | } 11 | } 12 | 13 | task wrapper(type: Wrapper) { 14 | gradleVersion = '1.10' 15 | } 16 | 17 | apply plugin: 'android' 18 | 19 | repositories { 20 | mavenCentral() 21 | } 22 | 23 | android { 24 | compileSdkVersion 19 25 | buildToolsVersion "19.1.0" 26 | sourceSets { 27 | main{ 28 | manifest.srcFile 'AndroidManifest.xml' 29 | java.srcDirs = ['src'] 30 | resources.srcDirs = ['src'] 31 | aidl.srcDirs = ['src'] 32 | renderscript.srcDirs = ['src'] 33 | res.srcDirs = ['res'] 34 | assets.srcDirs = ['assets'] 35 | } 36 | } 37 | } 38 | 39 | dependencies { 40 | compile 'com.android.support:support-v4:19.1.0' 41 | compile 'com.android.support:appcompat-v7:19.1.0' 42 | compile 'com.baasbox:baasbox-android:0.8.+' 43 | } 44 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Jan 28 09:45:04 CET 2014 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http\://services.gradle.org/distributions/gradle-1.10-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /libs/android-support-v4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/libs/android-support-v4.jar -------------------------------------------------------------------------------- /libs/baasbox-android-0.7.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/libs/baasbox-android-0.7.3.jar -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baasbox/DearDiary-Android/0a6af798065e15e84742d804fad954523de7fd5e/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/layout/activity_diary_details.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /res/layout/activity_diary_list.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /res/layout/activity_diary_panes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 19 | 20 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /res/layout/activity_edit_list.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 13 | 17 | 25 | 26 | 27 | 28 | 32 | 33 | 35 | 36 | 44 | 45 | 56 | 57 | 58 |