Update Maps API

This commit is contained in:
mar-v-in 2015-08-06 17:02:47 +02:00
parent 39a07ffcbc
commit 44f4bdc6ac
9 changed files with 215 additions and 229 deletions

2
extern/GmsApi vendored

@ -1 +1 @@
Subproject commit 0890bf454651e90274949af9dca09fbcfbf50d36 Subproject commit 28ff7f36f2b75a29cead8efc25fc0418065db601

View File

@ -49,6 +49,7 @@ public class BackendMap implements ItemizedLayer.OnItemGestureListener<MarkerIte
private final Context context; private final Context context;
private final MapView mapView; private final MapView mapView;
private final LabelLayer labels;
private final BuildingLayer buildings; private final BuildingLayer buildings;
private final VectorTileLayer baseLayer; private final VectorTileLayer baseLayer;
private final OSciMap4TileSource tileSource; private final OSciMap4TileSource tileSource;
@ -67,10 +68,10 @@ public class BackendMap implements ItemizedLayer.OnItemGestureListener<MarkerIte
tileSource.setCache(cache); tileSource.setCache(cache);
baseLayer = mapView.map().setBaseMap(tileSource); baseLayer = mapView.map().setBaseMap(tileSource);
Layers layers = mapView.map().layers(); Layers layers = mapView.map().layers();
layers.add(buildings = new BuildingLayer(mapView.map(), baseLayer)); layers.add(labels = new LabelLayer(mapView.map(), baseLayer));
layers.add(new LabelLayer(mapView.map(), baseLayer));
layers.add(items = new ItemizedLayer<MarkerItem>(mapView.map(), new MarkerSymbol(new AndroidBitmap(BitmapFactory layers.add(items = new ItemizedLayer<MarkerItem>(mapView.map(), new MarkerSymbol(new AndroidBitmap(BitmapFactory
.decodeResource(ResourcesContainer.get(), R.drawable.nop)), 0.5F, 1))); .decodeResource(ResourcesContainer.get(), R.drawable.nop)), 0.5F, 1)));
layers.add(buildings = new BuildingLayer(mapView.map(), baseLayer));
items.setOnItemGestureListener(this); items.setOnItemGestureListener(this);
mapView.map().setTheme(VtmThemes.DEFAULT); mapView.map().setTheme(VtmThemes.DEFAULT);
} }
@ -145,22 +146,30 @@ public class BackendMap implements ItemizedLayer.OnItemGestureListener<MarkerIte
} }
public synchronized <T extends Markup> T add(T markup) { public synchronized <T extends Markup> T add(T markup) {
switch (markup.getType()) { if (markup != null && markup.getType() != null)
case MARKER: switch (markup.getType()) {
markupMap.put(markup.getId(), markup); case MARKER:
items.addItem(markup.getMarkerItem(context)); markupMap.put(markup.getId(), markup);
redraw(); items.addItem(markup.getMarkerItem(context));
break; redraw();
case LAYER: break;
Layers layers = mapView.map().layers(); case LAYER:
layers.add(markup.getLayer(context, mapView.map())); Layers layers = mapView.map().layers();
layers.remove(items); // TODO: better sorting code
layers.add(items); layers.add(markup.getLayer(context, mapView.map()));
redraw(); if (hasBuilding()) {
break; layers.remove(buildings);
default: layers.add(buildings);
Log.d(TAG, "Unknown markup: " + markup); }
} layers.remove(items);
layers.add(items);
layers.remove(labels);
layers.add(labels);
redraw();
break;
default:
Log.d(TAG, "Unknown markup: " + markup);
}
return markup; return markup;
} }

View File

