aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java94
-rw-r--r--main/src/cgeo/geocaching/filter/AbstractRangeFilter.java2
-rw-r--r--main/src/cgeo/geocaching/filter/AttributeFilter.java6
-rw-r--r--main/src/cgeo/geocaching/filter/DifficultyFilter.java4
-rw-r--r--main/src/cgeo/geocaching/filter/FilterUserInterface.java105
-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.java13
-rw-r--r--main/src/cgeo/geocaching/filter/SizeFilter.java4
-rw-r--r--main/src/cgeo/geocaching/filter/StateFilter.java4
-rw-r--r--main/src/cgeo/geocaching/filter/TerrainFilter.java4
-rw-r--r--main/src/cgeo/geocaching/filter/TrackablesFilter.java14
-rw-r--r--main/src/cgeo/geocaching/filter/TypeFilter.java4
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() {