package cgeo.geocaching.filter; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.models.Geocache; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; 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; public static final Creator<PopularityRatioFilter> CREATOR = new Parcelable.Creator<PopularityRatioFilter>() { @Override public PopularityRatioFilter createFromParcel(final Parcel in) { return new PopularityRatioFilter(in); } @Override public PopularityRatioFilter[] newArray(final int size) { return new PopularityRatioFilter[size]; } }; PopularityRatioFilter(@NonNull final String name, final int minRatio) { super(name); this.minRatio = minRatio; } protected PopularityRatioFilter(final Parcel in) { super(in); minRatio = in.readInt(); } @Override public boolean accepts(@NonNull final Geocache cache) { final int finds = cache.getFindsCount(); if (finds == 0) { // Prevent division by zero return false; } final int favorites = cache.getFavoritePoints(); final float ratio = 100.0f * favorites / finds; return ratio > minRatio; } public static class Factory implements IFilterFactory { private static final int[] RATIOS = { 10, 20, 30, 40, 50, 75 }; @Override @NonNull public List<IFilter> getFilters() { final List<IFilter> filters = new ArrayList<>(RATIOS.length); for (final int minRange : RATIOS) { final String name = CgeoApplication.getInstance().getString(R.string.more_than_percent_favorite_points, minRange); filters.add(new PopularityRatioFilter(name, minRange)); } return filters; } } @Override public void writeToParcel(final Parcel dest, final int flags) { super.writeToParcel(dest, flags); dest.writeInt(minRatio); } }