package com.pedrocarrillo.expensetracker.ui.expenses; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import com.pedrocarrillo.expensetracker.R; import com.pedrocarrillo.expensetracker.adapters.CategoriesSpinnerAdapter; import com.pedrocarrillo.expensetracker.entities.Category; import com.pedrocarrillo.expensetracker.entities.Expense; import com.pedrocarrillo.expensetracker.interfaces.IExpensesType; import com.pedrocarrillo.expensetracker.interfaces.IUserActionsMode; import com.pedrocarrillo.expensetracker.utils.DateUtils; import com.pedrocarrillo.expensetracker.utils.DialogManager; import com.pedrocarrillo.expensetracker.utils.RealmManager; import com.pedrocarrillo.expensetracker.utils.Util; import com.pedrocarrillo.expensetracker.widget.ExpensesWidgetProvider; import com.pedrocarrillo.expensetracker.widget.ExpensesWidgetService; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Created by pcarrillo on 21/09/2015. */ public class NewExpenseFragment extends DialogFragment implements View.OnClickListener{ private TextView tvTitle; private Button btnDate; private Spinner spCategory; private EditText etDescription; private EditText etTotal; private CategoriesSpinnerAdapter mCategoriesSpinnerAdapter; private Date selectedDate; private Expense mExpense; private @IUserActionsMode int mUserActionMode; private @IExpensesType int mExpenseType; static NewExpenseFragment newInstance(@IUserActionsMode int mode, String expenseId) { NewExpenseFragment newExpenseFragment = new NewExpenseFragment(); Bundle bundle = new Bundle(); bundle.putInt(IUserActionsMode.MODE_TAG, mode); if (expenseId != null) bundle.putString(ExpenseDetailFragment.EXPENSE_ID_KEY, expenseId); newExpenseFragment.setArguments(bundle); return newExpenseFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_dialog_new_expense, container, false); tvTitle = (TextView)rootView.findViewById(R.id.tv_title); btnDate = (Button)rootView.findViewById(R.id.btn_date); spCategory = (Spinner)rootView.findViewById(R.id.sp_categories); etDescription = (EditText)rootView.findViewById(R.id.et_description); etTotal = (EditText)rootView.findViewById(R.id.et_total); mExpenseType = IExpensesType.MODE_EXPENSES; return rootView; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getArguments() != null) { mUserActionMode = getArguments().getInt(IUserActionsMode.MODE_TAG) == IUserActionsMode.MODE_CREATE ? IUserActionsMode.MODE_CREATE : IUserActionsMode.MODE_UPDATE; } setModeViews(); btnDate.setOnClickListener(this); (getView().findViewById(R.id.btn_cancel)).setOnClickListener(this); (getView().findViewById(R.id.btn_save)).setOnClickListener(this); } private void setModeViews() { List<Category> categoriesList = Category.getCategoriesExpense(); Category[] categoriesArray = new Category[categoriesList.size()]; categoriesArray = categoriesList.toArray(categoriesArray); mCategoriesSpinnerAdapter = new CategoriesSpinnerAdapter(getActivity(), categoriesArray); spCategory.setAdapter(mCategoriesSpinnerAdapter); switch (mUserActionMode) { case IUserActionsMode.MODE_CREATE: selectedDate = new Date(); break; case IUserActionsMode.MODE_UPDATE: if (getArguments() != null) { String id = getArguments().getString(ExpenseDetailFragment.EXPENSE_ID_KEY); mExpense = (Expense) RealmManager.getInstance().findById(Expense.class, id); tvTitle.setText("Edit"); selectedDate = mExpense.getDate(); etDescription.setText(mExpense.getDescription()); etTotal.setText(String.valueOf(mExpense.getTotal())); int categoryPosition = 0; for (int i=0; i<categoriesArray.length; i++) { if (categoriesArray[i].getId().equalsIgnoreCase(mExpense.getCategory().getId())) { categoryPosition = i; break; } } spCategory.setSelection(categoryPosition); } break; } updateDate(); } @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } } @Override public void onClick(View view) { if(view.getId() == R.id.btn_date) { showDateDialog(); } else if (view.getId() == R.id.btn_cancel) { dismiss(); } else if (view.getId() == R.id.btn_save) { onSaveExpense(); } } private void onSaveExpense() { if (mCategoriesSpinnerAdapter.getCount() > 0 ) { if (!Util.isEmptyField(etTotal)) { Category currentCategory = (Category) spCategory.getSelectedItem(); String total = etTotal.getText().toString(); String description = etDescription.getText().toString(); if (mUserActionMode == IUserActionsMode.MODE_CREATE) { RealmManager.getInstance().save(new Expense(description, selectedDate, mExpenseType, currentCategory, Float.parseFloat(total)), Expense.class); } else { Expense editExpense = new Expense(); editExpense.setId(mExpense.getId()); editExpense.setTotal(Float.parseFloat(total)); editExpense.setDescription(description); editExpense.setCategory(currentCategory); editExpense.setDate(selectedDate); RealmManager.getInstance().update(editExpense); } // update widget if the expense is created today if (DateUtils.isToday(selectedDate)) { Intent i = new Intent(getActivity(), ExpensesWidgetProvider.class); i.setAction(ExpensesWidgetService.UPDATE_WIDGET); getActivity().sendBroadcast(i); } getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null); dismiss(); } else { DialogManager.getInstance().showShortToast(getString(R.string.error_total)); } } else { DialogManager.getInstance().showShortToast(getString(R.string.no_categories_error)); } } private void showDateDialog() { final Calendar calendar = Calendar.getInstance(); calendar.setTime(selectedDate); DialogManager.getInstance().showDatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { calendar.set(year, month, day); selectedDate = calendar.getTime(); updateDate(); } }, calendar); } private void updateDate() { btnDate.setText(Util.formatDateToString(selectedDate, Util.getCurrentDateFormat())); } }