diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2014-06-12 08:02:00 +0200 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2014-06-12 08:02:18 +0200 |
| commit | dfd93e387f51b2cd505491e05ac5440b17351211 (patch) | |
| tree | e087320a3d58f707f86ae2f1394f06356cc4918f | |
| parent | f04d04a2b2438416335e6a5b03a21568912fa15f (diff) | |
| download | cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.zip cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.tar.gz cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.tar.bz2 | |
convert sort selection to actionprovider
| -rw-r--r-- | main/res/menu/cache_list_options.xml | 44 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheListActivity.java | 40 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java | 122 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/SortActionProvider.java | 153 |
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 |
