aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2013-11-10 09:45:34 +0100
committerBananeweizen <bananeweizen@gmx.de>2013-11-10 09:45:34 +0100
commit602cda57b0a70bb7b59598060842587a57b565f1 (patch)
tree7e8b5e2a8634abdab18a3230dd2f0aeeb905a041 /main
parent2fd3060213c74747d76cb104a3ecb693a3352781 (diff)
parent6193b1520a0c323e4fad53ad2d3374779bf70bf2 (diff)
downloadcgeo-602cda57b0a70bb7b59598060842587a57b565f1.zip
cgeo-602cda57b0a70bb7b59598060842587a57b565f1.tar.gz
cgeo-602cda57b0a70bb7b59598060842587a57b565f1.tar.bz2
Merge remote-tracking branch 'KiwiStone/popularity_ratio_filter'
Conflicts: main/res/values-de/strings.xml main/res/values/strings.xml main/src/cgeo/geocaching/filter/FilterUserInterface.java
Diffstat (limited to 'main')
-rw-r--r--main/res/values-de/strings.xml2
-rw-r--r--main/res/values/strings.xml4
-rw-r--r--main/src/cgeo/geocaching/filter/FilterUserInterface.java1
-rw-r--r--main/src/cgeo/geocaching/filter/PopularityRatioFilter.java73
-rw-r--r--main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java5
5 files changed, 81 insertions, 4 deletions
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index ec8a852..8d97abf 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -290,6 +290,7 @@
<string name="caches_filter_origin">Herkunft</string>
<string name="caches_filter_distance">Entfernung</string>
<string name="caches_filter_popularity">Beliebtheit</string>
+ <string name="caches_filter_popularity_ratio">Beliebtheit [%]</string>
<string name="caches_removing_from_history">Lösche aus Verlauf…</string>
<string name="caches_clear_offlinelogs">Offline-Logs löschen</string>
<string name="caches_clear_offlinelogs_progress">Lösche Offline-Logs</string>
@@ -1070,4 +1071,5 @@
<item quantity="one">%s Favorit</item>
<item quantity="other">%s Favoriten</item>
</plurals>
+ <string name="percent_favorite_points">% Favoriten</string>
</resources>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 79ba638..fab214b 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -331,6 +331,7 @@
<string name="caches_filter_distance">Distance</string>
<string name="caches_filter_personal_note">With personal note</string>
<string name="caches_filter_popularity">Popularity</string>
+ <string name="caches_filter_popularity_ratio">Popularity [%]</string>
<string name="caches_removing_from_history">Removing from History…</string>
<string name="caches_clear_offlinelogs">Clear offline logs</string>
<string name="caches_clear_offlinelogs_progress">Clearing offline logs</string>
@@ -1197,5 +1198,6 @@
<item quantity="one">%s favorite</item>
<item quantity="other">%s favorites</item>
</plurals>
-
+
+ <string name="percent_favorite_points">%\ favorites</string>
</resources>
diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
index 7813e69..d77341b 100644
--- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java
+++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
@@ -58,6 +58,7 @@ public final class FilterUserInterface {
register(R.string.caches_filter_distance, DistanceFilter.Factory.class);
register(R.string.caches_filter_personal_note, PersonalNoteFilter.class);
register(R.string.caches_filter_popularity, PopularityFilter.Factory.class);
+ register(R.string.caches_filter_popularity_ratio, PopularityRatioFilter.Factory.class);
// sort by localized names
Collections.sort(registry, new Comparator<FactoryEntry>() {
diff --git a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java
new file mode 100644
index 0000000..2d7207a
--- /dev/null
+++ b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java
@@ -0,0 +1,73 @@
+package cgeo.geocaching.filter;
+
+import cgeo.geocaching.CgeoApplication;
+import cgeo.geocaching.DataStore;
+import cgeo.geocaching.Geocache;
+import cgeo.geocaching.R;
+import cgeo.geocaching.enumerations.LogType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * filters caches by popularity ratio (favorites per find in %).
+ */
+class PopularityRatioFilter extends AbstractFilter {
+ private final int minRatio;
+ private final int maxRatio;
+
+ public PopularityRatioFilter(String name, final int minRatio, final int maxRatio) {
+ super(name);
+ this.minRatio = minRatio;
+ this.maxRatio = maxRatio;
+ }
+
+ @Override
+ public boolean accepts(final Geocache cache) {
+
+ int finds;
+ int favorites;
+ float ratio;
+
+ finds = getFindsCount(cache);
+
+ // prevent division by zero
+ if (finds == 0) {
+ return false;
+ }
+
+ favorites = cache.getFavoritePoints();
+ ratio = ((float) favorites / (float) finds) * 100.0f;
+
+ return (ratio > minRatio) && (ratio <= maxRatio);
+ }
+
+ private static int getFindsCount(Geocache cache) {
+ if (cache.getLogCounts().isEmpty()) {
+ cache.setLogCounts(DataStore.loadLogCounts(cache.getGeocode()));
+ }
+ Integer logged = cache.getLogCounts().get(LogType.FOUND_IT);
+ if (logged != null) {
+ return logged;
+ }
+ return 0;
+ }
+
+ public static class Factory implements IFilterFactory {
+
+ private static final int[] RATIOS = { 10, 20, 30, 40, 50, 75 };
+
+ @Override
+ public List<IFilter> getFilters() {
+ final List<IFilter> filters = new ArrayList<IFilter>(RATIOS.length);
+ for (int i = 0; i < RATIOS.length; i++) {
+ final int minRange = RATIOS[i];
+ final int maxRange = Integer.MAX_VALUE;
+ final String name = "> " + minRange + " " + CgeoApplication.getInstance().getResources().getString(R.string.percent_favorite_points);
+ filters.add(new PopularityRatioFilter(name, minRange, maxRange));
+ }
+ return filters;
+ }
+
+ }
+}
diff --git a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
index fab7bb1..b5edf17 100644
--- a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
+++ b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
@@ -9,7 +9,6 @@ import cgeo.geocaching.enumerations.LogType;
/**
* sorts caches by popularity ratio (favorites per find in %).
- * only caches with 10 finds and more are counted to obtain meaningful statistics
*/
public class PopularityRatioComparator extends AbstractCacheComparator {
@@ -27,10 +26,10 @@ public class PopularityRatioComparator extends AbstractCacheComparator {
int finds1 = getFindsCount(cache1);
int finds2 = getFindsCount(cache2);
- if (finds1 != 0 && finds1 > 9) {
+ if (finds1 != 0) {
ratio1 = (((float) cache1.getFavoritePoints()) / ((float) finds1));
}
- if (finds2 != 0 && finds2 > 9) {
+ if (finds2 != 0) {
ratio2 = (((float) cache2.getFavoritePoints()) / ((float) finds2));
}