package com.door43.translationstudio.newui.newtranslation;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.TextView;
import com.door43.translationstudio.R;
import com.door43.translationstudio.core.SourceLanguage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by joel on 9/7/2015.
*/
public class SourceLanguageAdapter extends BaseAdapter {
private SourceLanguage[] mLanguages;
private SourceLanguage[] mFilteredLanguages;
private SourceLanguageFilter mSourceLanguageFilter;
public SourceLanguageAdapter(SourceLanguage[] languages) {
List<SourceLanguage> languagesList = Arrays.asList(languages);
// TODO: sort
mLanguages = languagesList.toArray(new SourceLanguage[languagesList.size()]);
mFilteredLanguages = mLanguages;
}
@Override
public int getCount() {
if(mFilteredLanguages != null) {
return mFilteredLanguages.length;
} else {
return 0;
}
}
@Override
public SourceLanguage getItem(int position) {
return mFilteredLanguages[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if(convertView == null) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_language_list_item, null);
holder = new ViewHolder(v);
} else {
holder = (ViewHolder)v.getTag();
}
// render view
holder.mLanguageView.setText(getItem(position).name);
holder.mCodeView.setText(getItem(position).code);
return v;
}
/**
* Returns the source language filter
* @return
*/
public Filter getFilter() {
if(mSourceLanguageFilter == null) {
mSourceLanguageFilter = new SourceLanguageFilter();
}
return mSourceLanguageFilter;
}
public static class ViewHolder {
public TextView mLanguageView;
public TextView mCodeView;
public ViewHolder(View view) {
mLanguageView = (TextView) view.findViewById(R.id.languageName);
mCodeView = (TextView) view.findViewById(R.id.languageCode);
view.setTag(this);
}
}
/**
* A filter for projects
*/
private class SourceLanguageFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults();
if(charSequence == null || charSequence.length() == 0) {
// no filter
results.values = Arrays.asList(mLanguages);
results.count = mLanguages.length;
} else {
// perform filter
List<SourceLanguage> filteredCategories = new ArrayList<>();
for(SourceLanguage language:mLanguages) {
// match the source language id
boolean match = language.getId().toLowerCase().startsWith(charSequence.toString().toLowerCase());
if(!match) {
if (language.name.toLowerCase().startsWith(charSequence.toString().toLowerCase())) {
// match the source language name
match = true;
}
}
if(match) {
filteredCategories.add(language);
}
}
results.values = filteredCategories;
results.count = filteredCategories.size();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
List<SourceLanguage> filteredLanguages = ((List<SourceLanguage>) filterResults.values);
if(charSequence != null && charSequence.length() > 0) {
sortSourceLanguages(filteredLanguages, charSequence);
}
mFilteredLanguages = filteredLanguages.toArray(new SourceLanguage[filterResults.count]);
notifyDataSetChanged();
}
}
/**
* Sorts source languages by id
* @param languages
* @param referenceId languages are sorted according to the reference id
*/
private static void sortSourceLanguages(List<SourceLanguage> languages, final CharSequence referenceId) {
Collections.sort(languages, new Comparator<SourceLanguage>() {
@Override
public int compare(SourceLanguage lhs, SourceLanguage rhs) {
String lhId = lhs.getId();
String rhId = rhs.getId();
// give priority to matches with the reference
if (lhId.startsWith(referenceId.toString().toLowerCase())) {
lhId = "!" + lhId;
}
if (rhId.startsWith(referenceId.toString().toLowerCase())) {
rhId = "!" + rhId;
}
return lhId.compareToIgnoreCase(rhId);
}
});
}
}