diff options
Diffstat (limited to 'main/src/cgeo/geocaching/sorting')
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java | 122 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/SortActionProvider.java | 153 |
2 files changed, 153 insertions, 122 deletions
diff --git a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java deleted file mode 100644 index 7f10353..0000000 --- a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java +++ /dev/null @@ -1,122 +0,0 @@ -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<ComparatorEntry> registry; - private final Resources res; - - private static final class ComparatorEntry { - private final String name; - private final Class<? extends CacheComparator> cacheComparator; - - public ComparatorEntry(final String name, final Class<? extends CacheComparator> 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<ComparatorUserInterface.ComparatorEntry>(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<ComparatorEntry>() { - - @Override - public int compare(ComparatorEntry lhs, ComparatorEntry rhs) { - return lhs.name.compareToIgnoreCase(rhs.name); - } - }); - } - - private void register(final int resourceId, Class<? extends CacheComparator> comparatorClass) { - registry.add(new ComparatorEntry(res.getString(resourceId), comparatorClass)); - } - - public void selectComparator(final CacheComparator current, final Action1<CacheComparator> 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; - } - -} diff --git a/main/src/cgeo/geocaching/sorting/SortActionProvider.java b/main/src/cgeo/geocaching/sorting/SortActionProvider.java new file mode 100644 index 0000000..8663391 --- /dev/null +++ b/main/src/cgeo/geocaching/sorting/SortActionProvider.java @@ -0,0 +1,153 @@ +package cgeo.geocaching.sorting; + +import cgeo.geocaching.R; +import cgeo.geocaching.utils.Log; + +import org.eclipse.jdt.annotation.NonNull; + +import rx.functions.Action1; + +import android.content.Context; +import android.support.v4.view.ActionProvider; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.SubMenu; +import android.view.View; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +/** + * Provides a sub menu for sorting caches. Register your listener in the onCreateOptionsMenu of the containing activity. + * + */ +public class SortActionProvider extends ActionProvider implements OnMenuItemClickListener { + + private static final int MENU_GROUP = 1; + private final Context mContext; + private final ArrayList<ComparatorEntry> registry = new ArrayList<ComparatorEntry>(20); + /** + * Callback triggered on selecting a new sort order. + */ + private Action1<CacheComparator> onClickListener; + /** + * Currently selected filter. Used for radio button indication. + */ + private CacheComparator selection; + + private static final class ComparatorEntry { + private final String name; + private final Class<? extends CacheComparator> cacheComparator; + + public ComparatorEntry(final String name, final Class<? extends CacheComparator> cacheComparator) { + this.name = name; + this.cacheComparator = cacheComparator; + } + + @Override + public String toString() { + return name; + } + } + + public SortActionProvider(final Context context) { + super(context); + mContext = context; + registerComparators(); + } + + private void register(final int resourceId, final Class<? extends CacheComparator> comparatorClass) { + registry.add(new ComparatorEntry(mContext.getString(resourceId), comparatorClass)); + } + + private void registerComparators() { + 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<ComparatorEntry>() { + + @Override + public int compare(final ComparatorEntry lhs, final ComparatorEntry rhs) { + return lhs.name.compareToIgnoreCase(rhs.name); + } + }); + } + + @Override + public View onCreateActionView(){ + // must return null, otherwise onPrepareSubMenu is not called + return null; + } + + @Override + public boolean hasSubMenu(){ + return true; + } + + @Override + public void onPrepareSubMenu(final SubMenu subMenu){ + subMenu.clear(); + for (int i = 0; i < registry.size(); i++) { + final ComparatorEntry comparatorEntry = registry.get(i); + final MenuItem menuItem = subMenu.add(MENU_GROUP, i, i, comparatorEntry.name); + menuItem.setOnMenuItemClickListener(this).setCheckable(true); + if (selection == null) { + if (comparatorEntry.cacheComparator == null) { + menuItem.setChecked(true); + } + } + else { + if (selection.getClass().equals(comparatorEntry.cacheComparator)) { + menuItem.setChecked(true); + } + } + } + subMenu.setGroupCheckable(MENU_GROUP, true, true); + } + + @Override + public boolean onMenuItemClick(final MenuItem item){ + callListener(registry.get(item.getItemId()).cacheComparator); + return true; + } + + private void callListener(final Class<? extends CacheComparator> cacheComparator) { + try { + if (cacheComparator == null) { + onClickListener.call(null); + } + else { + final CacheComparator comparator = cacheComparator.newInstance(); + onClickListener.call(comparator); + } + } catch (final InstantiationException e) { + Log.e("selectComparator", e); + } catch (final IllegalAccessException e) { + Log.e("selectComparator", e); + } + } + + public void setClickListener(final @NonNull Action1<CacheComparator> onClickListener) { + this.onClickListener = onClickListener; + } + + public void setSelection(final CacheComparator selection) { + this.selection = selection; + } +}
\ No newline at end of file |
