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 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); + } }