aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/res/menu/cache_list_options.xml44
-rw-r--r--main/src/cgeo/geocaching/CacheListActivity.java40
-rw-r--r--main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java122
-rw-r--r--main/src/cgeo/geocaching/sorting/SortActionProvider.java153
4 files changed, 199 insertions, 160 deletions
diff --git a/main/res/menu/cache_list_options.xml b/main/res/menu/cache_list_options.xml
index be45b54..60fedad 100644
--- a/main/res/menu/cache_list_options.xml
+++ b/main/res/menu/cache_list_options.xml
@@ -1,24 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:cgeo="http://schemas.android.com/apk/res-auto">
+ xmlns:cgeo="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_show_on_map"
android:icon="@drawable/ic_menu_mapmode"
- cgeo:showAsAction="ifRoom"
- android:title="@string/caches_on_map">
+ android:title="@string/caches_on_map"
+ cgeo:showAsAction="ifRoom">
</item>
<item
android:id="@+id/menu_filter"
android:icon="@drawable/ic_menu_filter"
- cgeo:showAsAction="ifRoom|withText"
- android:title="@string/caches_filter">
+ android:title="@string/caches_filter"
+ cgeo:showAsAction="ifRoom|withText">
</item>
<item
android:id="@+id/menu_sort"
+ android:actionProviderClass="cgeo.geocaching.sorting.SortActionProvider"
android:icon="@drawable/ic_menu_sort_alphabetically"
- cgeo:showAsAction="ifRoom|withText"
- android:title="@string/caches_sort">
+ android:showAsAction="always"
+ android:title="@string/caches_sort"
+ cgeo:actionProviderClass="cgeo.geocaching.sorting.SortActionProvider"
+ cgeo:showAsAction="ifRoom|withText">
</item>
<item
android:id="@+id/menu_switch_select_mode"
@@ -81,26 +84,26 @@
android:icon="@drawable/ic_menu_mapmode"
android:title="@string/caches_on_map"
android:visible="false">
- <menu >
+ <menu>
</menu>
</item>
<item
- android:id="@+id/menu_create_list"
- android:title="@string/list_menu_create">
+ android:id="@+id/menu_create_list"
+ android:title="@string/list_menu_create">
</item>
<item
- android:id="@+id/menu_drop_list"
- android:title="@string/list_menu_drop">
+ android:id="@+id/menu_drop_list"
+ android:title="@string/list_menu_drop">
</item>
<item
- android:id="@+id/menu_rename_list"
- android:title="@string/list_menu_rename">
+ android:id="@+id/menu_rename_list"
+ android:title="@string/list_menu_rename">
</item>
<item
- cgeo:showAsAction="never|withText"
- android:title="@string/list_menu_import">
+ android:title="@string/list_menu_import"
+ cgeo:showAsAction="never|withText">
<menu>
- <item
+ <item
android:id="@+id/menu_import_gpx"
android:title="@string/gpx_import_title">
</item>
@@ -115,10 +118,10 @@
</menu>
</item>
<item
- cgeo:showAsAction="never|withText"
- android:title="@string/export">
+ android:title="@string/export"
+ cgeo:showAsAction="never|withText">
<menu>
- <item
+ <item
android:id="@+id/menu_export_gpx"
android:title="@string/export_gpx">
</item>
@@ -128,4 +131,5 @@
</item>
</menu>
</item>
+
</menu> \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java
index 2dbb2c0..8030a65 100644
--- a/main/src/cgeo/geocaching/CacheListActivity.java
+++ b/main/src/cgeo/geocaching/CacheListActivity.java
@@ -44,7 +44,7 @@ import cgeo.geocaching.sensors.IGeoData;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.settings.SettingsActivity;
import cgeo.geocaching.sorting.CacheComparator;
-import cgeo.geocaching.sorting.ComparatorUserInterface;
+import cgeo.geocaching.sorting.SortActionProvider;
import cgeo.geocaching.ui.CacheListAdapter;
import cgeo.geocaching.ui.LoggingUI;
import cgeo.geocaching.ui.WeakReferenceHandler;
@@ -83,6 +83,7 @@ import android.os.Message;
import android.provider.OpenableColumns;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
+import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@@ -439,6 +440,8 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
*/
private IFilter currentFilter = null;
+ private SortActionProvider sortProvider;
+
private void initActionBarSpinner() {
mCacheListSpinnerAdapter = new CacheListSpinnerAdapter(this, R.layout.support_simple_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
@@ -544,7 +547,25 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
getMenuInflater().inflate(R.menu.cache_list_options, menu);
CacheListAppFactory.addMenuItems(menu, this, res);
+ sortProvider = (SortActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.menu_sort));
+ sortProvider.setSelection(adapter.getCacheComparator());
+ sortProvider.setClickListener(new Action1<CacheComparator>() {
+ @Override
+ public void call(final CacheComparator selectedComparator) {
+ final CacheComparator oldComparator = adapter.getCacheComparator();
+ // selecting the same sorting twice will toggle the order
+ if (selectedComparator != null && oldComparator != null && selectedComparator.getClass().equals(oldComparator.getClass())) {
+ adapter.toggleInverseSort();
+ }
+ else {
+ // always reset the inversion for a new sorting criteria
+ adapter.resetInverseSort();
+ }
+ setComparator(selectedComparator);
+ sortProvider.setSelection(selectedComparator);
+ }
+ });
return true;
}
@@ -704,23 +725,6 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
case R.id.menu_filter:
showFilterMenu(null);
return true;
- case R.id.menu_sort:
- final CacheComparator oldComparator = adapter.getCacheComparator();
- new ComparatorUserInterface(this).selectComparator(oldComparator, new Action1<CacheComparator>() {
- @Override
- public void call(final CacheComparator selectedComparator) {
- // selecting the same sorting twice will toggle the order
- if (selectedComparator != null && oldComparator != null && selectedComparator.getClass().equals(oldComparator.getClass())) {
- adapter.toggleInverseSort();
- }
- else {
- // always reset the inversion for a new sorting criteria
- adapter.resetInverseSort();
- }
- setComparator(selectedComparator);
- }
- });
- return true;
case R.id.menu_import_web:
importWeb();
return true;
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