package cgeo.geocaching.sorting; import cgeo.geocaching.R; import cgeo.geocaching.utils.Log; import rx.functions.Action1; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.res.Resources; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class ComparatorUserInterface { private final Activity activity; private final ArrayList registry; private final Resources res; private static final class ComparatorEntry { private final String name; private final Class cacheComparator; public ComparatorEntry(final String name, final Class cacheComparator) { this.name = name; this.cacheComparator = cacheComparator; } @Override public String toString() { return name; } } public ComparatorUserInterface(final Activity activity) { this.activity = activity; res = activity.getResources(); registry = new ArrayList(20); register(R.string.caches_sort_distance, null); register(R.string.caches_sort_date_hidden, DateComparator.class); register(R.string.caches_sort_difficulty, DifficultyComparator.class); register(R.string.caches_sort_finds, FindsComparator.class); register(R.string.caches_sort_geocode, GeocodeComparator.class); register(R.string.caches_sort_inventory, InventoryComparator.class); register(R.string.caches_sort_name, NameComparator.class); register(R.string.caches_sort_favorites, PopularityComparator.class); register(R.string.caches_sort_favorites_ratio, PopularityRatioComparator.class); register(R.string.caches_sort_rating, RatingComparator.class); register(R.string.caches_sort_size, SizeComparator.class); register(R.string.caches_sort_state, StateComparator.class); register(R.string.caches_sort_storage, StorageTimeComparator.class); register(R.string.caches_sort_terrain, TerrainComparator.class); register(R.string.caches_sort_date_logged, VisitComparator.class); register(R.string.caches_sort_vote, VoteComparator.class); // sort the menu labels alphabetically for easier reading Collections.sort(registry, new Comparator() { @Override public int compare(ComparatorEntry lhs, ComparatorEntry rhs) { return lhs.name.compareToIgnoreCase(rhs.name); } }); } private void register(final int resourceId, Class comparatorClass) { registry.add(new ComparatorEntry(res.getString(resourceId), comparatorClass)); } public void selectComparator(final CacheComparator current, final Action1 runAfterwards) { final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.caches_sort_title); // adapter doesn't work correctly here, therefore using the string array based method final String[] items = new String[registry.size()]; for (int i = 0; i < items.length; i++) { items[i] = registry.get(i).name; } builder.setSingleChoiceItems(items, getCurrentIndex(current), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int itemIndex) { ComparatorEntry entry = registry.get(itemIndex); try { if (entry.cacheComparator == null) { runAfterwards.call(null); } else { CacheComparator comparator = entry.cacheComparator.newInstance(); runAfterwards.call(comparator); } } catch (InstantiationException e) { Log.e("selectComparator", e); } catch (IllegalAccessException e) { Log.e("selectComparator", e); } dialog.dismiss(); } }); builder.create().show(); } private int getCurrentIndex(final CacheComparator current) { for (int index = 0; index < registry.size(); index++) { final ComparatorEntry entry = registry.get(index); if (current == null) { if (entry.cacheComparator == null) { return index; } } else if (current.getClass().equals(entry.cacheComparator)) { return index; } } return -1; } }