package com.gh4a.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.TextUtils;
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.TextView;
import com.gh4a.Gh4Application;
import com.gh4a.R;
import com.gh4a.utils.ApiHelpers;
import com.gh4a.utils.AvatarHandler;
import org.eclipse.egit.github.core.User;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
public class DropDownUserAdapter extends BaseAdapter implements Filterable {
private final Object mLock = new Object();
private final Context mContext;
private List<User> mUsers;
private final ArrayList<User> mOriginalUsers;
private final LayoutInflater mInflater;
private ArrayFilter mFilter;
public DropDownUserAdapter(Context context) {
mContext = context;
mUsers = new ArrayList<>();
mOriginalUsers = new ArrayList<>();
mInflater = LayoutInflater.from(context);
}
public void replace(Set<User> newUsers) {
synchronized (mLock) {
String ourLogin = Gh4Application.get().getAuthLogin();
mOriginalUsers.clear();
for (User user : newUsers) {
if (!TextUtils.equals(ourLogin, user.getLogin())) {
mOriginalUsers.add(user);
}
}
Collections.sort(mOriginalUsers, new Comparator<User>() {
@Override
public int compare(User first, User second) {
final String firstUsername = ApiHelpers.getUserLogin(mContext, first);
final String secondUsername = ApiHelpers.getUserLogin(mContext, second);
return firstUsername.compareToIgnoreCase(secondUsername);
}
});
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return mUsers.size();
}
@Override
public User getItem(int position) {
return mUsers.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view;
if (convertView == null) {
view = mInflater.inflate(R.layout.row_dropdown_user, parent, false);
view.setTag(new ViewHolder(view));
} else {
view = convertView;
}
final User user = getItem(position);
final ViewHolder holder = (ViewHolder) view.getTag();
holder.tvUser.setText(ApiHelpers.getUserLogin(mContext, user));
AvatarHandler.assignAvatar(holder.ivUser, user);
return view;
}
@NonNull
@Override
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (TextUtils.isEmpty(constraint)) {
final ArrayList<User> list;
synchronized (mLock) {
list = new ArrayList<>(mOriginalUsers);
}
results.values = list;
results.count = list.size();
} else if (!constraint.toString().startsWith("@")) {
results.values = new ArrayList<>();
results.count = 0;
} else {
final String constraintString =
constraint.toString().substring(1).toLowerCase();
final ArrayList<User> values;
synchronized (mLock) {
values = new ArrayList<>(mOriginalUsers);
}
final int count = values.size();
final ArrayList<User> newValues = new ArrayList<>();
for (int i = 0; i < count; i++) {
final User user = values.get(i);
final String value = ApiHelpers.getUserLogin(mContext, user);
final String valueText = value.toLowerCase();
if (valueText.startsWith(constraintString)) {
newValues.add(user);
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.values != null) {
mUsers = (ArrayList<User>) results.values;
} else {
mUsers = new ArrayList<>();
}
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public CharSequence convertResultToString(Object resultValue) {
final User user = (User) resultValue;
return "@" + ApiHelpers.getUserLogin(mContext, user) + " ";
}
}
private static class ViewHolder {
private ViewHolder(View view) {
ivUser = (ImageView) view.findViewById(R.id.iv_user);
tvUser = (TextView) view.findViewById(R.id.tv_user);
}
private final ImageView ivUser;
private final TextView tvUser;
}
}