diff options
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 20 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/AbstractRangeFilter.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/AttributeFilter.java | 24 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/DifficultyFilter.java | 31 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/FilterFactory.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/SizeFilter.java | 19 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/StateFilter.java | 39 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/TerrainFilter.java | 31 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/TypeFilter.java | 19 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/filter/DifficultyFilterTest.java | 23 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/filter/SizeFilterTest.java | 2 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/filter/TerrainFilterTest.java | 23 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/filter/TypeFilterTest.java | 2 |
13 files changed, 207 insertions, 47 deletions
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 6ac9d9c..f44c473 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -14,10 +14,12 @@ 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.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; @@ -128,6 +130,8 @@ public class cgeocaches extends AbstractListActivity { 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 MSG_DONE = -1; private static final int MSG_CANCEL = -99; @@ -724,6 +728,8 @@ public class cgeocaches extends AbstractListActivity { 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)); @@ -972,16 +978,22 @@ public class cgeocaches extends AbstractListActivity { setComparator(item, new StateComparator()); return true; case SUBMENU_FILTER_TYPE: - showFilterMenu(TypeFilter.getAllFilters(), res.getString(R.string.caches_filter_type_title)); + showFilterMenu(new TypeFilter.Factory().getFilters(), res.getString(R.string.caches_filter_type_title)); return true; case SUBMENU_FILTER_SIZE: - showFilterMenu(SizeFilter.getAllFilters(), res.getString(R.string.caches_filter_size_title)); + showFilterMenu(new SizeFilter.Factory().getFilters(), res.getString(R.string.caches_filter_size_title)); return true; case SUBMENU_FILTER_ATTRIBUTES: - showFilterMenu(AttributeFilter.getAllFilters(), res.getString(R.string.cache_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(StateFilter.getAllFilters(), res.getString(R.string.cache_status)); + 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))); diff --git a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java new file mode 100644 index 0000000..4d98c23 --- /dev/null +++ b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java @@ -0,0 +1,16 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.cgeoapplication; + + +public abstract class AbstractRangeFilter extends AbstractFilter { + + protected final float rangeMin; + protected final float rangeMax; + + public AbstractRangeFilter(int ressourceId, int range) { + super(cgeoapplication.getInstance().getResources().getString(ressourceId) + ' ' + (range == 5 ? '5' : String.valueOf(range) + " + " + String.format("%.1f", range + 0.5))); + this.rangeMin = range; + rangeMax = rangeMin + 1f; + } +}
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/filter/AttributeFilter.java b/main/src/cgeo/geocaching/filter/AttributeFilter.java index 7b8992b..3bb1782 100644 --- a/main/src/cgeo/geocaching/filter/AttributeFilter.java +++ b/main/src/cgeo/geocaching/filter/AttributeFilter.java @@ -41,16 +41,20 @@ public class AttributeFilter extends AbstractFilter { return fullCache.getAttributes().contains(attribute); } - public static IFilter[] getAllFilters() { - final String packageName = cgeoapplication.getInstance().getBaseContext().getPackageName(); - final Resources res = cgeoapplication.getInstance().getResources(); - - final String[] ids = res.getStringArray(R.array.attribute_ids); - final IFilter[] filters = new IFilter[ids.length]; - for (int i = 0; i < ids.length; i++) { - filters[i] = new AttributeFilter(getName("attribute_" + ids[i], res, packageName), ids[i]); + public static class Factory implements FilterFactory { + + @Override + public IFilter[] getFilters() { + final String packageName = cgeoapplication.getInstance().getBaseContext().getPackageName(); + final Resources res = cgeoapplication.getInstance().getResources(); + + final String[] ids = res.getStringArray(R.array.attribute_ids); + final IFilter[] filters = new IFilter[ids.length]; + for (int i = 0; i < ids.length; i++) { + filters[i] = new AttributeFilter(getName("attribute_" + ids[i], res, packageName), ids[i]); + } + return filters; } - return filters; + } - } diff --git a/main/src/cgeo/geocaching/filter/DifficultyFilter.java b/main/src/cgeo/geocaching/filter/DifficultyFilter.java new file mode 100644 index 0000000..e493bb0 --- /dev/null +++ b/main/src/cgeo/geocaching/filter/DifficultyFilter.java @@ -0,0 +1,31 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.R; +import cgeo.geocaching.cgCache; + +import java.util.ArrayList; + +public class DifficultyFilter extends AbstractRangeFilter { + + public DifficultyFilter(int difficulty) { + super(R.string.cache_difficulty, difficulty); + } + + @Override + public boolean accepts(cgCache cache) { + return rangeMin <= cache.getDifficulty() && cache.getDifficulty() < rangeMax; + } + + public static class Factory implements FilterFactory { + + @Override + public IFilter[] getFilters() { + final ArrayList<IFilter> filters = new ArrayList<IFilter>(5); + for (int difficulty = 1; difficulty <= 5; difficulty++) { + filters.add(new DifficultyFilter(difficulty)); + } + return filters.toArray(new IFilter[filters.size()]); + } + + } +} diff --git a/main/src/cgeo/geocaching/filter/FilterFactory.java b/main/src/cgeo/geocaching/filter/FilterFactory.java new file mode 100644 index 0000000..de78500 --- /dev/null +++ b/main/src/cgeo/geocaching/filter/FilterFactory.java @@ -0,0 +1,5 @@ +package cgeo.geocaching.filter; + +public interface FilterFactory { + public IFilter[] getFilters(); +} diff --git a/main/src/cgeo/geocaching/filter/SizeFilter.java b/main/src/cgeo/geocaching/filter/SizeFilter.java index ecbbd95..b2fd03c 100644 --- a/main/src/cgeo/geocaching/filter/SizeFilter.java +++ b/main/src/cgeo/geocaching/filter/SizeFilter.java @@ -23,14 +23,19 @@ public class SizeFilter extends AbstractFilter { return cacheSize.getL10n(); } - public static AbstractFilter[] getAllFilters() { - final CacheSize[] cacheSizes = CacheSize.values(); - final ArrayList<SizeFilter> filters = new ArrayList<SizeFilter>(); - for (CacheSize cacheSize : cacheSizes) { - if (cacheSize != CacheSize.UNKNOWN) { - filters.add(new SizeFilter(cacheSize)); + public static class Factory implements FilterFactory { + + @Override + public IFilter[] getFilters() { + final CacheSize[] cacheSizes = CacheSize.values(); + final ArrayList<SizeFilter> filters = new ArrayList<SizeFilter>(); + for (CacheSize cacheSize : cacheSizes) { + if (cacheSize != CacheSize.UNKNOWN) { + filters.add(new SizeFilter(cacheSize)); + } } + return filters.toArray(new SizeFilter[filters.size()]); } - return filters.toArray(new SizeFilter[filters.size()]); + } } diff --git a/main/src/cgeo/geocaching/filter/StateFilter.java b/main/src/cgeo/geocaching/filter/StateFilter.java index 93e8c66..7aa0c98 100644 --- a/main/src/cgeo/geocaching/filter/StateFilter.java +++ b/main/src/cgeo/geocaching/filter/StateFilter.java @@ -75,23 +75,28 @@ public abstract class StateFilter extends AbstractFilter { } } - public static AbstractFilter[] getAllFilters() { - final ArrayList<StateFilter> filters = new ArrayList<StateFilter>(); - filters.add(new StateFoundFilter()); - filters.add(new StateArchivedFilter()); - filters.add(new StateDisabledFilter()); - filters.add(new StatePremiumFilter()); - filters.add(new StateOfflineLogFilter()); - - Collections.sort(filters, new Comparator<StateFilter>() { - - @Override - public int compare(StateFilter filter1, StateFilter filter2) { - return filter1.getName().compareToIgnoreCase(filter2.getName()); - } - }); - - return filters.toArray(new StateFilter[filters.size()]); + public static class Factory implements FilterFactory { + + @Override + public IFilter[] getFilters() { + final ArrayList<StateFilter> filters = new ArrayList<StateFilter>(); + filters.add(new StateFoundFilter()); + filters.add(new StateArchivedFilter()); + filters.add(new StateDisabledFilter()); + filters.add(new StatePremiumFilter()); + filters.add(new StateOfflineLogFilter()); + + Collections.sort(filters, new Comparator<StateFilter>() { + + @Override + public int compare(StateFilter filter1, StateFilter filter2) { + return filter1.getName().compareToIgnoreCase(filter2.getName()); + } + }); + + return filters.toArray(new StateFilter[filters.size()]); + } + } } diff --git a/main/src/cgeo/geocaching/filter/TerrainFilter.java b/main/src/cgeo/geocaching/filter/TerrainFilter.java new file mode 100644 index 0000000..ab6a31e --- /dev/null +++ b/main/src/cgeo/geocaching/filter/TerrainFilter.java @@ -0,0 +1,31 @@ +package cgeo.geocaching.filter; + + +import cgeo.geocaching.R; +import cgeo.geocaching.cgCache; + +import java.util.ArrayList; + +public class TerrainFilter extends AbstractRangeFilter { + + public TerrainFilter(int terrain) { + super(R.string.cache_terrain, terrain); + } + + @Override + public boolean accepts(cgCache cache) { + return rangeMin <= cache.getTerrain() && cache.getTerrain() < rangeMax; + } + + public static class Factory implements FilterFactory { + @Override + public IFilter[] getFilters() { + final ArrayList<IFilter> filters = new ArrayList<IFilter>(5); + for (int terrain = 1; terrain <= 5; terrain++) { + filters.add(new TerrainFilter(terrain)); + } + return filters.toArray(new IFilter[filters.size()]); + } + } + +} diff --git a/main/src/cgeo/geocaching/filter/TypeFilter.java b/main/src/cgeo/geocaching/filter/TypeFilter.java index cfeb007..e76d449 100644 --- a/main/src/cgeo/geocaching/filter/TypeFilter.java +++ b/main/src/cgeo/geocaching/filter/TypeFilter.java @@ -23,14 +23,19 @@ public class TypeFilter extends AbstractFilter { return cacheType.getL10n(); } - public static IFilter[] getAllFilters() { - final CacheType[] types = CacheType.values(); - final ArrayList<IFilter> filters = new ArrayList<IFilter>(types.length); - for (CacheType cacheType : types) { - if (cacheType != CacheType.ALL) { - filters.add(new TypeFilter(cacheType)); + public static class Factory implements FilterFactory { + + @Override + public IFilter[] getFilters() { + final CacheType[] types = CacheType.values(); + final ArrayList<IFilter> filters = new ArrayList<IFilter>(types.length); + for (CacheType cacheType : types) { + if (cacheType != CacheType.ALL) { + filters.add(new TypeFilter(cacheType)); + } } + return filters.toArray(new TypeFilter[filters.size()]); } - return filters.toArray(new TypeFilter[filters.size()]); + } } diff --git a/tests/src/cgeo/geocaching/filter/DifficultyFilterTest.java b/tests/src/cgeo/geocaching/filter/DifficultyFilterTest.java new file mode 100644 index 0000000..cf2abe2 --- /dev/null +++ b/tests/src/cgeo/geocaching/filter/DifficultyFilterTest.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.cgCache; + +public class DifficultyFilterTest extends AbstractFilterTestCase { + + public static void testTerrainFilter() { + final cgCache easy = new cgCache(); + easy.setDifficulty(1.5f); + + final cgCache hard = new cgCache(); + hard.setDifficulty(5f); + + final DifficultyFilter easyFilter = new DifficultyFilter(1); + + assertTrue(easyFilter.accepts(easy)); + assertFalse(easyFilter.accepts(hard)); + } + + public static void testAllFilters() { + assertTrue(new DifficultyFilter.Factory().getFilters().length == 5); // difficulty ranges from 1 to 5 + } +} diff --git a/tests/src/cgeo/geocaching/filter/SizeFilterTest.java b/tests/src/cgeo/geocaching/filter/SizeFilterTest.java index b62cd56..65fd8d8 100644 --- a/tests/src/cgeo/geocaching/filter/SizeFilterTest.java +++ b/tests/src/cgeo/geocaching/filter/SizeFilterTest.java @@ -32,7 +32,7 @@ public class SizeFilterTest extends AbstractFilterTestCase { public static void testGetAllFilters() { final int expectedSizes = CacheSize.values().length - 1; // hide "UNKNOWN" - assertEquals(expectedSizes, SizeFilter.getAllFilters().length); + assertEquals(expectedSizes, new SizeFilter.Factory().getFilters().length); } public void testFilter() { diff --git a/tests/src/cgeo/geocaching/filter/TerrainFilterTest.java b/tests/src/cgeo/geocaching/filter/TerrainFilterTest.java new file mode 100644 index 0000000..00c78b1 --- /dev/null +++ b/tests/src/cgeo/geocaching/filter/TerrainFilterTest.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.cgCache; + +public class TerrainFilterTest extends AbstractFilterTestCase { + + public static void testTerrainFilter() { + final cgCache easy = new cgCache(); + easy.setTerrain(1.5f); + + final cgCache hard = new cgCache(); + hard.setTerrain(5f); + + final AbstractRangeFilter easyFilter = new TerrainFilter(1); + + assertTrue(easyFilter.accepts(easy)); + assertFalse(easyFilter.accepts(hard)); + } + + public static void testAllFilters() { + assertTrue(new TerrainFilter.Factory().getFilters().length == 5); // terrain ranges from 1 to 5 + } +} diff --git a/tests/src/cgeo/geocaching/filter/TypeFilterTest.java b/tests/src/cgeo/geocaching/filter/TypeFilterTest.java index 9125c72..826ba03 100644 --- a/tests/src/cgeo/geocaching/filter/TypeFilterTest.java +++ b/tests/src/cgeo/geocaching/filter/TypeFilterTest.java @@ -45,7 +45,7 @@ public class TypeFilterTest extends AbstractFilterTestCase { public static void testGetAllFilters() { final int expectedEntries = CacheType.values().length - 1; // hide "all" - assertEquals(expectedEntries, TypeFilter.getAllFilters().length); + assertEquals(expectedEntries, new TypeFilter.Factory().getFilters().length); } } |
