package pt.rupeal.invoicexpress.fragments; import java.text.MessageFormat; import java.util.HashMap; import java.util.List; import java.util.Set; import pt.rupeal.invoicexpress.MainActivity; import pt.rupeal.invoicexpress.R; import pt.rupeal.invoicexpress.enums.DocumentStatusEnum; import pt.rupeal.invoicexpress.enums.DocumentTypeEnum; import pt.rupeal.invoicexpress.enums.FragmentTagsEnum; import pt.rupeal.invoicexpress.layouts.LinkTwoLabelsLayout; import pt.rupeal.invoicexpress.layouts.SubTitleLayout; import pt.rupeal.invoicexpress.model.ContactModel; import pt.rupeal.invoicexpress.model.DocumentModel; import pt.rupeal.invoicexpress.model.EmailModel; import pt.rupeal.invoicexpress.model.ItemModel; import pt.rupeal.invoicexpress.server.ContactDetailsRestHandler; import pt.rupeal.invoicexpress.server.DocumentChangeStatusRestHandler; import pt.rupeal.invoicexpress.server.InvoiceXpress; import pt.rupeal.invoicexpress.utils.ScreenLayoutUtil; import pt.rupeal.invoicexpress.utils.StringUtil; import pt.rupeal.invoicexpress.widgets.TextViewInvoiceXpress; import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.Vibrator; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; public class DocumentDetailsFragment extends Fragment { private View view; private DocumentModel document; private boolean isStatusChanged; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // enable menu setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.document_detail, container, false); document = (DocumentModel) getArguments().get(DocumentModel.DOCUMENT); ((ImageView) view.findViewById(R.id.doc_details_image_title)).setImageResource(DocumentStatusEnum.getDrawableId(document.getStatus())); ((TextView) view.findViewById(R.id.doc_details_status)).setText(DocumentStatusEnum.getLabelGui(getActivity(), document.getStatus())); if(!document.getClientId().isEmpty()) { view.findViewById(R.id.doc_details_image_link_name).setVisibility(View.VISIBLE); view.findViewById(R.id.doc_details_vertical_line_link_name).setVisibility(View.VISIBLE); // set listener view.findViewById(R.id.doc_details_name_layout).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // check if the progress bar is visible to disable clicks if(!InvoiceXpress.isInvoiceXpressClickable(getActivity())) { return; } // vibrate - time in milliseconds ((Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50); // if the contact was not in cache then the application will got it from server // else just pop it from cache if(InvoiceXpress.getInstance().getContacts().containsKey(document.getClientId())) { ContactModel contact = InvoiceXpress.getInstance().getContacts().get(document.getClientId()); Bundle args = new Bundle(); args.putSerializable(ContactModel.CONTACT, contact); // set contact details fragment ((MainActivity) getActivity()).addFragment(ContactDetailsFragment.class, FragmentTagsEnum.CONTACTS_DETAILS, args); } else { String[] params = new String[] {document.getClientId(), "false"}; new ContactDetailsRestHandler(getActivity()).execute(params); } } }); } else { view.findViewById(R.id.doc_details_image_link_name).setVisibility(View.INVISIBLE); view.findViewById(R.id.doc_details_vertical_line_link_name).setVisibility(View.INVISIBLE); } // set contact name TextViewInvoiceXpress clientNameTextView = ((TextViewInvoiceXpress) view.findViewById(R.id.doc_details_name)); int margin = ((MarginLayoutParams) clientNameTextView.getLayoutParams()).leftMargin; margin += ((MarginLayoutParams) clientNameTextView.getLayoutParams()).rightMargin; // extra document_details 18dp relative layout margins margin += Math.round(2 * ScreenLayoutUtil.convertDpToPixels(getActivity(), 30)); if(!document.getClientId().isEmpty()) { margin += Math.round(ScreenLayoutUtil.convertDpToPixels(getActivity(), 30)); } clientNameTextView.setText(getActivity(), document.getClientName(), margin, TextViewInvoiceXpress.RESIZE); ((TextView) view.findViewById(R.id.doc_details_sequenceNumber_value)).setText(document.getSequenceNumber()); ((TextView) view.findViewById(R.id.doc_details_date_value)).setText(document.getDate()); TextView dueDateTextView = ((TextView) view.findViewById(R.id.doc_details_dueDate_value)); dueDateTextView.setText(document.getDueDate()); // set red color for due date document if(document.isOverDueDate()) { dueDateTextView.setTextColor(getActivity().getResources().getColor(R.color.documents_over_due_red)); } else { dueDateTextView.setTextColor(getActivity().getResources().getColor(R.color.details_text)); } // sub title items "Items" ((SubTitleLayout) view.findViewById(R.id.doc_details_items_subtitle)).setTextToTextViewLeft(R.string.doc_details_items_subtitle_Left); // Items LinearLayout itemsLinearLayout = (LinearLayout) view.findViewById(R.id.doc_details_items); HashMap<String, ItemModel> docItems = document.getItems(); Set<String> docItemsKeys = docItems.keySet(); LinkTwoLabelsLayout itemLink = null; for (String key : docItemsKeys) { RelativeLayout rel = new RelativeLayout(getActivity()); itemLink = new LinkTwoLabelsLayout(getActivity(), rel); // set value itemLink.setValue(StringUtil.convertToMoneyValue(docItems.get(key).getSubTotal())); // set label // left and right margin margin = Math.round(2 * ScreenLayoutUtil.convertDpToPixels(getActivity(), 18)); itemLink.setLabel(getActivity(), key, margin); // set listener itemLink.getLinkView().setOnClickListener(new ItemOnClickListener(document.getSequenceNumber(), docItems.get(key))); itemsLinearLayout.addView(itemLink.getLinkView()); } // sub title items "Total w/Taxes" ((SubTitleLayout) view.findViewById(R.id.doc_details_items_subtitle)).setTextToTextViewRight(R.string.doc_details_items_subtitle_Right, itemLink.getMarginRight(getActivity())); ((SubTitleLayout) view.findViewById(R.id.doc_details_values_subtitle)).setTextToTextViewLeft(R.string.doc_details_values_subtitle); ((TextView) view.findViewById(R.id.doc_details_sum_value)).setText(StringUtil.convertToMoneyValue(document.getSum())); ((TextView) view.findViewById(R.id.doc_details_discount_value)).setText(StringUtil.convertToMoneyValue(document.getDiscount())); ((TextView) view.findViewById(R.id.doc_details_beforeTaxes_value)).setText(StringUtil.convertToMoneyValue(document.getBeforeTaxes())); ((TextView) view.findViewById(R.id.doc_details_taxes_value)).setText(StringUtil.convertToMoneyValue(document.getTaxes())); ((TextView) view.findViewById(R.id.doc_details_total_value)).setText(StringUtil.convertToMoneyValue(document.getTotal())); // Notes if(!document.getObservations().isEmpty()){ ((SubTitleLayout) view.findViewById(R.id.doc_details_notes_label)).setTextToTextViewLeft(R.string.doc_details_notes_label); ((TextView) view.findViewById(R.id.doc_details_notes)).setText(document.getObservations()); } else { ((SubTitleLayout) view.findViewById(R.id.doc_details_notes_label)).setVisibility(LinearLayout.GONE); ((TextView) view.findViewById(R.id.doc_details_notes)).setVisibility(TextView.GONE); } // Payment if(document.getPayEntity() != null && !document.getPayEntity().isEmpty()){ ((SubTitleLayout) view.findViewById(R.id.doc_details_payment_label)).setTextToTextViewLeft(R.string.doc_details_payment_label); ((TextView) view.findViewById(R.id.doc_details_invEnt)).setText("Entidade: " + document.getPayEntity()); ((TextView) view.findViewById(R.id.doc_details_invRef)).setText("ReferĂȘncia: " + document.getPayRef()); ((TextView) view.findViewById(R.id.doc_details_invMon)).setText("Montante: " + StringUtil.convertToMoneyValue(document.getTotal())); } else { ((SubTitleLayout) view.findViewById(R.id.doc_details_payment_label)).setVisibility(LinearLayout.GONE); ((RelativeLayout) view.findViewById(R.id.doc_detail_atm_layout)).setVisibility(RelativeLayout.GONE); } return view; } private class ItemOnClickListener implements View.OnClickListener { private String sequenceNumber; private ItemModel item; public ItemOnClickListener(String sequenceNumber, ItemModel item) { this.sequenceNumber = sequenceNumber; this.item = item; } @Override public void onClick(View v) { // check if the progress bar is visible to disable clicks if(!InvoiceXpress.isInvoiceXpressClickable(getActivity())) { return; } // get main activity MainActivity mainActivity = (MainActivity) getActivity(); // vibrate - time in milliseconds ((Vibrator) mainActivity.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50); // put sequence number and item data mainActivity.getIntent().putExtra(DocumentModel.SEQUENCE_NUMBER, sequenceNumber); mainActivity.getIntent().putExtra(ItemModel.ITEM, item); // add item details fragment mainActivity.addFragment(ItemDetailsFragment.class, FragmentTagsEnum.ITEM); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.action_bar_document_details, menu); // get document from args document = (DocumentModel) getArguments().get(DocumentModel.DOCUMENT); List<DocumentStatusEnum> possibleStatus = InvoiceXpress.getInstance().getStatusGraphs(document.getType()).get( DocumentStatusEnum.getDocumentStatusEnum(document.getStatus())); for (DocumentStatusEnum status : possibleStatus) { String menuItemLabel = status.getActionLabel(getActivity()); menu.add(Menu.NONE, menuItemLabel.hashCode(), Menu.NONE, menuItemLabel).setOnMenuItemClickListener( new ChangeStatusMenuListener(status)); } menu.findItem(R.id.send_email).setOnMenuItemClickListener(new EmailMenuListener()); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() != R.id.send_email && isStatusChanged) { // document was deleted, must remove fragment if(DocumentStatusEnum.isDeleted(document.getStatus())) { // ((MainActivity) getActivity()).removeFragment(FragmentTagsEnum.DOCUMENTS_DETAILS); return true; } ((ImageView) view.findViewById(R.id.doc_details_image_title)).setImageResource(DocumentStatusEnum.getDrawableId(document.getStatus())); } return super.onOptionsItemSelected(item); } private class ChangeStatusMenuListener implements MenuItem.OnMenuItemClickListener { private View cancelDialog; private DocumentStatusEnum status; public ChangeStatusMenuListener(DocumentStatusEnum status) { this.status = status; } @Override public boolean onMenuItemClick(MenuItem item) { if(item.getItemId() == DocumentStatusEnum.CANCELED.getActionLabel(getActivity()).hashCode()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout cancelDialog = inflater.inflate(R.layout.document_detail_cancel_dialog, null); builder.setView(cancelDialog) // Add action buttons .setPositiveButton(R.string.doc_details_cancel_dialog_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { EditText justification = (EditText) cancelDialog.findViewById(R.id.doc_details_cancel_dialog_justification); String[] params = new String[] {status.getStateXml(), justification.getText().toString()}; new DocumentChangeStatusRestHandler(getActivity(), document).execute(params); } }) .setNegativeButton(R.string.doc_details_cancel_dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); } }); builder.show(); } else { String[] params = new String[] {status.getStateXml(), ""}; new DocumentChangeStatusRestHandler(getActivity(), document).execute(params); return false; } // Return true to consume this click and prevent others from executing. return true; } } private class EmailMenuListener implements MenuItem.OnMenuItemClickListener { private MessageFormat emailMessage = new MessageFormat (getActivity().getResources().getString(R.string.email_body_message)); public EmailMenuListener() { super(); } @Override public boolean onMenuItemClick(MenuItem item) { // get document type gui label that it will be show on the interface String typeGuiLabel = getActivity().getResources().getString(DocumentTypeEnum.getLabelGui(document.getType())); // set message parameters, client name, doc type label gui, name account String[] messageParams = new String[] {document.getClientName(), typeGuiLabel, InvoiceXpress.getInstance().getActiveAccount().getName()}; // generate email body String body = emailMessage.format(messageParams); // get main activity MainActivity mainActivity = (MainActivity) getActivity(); // create email model with to, subject and body attributes EmailModel email = new EmailModel(); email.setTo(document.getClientEmail()); email.setSubject(""); email.setBody(body); Bundle args = new Bundle(); args.putSerializable(EmailModel.EMAIL, email); args.putString(DocumentModel.ID, document.getId()); args.putString(DocumentModel.DOC_TYPE, document.getType()); mainActivity.addFragment(EmailFragment.class, FragmentTagsEnum.EMAIL, args); return true; } } }