KnownHostsAdapter.java

 1package eu.siacs.conversations.ui.adapter;
 2
 3import android.content.Context;
 4import android.support.annotation.NonNull;
 5import android.widget.ArrayAdapter;
 6import android.widget.Filter;
 7
 8import java.util.ArrayList;
 9import java.util.Collection;
10import java.util.Locale;
11
12public class KnownHostsAdapter extends ArrayAdapter<String> {
13    private ArrayList<String> domains;
14    private Filter domainFilter = new Filter() {
15
16        @Override
17        protected FilterResults performFiltering(CharSequence constraint) {
18            final ArrayList<String> suggestions = new ArrayList<>();
19            final String[] split = constraint == null ? new String[0] : constraint.toString().split("@");
20            if (split.length == 1) {
21                final String local = split[0].toLowerCase(Locale.ENGLISH);
22                for (String domain : domains) {
23                    suggestions.add(local + "@" + domain);
24                }
25            } else if (split.length == 2) {
26                final String localPart = split[0].toLowerCase(Locale.ENGLISH);
27                final String domainPart = split[1].toLowerCase(Locale.ENGLISH);
28                if (domains.contains(domainPart)) {
29                    return new FilterResults();
30                }
31                for (String domain : domains) {
32                    if (domain.contains(domainPart)) {
33                        suggestions.add(localPart + "@" + domain);
34                    }
35                }
36            } else {
37                return new FilterResults();
38            }
39            FilterResults filterResults = new FilterResults();
40            filterResults.values = suggestions;
41            filterResults.count = suggestions.size();
42            return filterResults;
43        }
44
45        @Override
46        protected void publishResults(CharSequence constraint, FilterResults results) {
47            ArrayList filteredList = (ArrayList) results.values;
48            if (results.count > 0) {
49                clear();
50                addAll(filteredList);
51                notifyDataSetChanged();
52            }
53        }
54    };
55
56    public KnownHostsAdapter(Context context, int viewResourceId, Collection<String> mKnownHosts) {
57        super(context, viewResourceId, new ArrayList<>());
58        domains = new ArrayList<>(mKnownHosts);
59    }
60
61    public KnownHostsAdapter(Context context, int viewResourceId) {
62        super(context, viewResourceId, new ArrayList<>());
63        domains = new ArrayList<>();
64    }
65
66    public void refresh(Collection<String> knownHosts) {
67        domains = new ArrayList<>(knownHosts);
68        notifyDataSetChanged();
69    }
70
71    @Override
72    @NonNull
73    public Filter getFilter() {
74        return domainFilter;
75    }
76}