package com.hci.moola; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.Switch; import android.widget.Toast; import com.hci.moola.model.DataCollector; import com.hci.moola.model.PostOffice; import com.hci.moola.model.Transaction; import java.text.NumberFormat; import java.text.ParseException; import java.util.Calendar; public class EditIouActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_iou); getActionBar().setTitle("Add IOU"); if (savedInstanceState == null) { Transaction model = (Transaction) PostOffice.getMessage(this.getClass()); EditIouFragment f = EditIouFragment.newInstance(model); // can be null getFragmentManager().beginTransaction() .add(R.id.container, f, f.getClass().getName()) .commit(); } DataCollector.getInstance().attachTouchCounterToActivity(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_edit_iou, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_save) { EditIouFragment f = (EditIouFragment) getFragmentManager().findFragmentByTag(EditIouFragment.class.getName()); Transaction t = f.getModel(); int result = t.isValid(); switch (result) { case 0: PostOffice.putMessage(IouListActivity.class, t); setResult(Activity.RESULT_OK); finish(); break; case Transaction.ERROR_NO_PERSON: Toast.makeText(this, "You must enter a name.", Toast.LENGTH_LONG).show(); break; case Transaction.ERROR_NO_DESCRIPTION: Toast.makeText(this, "You must enter an amount or description.", Toast.LENGTH_LONG).show(); break; } return true; } else if (id == android.R.id.home) { setResult(Activity.RESULT_CANCELED); finish(); return true; } return super.onOptionsItemSelected(item); } public static class EditIouFragment extends Fragment { private Transaction mModel; private EditText mPersonEditText; private Switch mOwesMeSwitch; private EditText mAmountEditText; private EditText mDescriptionEditText; private static final String KEY_ARG = "Transaction"; public static EditIouFragment newInstance(Transaction model) { EditIouFragment f = new EditIouFragment(); Bundle args = new Bundle(); args.putParcelable(KEY_ARG, model); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { mModel = getArguments().getParcelable(KEY_ARG); } } public Transaction getModel() { String person = mPersonEditText.getText().toString(); boolean owesMe = mOwesMeSwitch.isChecked(); double amount = parseAmountText(mAmountEditText.getText().toString()); String description = mDescriptionEditText.getText().toString(); if (mModel == null) return new Transaction(person, owesMe, amount, description, Calendar.getInstance()); else return new Transaction(person, owesMe, amount, description, Calendar.getInstance(), mModel.getId()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_edit_iou, container, false); mPersonEditText = (EditText) rootView.findViewById(R.id.edit_title_edittext); if (mModel != null && mModel.getPerson() != null && !mModel.getPerson().isEmpty()) { mPersonEditText.setText(mModel.getPerson()); mPersonEditText.setEnabled(false); } mOwesMeSwitch = (Switch) rootView.findViewById(R.id.edit_owe_switch); if (mModel != null) mOwesMeSwitch.setChecked(mModel.isOwesMe()); mAmountEditText = (EditText) rootView.findViewById(R.id.edit_amount_edittext); if (mModel != null) mAmountEditText.setText(formatAmountText(mModel.getAmount())); else mAmountEditText.setText("$0.00"); mAmountEditText.setSelectAllOnFocus(true); mAmountEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { String s = mAmountEditText.getText().toString(); double amountVal = parseAmountText(s.toString()); String formatted = formatAmountText(amountVal); mAmountEditText.setText(formatted); mAmountEditText.setSelection(formatted.length()); } } }); mDescriptionEditText = (EditText) rootView.findViewById(R.id.edit_description_edittext); if (mModel != null && mModel.getDescription() != null && !mModel.getDescription().isEmpty()) mDescriptionEditText.setText(mModel.getDescription()); return rootView; } private String formatAmountText(double amount) { return NumberFormat.getCurrencyInstance().format(amount); } private double parseAmountText(String s) { if (s.contains(".")) { s = s.replaceAll("[$,]", ""); String[] parts = s.split("[.]"); String dollars = parts[0]; String cents = parts[1]; s = "$" + dollars + '.' + cents; } else { s = "$" + s; } try { Number n = NumberFormat.getCurrencyInstance().parse(s); return n.doubleValue(); } catch (ParseException e) { return 0; } } } }