package pt.rupeal.invoicexpress.adapters;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import pt.rupeal.invoicexpress.MainActivity;
import pt.rupeal.invoicexpress.R;
import pt.rupeal.invoicexpress.enums.FragmentTagsEnum;
import pt.rupeal.invoicexpress.fragments.ContactDetailsFragment;
import pt.rupeal.invoicexpress.fragments.ContactsFragment;
import pt.rupeal.invoicexpress.model.ContactModel;
import pt.rupeal.invoicexpress.utils.ScreenLayoutUtil;
import pt.rupeal.invoicexpress.widgets.TextViewInvoiceXpress;
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.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class ContactListRowAdapter extends BaseAdapter implements Filterable {
private Context context;
private ContactsFragment contactsFragment;
private List<ContactModel> contacts;
private List<ContactModel> originalContacts;
private Filter filter;
public ContactListRowAdapter(Context context, ContactsFragment contactsFragment, List<ContactModel> contacts){
this.context = context;
this.contactsFragment = contactsFragment;
this.contacts = contacts;
this.originalContacts = contacts;
}
public void setContacts(List<ContactModel> contacts) {
this.contacts = contacts;
this.originalContacts = contacts;
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Object getItem(int position) {
return contacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(view == null) {
view = inflater.inflate(R.layout.contacts_list_row_fragment, parent, false);
}
LinearLayout letterLayout = (LinearLayout) view.findViewById(R.id.contact_list_letter);
letterLayout.removeAllViews();
ContactModel contact = contacts.get(position);
if(contact.isFirst()){
View emptyView = new View(context);
emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 40));
letterLayout.addView(emptyView);
ContactsLetterTextView letterTextView = new ContactsLetterTextView(context);
letterTextView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
letterTextView.setBackgroundColor(context.getResources().getColor(R.color.green_shadow));
letterTextView.setTextColor(context.getResources().getColor(R.color.green_normal));
String contactLetter = String.valueOf(Normalizer.normalize(contact.getName(), Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "").charAt(0));
letterTextView.setText(contactLetter);
letterTextView.setTextSize(12);
letterTextView.setPadding(12, 8, 0, 8);
letterLayout.addView(letterTextView);
View lineSeperator = new View(context);
lineSeperator.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 2));
lineSeperator.setBackgroundColor(context.getResources().getColor(R.color.green_normal));
letterLayout.addView(lineSeperator);
}
// contact name
TextViewInvoiceXpress contactTitleTextView = (TextViewInvoiceXpress) view.findViewById(R.id.contact_name);
int margin = contactTitleTextView.getPaddingLeft();
margin += contactTitleTextView.getPaddingRight();
// margins in contacts_list_fragment.xml
margin += Math.round(2 * ScreenLayoutUtil.convertDpToPixels(context, 18));
// add margin no justification
margin += Math.round(ScreenLayoutUtil.convertDpToPixels(context, 10));
contactTitleTextView.setText(context, contact.getName(), margin, TextViewInvoiceXpress.RESIZE);
// Add click listener
view.setOnClickListener(new ContactListRowOnClickListener(contact));
// return contact row view
return view;
}
private class ContactListRowOnClickListener implements View.OnClickListener {
private ContactModel contact;
public ContactListRowOnClickListener(ContactModel contact){
this.contact = contact;
}
@Override
public void onClick(View v) {
// vibrate - time in milliseconds
((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50);
// set arguments
Bundle args = new Bundle();
args.putSerializable(ContactModel.CONTACT, contact);
// set contact details fragment
((MainActivity) contactsFragment.getActivity()).addFragment(ContactDetailsFragment.class,
FragmentTagsEnum.CONTACTS_DETAILS,
args);
}
}
private class ContactsLetterTextView extends TextView {
public ContactsLetterTextView(Context context) {
super(context);
}
@Override
public void setPressed(boolean pressed) {
// If the parent is pressed, do not set to pressed.
if (pressed && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
@Override
public Filter getFilter() {
if(filter == null) {
filter = new ContactFilter();
}
return filter;
}
private class ContactFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// Initialized filter result
FilterResults result = new FilterResults();
// check if the constraint is empty or not
if(constraint != null && constraint.toString().length() > 0) {
// normalize and ignore accents
//String stringToSearch = Normalizer.normalize(constraint, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "").toLowerCase(Locale.getDefault());
String stringToSearch = constraint.toString().toLowerCase(Locale.getDefault());
ArrayList<ContactModel> filteredItems = new ArrayList<ContactModel>();
for(int i = 0, l = originalContacts.size(); i < l; i++) {
ContactModel contactModel = originalContacts.get(i);
String[] contactNameSplited = contactModel.getName().toLowerCase(Locale.getDefault()).split(" ");
boolean found = false;
for(int j = 0; j < contactNameSplited.length && !found; j++) {
String contactNameSplitedNormalized = Normalizer.normalize(contactNameSplited[j], Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
if(contactNameSplitedNormalized.startsWith(stringToSearch)) {
ContactModel contactFiltered = new ContactModel(contactModel);
contactFiltered.setFirst(false);
filteredItems.add(contactFiltered);
found = true;
}
}
}
result.values = filteredItems.toArray(new ContactModel[]{});
result.count = filteredItems.size();
} else {
synchronized(this) {
result.values = originalContacts.toArray(new ContactModel[]{});
result.count = originalContacts.size();
}
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
contacts = Arrays.asList((ContactModel[]) results.values);
notifyDataSetChanged();
}
}
}