aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2012-04-14 11:01:26 +0200
committerBananeweizen <bananeweizen@gmx.de>2012-04-14 11:01:26 +0200
commit3b952c829e5b50057e18a0700c6b7ca3963c404d (patch)
treea4e86c50cf6bcb46de10dfdc436dae9de39a1628
parent22150479e8545ab50f41a7c64dba395ade4d586b (diff)
downloadcgeo-3b952c829e5b50057e18a0700c6b7ca3963c404d.zip
cgeo-3b952c829e5b50057e18a0700c6b7ca3963c404d.tar.gz
cgeo-3b952c829e5b50057e18a0700c6b7ca3963c404d.tar.bz2
fix #94: Filter for Difficulty and Terrain
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java20
-rw-r--r--main/src/cgeo/geocaching/filter/AbstractRangeFilter.java16
-rw-r--r--main/src/cgeo/geocaching/filter/AttributeFilter.java24
-rw-r--r--main/src/cgeo/geocaching/filter/DifficultyFilter.java31
-rw-r--r--main/src/cgeo/geocaching/filter/FilterFactory.java5
-rw-r--r--main/src/cgeo/geocaching/filter/SizeFilter.java19
-rw-r--r--main/src/cgeo/geocaching/filter/StateFilter.java39
-rw-r--r--main/src/cgeo/geocaching/filter/TerrainFilter.java31
-rw-r--r--main/src/cgeo/geocaching/filter/TypeFilter.java19
-rw-r--r--tests/src/cgeo/geocaching/filter/DifficultyFilterTest.java23
-rw-r--r--tests/src/cgeo/geocaching/filter/SizeFilterTest.java2
-rw-r--r--tests/src/cgeo/geocaching/filter/TerrainFilterTest.java23
-rw-r--r--tests/src/cgeo/geocaching/filter/TypeFilterTest.java2
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);
}
}