diff --git a/.gitignore b/.gitignore
index ccf2efe..01afe3d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,12 @@
+<<<<<<< HEAD
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+=======
# Built application files
*.apk
*.ap_
@@ -25,3 +34,4 @@ proguard/
# Log Files
*.log
+>>>>>>> ac8e0a393d1ea8a8d5f7401afa3b0f8ca0829d02
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..d388799
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+robinhood_hackathon
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..9a8b7e5
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..1bbc21d
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..5689cf8
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.7
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..4ff6821
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/app.iml b/app/app.iml
new file mode 100644
index 0000000..3f67e83
--- /dev/null
+++ b/app/app.iml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..95d3768
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,30 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ applicationId "abassawo.c4q.nyc.fe_nyc"
+ minSdkVersion 15
+ targetSdkVersion 22
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:22.2.1'
+ compile 'com.android.support:design:22.2.0'
+ compile 'com.jakewharton:butterknife:7.0.1'
+ compile 'com.android.support:support-v4:22.2.1'
+ compile 'com.google.android.gms:play-services:7.5.0'
+ compile 'org.achartengine:achartengine:1.2.0'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..dcb04d2
--- /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 /Users/c4q-Abass/Library/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/abassawo/c4q/nyc/fe_nyc/ApplicationTest.java b/app/src/androidTest/java/abassawo/c4q/nyc/fe_nyc/ApplicationTest.java
new file mode 100644
index 0000000..7b0c3e1
--- /dev/null
+++ b/app/src/androidTest/java/abassawo/c4q/nyc/fe_nyc/ApplicationTest.java
@@ -0,0 +1,13 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+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 100644
index 0000000..84d0e52
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+ android:theme="@style/Theme.DesignDemo" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/assets/chart.html b/app/src/main/assets/chart.html
new file mode 100644
index 0000000..0fe4a60
--- /dev/null
+++ b/app/src/main/assets/chart.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetCalculator.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetCalculator.java
new file mode 100644
index 0000000..0f9699d
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetCalculator.java
@@ -0,0 +1,15 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+/**
+ * Created by c4q-Abass on 8/1/15.
+ */
+public class BudgetCalculator {
+ private int savingGoal;
+ private int spendable;
+ private int currentSavings;
+ private int income;
+
+ public BudgetCalculator(double income){
+
+ }
+}
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetViewFragment.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetViewFragment.java
new file mode 100644
index 0000000..a7c52bb
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/BudgetViewFragment.java
@@ -0,0 +1,76 @@
+
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.graphics.Color;
+import android.graphics.drawable.AnimationDrawable;
+import android.net.Uri;
+import android.os.Bundle;
+
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import org.achartengine.ChartFactory;
+import org.achartengine.GraphicalView;
+import org.achartengine.model.CategorySeries;
+import org.achartengine.model.SeriesSelection;
+import org.achartengine.renderer.DefaultRenderer;
+import org.achartengine.renderer.SimpleSeriesRenderer;
+
+public class BudgetViewFragment extends Fragment {
+ public WebView webView;
+ public ImageView goalImage;
+
+
+ @SuppressLint("SetJavaScriptEnabled")
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ final View myInflatedView = inflater.inflate(R.layout.fragment_budget_view, container, false);
+
+ goalImage = (ImageView)myInflatedView.findViewById(R.id.goal);
+ goalImage.setBackgroundResource(R.drawable.goal_animation);
+ AnimationDrawable frameAnimation = (AnimationDrawable) goalImage.getBackground();
+ frameAnimation.start();
+
+ webView = (WebView) myInflatedView.findViewById(R.id.web);
+ webView.addJavascriptInterface(new WebAppInterface(), "Android");
+
+ webView.getSettings().setJavaScriptEnabled(true);
+ webView.loadUrl("file:///android_asset/chart.html");
+
+ return myInflatedView;
+ }
+
+
+ public class WebAppInterface {
+
+ @JavascriptInterface
+ public int getNum1() {
+ return 320;
+ }
+
+ @JavascriptInterface
+ public int getNum2() {
+ return 1285;
+ }
+
+ @JavascriptInterface
+ public int getNum3() {
+ return 115;
+ }
+
+ }
+}
+
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ExpenseFragment.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ExpenseFragment.java
new file mode 100644
index 0000000..9841033
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ExpenseFragment.java
@@ -0,0 +1,78 @@
+
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Activities that contain this fragment must implement the
+ * {@link ExpenseFragment.OnFragmentInteractionListener} interface
+ * to handle interaction events.
+ * Use the {@link ExpenseFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class ExpenseFragment extends Fragment {
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment ExpenseFragment.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static ExpenseFragment newInstance(String param1, String param2) {
+ ExpenseFragment fragment = new ExpenseFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+
+ public ExpenseFragment() {
+ // Required empty public constructor
+ }
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_expense, container, false);
+ }
+
+
+
+
+
+
+}
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LandingPageActivity.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LandingPageActivity.java
new file mode 100644
index 0000000..ea568f5
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LandingPageActivity.java
@@ -0,0 +1,22 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.app.FragmentManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by c4q-Abass on 8/1/15.
+ */
+public class LandingPageActivity extends Activity {
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_landing_page);
+ }
+}
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LoginFragment.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LoginFragment.java
new file mode 100644
index 0000000..b7c5c96
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/LoginFragment.java
@@ -0,0 +1,166 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.support.v4.app.Fragment;
+
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.annotation.TargetApi;
+
+
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ContentResolver;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+
+import android.os.Bundle;
+
+import android.support.v4.app.FragmentManager;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import android.support.annotation.Nullable;
+
+import android.support.v4.app.Fragment;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.google.android.gms.common.SignInButton;
+
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+/**
+ * A login screen that offers login via email/password and via Google+ sign in.
+ *
+ * ************ IMPORTANT SETUP NOTES: ************
+ * In order for Google+ sign in to work with your app, you must first go to:
+ * https://developers.google.com/+/mobile/android/getting-started#step_1_enable_the_google_api
+ * and follow the steps in "Step 1" to create an OAuth 2.0 client for your package.
+ */
+
+
+public class LoginFragment extends Fragment {
+
+ @Bind(R.id.email_sign_in_button)
+ Button signInBtn;
+ /**
+ * A dummy authentication store containing known user names and passwords.
+ * TODO: remove after connecting to a real authentication system.
+ */
+
+ public LoginFragment(){
+
+ }
+
+ private static final String[] DUMMY_CREDENTIALS = new String[]{
+ "foo@example.com:hello", "bar@example.com:world"
+ };
+ /**
+ * Keep track of the login task to ensure we can cancel it if requested.
+ */
+ private UserLoginTask mAuthTask = null;
+
+
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_login, container, false);
+ ButterKnife.bind(this, view);
+ signInBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_container, new ExpenseFragment())
+ .addToBackStack(null) //allows user to press back button and return to previous fragment
+ .commit();
+
+ }
+ });
+ return view;
+ }
+
+
+
+ private boolean isEmailValid(String email) {
+ //TODO: Replace this with your own logic
+ return email.contains("@");
+ }
+
+ private boolean isPasswordValid(String password) {
+ //TODO: Replace this with your own logic
+ return password.length() > 4;
+ }
+
+ /**
+ * Shows the progress UI and hides the login form.
+ */
+
+
+
+ private void addEmailsToAutoComplete(List emailAddressCollection) {
+ //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
+ // ArrayAdapter adapter =
+// new ArrayAdapter(LoginActivity.this,
+// android.R.layout.simple_dropdown_item_1line, emailAddressCollection);
+
+ // mEmailView.setAdapter(adapter);
+ }
+
+ /**
+ * Represents an asynchronous login/registration task used to authenticate
+ * the user.
+ */
+ public class UserLoginTask extends AsyncTask {
+
+ private final String mEmail;
+ private final String mPassword;
+
+ UserLoginTask(String email, String password) {
+ mEmail = email;
+ mPassword = password;
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ // TODO: attempt authentication against a network service.
+
+ try {
+ // Simulate network access.
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ return false;
+ }
+
+ for (String credential : DUMMY_CREDENTIALS) {
+ String[] pieces = credential.split(":");
+ if (pieces[0].equals(mEmail)) {
+ // Account exists, return true if the password matches.
+ return pieces[1].equals(mPassword);
+ }
+ }
+
+ // TODO: register the new account here.
+ return true;
+ }
+
+ }
+}
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/MainActivity.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/MainActivity.java
new file mode 100644
index 0000000..ae06563
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/MainActivity.java
@@ -0,0 +1,190 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.content.Intent;
+import android.support.design.widget.NavigationView;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBar;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.app.Activity;
+import android.view.View;
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+
+public class MainActivity extends AppCompatActivity {
+ @Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout;
+ private CharSequence mTitle;
+ NavigationView navigationView;
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ private FragmentManager fragmentManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ ButterKnife.bind(this);
+ mTitle = getTitle();
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name) {
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+
+ invalidateOptionsMenu();
+ }
+ };
+
+
+ navigationView = (NavigationView) findViewById(R.id.nav_view);
+ if (navigationView != null) {
+ setupDrawerContent(navigationView);
+ }
+
+ final ActionBar actionBar = getSupportActionBar();
+ actionBar.isHideOnContentScrollEnabled();
+ actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
+ actionBar.setTitle(getString(R.string.app_name));
+ actionBar.setLogo(R.drawable.fe_nyc_logo);
+ actionBar.setIcon(R.drawable.fe_nyc_logo);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+
+
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .add(R.id.main_container, new LoginFragment())
+ .addToBackStack(null) //allows user to press back button and return to previous fragment
+ .commit();
+
+ }
+
+
+
+ private void setupDrawerContent(NavigationView navigationView) {
+ fragmentManager = getSupportFragmentManager();
+ navigationView.setNavigationItemSelectedListener(
+ new NavigationView.OnNavigationItemSelectedListener() {
+ @Override
+ public boolean onNavigationItemSelected(MenuItem menuItem) {
+ menuItem.setChecked(true);
+ if (menuItem.getItemId() == R.id.nav_wallet){
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_container, new WalletFragment())//allows user to press back button and return to previous fragment
+ .commit();
+ } else if(menuItem.getItemId() == R.id.nav_expense){
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_container, new ExpenseFragment())
+ //allows user to press back button and return to previous fragment
+
+ .commit();
+ } else if(menuItem.getItemId() == R.id.nav_resources){
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_container, new ResourcesFragment())//allows user to press back button and return to previous fragment
+ .commit();
+ } else if((menuItem.getItemId() == R.id.nav_settings)){
+ Intent intent = new Intent(getApplicationContext(), SettingsActivity.class);
+ startActivity(intent);
+ }
+ mDrawerLayout.closeDrawers();
+ return true;
+ }
+ });
+ }
+
+
+
+ public void restoreActionBar() {
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(mTitle);
+ }
+
+
+
+
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return super.onCreateOptionsMenu(menu);
+
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+ if (id == R.id.action_log_out) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ public void onSectionAttached(int number) {
+ switch (number) {
+ case 4:
+ mTitle = ("Expenses");
+ break;
+ case 2:
+ mTitle = ("Budget");
+ break;
+ case 3:
+ mTitle = ("Settings");
+ break;
+ case 1:
+ mTitle = ("Resources");
+ break;
+ }
+ }
+
+ /**
+ * A placeholder fragment containing a simple view.
+ */
+ public static class PlaceholderFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_SECTION_NUMBER = "section_number";
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static PlaceholderFragment newInstance(int sectionNumber) {
+ PlaceholderFragment fragment = new PlaceholderFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_SECTION_NUMBER, sectionNumber);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ public PlaceholderFragment() {
+ }
+
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ ((MainActivity) activity).onSectionAttached(
+ getArguments().getInt(ARG_SECTION_NUMBER));
+ }
+ }
+
+}
+
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ResourcesFragment.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ResourcesFragment.java
new file mode 100644
index 0000000..b9d3861
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/ResourcesFragment.java
@@ -0,0 +1,79 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+
+
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Activities that contain this fragment must implement the
+ * {@link ResourcesFragment.OnFragmentInteractionListener} interface
+ * to handle interaction events.
+ * Use the {@link ResourcesFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class ResourcesFragment extends Fragment {
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment ResourcesFragment.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static ResourcesFragment newInstance(String param1, String param2) {
+ ResourcesFragment fragment = new ResourcesFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+
+ public ResourcesFragment() {
+ // Required empty public constructor
+ }
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_resources, container, false);
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/SettingsActivity.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/SettingsActivity.java
new file mode 100644
index 0000000..cc5759a
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/SettingsActivity.java
@@ -0,0 +1,259 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+import android.preference.RingtonePreference;
+import android.text.TextUtils;
+
+
+import java.util.List;
+
+/**
+ * A {@link PreferenceActivity} that presents a set of application settings. On
+ * handset devices, settings are presented as a single list. On tablets,
+ * settings are split by category, with category headers shown to the left of
+ * the list of settings.
+ *
+ * See
+ * Android Design: Settings for design guidelines and the Settings
+ * API Guide for more information on developing a Settings UI.
+ */
+public class SettingsActivity extends PreferenceActivity {
+ /**
+ * Determines whether to always show the simplified settings UI, where
+ * settings are presented in a single list. When false, settings are shown
+ * as a master/detail two-pane view on tablets. When true, a single pane is
+ * shown on tablets.
+ */
+ private static final boolean ALWAYS_SIMPLE_PREFS = false;
+
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ setupSimplePreferencesScreen();
+ }
+
+ /**
+ * Shows the simplified settings UI if the device configuration if the
+ * device configuration dictates that a simplified, single-pane UI should be
+ * shown.
+ */
+ private void setupSimplePreferencesScreen() {
+ if (!isSimplePreferences(this)) {
+ return;
+ }
+
+ // In the simplified UI, fragments are not used at all and we instead
+ // use the older PreferenceActivity APIs.
+
+ // Add 'general' preferences.
+ addPreferencesFromResource(R.xml.pref_general);
+
+ // Add 'notifications' preferences, and a corresponding header.
+ PreferenceCategory fakeHeader = new PreferenceCategory(this);
+ fakeHeader.setTitle(R.string.pref_header_notifications);
+ getPreferenceScreen().addPreference(fakeHeader);
+ addPreferencesFromResource(R.xml.pref_notification);
+
+ // Add 'data and sync' preferences, and a corresponding header.
+ fakeHeader = new PreferenceCategory(this);
+ fakeHeader.setTitle(R.string.pref_header_data_sync);
+ getPreferenceScreen().addPreference(fakeHeader);
+ addPreferencesFromResource(R.xml.pref_data_sync);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences to
+ // their values. When their values change, their summaries are updated
+ // to reflect the new value, per the Android Design guidelines.
+ bindPreferenceSummaryToValue(findPreference("example_text"));
+ //bindPreferenceSummaryToValue(findPreference("example_list"));
+// bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
+// bindPreferenceSummaryToValue(findPreference("sync_frequency"));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onIsMultiPane() {
+ return isXLargeTablet(this) && !isSimplePreferences(this);
+ }
+
+ /**
+ * Helper method to determine if the device has an extra-large screen. For
+ * example, 10" tablets are extra-large.
+ */
+ private static boolean isXLargeTablet(Context context) {
+ return (context.getResources().getConfiguration().screenLayout
+ & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
+ }
+
+ /**
+ * Determines whether the simplified settings UI should be shown. This is
+ * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
+ * doesn't have newer APIs like {@link PreferenceFragment}, or the device
+ * doesn't have an extra-large screen. In these cases, a single-pane
+ * "simplified" settings UI should be shown.
+ */
+ private static boolean isSimplePreferences(Context context) {
+ return ALWAYS_SIMPLE_PREFS
+ || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
+ || !isXLargeTablet(context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public void onBuildHeaders(List target) {
+ if (!isSimplePreferences(this)) {
+ loadHeadersFromResource(R.xml.pref_headers, target);
+ }
+ }
+
+ /**
+ * A preference value change listener that updates the preference's summary
+ * to reflect its new value.
+ */
+ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ String stringValue = value.toString();
+
+ if (preference instanceof ListPreference) {
+ // For list preferences, look up the correct display value in
+ // the preference's 'entries' list.
+ ListPreference listPreference = (ListPreference) preference;
+ int index = listPreference.findIndexOfValue(stringValue);
+
+ // Set the summary to reflect the new value.
+ preference.setSummary(
+ index >= 0
+ ? listPreference.getEntries()[index]
+ : null);
+
+ } else if (preference instanceof RingtonePreference) {
+ // For ringtone preferences, look up the correct display value
+ // using RingtoneManager.
+ if (TextUtils.isEmpty(stringValue)) {
+ // Empty values correspond to 'silent' (no ringtone).
+ preference.setSummary(R.string.pref_ringtone_silent);
+
+ } else {
+ Ringtone ringtone = RingtoneManager.getRingtone(
+ preference.getContext(), Uri.parse(stringValue));
+
+ if (ringtone == null) {
+ // Clear the summary if there was a lookup error.
+ preference.setSummary(null);
+ } else {
+ // Set the summary to reflect the new ringtone display
+ // name.
+ String name = ringtone.getTitle(preference.getContext());
+ preference.setSummary(name);
+ }
+ }
+
+ } else {
+ // For all other preferences, set the summary to the value's
+ // simple string representation.
+ preference.setSummary(stringValue);
+ }
+ return true;
+ }
+ };
+
+ /**
+ * Binds a preference's summary to its value. More specifically, when the
+ * preference's value is changed, its summary (line of text below the
+ * preference title) is updated to reflect the value. The summary is also
+ * immediately updated upon calling this method. The exact display format is
+ * dependent on the type of preference.
+ *
+ * @see #sBindPreferenceSummaryToValueListener
+ */
+ private static void bindPreferenceSummaryToValue(Preference preference) {
+ // Set the listener to watch for value changes.
+ preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
+
+ // Trigger the listener immediately with the preference's
+ // current value.
+ sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
+ PreferenceManager
+ .getDefaultSharedPreferences(preference.getContext())
+ .getString(preference.getKey(), ""));
+ }
+
+ /**
+ * This fragment shows general preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class GeneralPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_general);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ bindPreferenceSummaryToValue(findPreference("example_text"));
+ //bindPreferenceSummaryToValue(findPreference("example_list"));
+ }
+ }
+
+ /**
+ * This fragment shows notification preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class NotificationPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_notification);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ //bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
+ }
+ }
+
+ /**
+ * This fragment shows data and sync preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class DataSyncPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_data_sync);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ bindPreferenceSummaryToValue(findPreference("sync_frequency"));
+ }
+ }
+}
diff --git a/app/src/main/java/abassawo/c4q/nyc/fe_nyc/WalletFragment.java b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/WalletFragment.java
new file mode 100644
index 0000000..0a6cf84
--- /dev/null
+++ b/app/src/main/java/abassawo/c4q/nyc/fe_nyc/WalletFragment.java
@@ -0,0 +1,106 @@
+package abassawo.c4q.nyc.fe_nyc;
+
+import android.os.Bundle;
+
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+public class WalletFragment extends Fragment {
+ String strCash;
+ boolean addCash;
+ double cashInWallet, transactionCash, savings, monthlyWallet = 300;
+ Button add, minus, calculate;
+ ImageView tree;
+ TextView cashDisplay, warning;
+ EditText enterAmount;
+
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+
+ final View myInflatedView = inflater.inflate(R.layout.fragment_wallet, container, false);
+
+ add = (Button) myInflatedView.findViewById(R.id.add_button);
+ minus = (Button) myInflatedView.findViewById(R.id.minus_button);
+ calculate = (Button) myInflatedView.findViewById(R.id.calculate);
+ tree = (ImageView) myInflatedView.findViewById(R.id.tree);
+ cashDisplay = (TextView) myInflatedView.findViewById(R.id.wallet_money);
+ warning = (TextView) myInflatedView.findViewById(R.id.warning);
+ enterAmount = (EditText) myInflatedView.findViewById(R.id.enter_amount);
+
+ //TODO get cash amount from shared preferences
+
+ cashDisplay.setText(String.valueOf(cashInWallet));
+
+ minus.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ enterAmount.setVisibility(View.VISIBLE);
+ calculate.setVisibility(View.VISIBLE);
+ addCash = false;
+ }
+ });
+
+ add.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ enterAmount.setVisibility(View.VISIBLE);
+ calculate.setVisibility(View.VISIBLE);
+ addCash = true;
+ }
+ });
+
+ calculate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ transactionCash = Double.parseDouble(enterAmount.getText().toString());
+
+ if (addCash) {
+ cashInWallet = cashInWallet + transactionCash;
+ } else {
+ cashInWallet = cashInWallet - transactionCash;
+ if (cashInWallet < 0) {
+ cashInWallet = 0.0;
+ }
+ }
+ cashDisplay.setText(String.valueOf(cashInWallet));
+ enterAmount.setText("");
+ enterAmount.setVisibility(View.GONE);
+ calculate.setVisibility(View.GONE);
+
+ double cashPercentage = (cashInWallet / monthlyWallet) * 100;
+
+ if (cashPercentage > 80) {
+ tree.setBackgroundResource(R.drawable.tree_full);
+ warning.setVisibility(View.GONE);
+ } else if (cashPercentage > 60) {
+ tree.setBackgroundResource(R.drawable.tree_60);
+ warning.setVisibility(View.GONE);
+ } else if (cashPercentage > 40) {
+ tree.setBackgroundResource(R.drawable.tree_40);
+ warning.setVisibility(View.GONE);
+ } else if (cashPercentage > 20) {
+ tree.setBackgroundResource(R.drawable.tree_20);
+ warning.setVisibility(View.GONE);
+ } else {
+ tree.setBackgroundResource(R.drawable.tree_empty);
+ warning.setVisibility(View.VISIBLE);
+
+ }
+ }
+ });
+
+ return myInflatedView;
+ }
+
+
+}
+
+
+
diff --git a/app/src/main/res/drawable/a_new_car_1.png b/app/src/main/res/drawable/a_new_car_1.png
new file mode 100644
index 0000000..f5005b1
Binary files /dev/null and b/app/src/main/res/drawable/a_new_car_1.png differ
diff --git a/app/src/main/res/drawable/a_new_car_2.png b/app/src/main/res/drawable/a_new_car_2.png
new file mode 100644
index 0000000..02464d6
Binary files /dev/null and b/app/src/main/res/drawable/a_new_car_2.png differ
diff --git a/app/src/main/res/drawable/a_new_car_3.png b/app/src/main/res/drawable/a_new_car_3.png
new file mode 100644
index 0000000..f6eb3ab
Binary files /dev/null and b/app/src/main/res/drawable/a_new_car_3.png differ
diff --git a/app/src/main/res/drawable/a_new_car_4.png b/app/src/main/res/drawable/a_new_car_4.png
new file mode 100644
index 0000000..ce21855
Binary files /dev/null and b/app/src/main/res/drawable/a_new_car_4.png differ
diff --git a/app/src/main/res/drawable/arrow.jpg b/app/src/main/res/drawable/arrow.jpg
new file mode 100644
index 0000000..65a75a6
Binary files /dev/null and b/app/src/main/res/drawable/arrow.jpg differ
diff --git a/app/src/main/res/drawable/button_normal.jpg b/app/src/main/res/drawable/button_normal.jpg
new file mode 100644
index 0000000..364ca23
Binary files /dev/null and b/app/src/main/res/drawable/button_normal.jpg differ
diff --git a/app/src/main/res/drawable/button_pressed.jpg b/app/src/main/res/drawable/button_pressed.jpg
new file mode 100644
index 0000000..c5e4cf5
Binary files /dev/null and b/app/src/main/res/drawable/button_pressed.jpg differ
diff --git a/app/src/main/res/drawable/custom_button.xml b/app/src/main/res/drawable/custom_button.xml
new file mode 100644
index 0000000..b5d20ca
--- /dev/null
+++ b/app/src/main/res/drawable/custom_button.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/fe_nyc_logo.png b/app/src/main/res/drawable/fe_nyc_logo.png
new file mode 100644
index 0000000..13bab65
Binary files /dev/null and b/app/src/main/res/drawable/fe_nyc_logo.png differ
diff --git a/app/src/main/res/drawable/goal_animation.xml b/app/src/main/res/drawable/goal_animation.xml
new file mode 100644
index 0000000..3bbf4a1
--- /dev/null
+++ b/app/src/main/res/drawable/goal_animation.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_menu.png b/app/src/main/res/drawable/ic_menu.png
new file mode 100644
index 0000000..c62db8c
Binary files /dev/null and b/app/src/main/res/drawable/ic_menu.png differ
diff --git a/app/src/main/res/drawable/moneytrees.jpg b/app/src/main/res/drawable/moneytrees.jpg
new file mode 100644
index 0000000..b7a7159
Binary files /dev/null and b/app/src/main/res/drawable/moneytrees.jpg differ
diff --git a/app/src/main/res/drawable/moneytrees.png b/app/src/main/res/drawable/moneytrees.png
new file mode 100644
index 0000000..4392e55
Binary files /dev/null and b/app/src/main/res/drawable/moneytrees.png differ
diff --git a/app/src/main/res/drawable/progress_bar.png b/app/src/main/res/drawable/progress_bar.png
new file mode 100644
index 0000000..abff577
Binary files /dev/null and b/app/src/main/res/drawable/progress_bar.png differ
diff --git a/app/src/main/res/drawable/tree_20.jpg b/app/src/main/res/drawable/tree_20.jpg
new file mode 100644
index 0000000..06fa7b9
Binary files /dev/null and b/app/src/main/res/drawable/tree_20.jpg differ
diff --git a/app/src/main/res/drawable/tree_40.jpg b/app/src/main/res/drawable/tree_40.jpg
new file mode 100644
index 0000000..bf78cf0
Binary files /dev/null and b/app/src/main/res/drawable/tree_40.jpg differ
diff --git a/app/src/main/res/drawable/tree_60.jpg b/app/src/main/res/drawable/tree_60.jpg
new file mode 100644
index 0000000..86e8a5a
Binary files /dev/null and b/app/src/main/res/drawable/tree_60.jpg differ
diff --git a/app/src/main/res/drawable/tree_80.jpg b/app/src/main/res/drawable/tree_80.jpg
new file mode 100644
index 0000000..c67f576
Binary files /dev/null and b/app/src/main/res/drawable/tree_80.jpg differ
diff --git a/app/src/main/res/drawable/tree_empty.jpg b/app/src/main/res/drawable/tree_empty.jpg
new file mode 100644
index 0000000..cc3ba76
Binary files /dev/null and b/app/src/main/res/drawable/tree_empty.jpg differ
diff --git a/app/src/main/res/drawable/tree_full.jpg b/app/src/main/res/drawable/tree_full.jpg
new file mode 100644
index 0000000..f4389c2
Binary files /dev/null and b/app/src/main/res/drawable/tree_full.jpg differ
diff --git a/app/src/main/res/layout/activity_landing_page.xml b/app/src/main/res/layout/activity_landing_page.xml
new file mode 100644
index 0000000..dccd9fd
--- /dev/null
+++ b/app/src/main/res/layout/activity_landing_page.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..8b17680
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_budget_view.xml b/app/src/main/res/layout/fragment_budget_view.xml
new file mode 100644
index 0000000..9cfe280
--- /dev/null
+++ b/app/src/main/res/layout/fragment_budget_view.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_expense.xml b/app/src/main/res/layout/fragment_expense.xml
new file mode 100644
index 0000000..456ed7b
--- /dev/null
+++ b/app/src/main/res/layout/fragment_expense.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ android:text="EXPENSE FRAGMENT" />
+
+
+
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
new file mode 100644
index 0000000..d52d9b7
--- /dev/null
+++ b/app/src/main/res/layout/fragment_login.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_resources.xml b/app/src/main/res/layout/fragment_resources.xml
new file mode 100644
index 0000000..e9ef75b
--- /dev/null
+++ b/app/src/main/res/layout/fragment_resources.xml
@@ -0,0 +1,13 @@
+
+
+
+
+=======
+ android:text="Resource Fragment" />
+
+
+
diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml
new file mode 100644
index 0000000..97dcf22
--- /dev/null
+++ b/app/src/main/res/layout/fragment_wallet.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/nav_header.xml b/app/src/main/res/layout/nav_header.xml
new file mode 100644
index 0000000..e538a25
--- /dev/null
+++ b/app/src/main/res/layout/nav_header.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/toolbarlayout.xml b/app/src/main/res/layout/toolbarlayout.xml
new file mode 100644
index 0000000..da2caa6
--- /dev/null
+++ b/app/src/main/res/layout/toolbarlayout.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/drawer_view.xml b/app/src/main/res/menu/drawer_view.xml
new file mode 100644
index 0000000..7309014
--- /dev/null
+++ b/app/src/main/res/menu/drawer_view.xml
@@ -0,0 +1,48 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000..79b8edd
--- /dev/null
+++ b/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6090ba8
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,39 @@
+
+ Fe NYC
+
+ Hello world!
+ Settings
+ Sally
+
+
+ Hello blank fragment
+
+ Sign in
+
+
+ Email
+ Password (optional)
+ Sign in or register
+ Sign in
+ Switch Google+ account
+ Disconnect from Google+
+ This email address is invalid
+ This password is too short
+ This password is incorrect
+ This field is required
+
+
+
+ Your spending cash is low, click on resources tab to learn money saving opportunities
+ Monthly Wallet
+ $175
+ Subtract from Wallet
+ Add to Wallet
+
+
+ Your Goal Progress: 0%
+ You Are Here
+ Your Recommended Monthly Savings: $320
+
+ Log Out
+
diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml
new file mode 100644
index 0000000..cb3f8ea
--- /dev/null
+++ b/app/src/main/res/values/strings_activity_settings.xml
@@ -0,0 +1,61 @@
+
+ Settings
+
+
+
+
+ General
+
+ Enable social recommendations
+ Recommendations for people to contact
+ based on your message history
+
+
+ Display name
+ Sally
+
+ Add friends to messages
+
+ - Always
+ - When possible
+ - Never
+
+
+ - 1
+ - 0
+ - -1
+
+
+
+ Data & sync
+
+ Sync frequency
+
+ - 15 minutes
+ - 30 minutes
+ - 1 hour
+ - 3 hours
+ - 6 hours
+ - Never
+
+
+ - 15
+ - 30
+ - 60
+ - 180
+ - 360
+ - -1
+
+
+ System sync settings
+
+
+ Notifications
+
+ New message notifications
+
+ Ringtone
+ Silent
+
+ Vibrate
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..a74913f
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_data_sync.xml b/app/src/main/res/xml/pref_data_sync.xml
new file mode 100644
index 0000000..ffda831
--- /dev/null
+++ b/app/src/main/res/xml/pref_data_sync.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
new file mode 100644
index 0000000..eeee65a
--- /dev/null
+++ b/app/src/main/res/xml/pref_general.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml
new file mode 100644
index 0000000..cfe4de0
--- /dev/null
+++ b/app/src/main/res/xml/pref_headers.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_notification.xml b/app/src/main/res/xml/pref_notification.xml
new file mode 100644
index 0000000..b4b8cae
--- /dev/null
+++ b/app/src/main/res/xml/pref_notification.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..49c2ebd
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,29 @@
+// 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:1.2.3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+ repositories {
+ maven {
+ url "https://repository-achartengine.forge.cloudbees.com/snapshot/"
+ }
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+ repositories {
+ maven {
+ url "https://repository-achartengine.forge.cloudbees.com/snapshot/"
+ }
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/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
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+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"`
+
+ # 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/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/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/robinhood_hackathon.iml b/robinhood_hackathon.iml
new file mode 100644
index 0000000..27857e4
--- /dev/null
+++ b/robinhood_hackathon.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'