package tof.cv.mpp.adapter;
import android.content.Context;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.SectionIndexer;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import tof.cv.mpp.Utils.ConnectionMaker;
/**
* Created by versieuxchristophe on 24/10/15.
*/
public class IndexAdapter extends ArrayAdapter<String> implements SectionIndexer, Filterable {
private HashMap<String, Integer> alphaIndexer;
private ArrayList<String> sections = new ArrayList<>();
ArrayList<String> list;
ArrayList<String> data = new ArrayList<>();
ContainsFilter myFilter;
boolean filtered;
@Override
public Filter getFilter() {
if (myFilter == null)
myFilter = new ContainsFilter();
return myFilter;
}
public IndexAdapter(Context c, int resource, ArrayList<String> pData) {
super(c, resource, pData);
this.data = pData;
this.list = (ArrayList<String>) pData.clone();
alphaIndexer = new HashMap<>();
sections.clear();
for (int i = 0; i < list.size(); i++) {
String s = list.get(i).substring(0, 1).toUpperCase();
if (!alphaIndexer.containsKey(s)) {
alphaIndexer.put(s, i);
sections.add(s);
}
}
/*
Set<String> sectionLetters = alphaIndexer.keySet();
ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
//Collections.sort(sectionList);
sections = new String[sectionList.size()];
for (int i = 0; i < sectionList.size(); i++){
Log.e("CVE",sectionList.get(i));
sections[i] = sectionList.get(i);
}*/
}
public int getPositionForSection(int section) {
try {
return alphaIndexer.get(sections.get(section));
} catch (Exception e) {
return 0;
}
}
public int getSectionForPosition(int position) {
return 1;
}
public Object[] getSections() {
String[] array = new String[sections.size()];
sections.toArray(array);
return array;
}
public String unaccent(String s) {
String normalized = Normalizer.normalize(s, Normalizer.Form.NFD);
return normalized.replaceAll("[^\\p{ASCII}]", "");
}
private class ContainsFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String toFilter = constraint.toString();
FilterResults filterResults = new FilterResults();
ArrayList<String> tempList = new ArrayList<>();
int length = list.size();
int add = 0;
filtered = false;
for (int i = 0; i < length; i++) {
String obj = list.get(i);
Log.e("CVE", obj);
if (unaccent(obj.toLowerCase()).contains(unaccent(toFilter.toLowerCase()))) {
if (toFilter.length() > 0 && obj.toLowerCase().startsWith(toFilter.toLowerCase())) {
tempList.add(add, obj);
add++;
filtered = true;
} else
tempList.add(obj);
}
}
Collections.sort(tempList);
filterResults.values = tempList;
filterResults.count = tempList.size();
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
if (results.count > 0) {
alphaIndexer = new HashMap<>();
ArrayList<String> items = (ArrayList<String>) results.values;
for (int i = 0; i < items.size(); i++) {
String s = items.get(i).substring(0, 1).toUpperCase();
if (constraint.length() > 0 && items.get(i).toUpperCase().startsWith(constraint.toString().toUpperCase()))
s = constraint.toString().toUpperCase();
sections.clear();
if (!alphaIndexer.containsKey(s)) {
alphaIndexer.put(s, i);
sections.add(s);
}
}
addAll((ArrayList<String>) results.values);
} else {
//Log.println(Log.INFO, "Results !!", "NONE");
}
notifyDataSetChanged();
}
}
public class CustomComparator implements Comparator<String> {
String s;
public CustomComparator(String s) {
this.s = s.toUpperCase();
}
@Override
public int compare(String o1, String o2) {
if (s.length() > 0 && o1.toUpperCase().startsWith(s) && !o2.toUpperCase().startsWith(s)) {
// Log.e("CVE", "START o1 " + o1);
return -1;
}
if (s.length() > 0 && o2.toUpperCase().startsWith(s) && !o1.toUpperCase().startsWith(s)) {
// Log.e("CVE", "START o2 " + o2);
return 1;
}
//Log.e("CVE", "COMPARE " + o2.compareTo(o2));
return o1.compareTo(o2);
}
}
}