package com.vaguehope.onosendai.storage; import java.util.List; import android.widget.ArrayAdapter; import android.widget.Filter; import com.vaguehope.onosendai.ui.PostActivity; import com.vaguehope.onosendai.util.LogWrapper; public class UsernameSearchAdapter extends ArrayAdapter<String> { protected static final LogWrapper LOG = new LogWrapper("UNS"); private final Filter filter; public UsernameSearchAdapter (final PostActivity host) { // TODO be more specific than PostActivity. super(host, android.R.layout.simple_list_item_1); this.filter = new UsernameFilter(this, host); } @Override public Filter getFilter () { return this.filter; } private static class UsernameFilter extends Filter { private final ArrayAdapter<String> adapter; private final DbProvider dbProvider; public UsernameFilter (final ArrayAdapter<String> adapter, final DbProvider dbProvider) { // TODO be more specific than PostActivity. this.adapter = adapter; this.dbProvider = dbProvider; } @Override protected FilterResults performFiltering (final CharSequence constraint) { if (constraint == null || constraint.length() < 2) return new FilterResults(); try { final String term = constraint.subSequence(1, constraint.length()).toString(); switch (constraint.charAt(0)) { case '@': return wrapResults("@", this.dbProvider.getDb().getUsernames(term, 10)); case '#': return wrapResults("#", this.dbProvider.getDb().getHashtags(term, 10)); default: LOG.w("Unexpected search: '%s'.", term); } return new FilterResults(); } catch (final Exception e) { // NOSONAR Need to report errors. LOG.e("Search failed.", e); return new FilterResults(); } } private static FilterResults wrapResults (final String addPrefix, final List<String> res) { for (int i = 0; i < res.size(); i++) { res.set(i, addPrefix.concat(res.get(i))); } final FilterResults filterResults = new FilterResults(); filterResults.values = res; filterResults.count = res.size(); return filterResults; } @Override protected void publishResults (final CharSequence constraint, final FilterResults results) { this.adapter.clear(); if (results != null && results.count > 0) { final List<String> usernames = (List<String>) results.values; this.adapter.addAll(usernames); this.adapter.notifyDataSetChanged(); } else { this.adapter.notifyDataSetInvalidated(); } } } }