diff --git a/res/drawable-hdpi/ic_action_add.png b/res/drawable-hdpi/ic_action_add.png
index 6771494..affeaae 100644
Binary files a/res/drawable-hdpi/ic_action_add.png and b/res/drawable-hdpi/ic_action_add.png differ
diff --git a/res/drawable-mdpi/ic_action_add.png b/res/drawable-mdpi/ic_action_add.png
index 89d4935..0146a82 100644
Binary files a/res/drawable-mdpi/ic_action_add.png and b/res/drawable-mdpi/ic_action_add.png differ
diff --git a/res/drawable-xhdpi/ic_action_add.png b/res/drawable-xhdpi/ic_action_add.png
index 3cfb0e7..37a4bc7 100644
Binary files a/res/drawable-xhdpi/ic_action_add.png and b/res/drawable-xhdpi/ic_action_add.png differ
diff --git a/res/drawable-xxhdpi/ic_action_add.png b/res/drawable-xxhdpi/ic_action_add.png
index 3db423e..d63c3a8 100644
Binary files a/res/drawable-xxhdpi/ic_action_add.png and b/res/drawable-xxhdpi/ic_action_add.png differ
diff --git a/res/layout/fragment_dashboard.xml b/res/layout/fragment_dashboard.xml
index 2465440..8181dfc 100644
--- a/res/layout/fragment_dashboard.xml
+++ b/res/layout/fragment_dashboard.xml
@@ -1,158 +1,90 @@
-
+
+ android:id="@+id/tvLiquidAsset"
+ style="@style/DashboardLiquidAssetBalance"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:text="@string/sample_remaining_amount"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
+
+
+
+
+
+
+ android:text="@string/label_monthly_goals" />
+ android:id="@+id/tvMonthlyGoals"
+ style="@style/MediumAmount"
+ android:text="@string/sample_spent_today" />
+
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/res/layout/fragment_goals_list.xml b/res/layout/fragment_goals_list.xml
new file mode 100644
index 0000000..5d7b4a3
--- /dev/null
+++ b/res/layout/fragment_goals_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/item_goal.xml b/res/layout/item_goal.xml
new file mode 100644
index 0000000..e3750f5
--- /dev/null
+++ b/res/layout/item_goal.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 6ad6df0..da75083 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -7,5 +7,6 @@
#CCCCCC
#c1dbee
#165b8c
+ #23c7a1
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index aa98806..d76c6b4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6,17 +6,18 @@
Liquid Assets
Goals
Remaining
- Spent Today
+ SPENT TODAY
Spent this week
AVG $5.62 PER DAY
$234.64
$42.00
Lending Circle Bill
+ Lending Circle
Total Payment of
$35.00
Due On
JUL 25
- 2 DAYS FROM NOW
+ DUE IN 2 DAYS
You will receive
payment 5 of 10
@@ -46,6 +47,8 @@
Transaction saved!
Done saving goal.
date parsing issue
+ TOTAL LIQUID ASSETS
+ MONTHLY GOALS
Dashboard
Edit Profile
Profile
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 93d3ffe..9e33c59 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -25,7 +25,7 @@
- fill_parent
- wrap_content
-
+
-
+
-
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/src/org/missionassetfund/apps/android/activities/GoalDetailsActivity.java b/src/org/missionassetfund/apps/android/activities/GoalDetailsActivity.java
index e49c385..12414d8 100644
--- a/src/org/missionassetfund/apps/android/activities/GoalDetailsActivity.java
+++ b/src/org/missionassetfund/apps/android/activities/GoalDetailsActivity.java
@@ -54,6 +54,7 @@ protected void onCreate(Bundle savedInstanceState) {
tvTargetDateHuman = (TextView) findViewById(R.id.tvTargetDateHuman);
lvPastPayments = (ListView) findViewById(R.id.lvPastPayments);
+ // TODO(amit) consume goal being set from the intent
// Goal will come from Dashboard. For now let's get one from parse
ParseQuery query = ParseQuery.getQuery(Goal.class);
query.whereEqualTo("user", (User) ParseUser.getCurrentUser());
diff --git a/src/org/missionassetfund/apps/android/adapters/GoalAdapter.java b/src/org/missionassetfund/apps/android/adapters/GoalAdapter.java
new file mode 100644
index 0000000..1f8d0b7
--- /dev/null
+++ b/src/org/missionassetfund/apps/android/adapters/GoalAdapter.java
@@ -0,0 +1,52 @@
+
+package org.missionassetfund.apps.android.adapters;
+
+import org.missionassetfund.apps.android.R;
+import org.missionassetfund.apps.android.models.Goal;
+import org.missionassetfund.apps.android.models.User;
+import org.missionassetfund.apps.android.utils.FormatterUtils;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.parse.ParseQuery;
+import com.parse.ParseQueryAdapter;
+
+public class GoalAdapter extends ParseQueryAdapter {
+
+ public GoalAdapter(Context context) {
+ super(context, new ParseQueryAdapter.QueryFactory() {
+ @Override
+ public ParseQuery create() {
+ ParseQuery query = ParseQuery.getQuery(Goal.class);
+ query.whereEqualTo("user", (User) User.getCurrentUser());
+ return query;
+ }
+ });
+ }
+
+ @Override
+ public View getItemView(Goal goal, View v, ViewGroup parent) {
+ if (v == null) {
+ v = View.inflate(getContext(), R.layout.item_goal, null);
+ }
+
+ super.getItemView(goal, v, parent);
+
+ // Look up view elements
+ TextView tvName = (TextView) v.findViewById(R.id.tvName);
+ TextView tvDueDate = (TextView) v.findViewById(R.id.tvDueDate);
+ TextView tvPaymentDue = (TextView) v.findViewById(R.id.tvPaymentDue);
+
+ // Populate Goal Item
+ tvName.setText(goal.getName());
+ // TODO(jose): Use goal due date buitl by amit. ATM just showing the Goal Date.
+ tvDueDate.setText(FormatterUtils.formatMonthDate(goal.getGoalDate()));
+ // TODO(jose): use CurrencyUtils.getCurrencyValueFormatted from felipe's PR
+ tvPaymentDue.setText(FormatterUtils.formatAmount(goal.getPaymentAmount()));
+
+ return v;
+ }
+}
diff --git a/src/org/missionassetfund/apps/android/fragments/DashboardFragment.java b/src/org/missionassetfund/apps/android/fragments/DashboardFragment.java
index c3ddb97..44e9e90 100644
--- a/src/org/missionassetfund/apps/android/fragments/DashboardFragment.java
+++ b/src/org/missionassetfund/apps/android/fragments/DashboardFragment.java
@@ -1,9 +1,11 @@
package org.missionassetfund.apps.android.fragments;
+import java.text.NumberFormat;
+
import org.missionassetfund.apps.android.R;
-import org.missionassetfund.apps.android.activities.GoalDetailsActivity;
import org.missionassetfund.apps.android.activities.LiquidAssetsActivity;
+import org.missionassetfund.apps.android.models.User;
import android.app.Activity;
import android.content.Intent;
@@ -15,11 +17,16 @@
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
public class DashboardFragment extends Fragment {
- private LinearLayout llGoal;
- private LinearLayout llLiquidAsset;
+ private RelativeLayout rlLiquidAsset;
+ private TextView tvLiquidAsset;
+ private TextView tvMonthlyGoals;
+ private TextView tvSpentToday;
+
+ private User currentUser;
public interface SwitchMainFragmentListener {
void SwitchToFragment(Class extends Fragment> klass);
@@ -30,17 +37,24 @@ public void onAttach(Activity activity) {
super.onAttach(activity);
}
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setHasOptionsMenu(true);
+
+ currentUser = (User) User.getCurrentUser();
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
- llGoal = (LinearLayout) view.findViewById(R.id.llGoal);
- llGoal.setOnClickListener(goalDetailsClickListener);
+ setupViews(view);
- llLiquidAsset = (LinearLayout) view.findViewById(R.id.llLiquidAsset);
- llLiquidAsset.setOnClickListener(liquidAssetClickListener);
+ rlLiquidAsset.setOnClickListener(liquidAssetClickListener);
+
+ setupUserData();
- setHasOptionsMenu(true);
return view;
}
@@ -50,6 +64,21 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.dashboard, menu);
}
+ private void setupViews(View v) {
+ rlLiquidAsset = (RelativeLayout) v.findViewById(R.id.rlLiquidAsset);
+ tvLiquidAsset = (TextView) v.findViewById(R.id.tvLiquidAsset);
+ tvMonthlyGoals = (TextView) v.findViewById(R.id.tvMonthlyGoals);
+ tvSpentToday = (TextView) v.findViewById(R.id.tvSpentToday);
+ }
+
+ private void setupUserData() {
+ // TODO(jose): investigate and potentially set up Parse Cloud Code to
+ // create custom functions that would do aggregate queries.
+ tvLiquidAsset.setText(getCurrencyValueFormatted(currentUser.getLiquidAssets()));
+ tvMonthlyGoals.setText(getCurrencyValueFormatted(60.5d));
+ tvSpentToday.setText(getCurrencyValueFormatted(-123.45d));
+ }
+
private OnClickListener liquidAssetClickListener = new OnClickListener() {
@Override
@@ -59,13 +88,9 @@ public void onClick(View v) {
}
};
- private OnClickListener goalDetailsClickListener = new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(getActivity(), GoalDetailsActivity.class);
- getActivity().startActivity(intent);
- }
- };
+ private String getCurrencyValueFormatted(Double value) {
+ NumberFormat baseFormat = NumberFormat.getCurrencyInstance();
+ return baseFormat.format(value);
+ }
}
diff --git a/src/org/missionassetfund/apps/android/fragments/GoalsListFragment.java b/src/org/missionassetfund/apps/android/fragments/GoalsListFragment.java
new file mode 100644
index 0000000..3e51d52
--- /dev/null
+++ b/src/org/missionassetfund/apps/android/fragments/GoalsListFragment.java
@@ -0,0 +1,57 @@
+
+package org.missionassetfund.apps.android.fragments;
+
+import org.missionassetfund.apps.android.R;
+import org.missionassetfund.apps.android.activities.GoalDetailsActivity;
+import org.missionassetfund.apps.android.adapters.GoalAdapter;
+import org.missionassetfund.apps.android.models.Goal;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+
+public class GoalsListFragment extends Fragment {
+
+ private ListView lvGoals;
+ private GoalAdapter goalAdapter;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ goalAdapter = new GoalAdapter(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.fragment_goals_list, container, false);
+
+ lvGoals = (ListView) v.findViewById(R.id.lvGoals);
+ lvGoals.setAdapter(goalAdapter);
+ goalAdapter.loadObjects();
+
+ setupListeners();
+
+ return v;
+ }
+
+ private void setupListeners() {
+ lvGoals.setOnItemClickListener(new OnItemClickListener() {
+
+ @Override
+ public void onItemClick(AdapterView> adapter, View parent, int position, long rowId) {
+ Goal goal = (Goal) adapter.getItemAtPosition(position);
+
+ Intent intent = new Intent(getActivity(), GoalDetailsActivity.class);
+ intent.putExtra(Goal.GOAL_KEY, goal);
+ getActivity().startActivity(intent);
+ }
+ });
+ }
+}
diff --git a/src/org/missionassetfund/apps/android/models/Goal.java b/src/org/missionassetfund/apps/android/models/Goal.java
index 2969db5..de85a05 100644
--- a/src/org/missionassetfund/apps/android/models/Goal.java
+++ b/src/org/missionassetfund/apps/android/models/Goal.java
@@ -10,6 +10,7 @@
@ParseClassName("Goal")
public class Goal extends ParseObject implements Serializable {
private static final long serialVersionUID = 6160272793326362343L;
+ public static final String GOAL_KEY = "goal";
public static final String USER_KEY = "user";
public static final String NAME_KEY = "name";
diff --git a/src/org/missionassetfund/apps/android/models/User.java b/src/org/missionassetfund/apps/android/models/User.java
index 7a8d771..e3d80b3 100644
--- a/src/org/missionassetfund/apps/android/models/User.java
+++ b/src/org/missionassetfund/apps/android/models/User.java
@@ -8,13 +8,12 @@
public class User extends ParseUser {
public static final String NAME_KEY = "name";
public static final String PHONE_NUMBER_KEY = "phoneNumber";
+ public static final String LIQUID_ASSETS_KEY = "liquidAssets";
public User() {
super();
}
- // TODO: determine where to store liquid asset data.
-
public String getName() {
return getString(NAME_KEY);
}
@@ -30,4 +29,13 @@ public String getPhoneNumber() {
public void setPhoneNumber(String phoneNumber) {
put(PHONE_NUMBER_KEY, phoneNumber);
}
+
+ // For now, lets store liquid assets within the user Obj
+ public Double getLiquidAssets() {
+ return getDouble(LIQUID_ASSETS_KEY);
+ }
+
+ public void setLiquidAssets(Double liquidAsset) {
+ put(LIQUID_ASSETS_KEY, liquidAsset);
+ }
}