1package eu.siacs.conversations.ui.widget;
2
3import android.annotation.TargetApi;
4import android.content.Context;
5import android.graphics.Bitmap;
6import android.graphics.Canvas;
7import android.graphics.Paint;
8import android.graphics.Point;
9import android.location.Location;
10import android.os.Build;
11
12import org.osmdroid.util.GeoPoint;
13import org.osmdroid.views.MapView;
14import org.osmdroid.views.overlay.mylocation.SimpleLocationOverlay;
15
16import eu.siacs.conversations.Config;
17import eu.siacs.conversations.R;
18import microsoft.mappoint.TileSystem;
19
20public class MyLocation extends SimpleLocationOverlay {
21 private final GeoPoint position;
22 private final float accuracy;
23 private final Point mapCenterPoint;
24 private final Paint fill;
25 private final Paint outline;
26
27 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
28 private int getColor(final Context ctx) {
29 final int accent;
30 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
31 accent = ctx.getResources().getColor(R.color.accent, ctx.getTheme());
32 } else {
33 //noinspection deprecation
34 accent = ctx.getResources().getColor(R.color.accent);
35 }
36 return accent;
37 }
38
39 public MyLocation(final Context ctx, final Bitmap icon, final Location position) {
40 super(icon);
41 this.mapCenterPoint = new Point();
42 this.fill = new Paint(Paint.ANTI_ALIAS_FLAG);
43 final int accent = this.getColor(ctx);
44 fill.setColor(accent);
45 fill.setStyle(Paint.Style.FILL);
46 this.outline = new Paint(Paint.ANTI_ALIAS_FLAG);
47 outline.setColor(accent);
48 outline.setAlpha(50);
49 outline.setStyle(Paint.Style.FILL);
50 this.position = new GeoPoint(position);
51 this.accuracy = position.getAccuracy();
52 }
53
54 @Override
55 public void draw(final Canvas c, final MapView view, final boolean shadow) {
56 super.draw(c, view, shadow);
57
58 view.getProjection().toPixels(position, mapCenterPoint);
59 c.drawCircle(mapCenterPoint.x, mapCenterPoint.y,
60 Math.max(Config.Map.MY_LOCATION_INDICATOR_SIZE + Config.Map.MY_LOCATION_INDICATOR_OUTLINE_SIZE,
61 accuracy / (float) TileSystem.GroundResolution(position.getLatitude(), view.getZoomLevel())
62 ), this.outline);
63 c.drawCircle(mapCenterPoint.x, mapCenterPoint.y, Config.Map.MY_LOCATION_INDICATOR_SIZE, this.fill);
64 }
65}