package cgeo.geocaching.maps;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.location.Geopoint;
import cgeo.geocaching.maps.interfaces.MapItemFactory;
import cgeo.geocaching.maps.interfaces.MapProjectionImpl;
import cgeo.geocaching.maps.routing.Routing;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.CanvasUtils;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Location;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import java.util.ArrayList;
public class DirectionDrawer {
private Geopoint currentCoords;
private final Geopoint destinationCoords;
private final MapItemFactory mapItemFactory;
private final float width;
private Paint linePaint = null;
public DirectionDrawer(final Geopoint coords) {
this.destinationCoords = coords;
this.mapItemFactory = Settings.getMapProvider().getMapItemFactory();
final DisplayMetrics metrics = new DisplayMetrics();
final WindowManager windowManager = (WindowManager) CgeoApplication.getInstance().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
width = 8f * metrics.density;
}
public void setCoordinates(final Location coordinatesIn) {
currentCoords = new Geopoint(coordinatesIn);
}
void drawDirection(final Canvas canvas, final MapProjectionImpl projection) {
if (currentCoords == null) {
return;
}
if (!Settings.isMapDirection()) {
return;
}
if (linePaint == null) {
linePaint = new Paint();
linePaint.setAntiAlias(true);
linePaint.setStrokeWidth(width);
linePaint.setStyle(Paint.Style.STROKE);
linePaint.setColor(0xD0EB391E);
}
final Geopoint[] routingPoints = Routing.getTrack(currentCoords, destinationCoords);
final ArrayList<Point> pixelPoints = new ArrayList<>(routingPoints.length);
for (final Geopoint geopoint : routingPoints) {
pixelPoints.add(translateToPixels(projection, geopoint));
}
CanvasUtils.drawPath(pixelPoints, canvas, linePaint);
}
private Point translateToPixels(final MapProjectionImpl projection, final Geopoint geopoint) {
final Point pixelPoint = new Point();
projection.toPixels(mapItemFactory.getGeoPointBase(geopoint), pixelPoint);
return pixelPoint;
}
}