diff --git a/.gitignore b/.gitignore
index a8b0d1d..d3c6c1b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,45 @@ google-services.json
# Android Profiling
*.hprof
+## Suggested ^^
+
+## From TicTacToe project for good measure. vv
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Log/OS Files
+*.log
+
+# Android Studio generated files and folders
+captures/
+.externalNativeBuild/
+.cxx/
+*.apk
+output.json
+
+# IntelliJ
+*.iml
+.idea/
+misc.xml
+deploymentTargetDropDown.xml
+render.experimental.xml
+
+# Keystore files
+*.jks
+*.keystore
+
+# Google Services (e.g. APIs or Firebase)
+google-services.json
+
+# Android Profiling
+*.hprof
+/app/debug/output-metadata.json
+
+# Ha!
+keystore/*
+release
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100755
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100755
index 0000000..f299b07
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,26 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.2"
+
+ defaultConfig {
+ applicationId "com.hyperling.apps.example_sqlite_addressbook"
+ minSdkVersion 18
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ testCompile 'junit:junit:4.12'
+ compile 'com.android.support:appcompat-v7:23.1.1'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100755
index 0000000..675df9e
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /home/ling/WDBlue/Programming/Java/Android/android-sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/app/src/androidTest/java/com/hyperling/apps/example_sqlite_addressbook/ApplicationTest.java b/app/src/androidTest/java/com/hyperling/apps/example_sqlite_addressbook/ApplicationTest.java
new file mode 100755
index 0000000..362bacc
--- /dev/null
+++ b/app/src/androidTest/java/com/hyperling/apps/example_sqlite_addressbook/ApplicationTest.java
@@ -0,0 +1,13 @@
+package com.hyperling.apps.example_sqlite_addressbook;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100755
index 0000000..8d51983
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/hyperling/apps/example_sqlite_addressbook/AddEditFragment.java b/app/src/main/java/com/hyperling/apps/example_sqlite_addressbook/AddEditFragment.java
new file mode 100755
index 0000000..a4ec766
--- /dev/null
+++ b/app/src/main/java/com/hyperling/apps/example_sqlite_addressbook/AddEditFragment.java
@@ -0,0 +1,154 @@
+package com.hyperling.apps.example_sqlite_addressbook;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+
+/**
+ * Created by ling on 12/13/15.
+ */
+public class AddEditFragment extends Fragment {
+ public interface AddEditFragmentListener {
+ public void onAddEditCompleted(long rowID);
+ }
+
+ private AddEditFragmentListener listener;
+
+ private long rowID;
+
+ private Bundle contactInfoBundle;
+
+ private EditText etName;
+ private EditText etPhone;
+ private EditText etEmail;
+ private EditText etStreet;
+ private EditText etCity;
+ private EditText etState;
+ private EditText etZip;
+
+ @Override
+ public void onAttach(Activity activity){
+ super.onAttach(activity);
+ listener = (AddEditFragmentListener) activity;
+ }
+
+ @Override
+ public void onDetach(){
+ super.onDetach();
+ listener = null;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
+ super.onCreateView(inflater, container, savedInstanceState);
+ setRetainInstance(true);
+ setHasOptionsMenu(true);
+
+ View view = inflater.inflate(R.layout.fragment_add_edit, container, false);
+ etName = (EditText) view.findViewById(R.id.et_name);
+ etPhone = (EditText) view.findViewById(R.id.et_phone);
+ etEmail = (EditText) view.findViewById(R.id.et_email);
+ etStreet = (EditText) view.findViewById(R.id.et_street);
+ etCity = (EditText) view.findViewById(R.id.et_city);
+ etState = (EditText) view.findViewById(R.id.et_state);
+ etZip = (EditText) view.findViewById(R.id.et_zip);
+
+ contactInfoBundle = getArguments();
+
+ if (contactInfoBundle != null){
+ rowID = contactInfoBundle.getLong(MainActivity.ROW_ID);
+ etName.setText(contactInfoBundle.getString("name"));
+ etPhone.setText(contactInfoBundle.getString("phone"));
+ etEmail.setText(contactInfoBundle.getString("email"));
+ etStreet.setText(contactInfoBundle.getString("street"));
+ etCity.setText(contactInfoBundle.getString("city"));
+ etState.setText(contactInfoBundle.getString("state"));
+ etZip.setText(contactInfoBundle.getString("zip"));
+ }
+
+ Button btnSave = (Button) view.findViewById(R.id.btn_save);
+ btnSave.setOnClickListener(saveButtonClicked);
+
+ return view;
+ }
+
+ View.OnClickListener saveButtonClicked = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (etName.getText().toString().trim().length() > 0){
+ AsyncTask