@ -19,9 +19,12 @@ package org.microg.gms.maps;
import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.LatLngBounds;
import org.oscim.core.BoundingBox; import org.oscim.core.BoundingBox;
import org.oscim.core.Box;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
import org.oscim.core.MercatorProjection;
public class GmsMapsTypeHelper { public class GmsMapsTypeHelper {
public static android.graphics.Point toPoint(org.oscim.core.Point in) { public static android.graphics.Point toPoint(org.oscim.core.Point in) {
@ -36,9 +39,12 @@ public class GmsMapsTypeHelper {
return new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()); return new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude());
} }
public static LatLngBounds toLatLngBounds(BoundingBox box) { public static LatLngBounds toLatLngBounds(Box box) {
return new LatLngBounds(new LatLng(box.getMinLatitude(), box.getMinLongitude()), double minLon = MercatorProjection.toLongitude(box.xmin);
new LatLng(box.getMaxLatitude(), box.getMaxLongitude())); double maxLon = MercatorProjection.toLongitude(box.xmax);
double minLat = MercatorProjection.toLatitude(box.ymax);
double maxLat = MercatorProjection.toLatitude(box.ymin);
return new LatLngBounds(new LatLng(minLat, minLon), new LatLng(maxLat, maxLon));
} }
public static org.oscim.core.Point fromPoint(android.graphics.Point point) { public static org.oscim.core.Point fromPoint(android.graphics.Point point) {

View File

@ -81,6 +81,9 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub
private int markerCounter = 0; private int markerCounter = 0;
private int circleCounter = 0; private int circleCounter = 0;
private int polylineCounter = 0;
private int polygonCounter = 0;
private IOnMarkerClickListener onMarkerClickListener; private IOnMarkerClickListener onMarkerClickListener;
public GoogleMapImpl(LayoutInflater inflater, GoogleMapOptions options) { public GoogleMapImpl(LayoutInflater inflater, GoogleMapOptions options) {
@ -116,6 +119,14 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub
return "c" + circleCounter++; return "c" + circleCounter++;
} }
private String getNextPolylineId() {
return "l" + polylineCounter++;
}
private String getNextPolygonId() {
return "p" + polygonCounter++;
}
/* /*
Camera Camera
*/ */
@ -182,14 +193,13 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub
@Override @Override
public IPolylineDelegate addPolyline(PolylineOptions options) throws RemoteException { public IPolylineDelegate addPolyline(PolylineOptions options) throws RemoteException {
Log.d(TAG, "not yet usable: addPolyline"); Log.d(TAG, "addPolyline");
return new PolylineImpl(options); // TODO return backendMap.add(new PolylineImpl(getNextPolylineId(), options, this));
} }
@Override @Override
public IPolygonDelegate addPolygon(PolygonOptions options) throws RemoteException { public IPolygonDelegate addPolygon(PolygonOptions options) throws RemoteException {
Log.d(TAG, "not yet usable: addPolygon"); return backendMap.add(new PolygonImpl(getNextPolygonId(), options, this));
return new PolygonImpl(options); // TODO
} }
@Override @Override
@ -218,8 +228,10 @@ public class GoogleMapImpl extends IGoogleMapDelegate.Stub
@Override @Override
public void clear() throws RemoteException { public void clear() throws RemoteException {
backendMap.clear(); backendMap.clear();
circleCounter = 0;
markerCounter = 0; markerCounter = 0;
circleCounter = 0;
polylineCounter = 0;
polygonCounter = 0;
} }
@Override @Override

View File

@ -17,11 +17,13 @@
package org.microg.gms.maps; package org.microg.gms.maps;
import android.os.RemoteException; import android.os.RemoteException;
import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.IObjectWrapper;
import com.google.android.gms.dynamic.ObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper;
import com.google.android.gms.maps.internal.IProjectionDelegate; import com.google.android.gms.maps.internal.IProjectionDelegate;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.VisibleRegion; import com.google.android.gms.maps.model.VisibleRegion;
import org.oscim.core.Point; import org.oscim.core.Point;
import org.oscim.map.Viewport; import org.oscim.map.Viewport;
@ -49,6 +51,6 @@ public class ProjectionImpl extends IProjectionDelegate.Stub {
@Override @Override
public VisibleRegion getVisibleRegion() throws RemoteException { public VisibleRegion getVisibleRegion() throws RemoteException {
return new VisibleRegion(GmsMapsTypeHelper.toLatLngBounds(viewport.getBBox())); return new VisibleRegion(GmsMapsTypeHelper.toLatLngBounds(viewport.getBBox(null, 0)));
} }
} }

View File

@ -23,52 +23,35 @@ import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.internal.ICircleDelegate; import com.google.android.gms.maps.model.internal.ICircleDelegate;
import org.oscim.android.gl.AndroidGL; import org.microg.gms.maps.GmsMapsTypeHelper;
import org.oscim.backend.GL20;
import org.oscim.backend.canvas.Color;
import org.oscim.core.Box;
import org.oscim.core.Point;
import org.oscim.core.Tile;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.vector.VectorLayer;
import org.oscim.layers.vector.geometries.CircleDrawable;
import org.oscim.layers.vector.geometries.Style;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.renderer.GLShader;
import org.oscim.renderer.GLState;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.LayerRenderer;
import org.oscim.renderer.MapRenderer;
import static org.oscim.core.MercatorProjection.groundResolution; //import org.oscim.backend.GL20;
import static org.oscim.core.MercatorProjection.latitudeToY;
import static org.oscim.core.MercatorProjection.longitudeToX;
public class CircleImpl extends ICircleDelegate.Stub implements Markup { public class CircleImpl extends ICircleDelegate.Stub implements Markup {
private final String id; private final String id;
private final CircleOptions options; private final CircleOptions options;
private final MarkupListener listener; private final MarkupListener listener;
private CircleLayer layer; private VectorLayer vectorLayer;
private Point point; private CircleDrawable circleDrawable;
private float drawRadius;
private boolean removed = false; private boolean removed = false;
public CircleImpl(String id, CircleOptions options, MarkupListener listener) { public CircleImpl(String id, CircleOptions options, MarkupListener listener) {
this.id = id; this.id = id;
this.listener = listener; this.listener = listener;
this.options = options == null ? new CircleOptions() : options; this.options = options == null ? new CircleOptions() : options;
LatLng center = this.options.getCenter();
if (center != null) {
point = new Point(longitudeToX(center.longitude), latitudeToY(center.latitude));
drawRadius = (float) (options.getRadius() / groundResolution(center.latitude, 1));
}
} }
@Override @Override
public void remove() throws RemoteException { public void remove() throws RemoteException {
listener.remove(this); listener.remove(this);
removed = true; removed = true;
layer.setEnabled(false);
layer = null;
} }
@Override @Override
@ -79,8 +62,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setCenter(LatLng center) throws RemoteException { public void setCenter(LatLng center) throws RemoteException {
options.center(center); options.center(center);
point = new Point(longitudeToX(center.longitude), latitudeToY(center.latitude)); if (vectorLayer != null) update();
drawRadius = (float) (options.getRadius() / groundResolution(center.latitude, 1));
} }
@Override @Override
@ -91,9 +73,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setRadius(double radius) throws RemoteException { public void setRadius(double radius) throws RemoteException {
options.radius(radius); options.radius(radius);
if (point != null) { if (vectorLayer != null) update();
this.drawRadius = (float) (options.getRadius() / groundResolution(options.getCenter().latitude, 1));
}
} }
@Override @Override
@ -104,6 +84,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setStrokeWidth(float width) throws RemoteException { public void setStrokeWidth(float width) throws RemoteException {
options.strokeWidth(width); options.strokeWidth(width);
if (vectorLayer != null) update();
} }
@Override @Override
@ -114,6 +95,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setStrokeColor(int color) throws RemoteException { public void setStrokeColor(int color) throws RemoteException {
options.strokeColor(color); options.strokeColor(color);
if (vectorLayer != null) update();
} }
@Override @Override
@ -124,6 +106,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setFillColor(int color) throws RemoteException { public void setFillColor(int color) throws RemoteException {
options.fillColor(color); options.fillColor(color);
if (vectorLayer != null) update();
listener.update(this); listener.update(this);
} }
@ -145,6 +128,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public void setVisible(boolean visible) throws RemoteException { public void setVisible(boolean visible) throws RemoteException {
options.visible(visible); options.visible(visible);
if (vectorLayer != null) update();
} }
@Override @Override
@ -179,154 +163,30 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup {
@Override @Override
public Layer getLayer(Context context, Map map) { public Layer getLayer(Context context, Map map) {
if (layer == null) { vectorLayer = new VectorLayer(map);
layer = new CircleLayer(map); update();
return vectorLayer;
}
private void update() {
if (circleDrawable != null) {
vectorLayer.remove(circleDrawable);
} }
return layer; if (options.isVisible()) {
circleDrawable = new CircleDrawable(
GmsMapsTypeHelper.fromLatLng(options.getCenter()),
options.getRadius() / 1000.0,
Style.builder()
.strokeColor(options.getStrokeColor())
.fillColor(options.getFillColor())
.strokeWidth(options.getStrokeWidth()).build());
vectorLayer.add(circleDrawable);
}
vectorLayer.update();
} }
@Override @Override
public Type getType() { public Type getType() {
return Type.LAYER; return Type.LAYER;
} }
private class CircleLayer extends Layer {
public CircleLayer(Map map) {
super(map);
mRenderer = new CircleRenderer();
}
private class CircleRenderer extends LayerRenderer {
private final Box bBox = new Box();
private final Point screenPoint = new Point();
private final Point indicatorPosition = new Point();
private AndroidGL GL = new AndroidGL();
private int shader;
private int vertexPosition;
private int matrixPosition;
private int phase;
private int scale;
private int color;
private int borderColor;
private int borderWidth;
@Override
public void update(GLViewport viewport) {
if (!isEnabled()) {
setReady(false);
return;
}
if (!viewport.changed() && isReady()) return;
setReady(true);
int width = mMap.getWidth();
int height = mMap.getHeight();
// clamp location to a position that can be
// savely translated to screen coordinates
viewport.getBBox(bBox, 0);
double x = point.x;
double y = point.y;
// get position of Location in pixel relative to
// screen center
viewport.toScreenPoint(x, y, screenPoint);
x = screenPoint.x + width / 2;
y = screenPoint.y + height / 2;
viewport.fromScreenPoint(x, y, indicatorPosition);
}
@Override
public void render(GLViewport viewport) {
GLState.useProgram(shader);
GLState.blend(true);
GLState.test(false, false);
GLState.enableVertexArrays(vertexPosition, -1);
MapRenderer.bindQuadVertexVBO(vertexPosition);
float radius = (float) (drawRadius * viewport.pos.scale);
GL.uniform1f(scale, radius);
GL.uniform1f(borderWidth, (float) (options.getStrokeWidth() / (viewport.pos.scale * 10)));
double x = indicatorPosition.x - viewport.pos.x;
double y = indicatorPosition.y - viewport.pos.y;
double tileScale = Tile.SIZE * viewport.pos.scale;
viewport.mvp.setTransScale((float) (x * tileScale), (float) (y * tileScale), 1);
viewport.mvp.multiplyMM(viewport.viewproj, viewport.mvp);
viewport.mvp.setAsUniform(matrixPosition);
GL.uniform1f(phase, 1);
float alpha = Color.aToFloat(options.getFillColor());
GL.uniform4f(color,
Color.rToFloat(options.getFillColor()) * alpha,
Color.gToFloat(options.getFillColor()) * alpha,
Color.bToFloat(options.getFillColor()) * alpha,
alpha);
alpha = Color.aToFloat(options.getStrokeColor());
GL.uniform4f(borderColor,
Color.rToFloat(options.getStrokeColor()) * alpha,
Color.gToFloat(options.getStrokeColor()) * alpha,
Color.bToFloat(options.getStrokeColor()) * alpha,
alpha);
GL.drawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
}
@Override
public boolean setup() {
shader = GLShader.createProgram(vShaderStr, fShaderStr);
if (shader == 0)
return false;
vertexPosition = GL.getAttribLocation(shader, "a_pos");
matrixPosition = GL.getUniformLocation(shader, "u_mvp");
phase = GL.getUniformLocation(shader, "u_phase");
scale = GL.getUniformLocation(shader, "u_scale");
color = GL.getUniformLocation(shader, "u_color");
borderColor = GL.getUniformLocation(shader, "u_border_color");
borderWidth = GL.getUniformLocation(shader, "u_border_width");
return true;
}
}
}
private final static String vShaderStr = ""
+ "precision mediump float;"
+ "uniform mat4 u_mvp;"
+ "uniform float u_phase;"
+ "uniform float u_scale;"
+ "attribute vec2 a_pos;"
+ "varying vec2 v_tex;"
+ "void main() {"
+ " gl_Position = u_mvp * vec4(a_pos * u_scale * u_phase, 0.0, 1.0);"
+ " v_tex = a_pos;"
+ "}";
private final static String fShaderStr = ""
+ "precision mediump float;"
+ "varying vec2 v_tex;"
+ "uniform float u_scale;"
+ "uniform vec4 u_color;"
+ "uniform float u_border_width;"
+ "uniform vec4 u_border_color;"
+ "void main() {"
+ " float len = 1.0 - length(v_tex);"
+ " float a = smoothstep(0.0, 2.0 / u_scale, len);"
+ " if ( len > u_border_width )"
+ " gl_FragColor = u_color;"
+ " else "
+ " gl_FragColor = u_border_color;"
+ " gl_FragColor = gl_FragColor * a;"
+ "}";
} }

View File

@ -36,7 +36,7 @@ public interface Markup {
public boolean isValid(); public boolean isValid();
public static enum Type { public static enum Type {
MARKER, LAYER MARKER, LAYER, DRAWABLE
} }
public static interface MarkupListener { public static interface MarkupListener {

View File

@ -16,14 +16,21 @@
package org.microg.gms.maps.markup; package org.microg.gms.maps.markup;
import android.content.Context;
import android.os.RemoteException; import android.os.RemoteException;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.PolygonOptions; import com.google.android.gms.maps.model.PolygonOptions;
import com.google.android.gms.maps.model.internal.IPolygonDelegate; import com.google.android.gms.maps.model.internal.IPolygonDelegate;
import org.microg.gms.maps.GoogleMapImpl;
import org.oscim.layers.Layer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.map.Map;
import java.util.List; import java.util.List;
public class PolygonImpl extends IPolygonDelegate.Stub { public class PolygonImpl extends IPolygonDelegate.Stub implements Markup {
private List<LatLng> points; private List<LatLng> points;
private List holes; private List holes;
private float zIndex; private float zIndex;
@ -34,8 +41,8 @@ public class PolygonImpl extends IPolygonDelegate.Stub {
private int strokeColor; private int strokeColor;
private int fillColor; private int fillColor;
public PolygonImpl(PolygonOptions options) { public PolygonImpl(String id, PolygonOptions options, MarkupListener listener) {
this.id = id;
} }
@Override @Override
@ -44,10 +51,35 @@ public class PolygonImpl extends IPolygonDelegate.Stub {
} }
@Override @Override
public String getId() throws RemoteException { public MarkerItem getMarkerItem(Context context) {
return null;
}
@Override
public Layer getLayer(Context context, Map map) {
return null;
}
@Override
public Type getType() {
return null;
}
@Override
public String getId() {
return id; return id;
} }
@Override
public boolean onClick() {
return false;
}
@Override
public boolean isValid() {
return false;
}
@Override @Override
public void setPoints(List<LatLng> points) throws RemoteException { public void setPoints(List<LatLng> points) throws RemoteException {
this.points = points; this.points = points;

View File

@ -16,107 +16,172 @@
package org.microg.gms.maps.markup; package org.microg.gms.maps.markup;
import android.content.Context;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.PolylineOptions; import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.gms.maps.model.internal.IPolylineDelegate; import com.google.android.gms.maps.model.internal.IPolylineDelegate;
import java.util.Collections; import org.microg.gms.maps.GmsMapsTypeHelper;
import org.oscim.layers.Layer;
import org.oscim.layers.PathLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.map.Map;
import java.util.List; import java.util.List;
/** /**
* TODO * TODO
*/ */
public class PolylineImpl extends IPolylineDelegate.Stub { public class PolylineImpl extends IPolylineDelegate.Stub implements Markup {
private List<LatLng> points; private static final String TAG = "GmsMapsPolylineImpl";
private float zIndex;
private boolean geodesic;
private boolean visible;
private String id;
private float width;
private int color;
public PolylineImpl(PolylineOptions options) { private final String id;
private final PolylineOptions options;
private final MarkupListener listener;
private boolean removed = false;
private PathLayer pathLayer;
public PolylineImpl(String id, PolylineOptions options, MarkupListener listener) {
this.id = id;
this.options = options == null ? new PolylineOptions() : options;
this.listener = listener;
} }
@Override @Override
public void remove() throws RemoteException { public void remove() throws RemoteException {
listener.remove(this);
removed = true;
} }
@Override @Override
public String getId() throws RemoteException { public MarkerItem getMarkerItem(Context context) {
return null;
}
@Override
public Layer getLayer(Context context, Map map) {
pathLayer = new PathLayer(map, options.getColor(), options.getWidth());
for (LatLng point : options.getPoints()) {
pathLayer.addPoint(GmsMapsTypeHelper.fromLatLng(point));
}
return pathLayer;
}
@Override
public Type getType() {
return Type.LAYER;
}
@Override
public String getId() {
return id; return id;
} }
@Override
public boolean onClick() {
return listener.onClick(this);
}
@Override
public boolean isValid() {
return !removed;
}
@Override @Override
public void setPoints(List<LatLng> points) throws RemoteException { public void setPoints(List<LatLng> points) throws RemoteException {
this.points = points; options.getPoints().clear();
options.getPoints().addAll(points);
if (pathLayer != null) {
pathLayer.clearPath();
for (LatLng point : points) {
pathLayer.addPoint(GmsMapsTypeHelper.fromLatLng(point));
}
pathLayer.update();
}
listener.update(this);
} }
@Override @Override
public List<LatLng> getPoints() throws RemoteException { public List<LatLng> getPoints() throws RemoteException {
return points == null ? Collections.<LatLng>emptyList() : points; return options.getPoints();
} }
@Override @Override
public void setWidth(float width) throws RemoteException { public void setWidth(float width) throws RemoteException {
this.width = width; options.width(width);
if (pathLayer != null) {
pathLayer.setStyle(options.getColor(), options.getWidth());
pathLayer.update();
}
listener.update(this);
} }
@Override @Override
public float getWidth() throws RemoteException { public float getWidth() throws RemoteException {
return width; return options.getWidth();
} }
@Override @Override
public void setColor(int color) throws RemoteException { public void setColor(int color) throws RemoteException {
this.color = color; this.options.color(color);
if (pathLayer != null) {
pathLayer.setStyle(options.getColor(), options.getWidth());
pathLayer.update();
}
listener.update(this);
} }
@Override @Override
public int getColor() throws RemoteException { public int getColor() throws RemoteException {
return color; return options.getColor();
} }
@Override @Override
public void setZIndex(float zIndex) throws RemoteException { public void setZIndex(float zIndex) throws RemoteException {
this.zIndex = zIndex; options.zIndex(zIndex);
listener.update(this);
} }
@Override @Override
public float getZIndex() throws RemoteException { public float getZIndex() throws RemoteException {
return zIndex; return options.getZIndex();
} }
@Override @Override
public void setVisible(boolean visible) throws RemoteException { public void setVisible(boolean visible) throws RemoteException {
this.visible = visible; options.visible(visible);
if (pathLayer != null) pathLayer.setEnabled(visible);
listener.update(this);
} }
@Override @Override
public boolean isVisible() throws RemoteException { public boolean isVisible() throws RemoteException {
return visible; return options.isVisible();
} }
@Override @Override
public void setGeodesic(boolean geod) throws RemoteException { public void setGeodesic(boolean geod) throws RemoteException {
this.geodesic = geod; options.geodesic(geod);
listener.update(this);
} }
@Override @Override
public boolean isGeodesic() throws RemoteException { public boolean isGeodesic() throws RemoteException {
return geodesic; return options.isGeodesic();
} }
@Override @Override
public boolean equalsRemote(IPolylineDelegate other) throws RemoteException { public boolean equalsRemote(IPolylineDelegate other) throws RemoteException {
Log.d(TAG, "equalsRemote");
return other != null && other.getId().equals(getId()); return other != null && other.getId().equals(getId());
} }
@Override @Override
public int hashCodeRemote() throws RemoteException { public int hashCodeRemote() throws RemoteException {
Log.d(TAG, "hashcodeRemote");
return id.hashCode(); return id.hashCode();
} }
} }