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}