package pt.rupeal.invoicexpress.adapters; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Locale; 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.fragments.DocumentDetailsFragment; import pt.rupeal.invoicexpress.model.DocumentModel; import pt.rupeal.invoicexpress.utils.ScreenLayoutUtil; import pt.rupeal.invoicexpress.utils.StringUtil; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Vibrator; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.TextView; public class DocumentListRowAdapter extends BaseAdapter implements ListAdapter, Filterable { private Context context; private List<DocumentModel> documents; private List<DocumentModel> originalDocuments; // for search purpose private Filter filter; private LinearLayout documentsMoreLayout; public DocumentListRowAdapter(Context context, List<DocumentModel> documents, LinearLayout documentsMoreLayout) { this.context = context; this.documents = documents; this.originalDocuments = documents; this.documentsMoreLayout = documentsMoreLayout; } public void setDocuments(List<DocumentModel> documents) { this.documents = documents; this.originalDocuments = documents; } @Override public int getCount() { return documents.size(); } @Override public Object getItem(int position) { return documents.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(convertView == null){ convertView = inflater.inflate(R.layout.documents_list_row, parent, false); } DocumentModel document = documents.get(position); // Fill the Documents Row with associated data. // Client Name TextView clientTextView = (TextView) convertView.findViewById(R.id.doc_client); // for cash invoices or simplified invoices the client can be empty String clientName = StringUtil.resizeString((Activity) context, document.getClientName(), clientTextView.getTextSize(), ScreenLayoutUtil.convertDpToPixels(context, 150)); clientTextView.setText(clientName); // Document Type ImageView type = (ImageView) convertView.findViewById(R.id.doc_type); type.setImageResource(DocumentTypeEnum.getDrawableId(document.getType())); // Documents Ammount TextView value = (TextView) convertView.findViewById(R.id.doc_ammount); value.setText(StringUtil.convertToMoneyValue(document.getTotal())); // Documents Date TextView date = (TextView) convertView.findViewById(R.id.doc_client_date); date.setText(document.getSequenceNumber()); date.setPadding(clientTextView.getCompoundPaddingLeft(), 0, 0, 0); // Documents Dates (start and end) TextView startDate = (TextView) convertView.findViewById(R.id.doc_start_date); startDate.setText(document.getDate()); // Documents Status ImageView status = (ImageView) convertView.findViewById(R.id.doc_status); status.setImageResource(DocumentStatusEnum.getDrawableId(document.getStatus())); // Documents End Date TextView dueDate = (TextView) convertView.findViewById(R.id.doc_due_date); if(document.isOverDueDate()) { // TODO remove from xml file dueDate.setTextColor(context.getResources().getColor(R.color.documents_over_due_red)); ((ImageView) convertView.findViewById(R.id.doc_image_due_date)).setVisibility(ImageView.INVISIBLE); } else { // TODO remove from xml file dueDate.setTextColor(context.getResources().getColor(R.color.documents_over_due_normal)); ((ImageView) convertView.findViewById(R.id.doc_image_due_date)).setVisibility(ImageView.INVISIBLE); } dueDate.setText(document.getDueDate()); // Add click listener convertView.setOnClickListener(new DocumentListRowOnClickListener(document)); return convertView; } private class DocumentListRowOnClickListener implements View.OnClickListener { private DocumentModel document; public DocumentListRowOnClickListener(DocumentModel document) { this.document = document; } @Override public void onClick(View v) { // vibrate - time in milliseconds ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50); // set document as argument Bundle args = new Bundle(); args.putSerializable(DocumentModel.DOCUMENT, document); // call document details fragment ((MainActivity) context).addFragment(DocumentDetailsFragment.class, FragmentTagsEnum.DOCUMENTS_DETAILS, args); } } @Override public Filter getFilter() { if(filter == null) { filter = new DocumentFilter(); } return filter; } private class DocumentFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(Locale.getDefault()); FilterResults result = new FilterResults(); if(constraint != null && constraint.toString().length() > 0) { ArrayList<DocumentModel> filteredItems = new ArrayList<DocumentModel>(); for(int i = 0, l = originalDocuments.size(); i < l; i++) { DocumentModel documentModel = getOriginalItem(i); if(documentModel.getClientName().toLowerCase(Locale.getDefault()).contains(constraint) || documentModel.getDate().toLowerCase(Locale.getDefault()).contains(constraint) || documentModel.getDueDate().toLowerCase(Locale.getDefault()).contains(constraint) || documentModel.getSequenceNumber().toLowerCase(Locale.getDefault()).contains(constraint)) { DocumentModel documentFiltered = new DocumentModel(documentModel); filteredItems.add(documentFiltered); } } result.values = filteredItems.toArray(new DocumentModel[]{}); result.count = filteredItems.size(); } else { synchronized(this) { result.values = originalDocuments.toArray(new DocumentModel[]{}); result.count = originalDocuments.size(); } } return result; } public DocumentModel getOriginalItem(int position) { int index = 0; Iterator<DocumentModel> iterator = originalDocuments.iterator(); while(iterator.hasNext()) { DocumentModel document = iterator.next(); if(index == position) { return document; } index++; } return null; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { documents = Arrays.asList((DocumentModel[]) results.values); if(documentsMoreLayout != null) { if(constraint.equals("")) { documentsMoreLayout.setVisibility(View.VISIBLE); } else { documentsMoreLayout.setVisibility(View.GONE); } } notifyDataSetChanged(); } } }