package cgeo.geocaching.filter;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.location.Geopoint;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.sensors.GeoData;
import cgeo.geocaching.sensors.Sensors;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
class DistanceFilter extends AbstractFilter {
private final GeoData geo;
private final int minDistance;
private final int maxDistance;
public static final Creator<DistanceFilter> CREATOR = new Parcelable.Creator<DistanceFilter>() {
@Override
public DistanceFilter createFromParcel(final Parcel in) {
return new DistanceFilter(in);
}
@Override
public DistanceFilter[] newArray(final int size) {
return new DistanceFilter[size];
}
};
DistanceFilter(@NonNull final String name, final int minDistance, final int maxDistance) {
super(name);
this.minDistance = minDistance;
this.maxDistance = maxDistance;
geo = Sensors.getInstance().currentGeo();
}
protected DistanceFilter(final Parcel in) {
super(in);
minDistance = in.readInt();
maxDistance = in.readInt();
geo = Sensors.getInstance().currentGeo();
}
@Override
public boolean accepts(@NonNull final Geocache cache) {
final Geopoint coords = cache.getCoords();
if (coords == null) {
// If a cache has no coordinates, consider it to be out of range. It will
// happen with archived caches.
return false;
}
final Geopoint currentPos = new Geopoint(geo);
final float distance = currentPos.distanceTo(coords);
return distance >= minDistance && distance <= maxDistance;
}
public static class Factory implements IFilterFactory {
private static final int[] KILOMETERS = { 0, 2, 5, 10, 20, 50 };
@Override
@NonNull
public List<IFilter> getFilters() {
final List<IFilter> filters = new ArrayList<>(KILOMETERS.length);
for (int i = 0; i < KILOMETERS.length; i++) {
final int minRange = KILOMETERS[i];
final int maxRange;
if (i < KILOMETERS.length - 1) {
maxRange = KILOMETERS[i + 1];
} else {
maxRange = Integer.MAX_VALUE;
}
final String range = maxRange == Integer.MAX_VALUE ? "> " + minRange : minRange + " - " + maxRange;
final String name = CgeoApplication.getInstance().getResources().getQuantityString(R.plurals.tts_kilometers, maxRange, range);
filters.add(new DistanceFilter(name, minRange, maxRange));
}
return filters;
}
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(minDistance);
dest.writeInt(maxDistance);
}
}