diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 94 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/AbstractRangeFilter.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/AttributeFilter.java | 6 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/DifficultyFilter.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/FilterUserInterface.java | 105 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/IFilterFactory.java (renamed from main/src/cgeo/geocaching/filter/FilterFactory.java) | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/ModifiedFilter.java | 13 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/SizeFilter.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/StateFilter.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/TerrainFilter.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/TrackablesFilter.java | 14 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/TypeFilter.java | 4 |
12 files changed, 159 insertions, 97 deletions
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 77c4f96..a25d1b4 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -13,15 +13,8 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.export.ExportFactory; import cgeo.geocaching.files.GPXImporter; -import cgeo.geocaching.filter.AttributeFilter; -import cgeo.geocaching.filter.DifficultyFilter; +import cgeo.geocaching.filter.FilterUserInterface; import cgeo.geocaching.filter.IFilter; -import cgeo.geocaching.filter.ModifiedFilter; -import cgeo.geocaching.filter.SizeFilter; -import cgeo.geocaching.filter.StateFilter; -import cgeo.geocaching.filter.TerrainFilter; -import cgeo.geocaching.filter.TrackablesFilter; -import cgeo.geocaching.filter.TypeFilter; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.network.Network; @@ -108,16 +101,11 @@ public class cgeocaches extends AbstractListActivity { private static final int MENU_REMOVE_FROM_HISTORY = 23; private static final int MENU_DROP_CACHE = 24; private static final int MENU_MOVE_TO_LIST = 25; - private static final int MENU_FILTER_CLEAR = 26; - private static final int MENU_FILTER_TRACKABLES = 27; - private static final int SUBMENU_FILTER_SIZE = 28; - private static final int SUBMENU_FILTER_TYPE = 29; private static final int MENU_SWITCH_SELECT_MODE = 52; private static final int SUBMENU_SHOW_MAP = 54; private static final int SUBMENU_MANAGE_LISTS = 55; private static final int SUBMENU_MANAGE_OFFLINE = 56; private static final int SUBMENU_SORT = 57; - private static final int SUBMENU_FILTER = 58; private static final int SUBMENU_IMPORT = 59; private static final int SUBMENU_MANAGE_HISTORY = 60; private static final int MENU_SORT_DATE = 61; @@ -126,13 +114,9 @@ public class cgeocaches extends AbstractListActivity { private static final int MENU_RENAME_LIST = 64; private static final int MENU_DROP_CACHES_AND_LIST = 65; private static final int MENU_DEFAULT_NAVIGATION = 66; - private static final int SUBMENU_FILTER_ATTRIBUTES = 67; - private static final int SUBMENU_FILTER_STATE = 68; private static final int MENU_NAVIGATION = 69; - private static final int MENU_FILTER_MODIFIED = 70; - private static final int SUBMENU_FILTER_TERRAIN = 71; - private static final int SUBMENU_FILTER_DIFFICULTY = 72; private static final int MENU_STORE_CACHE = 73; + private static final int MENU_FILTER = 74; private static final int MSG_DONE = -1; private static final int MSG_CANCEL = -99; @@ -722,19 +706,7 @@ public class cgeocaches extends AbstractListActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - SubMenu subMenuFilter = menu.addSubMenu(0, SUBMENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter); - subMenuFilter.setHeaderTitle(res.getString(R.string.caches_filter_title)); - if (Settings.getCacheType() == CacheType.ALL) { - subMenuFilter.add(0, SUBMENU_FILTER_TYPE, 0, res.getString(R.string.caches_filter_type)); - } - subMenuFilter.add(0, SUBMENU_FILTER_SIZE, 0, res.getString(R.string.caches_filter_size)); - subMenuFilter.add(0, SUBMENU_FILTER_TERRAIN, 0, res.getString(R.string.cache_terrain)); - subMenuFilter.add(0, SUBMENU_FILTER_DIFFICULTY, 0, res.getString(R.string.cache_difficulty)); - subMenuFilter.add(0, SUBMENU_FILTER_ATTRIBUTES, 0, res.getString(R.string.cache_attributes)); - subMenuFilter.add(0, SUBMENU_FILTER_STATE, 0, res.getString(R.string.cache_status)); - subMenuFilter.add(0, MENU_FILTER_TRACKABLES, 0, res.getString(R.string.caches_filter_track)); - subMenuFilter.add(0, MENU_FILTER_MODIFIED, 0, res.getString(R.string.caches_filter_modified)); - subMenuFilter.add(0, MENU_FILTER_CLEAR, 0, res.getString(R.string.caches_filter_clear)); + menu.add(0, MENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter); SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(android.R.drawable.ic_menu_sort_alphabetically); subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title)); @@ -977,35 +949,22 @@ public class cgeocaches extends AbstractListActivity { case MENU_SORT_STATE: setComparator(item, new StateComparator()); return true; - case SUBMENU_FILTER_TYPE: - showFilterMenu(new TypeFilter.Factory().getFilters(), res.getString(R.string.caches_filter_type_title)); - return true; - case SUBMENU_FILTER_SIZE: - showFilterMenu(new SizeFilter.Factory().getFilters(), res.getString(R.string.caches_filter_size_title)); - return true; - case SUBMENU_FILTER_ATTRIBUTES: - showFilterMenu(new AttributeFilter.Factory().getFilters(), res.getString(R.string.cache_attributes)); - return true; - case SUBMENU_FILTER_DIFFICULTY: - showFilterMenu(new DifficultyFilter.Factory().getFilters(), res.getString(R.string.cache_difficulty)); - return true; - case SUBMENU_FILTER_TERRAIN: - showFilterMenu(new TerrainFilter.Factory().getFilters(), res.getString(R.string.cache_terrain)); - return true; - case SUBMENU_FILTER_STATE: - showFilterMenu(new StateFilter.Factory().getFilters(), res.getString(R.string.cache_status)); - return true; - case MENU_FILTER_TRACKABLES: - setFilter(new TrackablesFilter(res.getString(R.string.caches_filter_track))); - return true; - case MENU_FILTER_MODIFIED: - setFilter(new ModifiedFilter(res.getString(R.string.caches_filter_modified))); + case MENU_FILTER: + new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() { + @Override + public void run(IFilter selectedFilter) { + if (selectedFilter != null) { + setFilter(selectedFilter); + } + else { + // clear filter + if (adapter != null) { + setFilter(null); + } + } + } + }); return true; - case MENU_FILTER_CLEAR: - if (adapter != null) { - setFilter(null); - } - return false; case MENU_IMPORT_WEB: importWeb(); return false; @@ -1025,23 +984,6 @@ public class cgeocaches extends AbstractListActivity { return CacheListAppFactory.onMenuItemSelected(item, geo, cacheList, this, search); } - private void showFilterMenu(final IFilter[] filters, final String menuTitle) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(menuTitle); - - final String[] names = new String[filters.length]; - for (int i = 0; i < filters.length; i++) { - names[i] = filters[i].getName(); - } - builder.setItems(names, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - setFilter(filters[item]); - } - }); - - builder.create().show(); - } - private void setComparator(MenuItem item, CacheComparator comparator) { if (adapter != null) { diff --git a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java index 4d98c23..ff3fce5 100644 --- a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java +++ b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java @@ -3,7 +3,7 @@ package cgeo.geocaching.filter; import cgeo.geocaching.cgeoapplication; -public abstract class AbstractRangeFilter extends AbstractFilter { +abstract class AbstractRangeFilter extends AbstractFilter { protected final float rangeMin; protected final float rangeMax; diff --git a/main/src/cgeo/geocaching/filter/AttributeFilter.java b/main/src/cgeo/geocaching/filter/AttributeFilter.java index 3bb1782..2565178 100644 --- a/main/src/cgeo/geocaching/filter/AttributeFilter.java +++ b/main/src/cgeo/geocaching/filter/AttributeFilter.java @@ -11,7 +11,7 @@ import android.content.res.Resources; import java.util.EnumSet; -public class AttributeFilter extends AbstractFilter { +class AttributeFilter extends AbstractFilter { private final String attribute; @@ -41,7 +41,7 @@ public class AttributeFilter extends AbstractFilter { return fullCache.getAttributes().contains(attribute); } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { @@ -55,6 +55,6 @@ public class AttributeFilter extends AbstractFilter { } return filters; } - + } } diff --git a/main/src/cgeo/geocaching/filter/DifficultyFilter.java b/main/src/cgeo/geocaching/filter/DifficultyFilter.java index e493bb0..368c20f 100644 --- a/main/src/cgeo/geocaching/filter/DifficultyFilter.java +++ b/main/src/cgeo/geocaching/filter/DifficultyFilter.java @@ -5,7 +5,7 @@ import cgeo.geocaching.cgCache; import java.util.ArrayList; -public class DifficultyFilter extends AbstractRangeFilter { +class DifficultyFilter extends AbstractRangeFilter { public DifficultyFilter(int difficulty) { super(R.string.cache_difficulty, difficulty); @@ -16,7 +16,7 @@ public class DifficultyFilter extends AbstractRangeFilter { return rangeMin <= cache.getDifficulty() && cache.getDifficulty() < rangeMax; } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java new file mode 100644 index 0000000..271df9d --- /dev/null +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -0,0 +1,105 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.R; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RunnableWithArgument; + +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.HashMap; +import java.util.Map.Entry; + +public final class FilterUserInterface { + + private final IAbstractActivity activity; + private final HashMap<Integer, Class<? extends IFilterFactory>> registry; + private final Resources res; + + public FilterUserInterface(final IAbstractActivity activity) { + this.activity = activity; + this.res = cgeoapplication.getInstance().getResources(); + + registry = new HashMap<Integer, Class<? extends IFilterFactory>>(); + if (Settings.getCacheType() == CacheType.ALL) { + registry.put(R.string.caches_filter_type, TypeFilter.Factory.class); + } + registry.put(R.string.caches_filter_size, SizeFilter.Factory.class); + registry.put(R.string.cache_terrain, TerrainFilter.Factory.class); + registry.put(R.string.cache_difficulty, DifficultyFilter.Factory.class); + registry.put(R.string.cache_attributes, AttributeFilter.Factory.class); + registry.put(R.string.cache_status, StateFilter.Factory.class); + registry.put(R.string.caches_filter_track, TrackablesFilter.class); + registry.put(R.string.caches_filter_modified, ModifiedFilter.class); + } + + public void selectFilter(final RunnableWithArgument<IFilter> runAfterwards) { + final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity); + builder.setTitle(R.string.caches_filter); + + ArrayList<String> names = new ArrayList<String>(registry.size() + 1); + for (Entry<Integer, Class<? extends IFilterFactory>> entry : registry.entrySet()) { + names.add(res.getString(entry.getKey())); + } + Collections.sort(names); + names.add(res.getString(R.string.caches_filter_clear)); + final String[] array = names.toArray(new String[names.size()]); + builder.setItems(array, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int itemIndex) { + // no filter selected? + if (itemIndex >= registry.size()) { + runAfterwards.run(null); + } + else { + final String name = array[itemIndex]; + for (Entry<Integer, Class<? extends IFilterFactory>> entry : registry.entrySet()) { + if (name.equals(res.getString(entry.getKey()))) { + Class<? extends IFilterFactory> producer = entry.getValue(); + try { + IFilterFactory factory = producer.newInstance(); + selectFromFactory(factory, name, runAfterwards); + } catch (Exception e) { + Log.e("selectFilter", e); + } + return; + } + } + } + } + }); + + builder.create().show(); + } + + private void selectFromFactory(final IFilterFactory factory, final String menuTitle, final RunnableWithArgument<IFilter> runAfterwards) { + final IFilter[] filters = factory.getFilters(); + if (filters.length == 1) { + runAfterwards.run(filters[0]); + return; + } + + final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity); + builder.setTitle(menuTitle); + + final String[] names = new String[filters.length]; + for (int i = 0; i < filters.length; i++) { + names[i] = filters[i].getName(); + } + builder.setItems(names, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + runAfterwards.run(filters[item]); + } + }); + + builder.create().show(); + } + +} diff --git a/main/src/cgeo/geocaching/filter/FilterFactory.java b/main/src/cgeo/geocaching/filter/IFilterFactory.java index de78500..3491fd7 100644 --- a/main/src/cgeo/geocaching/filter/FilterFactory.java +++ b/main/src/cgeo/geocaching/filter/IFilterFactory.java @@ -1,5 +1,5 @@ package cgeo.geocaching.filter; -public interface FilterFactory { +interface IFilterFactory { public IFilter[] getFilters(); } diff --git a/main/src/cgeo/geocaching/filter/ModifiedFilter.java b/main/src/cgeo/geocaching/filter/ModifiedFilter.java index 6063f58..f74bb4d 100644 --- a/main/src/cgeo/geocaching/filter/ModifiedFilter.java +++ b/main/src/cgeo/geocaching/filter/ModifiedFilter.java @@ -1,11 +1,13 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.R; import cgeo.geocaching.cgCache; +import cgeo.geocaching.cgeoapplication; -public class ModifiedFilter extends AbstractFilter { +class ModifiedFilter extends AbstractFilter implements IFilterFactory { - public ModifiedFilter(String name) { - super(name); + public ModifiedFilter() { + super(cgeoapplication.getInstance().getString(R.string.caches_filter_modified)); } @Override @@ -13,4 +15,9 @@ public class ModifiedFilter extends AbstractFilter { // modified on GC return cache.hasUserModifiedCoords() || cache.hasFinalDefined(); } + + @Override + public IFilter[] getFilters() { + return new IFilter[] { this }; + } } diff --git a/main/src/cgeo/geocaching/filter/SizeFilter.java b/main/src/cgeo/geocaching/filter/SizeFilter.java index b2fd03c..b08c2ae 100644 --- a/main/src/cgeo/geocaching/filter/SizeFilter.java +++ b/main/src/cgeo/geocaching/filter/SizeFilter.java @@ -5,7 +5,7 @@ import cgeo.geocaching.enumerations.CacheSize; import java.util.ArrayList; -public class SizeFilter extends AbstractFilter { +class SizeFilter extends AbstractFilter { private final CacheSize cacheSize; public SizeFilter(CacheSize cacheSize) { @@ -23,7 +23,7 @@ public class SizeFilter extends AbstractFilter { return cacheSize.getL10n(); } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { diff --git a/main/src/cgeo/geocaching/filter/StateFilter.java b/main/src/cgeo/geocaching/filter/StateFilter.java index 7aa0c98..b086477 100644 --- a/main/src/cgeo/geocaching/filter/StateFilter.java +++ b/main/src/cgeo/geocaching/filter/StateFilter.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -public abstract class StateFilter extends AbstractFilter { +abstract class StateFilter extends AbstractFilter { final static Resources res = cgeoapplication.getInstance().getResources(); @@ -75,7 +75,7 @@ public abstract class StateFilter extends AbstractFilter { } } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { diff --git a/main/src/cgeo/geocaching/filter/TerrainFilter.java b/main/src/cgeo/geocaching/filter/TerrainFilter.java index ab6a31e..5cee87e 100644 --- a/main/src/cgeo/geocaching/filter/TerrainFilter.java +++ b/main/src/cgeo/geocaching/filter/TerrainFilter.java @@ -6,7 +6,7 @@ import cgeo.geocaching.cgCache; import java.util.ArrayList; -public class TerrainFilter extends AbstractRangeFilter { +class TerrainFilter extends AbstractRangeFilter { public TerrainFilter(int terrain) { super(R.string.cache_terrain, terrain); @@ -17,7 +17,7 @@ public class TerrainFilter extends AbstractRangeFilter { return rangeMin <= cache.getTerrain() && cache.getTerrain() < rangeMax; } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { final ArrayList<IFilter> filters = new ArrayList<IFilter>(5); diff --git a/main/src/cgeo/geocaching/filter/TrackablesFilter.java b/main/src/cgeo/geocaching/filter/TrackablesFilter.java index 99d888b..90def5b 100644 --- a/main/src/cgeo/geocaching/filter/TrackablesFilter.java +++ b/main/src/cgeo/geocaching/filter/TrackablesFilter.java @@ -1,14 +1,22 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.R; import cgeo.geocaching.cgCache; +import cgeo.geocaching.cgeoapplication; -public class TrackablesFilter extends AbstractFilter { - public TrackablesFilter(String name) { - super(name); +class TrackablesFilter extends AbstractFilter implements IFilterFactory { + public TrackablesFilter() { + super(cgeoapplication.getInstance().getString(R.string.caches_filter_track)); } @Override public boolean accepts(cgCache cache) { return cache.hasTrackables(); } + + @Override + public IFilter[] getFilters() { + return new IFilter[] { this }; + } + } diff --git a/main/src/cgeo/geocaching/filter/TypeFilter.java b/main/src/cgeo/geocaching/filter/TypeFilter.java index e76d449..11321c7 100644 --- a/main/src/cgeo/geocaching/filter/TypeFilter.java +++ b/main/src/cgeo/geocaching/filter/TypeFilter.java @@ -5,7 +5,7 @@ import cgeo.geocaching.enumerations.CacheType; import java.util.ArrayList; -public class TypeFilter extends AbstractFilter { +class TypeFilter extends AbstractFilter { private final CacheType cacheType; public TypeFilter(final CacheType cacheType) { @@ -23,7 +23,7 @@ public class TypeFilter extends AbstractFilter { return cacheType.getL10n(); } - public static class Factory implements FilterFactory { + public static class Factory implements IFilterFactory { @Override public IFilter[] getFilters() { |
