aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java38
-rw-r--r--main/src/cgeo/geocaching/export/ExportFactory.java1
-rw-r--r--main/src/cgeo/geocaching/filter/AbstractFilter.java10
-rw-r--r--main/src/cgeo/geocaching/filter/FilterUserInterface.java95
4 files changed, 81 insertions, 63 deletions
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
index ec7dd0f..052189a 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
@@ -19,10 +19,7 @@ import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
import android.widget.ArrayAdapter;
-import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
@@ -66,6 +63,16 @@ public final class NavigationAppFactory extends AbstractAppFactory {
* The id - used in c:geo settings
*/
public final int id;
+
+ /*
+ * display app name in array adapter
+ *
+ * @see java.lang.Enum#toString()
+ */
+ @Override
+ public String toString() {
+ return app.getName();
+ }
}
/**
@@ -127,24 +134,9 @@ public final class NavigationAppFactory extends AbstractAppFactory {
}
/*
* Using an ArrayAdapter with list of NavigationAppsEnum items avoids
- * handling between mapping list positions allows us to do dynamic filtering of the list based on usecase.
+ * handling between mapping list positions allows us to do dynamic filtering of the list based on use case.
*/
- final ArrayAdapter<NavigationAppsEnum> adapter = new ArrayAdapter<NavigationAppsEnum>(activity, android.R.layout.select_dialog_item, items) {
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView textView = (TextView) super.getView(position, convertView, parent);
- textView.setText(getItem(position).app.getName());
- return textView;
- }
-
- @Override
- public View getDropDownView(int position, View convertView, ViewGroup parent) {
- TextView textView = (TextView) super.getDropDownView(position, convertView, parent);
- textView.setText(getItem(position).app.getName());
- return textView;
- }
- };
- adapter.setDropDownViewResource(android.R.layout.select_dialog_item);
+ final ArrayAdapter<NavigationAppsEnum> adapter = new ArrayAdapter<NavigationAppsEnum>(activity, android.R.layout.select_dialog_item, items);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
@@ -298,7 +290,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
/**
* Starts the second default navigation tool if correctly set and installed or the compass app as default fallback.
- *
+ *
* @param geo
* @param activity
* @param cache
@@ -321,7 +313,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
/**
* Returns the default navigation tool if correctly set and installed or the compass app as default fallback
- *
+ *
* @param activity
* @return never <code>null</code>
*/
@@ -341,7 +333,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
/**
* Returns the second default navigation tool if correctly set and installed or the compass app as default fallback
- *
+ *
* @param activity
* @return never <code>null</code>
*/
diff --git a/main/src/cgeo/geocaching/export/ExportFactory.java b/main/src/cgeo/geocaching/export/ExportFactory.java
index c4fdf36..8b3df58 100644
--- a/main/src/cgeo/geocaching/export/ExportFactory.java
+++ b/main/src/cgeo/geocaching/export/ExportFactory.java
@@ -52,7 +52,6 @@ public abstract class ExportFactory {
}
final ArrayAdapter<Export> adapter = new ArrayAdapter<Export>(activity, android.R.layout.select_dialog_item, export);
- adapter.setDropDownViewResource(android.R.layout.select_dialog_item);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
diff --git a/main/src/cgeo/geocaching/filter/AbstractFilter.java b/main/src/cgeo/geocaching/filter/AbstractFilter.java
index 49cf84a..e9f9003 100644
--- a/main/src/cgeo/geocaching/filter/AbstractFilter.java
+++ b/main/src/cgeo/geocaching/filter/AbstractFilter.java
@@ -26,4 +26,14 @@ abstract class AbstractFilter implements IFilter {
public String getName() {
return name;
}
+
+ /*
+ * show name in array adapter
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getName();
+ }
}
diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
index 271df9d..1d22e52 100644
--- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java
+++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
@@ -12,65 +12,85 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.Resources;
+import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map.Entry;
+import java.util.Comparator;
public final class FilterUserInterface {
+ private static class FactoryEntry {
+ private final String name;
+ private final Class<? extends IFilterFactory> filterFactory;
+
+ public FactoryEntry(final String name, final Class<? extends IFilterFactory> filterFactory) {
+ this.name = name;
+ this.filterFactory = filterFactory;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+
private final IAbstractActivity activity;
- private final HashMap<Integer, Class<? extends IFilterFactory>> registry;
+ private final ArrayList<FactoryEntry> 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>>();
+ registry = new ArrayList<FactoryEntry>();
if (Settings.getCacheType() == CacheType.ALL) {
- registry.put(R.string.caches_filter_type, TypeFilter.Factory.class);
+ register(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);
+ register(R.string.caches_filter_size, SizeFilter.Factory.class);
+ register(R.string.cache_terrain, TerrainFilter.Factory.class);
+ register(R.string.cache_difficulty, DifficultyFilter.Factory.class);
+ register(R.string.cache_attributes, AttributeFilter.Factory.class);
+ register(R.string.cache_status, StateFilter.Factory.class);
+ register(R.string.caches_filter_track, TrackablesFilter.class);
+ register(R.string.caches_filter_modified, ModifiedFilter.class);
+
+ // sort by localized names
+ Collections.sort(registry, new Comparator<FactoryEntry>() {
+
+ @Override
+ public int compare(FactoryEntry lhs, FactoryEntry rhs) {
+ return lhs.name.compareToIgnoreCase(rhs.name);
+ }
+ });
+
+ // reset shall be last
+ register(R.string.caches_filter_clear, null);
+ }
+
+ private void register(int resourceId, Class<? extends IFilterFactory> factoryClass) {
+ registry.add(new FactoryEntry(res.getString(resourceId), factoryClass));
}
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() {
+ final ArrayAdapter<FactoryEntry> adapter = new ArrayAdapter<FactoryEntry>((Activity) activity, android.R.layout.select_dialog_item, registry);
+
+ builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int itemIndex) {
- // no filter selected?
- if (itemIndex >= registry.size()) {
+ FactoryEntry entry = adapter.getItem(itemIndex);
+ // reset?
+ if (entry.filterFactory == null) {
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;
- }
+ try {
+ IFilterFactory factoryInstance = entry.filterFactory.newInstance();
+ selectFromFactory(factoryInstance, entry.name, runAfterwards);
+ } catch (Exception e) {
+ Log.e("selectFilter", e);
}
}
}
@@ -89,11 +109,8 @@ public final class FilterUserInterface {
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() {
+ final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>((Activity) activity, android.R.layout.select_dialog_item, filters);
+ builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
runAfterwards.run(filters[item]);
}