summaryrefslogtreecommitdiff
path: root/platform/android
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-02-05 09:05:35 +0100
committerTobrun <tobrun@mapbox.com>2016-02-15 17:05:15 +0100
commitfb9021f929ffd25fbe56b9ffe6ccc005666c640a (patch)
treed0e66dc5aa0a8bba35fc8ec703845a6201c2902f /platform/android
parentef865f04f6942e43796a70aaf7e92c899b803ac2 (diff)
downloadqtlocation-mapboxgl-fb9021f929ffd25fbe56b9ffe6ccc005666c640a.tar.gz
[android] #3756 - unit test annotations integration in MapboxMap
[android] #3756 - unit tests fixes [android] #3756 - allow using inheritance Marker, added example to WindowAdapterActivity
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java38
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/IconFactory.java4
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java9
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java7
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java367
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java273
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/BulkMarkerActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/GeocoderActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java31
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarker.java18
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarkerOptions.java68
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java224
14 files changed, 713 insertions, 334 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java
new file mode 100644
index 0000000000..5b1eebdb1b
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java
@@ -0,0 +1,38 @@
+package com.mapbox.mapboxsdk.annotations;
+
+import android.os.Parcelable;
+
+import com.mapbox.mapboxsdk.geometry.LatLng;
+
+public abstract class BaseMarkerOptions<U extends Marker, T extends BaseMarkerOptions<U, T>> implements Parcelable {
+
+ protected LatLng position;
+ protected String snippet;
+ protected String title;
+ protected Icon icon;
+
+ public T position(LatLng position) {
+ this.position = position;
+ return getThis();
+ }
+
+ public T snippet(String snippet) {
+ this.snippet = snippet;
+ return getThis();
+ }
+
+ public T title(String title) {
+ this.title = title;
+ return getThis();
+ }
+
+ public T icon(Icon icon) {
+ this.icon = icon;
+ return getThis();
+ }
+
+ public abstract T getThis();
+
+ public abstract U getMarker();
+
+} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/IconFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/IconFactory.java
index bee4ec47c5..d7d41b98be 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/IconFactory.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/IconFactory.java
@@ -150,4 +150,8 @@ public final class IconFactory {
}
return fromInputStream(is);
}
+
+ public static Icon recreate(@NonNull String iconId, @NonNull Bitmap bitmap) {
+ return new Icon(iconId, bitmap);
+ }
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java
index 2cb9ff0ef6..c2683cbb56 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java
@@ -15,7 +15,7 @@ import com.mapbox.mapboxsdk.maps.MapView;
* An {@link InfoWindow} can be shown when a Marker is pressed
* <p/>
*/
-public final class Marker extends Annotation {
+public class Marker extends Annotation {
private LatLng position;
private String snippet;
@@ -32,6 +32,13 @@ public final class Marker extends Annotation {
super();
}
+ public Marker(BaseMarkerOptions baseMarkerOptions) {
+ position = baseMarkerOptions.position;
+ snippet = baseMarkerOptions.snippet;
+ icon = baseMarkerOptions.icon;
+ title = baseMarkerOptions.title;
+ }
+
public LatLng getPosition() {
return position;
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java
index a83a6991b2..fdf6094bdd 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java
@@ -22,7 +22,7 @@ import com.mapbox.mapboxsdk.geometry.LatLng;
* .position(new LatLng(38.9002073, -77.03364419)));
* </pre>
*/
-public final class MarkerOptions implements Parcelable {
+public final class MarkerOptions extends BaseMarkerOptions<Marker, MarkerOptions> implements Parcelable {
public static final Parcelable.Creator<MarkerOptions> CREATOR
= new Parcelable.Creator<MarkerOptions>() {
@@ -47,6 +47,11 @@ public final class MarkerOptions implements Parcelable {
}
@Override
+ public MarkerOptions getThis() {
+ return this;
+ }
+
+ @Override
public int describeContents() {
return 0;
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
index d0ba9be2e8..09056ee123 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
@@ -64,14 +64,12 @@ import com.almeros.android.multitouch.gesturedetectors.TwoFingerGestureDetector;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.annotations.Annotation;
import com.mapbox.mapboxsdk.annotations.Icon;
+import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.annotations.InfoWindow;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.annotations.Polygon;
-import com.mapbox.mapboxsdk.annotations.PolygonOptions;
import com.mapbox.mapboxsdk.annotations.Polyline;
-import com.mapbox.mapboxsdk.annotations.PolylineOptions;
-import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
@@ -124,7 +122,6 @@ public class MapView extends FrameLayout {
private static final float DIMENSION_SEVENTYSIX_DP = 76f;
private MapboxMap mMapboxMap;
- private LongSparseArray<Annotation> mAnnotations;
private List<Icon> mIcons;
private NativeMapView mNativeMapView;
@@ -173,9 +170,7 @@ public class MapView extends FrameLayout {
private void initialize(@NonNull Context context, @Nullable AttributeSet attrs) {
mOnMapChangedListener = new CopyOnWriteArrayList<>();
mMapboxMap = new MapboxMap(this);
- mAnnotations = new LongSparseArray<>();
mIcons = new ArrayList<>();
-
View view = LayoutInflater.from(context).inflate(R.layout.mapview_internal, this);
if (!isInEditMode()) {
@@ -974,7 +969,25 @@ public class MapView extends FrameLayout {
// Annotations
//
- private void loadIcon(Icon icon) {
+ Icon loadIconForMarker(Marker marker) {
+ Icon icon = marker.getIcon();
+ if (icon == null) {
+ icon = IconFactory.getInstance(getContext()).defaultMarker();
+ marker.setIcon(icon);
+ }
+ if (!mIcons.contains(icon)) {
+ mIcons.add(icon);
+ loadIcon(icon);
+ } else {
+ Icon oldIcon = mIcons.get(mIcons.indexOf(icon));
+ if (!oldIcon.getBitmap().sameAs(icon.getBitmap())) {
+ throw new IconBitmapChangedException();
+ }
+ }
+ return icon;
+ }
+
+ void loadIcon(Icon icon) {
Bitmap bitmap = icon.getBitmap();
String id = icon.getId();
if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
@@ -996,7 +1009,7 @@ public class MapView extends FrameLayout {
scale, buffer.array());
}
- private void reloadIcons() {
+ void reloadIcons() {
int count = mIcons.size();
for (int i = 0; i < count; i++) {
Icon icon = mIcons.get(i);
@@ -1004,6 +1017,28 @@ public class MapView extends FrameLayout {
}
}
+ /**
+ * <p>
+ * Updates a marker on this map. Does nothing if the marker is already added.
+ * </p>
+ *
+ * @param updatedMarker An updated marker object.
+ */
+ @UiThread
+ void updateMarker(@NonNull Marker updatedMarker) {
+ if (updatedMarker == null) {
+ Log.w(TAG, "marker was null, doing nothing");
+ return;
+ }
+
+ if (updatedMarker.getId() == -1) {
+ Log.w(TAG, "marker has an id of -1, possibly was not added yet, doing nothing");
+ }
+
+ ensureIconLoaded(updatedMarker);
+ mNativeMapView.updateMarker(updatedMarker);
+ }
+
private Marker prepareMarker(MarkerOptions markerOptions) {
Marker marker = markerOptions.getMarker();
ensureIconLoaded(marker);
@@ -1027,306 +1062,46 @@ public class MapView extends FrameLayout {
}
// this seems to be a costly operation according to the profiler so I'm trying to save some calls
- Marker previousMarker = marker.getId() != -1 ? (Marker) mAnnotations.get(marker.getId()) : null;
+ Marker previousMarker = marker.getId() != -1 ? (Marker) mMapboxMap.getAnnotation(marker.getId()) : null;
if (previousMarker == null || previousMarker.getIcon() == null || previousMarker.getIcon() != marker.getIcon()) {
marker.setTopOffsetPixels(getTopOffsetPixelsForIcon(icon));
}
}
- /**
- * <p>
- * Adds a marker to this map.
- * </p>
- * The marker's icon is rendered on the map at the location {@code Marker.position}.
- * If {@code Marker.title} is defined, the map shows an info box with the marker's title and snippet.
- *
- * @param markerOptions A marker options object that defines how to render the marker.
- * @return The {@code Marker} that was added to the map.
- */
- @UiThread
- @NonNull
- Marker addMarker(@NonNull MarkerOptions markerOptions) {
- if (markerOptions == null) {
- Log.w(TAG, "markerOptions was null, so just returning null");
- return null;
- }
-
- Marker marker = prepareMarker(markerOptions);
- long id = mNativeMapView.addMarker(marker);
- marker.setId(id); // the annotation needs to know its id
- marker.setMapboxMap(mMapboxMap); // the annotation needs to know which map view it is in
- mAnnotations.put(id, marker);
- return marker;
- }
-
- /**
- * <p>
- * Updates a marker on this map. Does nothing if the marker is already added.
- * </p>
- *
- * @param updatedMarker An updated marker object.
- */
- @UiThread
- void updateMarker(@NonNull Marker updatedMarker) {
- if (updatedMarker == null) {
- Log.w(TAG, "marker was null, doing nothing");
- return;
- }
-
- if (updatedMarker.getId() == -1) {
- Log.w(TAG, "marker has an id of -1, possibly was not added yet, doing nothing");
- }
- ensureIconLoaded(updatedMarker);
- mNativeMapView.updateMarker(updatedMarker);
-
-
- int index = mAnnotations.indexOfKey(updatedMarker.getId());
- if (index > -1) {
- mAnnotations.setValueAt(index, updatedMarker);
+ long addMarker(@NonNull Marker marker) {
+ if (mNativeMapView == null) {
+ return 0l;
}
+ return mNativeMapView.addMarker(marker);
}
- /**
- * <p>
- * Adds multiple markers to this map.
- * </p>
- * The marker's icon is rendered on the map at the location {@code Marker.position}.
- * If {@code Marker.title} is defined, the map shows an info box with the marker's title and snippet.
- *
- * @param markerOptionsList A list of marker options objects that defines how to render the markers.
- * @return A list of the {@code Marker}s that were added to the map.
- */
- @UiThread
- @NonNull
- List<Marker> addMarkers(@NonNull List<MarkerOptions> markerOptionsList) {
- if (markerOptionsList == null) {
- Log.w(TAG, "markerOptionsList was null, so just returning null");
- return null;
- }
-
- int count = markerOptionsList.size();
- List<Marker> markers = new ArrayList<>(count);
- for (int i = 0; i < count; i++) {
- MarkerOptions markerOptions = markerOptionsList.get(i);
- Marker marker = prepareMarker(markerOptions);
- markers.add(marker);
- }
-
- long[] ids = mNativeMapView.addMarkers(markers);
-
- Marker m;
- for (int i = 0; i < count; i++) {
- m = markers.get(i);
- m.setId(ids[i]);
- m.setMapboxMap(mMapboxMap);
- mAnnotations.put(ids[i], m);
- }
-
- return new ArrayList<>(markers);
+ long[] addMarkers(@NonNull List<Marker> markerList) {
+ return mNativeMapView.addMarkers(markerList);
}
- /**
- * Adds a polyline to this map.
- *
- * @param polylineOptions A polyline options object that defines how to render the polyline.
- * @return The {@code Polyine} that was added to the map.
- */
- @UiThread
- @NonNull
- Polyline addPolyline(@NonNull PolylineOptions polylineOptions) {
- if (polylineOptions == null) {
- Log.w(TAG, "polylineOptions was null, so just returning null");
- return null;
- }
-
- Polyline polyline = polylineOptions.getPolyline();
- long id = mNativeMapView.addPolyline(polyline);
- polyline.setId(id);
- polyline.setMapboxMap(mMapboxMap);
- mAnnotations.put(id, polyline);
- return polyline;
+ long addPolyline(@NonNull Polyline polyline) {
+ return mNativeMapView.addPolyline(polyline);
}
- /**
- * Adds multiple polylines to this map.
- *
- * @param polylineOptionsList A list of polyline options objects that defines how to render the polylines.
- * @return A list of the {@code Polyline}s that were added to the map.
- */
- @UiThread
- @NonNull
- List<Polyline> addPolylines(@NonNull List<PolylineOptions> polylineOptionsList) {
- if (polylineOptionsList == null) {
- Log.w(TAG, "polylineOptionsList was null, so just returning null");
- return null;
- }
-
- int count = polylineOptionsList.size();
- List<Polyline> polylines = new ArrayList<>(count);
- for (PolylineOptions options : polylineOptionsList) {
- polylines.add(options.getPolyline());
- }
-
- long[] ids = mNativeMapView.addPolylines(polylines);
-
- Polyline p;
- for (int i = 0; i < count; i++) {
- p = polylines.get(i);
- p.setId(ids[i]);
- p.setMapboxMap(mMapboxMap);
- mAnnotations.put(ids[i], p);
- }
-
- return new ArrayList<>(polylines);
+ long[] addPolylines(@NonNull List<Polyline> polylines) {
+ return mNativeMapView.addPolylines(polylines);
}
- /**
- * Adds a polygon to this map.
- *
- * @param polygonOptions A polygon options object that defines how to render the polygon.
- * @return The {@code Polygon} that was added to the map.
- */
- @UiThread
- @NonNull
- Polygon addPolygon(@NonNull PolygonOptions polygonOptions) {
- if (polygonOptions == null) {
- Log.w(TAG, "polygonOptions was null, so just returning null");
- return null;
- }
-
- Polygon polygon = polygonOptions.getPolygon();
- long id = mNativeMapView.addPolygon(polygon);
- polygon.setId(id);
- polygon.setMapboxMap(mMapboxMap);
- mAnnotations.put(id, polygon);
- return polygon;
+ long addPolygon(@NonNull Polygon polygon) {
+ return mNativeMapView.addPolygon(polygon);
}
-
- /**
- * Adds multiple polygons to this map.
- *
- * @param polygonOptionsList A list of polygon options objects that defines how to render the polygons.
- * @return A list of the {@code Polygon}s that were added to the map.
- */
- @UiThread
- @NonNull
- List<Polygon> addPolygons(@NonNull List<PolygonOptions> polygonOptionsList) {
- if (polygonOptionsList == null) {
- Log.w(TAG, "polygonOptionsList was null, so just returning null");
- return null;
- }
-
- int count = polygonOptionsList.size();
- List<Polygon> polygons = new ArrayList<>(count);
- for (PolygonOptions polygonOptions : polygonOptionsList) {
- polygons.add(polygonOptions.getPolygon());
- }
-
- long[] ids = mNativeMapView.addPolygons(polygons);
-
- Polygon p;
- for (int i = 0; i < count; i++) {
- p = polygons.get(i);
- p.setId(ids[i]);
- p.setMapboxMap(mMapboxMap);
- mAnnotations.put(ids[i], p);
- }
-
- return new ArrayList<>(polygons);
+ long[] addPolygons(@NonNull List<Polygon> polygons) {
+ return mNativeMapView.addPolygons(polygons);
}
-
- /**
- * <p>
- * Convenience method for removing a Marker from the map.
- * </p>
- * Calls removeAnnotation() internally
- *
- * @param marker Marker to remove
- */
- @UiThread
- void removeMarker(@NonNull Marker marker) {
- removeAnnotation(marker);
- }
-
- /**
- * Removes an annotation from the map.
- *
- * @param annotation The annotation object to remove.
- */
- @UiThread
- void removeAnnotation(@NonNull Annotation annotation) {
- if (annotation == null) {
- Log.w(TAG, "annotation was null, so just returning");
- return;
- }
-
- if (annotation instanceof Marker) {
- ((Marker) annotation).hideInfoWindow();
- }
- long id = annotation.getId();
+ void removeAnnotation(long id) {
mNativeMapView.removeAnnotation(id);
- mAnnotations.delete(id);
- }
-
- /**
- * Removes multiple annotations from the map.
- *
- * @param annotationList A list of annotation objects to remove.
- */
- @UiThread
- void removeAnnotations(@NonNull List<? extends Annotation> annotationList) {
- if (annotationList == null) {
- Log.w(TAG, "annotationList was null, so just returning");
- return;
- }
-
- int count = annotationList.size();
- long[] ids = new long[count];
- for (int i = 0; i < count; i++) {
- ids[i] = annotationList.get(i).getId();
- }
- mNativeMapView.removeAnnotations(ids);
}
- /**
- * Removes all annotations from the map.
- */
- @UiThread
- void removeAllAnnotations() {
- int count = mAnnotations.size();
- long[] ids = new long[count];
-
- for (int i = 0; i < count; i++) {
- Annotation annotation = mAnnotations.valueAt(i);
- long id = annotation.getId();
- ids[i] = id;
- if (annotation instanceof Marker) {
- ((Marker) annotation).hideInfoWindow();
- }
- }
-
+ void removeAnnotations(@NonNull long[] ids) {
mNativeMapView.removeAnnotations(ids);
- mAnnotations.clear();
- }
-
- /**
- * Returns a list of all the annotations on the map.
- *
- * @return A list of all the annotation objects. The returned object is a copy so modifying this
- * list will not update the map.
- */
- @NonNull
- public List<Annotation> getAllAnnotations() {
- List<Annotation> copyOfAnnotations = new ArrayList<>(mAnnotations.size());
-
- for (int i = 0; i < mAnnotations.size(); i++) {
- copyOfAnnotations.add(mAnnotations.valueAt(i));
- }
-
- return copyOfAnnotations;
}
private List<Marker> getMarkersInBounds(@NonNull LatLngBounds bbox) {
@@ -1344,9 +1119,10 @@ public class MapView extends FrameLayout {
}
List<Marker> annotations = new ArrayList<>(ids.length);
- int count = mAnnotations.size();
+ List<Annotation> annotationList = mMapboxMap.getAnnotations();
+ int count = annotationList.size();
for (int i = 0; i < count; i++) {
- Annotation annotation = mAnnotations.valueAt(i);
+ Annotation annotation = annotationList.get(i);
if (annotation instanceof Marker && idsList.contains(annotation.getId())) {
annotations.add((Marker) annotation);
}
@@ -1355,7 +1131,7 @@ public class MapView extends FrameLayout {
return new ArrayList<>(annotations);
}
- private int getTopOffsetPixelsForIcon(Icon icon) {
+ int getTopOffsetPixelsForIcon(Icon icon) {
// This method will dead lock if map paused. Causes a freeze if you add a marker in an
// activity's onCreate()
if (mNativeMapView.isPaused()) {
@@ -1504,9 +1280,10 @@ public class MapView extends FrameLayout {
}
private void adjustTopOffsetPixels() {
- int count = mAnnotations.size();
+ List<Annotation> annotations = mMapboxMap.getAnnotations();
+ int count = annotations.size();
for (int i = 0; i < count; i++) {
- Annotation annotation = mAnnotations.valueAt(i);
+ Annotation annotation = annotations.get(i);
if (annotation instanceof Marker) {
Marker marker = (Marker) annotation;
marker.setTopOffsetPixels(
@@ -1523,9 +1300,10 @@ public class MapView extends FrameLayout {
}
private void reloadMarkers() {
- int count = mAnnotations.size();
+ List<Annotation> annotations = mMapboxMap.getAnnotations();
+ int count = annotations.size();
for (int i = 0; i < count; i++) {
- Annotation annotation = mAnnotations.valueAt(i);
+ Annotation annotation = annotations.get(i);
if (annotation instanceof Marker) {
Marker marker = (Marker) annotation;
mNativeMapView.removeAnnotation(annotation.getId());
@@ -1830,9 +1608,10 @@ public class MapView extends FrameLayout {
}
if (newSelectedMarkerId >= 0) {
- int count = mAnnotations.size();
+ List<Annotation> annotations = mMapboxMap.getAnnotations();
+ int count = annotations.size();
for (int i = 0; i < count; i++) {
- Annotation annotation = mAnnotations.valueAt(i);
+ Annotation annotation = annotations.get(i);
if (annotation instanceof Marker) {
if (annotation.getId() == newSelectedMarkerId) {
if (selectedMarkers.isEmpty() || !selectedMarkers.contains(annotation)) {
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
index 129a76978a..a402866cea 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
@@ -11,11 +11,15 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresPermission;
import android.support.annotation.UiThread;
+import android.support.v4.util.LongSparseArray;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import com.mapbox.mapboxsdk.annotations.Annotation;
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
+import com.mapbox.mapboxsdk.annotations.Icon;
+import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.annotations.InfoWindow;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
@@ -28,11 +32,13 @@ import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.constants.Style;
+import com.mapbox.mapboxsdk.exceptions.IconBitmapChangedException;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.layers.CustomLayer;
import com.mapbox.mapboxsdk.utils.ApiAccess;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -45,6 +51,7 @@ public class MapboxMap {
private CameraPosition mCameraPosition;
private boolean mInvalidCameraPosition;
private String mStyleUrl;
+ private LongSparseArray<Annotation> mAnnotations;
private List<Marker> mSelectedMarkers;
private List<InfoWindow> mInfoWindows;
private MapboxMap.InfoWindowAdapter mInfoWindowAdapter;
@@ -71,6 +78,7 @@ public class MapboxMap {
mUiSettings = new UiSettings(mapView);
mTrackingSettings = new TrackingSettings(mMapView, mUiSettings);
mProjection = new Projection(mapView);
+ mAnnotations = new LongSparseArray<>();
mSelectedMarkers = new ArrayList<>();
mInfoWindows = new ArrayList<>();
}
@@ -97,7 +105,7 @@ public class MapboxMap {
*
* @return
*/
- public TrackingSettings getTrackingSettings(){
+ public TrackingSettings getTrackingSettings() {
return mTrackingSettings;
}
@@ -532,7 +540,17 @@ public class MapboxMap {
@UiThread
@NonNull
public Marker addMarker(@NonNull MarkerOptions markerOptions) {
- return mMapView.addMarker(markerOptions);
+ return addMarker((BaseMarkerOptions)markerOptions);
+ }
+
+ @UiThread
+ @NonNull
+ public Marker addMarker(@NonNull BaseMarkerOptions markerOptions) {
+ Marker marker = prepareMarker(markerOptions);
+ long id = mMapView.addMarker(marker);
+ marker.setId(id);
+ mAnnotations.put(id, marker);
+ return marker;
}
/**
@@ -548,7 +566,33 @@ public class MapboxMap {
@UiThread
@NonNull
public List<Marker> addMarkers(@NonNull List<MarkerOptions> markerOptionsList) {
- return mMapView.addMarkers(markerOptionsList);
+ int count = markerOptionsList.size();
+ List<Marker> markers = new ArrayList<>(count);
+ MarkerOptions markerOptions;
+ Marker marker;
+ for (int i = 0; i < count; i++) {
+ markerOptions = markerOptionsList.get(i);
+ marker = prepareMarker(markerOptions);
+ markers.add(marker);
+ }
+
+ long[] ids = mMapView.addMarkers(markers);
+ long id = 0;
+ Marker m;
+
+ for (int i = 0; i < markers.size(); i++) {
+ m = markers.get(i);
+ m.setMapboxMap(this);
+ if (ids != null) {
+ id = ids[i];
+ } else {
+ //unit test
+ id++;
+ }
+ m.setId(id);
+ mAnnotations.put(id, m);
+ }
+ return markers;
}
/**
@@ -561,6 +605,11 @@ public class MapboxMap {
@UiThread
public void updateMarker(@NonNull Marker updatedMarker) {
mMapView.updateMarker(updatedMarker);
+
+ int index = mAnnotations.indexOfKey(updatedMarker.getId());
+ if (index > -1) {
+ mAnnotations.setValueAt(index, updatedMarker);
+ }
}
/**
@@ -572,7 +621,12 @@ public class MapboxMap {
@UiThread
@NonNull
public Polyline addPolyline(@NonNull PolylineOptions polylineOptions) {
- return mMapView.addPolyline(polylineOptions);
+ Polyline polyline = polylineOptions.getPolyline();
+ long id = mMapView.addPolyline(polyline);
+ polyline.setMapboxMap(this);
+ polyline.setId(id);
+ mAnnotations.put(id, polyline);
+ return polyline;
}
/**
@@ -584,7 +638,29 @@ public class MapboxMap {
@UiThread
@NonNull
public List<Polyline> addPolylines(@NonNull List<PolylineOptions> polylineOptionsList) {
- return mMapView.addPolylines(polylineOptionsList);
+ int count = polylineOptionsList.size();
+ List<Polyline> polylines = new ArrayList<>(count);
+ for (PolylineOptions options : polylineOptionsList) {
+ polylines.add(options.getPolyline());
+ }
+
+ long[] ids = mMapView.addPolylines(polylines);
+ long id = 0;
+ Polyline p;
+
+ for (int i = 0; i < polylines.size(); i++) {
+ p = polylines.get(i);
+ p.setMapboxMap(this);
+ if (ids != null) {
+ id = ids[i];
+ } else {
+ // unit test
+ id++;
+ }
+ p.setId(id);
+ mAnnotations.put(id, p);
+ }
+ return polylines;
}
/**
@@ -596,7 +672,12 @@ public class MapboxMap {
@UiThread
@NonNull
public Polygon addPolygon(@NonNull PolygonOptions polygonOptions) {
- return mMapView.addPolygon(polygonOptions);
+ Polygon polygon = polygonOptions.getPolygon();
+ long id = mMapView.addPolygon(polygon);
+ polygon.setId(id);
+ polygon.setMapboxMap(this);
+ mAnnotations.put(id, polygon);
+ return polygon;
}
/**
@@ -608,7 +689,29 @@ public class MapboxMap {
@UiThread
@NonNull
public List<Polygon> addPolygons(@NonNull List<PolygonOptions> polygonOptionsList) {
- return mMapView.addPolygons(polygonOptionsList);
+ int count = polygonOptionsList.size();
+ List<Polygon> polygons = new ArrayList<>(count);
+ for (PolygonOptions polygonOptions : polygonOptionsList) {
+ polygons.add(polygonOptions.getPolygon());
+ }
+
+ long[] ids = mMapView.addPolygons(polygons);
+ long id = 0;
+ Polygon polygon;
+
+ for (int i = 0; i < polygons.size(); i++) {
+ polygon = polygons.get(i);
+ polygon.setMapboxMap(this);
+ if(ids!=null){
+ id = ids[i];
+ }else{
+ // unit test
+ id++;
+ }
+ polygon.setId(id);
+ mAnnotations.put(id, polygon);
+ }
+ return polygons;
}
/**
@@ -625,13 +728,55 @@ public class MapboxMap {
}
/**
+ * <p>
+ * Convenience method for removing a Polyline from the map.
+ * </p>
+ * Calls removeAnnotation() internally
+ *
+ * @param polyline Polyline to remove
+ */
+ @UiThread
+ public void removePolyline(@NonNull Polyline polyline) {
+ removeAnnotation(polyline);
+ }
+
+ /**
+ * <p>
+ * Convenience method for removing a Polygon from the map.
+ * </p>
+ * Calls removeAnnotation() internally
+ *
+ * @param polygon Polygon to remove
+ */
+ @UiThread
+ public void removePolygon(@NonNull Polygon polygon) {
+ removeAnnotation(polygon);
+ }
+
+ /**
* Removes an annotation from the map.
*
* @param annotation The annotation object to remove.
*/
@UiThread
public void removeAnnotation(@NonNull Annotation annotation) {
- mMapView.removeAnnotation(annotation);
+ if (annotation instanceof Marker) {
+ ((Marker) annotation).hideInfoWindow();
+ }
+ long id = annotation.getId();
+ mMapView.removeAnnotation(id);
+ mAnnotations.remove(id);
+ }
+
+ /**
+ * Removes an annotation from the map
+ *
+ * @param id The identifier associated to the annotation to be removed
+ */
+ @UiThread
+ public void removeAnnotation(long id) {
+ mMapView.removeAnnotation(id);
+ mAnnotations.remove(id);
}
/**
@@ -641,15 +786,38 @@ public class MapboxMap {
*/
@UiThread
public void removeAnnotations(@NonNull List<? extends Annotation> annotationList) {
- mMapView.removeAnnotations(annotationList);
+ int count = annotationList.size();
+ long[] ids = new long[count];
+ for (int i = 0; i < count; i++) {
+ Annotation annotation = annotationList.get(i);
+ if (annotation instanceof Marker) {
+ ((Marker) annotation).hideInfoWindow();
+ }
+ ids[i] = annotationList.get(i).getId();
+ }
+ mMapView.removeAnnotations(ids);
+ for (long id : ids) {
+ mAnnotations.remove(id);
+ }
}
/**
* Removes all annotations from the map.
*/
@UiThread
- public void removeAllAnnotations() {
- mMapView.removeAllAnnotations();
+ public void removeAnnotations() {
+ mAnnotations.clear();
+ }
+
+ /**
+ * Return a annotation based on its id.
+ *
+ * @return An annotation with a matched id, null is returned if no match was found.
+ */
+ @UiThread
+ @Nullable
+ public Annotation getAnnotation(long id) {
+ return mAnnotations.get(id);
}
/**
@@ -659,8 +827,69 @@ public class MapboxMap {
* list will not update the map.
*/
@NonNull
- public List<Annotation> getAllAnnotations() {
- return mMapView.getAllAnnotations();
+ public List<Annotation> getAnnotations() {
+ List<Annotation> annotations = new ArrayList<>();
+ for (int i = 0; i < mAnnotations.size(); i++) {
+ annotations.add(mAnnotations.get(mAnnotations.keyAt(i)));
+ }
+ return annotations;
+ }
+
+ /**
+ * Returns a list of all the markers on the map.
+ *
+ * @return A list of all the markers objects. The returned object is a copy so modifying this
+ * list will not update the map.
+ */
+ @NonNull
+ public List<Marker> getMarkers() {
+ List<Marker> markers = new ArrayList<>();
+ Annotation annotation;
+ for (int i = 0; i < mAnnotations.size(); i++) {
+ annotation = mAnnotations.get(mAnnotations.keyAt(i));
+ if (annotation instanceof Marker) {
+ markers.add((Marker) annotation);
+ }
+ }
+ return markers;
+ }
+
+ /**
+ * Returns a list of all the polygons on the map.
+ *
+ * @return A list of all the polygon objects. The returned object is a copy so modifying this
+ * list will not update the map.
+ */
+ @NonNull
+ public List<Polygon> getPolygons() {
+ List<Polygon> polygons = new ArrayList<>();
+ Annotation annotation;
+ for (int i = 0; i < mAnnotations.size(); i++) {
+ annotation = mAnnotations.get(mAnnotations.keyAt(i));
+ if (annotation instanceof Polygon) {
+ polygons.add((Polygon) annotation);
+ }
+ }
+ return polygons;
+ }
+
+ /**
+ * Returns a list of all the polylines on the map.
+ *
+ * @return A list of all the polylines objects. The returned object is a copy so modifying this
+ * list will not update the map.
+ */
+ @NonNull
+ public List<Polyline> getPolylines() {
+ List<Polyline> polylines = new ArrayList<>();
+ Annotation annotation;
+ for (int i = 0; i < mAnnotations.size(); i++) {
+ annotation = mAnnotations.get(mAnnotations.keyAt(i));
+ if (annotation instanceof Polyline) {
+ polylines.add((Polyline) annotation);
+ }
+ }
+ return polylines;
}
/**
@@ -746,11 +975,17 @@ public class MapboxMap {
* @return The currently selected marker.
*/
@UiThread
- @Nullable
public List<Marker> getSelectedMarkers() {
return mSelectedMarkers;
}
+ private Marker prepareMarker(BaseMarkerOptions markerOptions) {
+ Marker marker = markerOptions.getMarker();
+ Icon icon = mMapView.loadIconForMarker(marker);
+ marker.setTopOffsetPixels(mMapView.getTopOffsetPixelsForIcon(icon));
+ return marker;
+ }
+
//
// InfoWindow
//
@@ -1107,9 +1342,9 @@ public class MapboxMap {
return mMapView;
}
-//
-// Interfaces
-//
+ //
+ // Interfaces
+ //
/**
* Interface definition for a callback to be invoked when the map is flinged.
@@ -1287,7 +1522,7 @@ public class MapboxMap {
/**
* Interface definition for a callback to be invoked when the the My Location tracking mode changes.
*
- * @see MapboxMap#setMyLocationTrackingMode(int)
+ * @see MapView#setMyLocationTrackingMode(int)
*/
public interface OnMyLocationTrackingModeChangeListener {
@@ -1302,7 +1537,7 @@ public class MapboxMap {
/**
* Interface definition for a callback to be invoked when the the My Location tracking mode changes.
*
- * @see MapboxMap#setMyLocationTrackingMode(int)
+ * @see MapView#setMyLocationTrackingMode(int)
*/
public interface OnMyBearingTrackingModeChangeListener {
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/BulkMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/BulkMarkerActivity.java
index 3c5e53a0ad..4dace2c452 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/BulkMarkerActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/BulkMarkerActivity.java
@@ -150,7 +150,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView
public LoadBulkMarkerTask(Context context, MapboxMap mapboxMap, int amount) {
mMapboxMap = mapboxMap;
- mapboxMap.removeAllAnnotations();
+ mapboxMap.removeAnnotations();
mProgressDialog = ProgressDialog.show(context, "Loading", "Fetching markers", false);
mAppContext = context.getApplicationContext();
mAmount = amount;
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/GeocoderActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/GeocoderActivity.java
index b87812277c..5594348be7 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/GeocoderActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/GeocoderActivity.java
@@ -78,7 +78,7 @@ public class GeocoderActivity extends AppCompatActivity {
@Override
public void onMapClick(@NonNull LatLng point) {
setMessage("Geocoding...");
- mapboxMap.removeAllAnnotations();
+ mapboxMap.removeAnnotations();
mapboxMap.addMarker(new MarkerOptions()
.position(point)
.title("Your finger is here"));
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java
index 52f0bddc28..02380e59f2 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java
@@ -16,10 +16,11 @@ import android.widget.TextView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.annotations.Icon;
import com.mapbox.mapboxsdk.annotations.Marker;
-import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
+import com.mapbox.mapboxsdk.testapp.annotations.CityStateMarker;
+import com.mapbox.mapboxsdk.testapp.annotations.CityStateMarkerOptions;
import com.mapbox.mapboxsdk.utils.ApiAccess;
import com.mapbox.mapboxsdk.maps.MapView;
@@ -54,12 +55,12 @@ public class InfoWindowAdapterActivity extends AppCompatActivity {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
// add markers
- mapboxMap.addMarker(generateMarker("Andorra", 42.505777, 1.52529, "#F44336"));
- mapboxMap.addMarker(generateMarker("Luxembourg", 49.815273, 6.129583, "#3F51B5"));
- mapboxMap.addMarker(generateMarker("Monaco", 43.738418, 7.424616, "#673AB7"));
- mapboxMap.addMarker(generateMarker("Vatican City", 41.902916, 12.453389, "#009688"));
- mapboxMap.addMarker(generateMarker("San Marino", 43.942360, 12.457777, "#795548"));
- mapboxMap.addMarker(generateMarker("Liechtenstein", 47.166000, 9.555373, "#FF5722"));
+ mapboxMap.addMarker(generateCityStateMarker("Andorra", 42.505777, 1.52529, "#F44336"));
+ mapboxMap.addMarker(generateCityStateMarker("Luxembourg", 49.815273, 6.129583, "#3F51B5"));
+ mapboxMap.addMarker(generateCityStateMarker("Monaco", 43.738418, 7.424616, "#673AB7"));
+ mapboxMap.addMarker(generateCityStateMarker("Vatican City", 41.902916, 12.453389, "#009688"));
+ mapboxMap.addMarker(generateCityStateMarker("San Marino", 43.942360, 12.457777, "#795548"));
+ mapboxMap.addMarker(generateCityStateMarker("Liechtenstein", 47.166000, 9.555373, "#FF5722"));
// add custom window adapter
mapboxMap.setInfoWindowAdapter(new MapboxMap.InfoWindowAdapter() {
@@ -71,7 +72,12 @@ public class InfoWindowAdapterActivity extends AppCompatActivity {
TextView textView = new TextView(InfoWindowAdapterActivity.this);
textView.setText(marker.getTitle());
textView.setTextColor(Color.WHITE);
- textView.setBackgroundColor(Color.parseColor(marker.getSnippet()));
+
+ if(marker instanceof CityStateMarker){
+ CityStateMarker cityStateMarker = (CityStateMarker)marker;
+ textView.setBackgroundColor(Color.parseColor(cityStateMarker.getInfoWindowBackgroundColor()));
+ }
+
textView.setPadding(tenDp, tenDp, tenDp, tenDp);
return textView;
}
@@ -80,13 +86,13 @@ public class InfoWindowAdapterActivity extends AppCompatActivity {
});
}
- private MarkerOptions generateMarker(String title, double lat, double lng, String color) {
- MarkerOptions marker = new MarkerOptions();
+ private CityStateMarkerOptions generateCityStateMarker(String title, double lat, double lng, String color) {
+ CityStateMarkerOptions marker = new CityStateMarkerOptions();
marker.title(title);
- marker.snippet(color);
marker.position(new LatLng(lat, lng));
+ marker.infoWindowBackground(color);
- mIconDrawable.setColorFilter(Color.parseColor(marker.getSnippet()), PorterDuff.Mode.SRC_IN);
+ mIconDrawable.setColorFilter(Color.parseColor(color), PorterDuff.Mode.SRC_IN);
Icon icon = mIconFactory.fromDrawable(mIconDrawable);
marker.icon(icon);
return marker;
@@ -144,4 +150,5 @@ public class InfoWindowAdapterActivity extends AppCompatActivity {
return super.onOptionsItemSelected(item);
}
}
+
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java
index 91fcb8f5c5..d1ac656cd0 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java
@@ -655,7 +655,7 @@ public class MainActivity extends AppCompatActivity {
private void removeAnnotations() {
mMarkerList.clear();
- mMapboxMap.removeAllAnnotations();
+ mMapboxMap.removeAnnotations();
}
private void addCustomLayer() {
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java
index eaf2b240b0..313eb6722b 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java
@@ -169,7 +169,7 @@ public class PolylineActivity extends AppCompatActivity {
case R.id.action_id_remove:
// test to remove all annotations
mPolylineOptions.clear();
- mMapboxMap.removeAllAnnotations();
+ mMapboxMap.removeAnnotations();
return true;
case android.R.id.home:
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarker.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarker.java
new file mode 100644
index 0000000000..1ec5aa9c76
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarker.java
@@ -0,0 +1,18 @@
+package com.mapbox.mapboxsdk.testapp.annotations;
+
+import com.mapbox.mapboxsdk.annotations.Marker;
+
+public class CityStateMarker extends Marker {
+
+ private String mInfoWindowBackgroundColor;
+
+ public CityStateMarker(CityStateMarkerOptions cityStateOptions, String color) {
+ super(cityStateOptions);
+ mInfoWindowBackgroundColor = color;
+ }
+
+ public String getInfoWindowBackgroundColor() {
+ return mInfoWindowBackgroundColor;
+ }
+
+} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarkerOptions.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarkerOptions.java
new file mode 100644
index 0000000000..379a9210e5
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/annotations/CityStateMarkerOptions.java
@@ -0,0 +1,68 @@
+package com.mapbox.mapboxsdk.testapp.annotations;
+
+import android.graphics.Bitmap;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
+import com.mapbox.mapboxsdk.annotations.Icon;
+import com.mapbox.mapboxsdk.annotations.IconFactory;
+import com.mapbox.mapboxsdk.geometry.LatLng;
+
+public class CityStateMarkerOptions extends BaseMarkerOptions<CityStateMarker, CityStateMarkerOptions> {
+
+ private String mInfoWindowBackgroundColor;
+
+ public CityStateMarkerOptions infoWindowBackground(String color) {
+ mInfoWindowBackgroundColor = color;
+ return getThis();
+ }
+
+ public CityStateMarkerOptions() {
+ }
+
+ private CityStateMarkerOptions(Parcel in) {
+ position((LatLng) in.readParcelable(LatLng.class.getClassLoader()));
+ snippet(in.readString());
+ String iconId = in.readString();
+ Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader());
+ Icon icon = IconFactory.recreate(iconId, iconBitmap);
+ icon(icon);
+ title(in.readString());
+ }
+
+ @Override
+ public CityStateMarkerOptions getThis() {
+ return this;
+ }
+
+ @Override
+ public CityStateMarker getMarker() {
+ return new CityStateMarker(this, mInfoWindowBackgroundColor);
+ }
+
+ public static final Parcelable.Creator<CityStateMarkerOptions> CREATOR
+ = new Parcelable.Creator<CityStateMarkerOptions>() {
+ public CityStateMarkerOptions createFromParcel(Parcel in) {
+ return new CityStateMarkerOptions(in);
+ }
+
+ public CityStateMarkerOptions[] newArray(int size) {
+ return new CityStateMarkerOptions[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeParcelable(position, flags);
+ out.writeString(snippet);
+ out.writeString(icon.getId());
+ out.writeParcelable(icon.getBitmap(), flags);
+ out.writeString(title);
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java
index 0f75655dc9..5a6a2b5f8b 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java
@@ -1,9 +1,14 @@
package com.mapbox.mapboxsdk.maps;
+import android.graphics.Color;
import android.graphics.Point;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
+import com.mapbox.mapboxsdk.annotations.Polygon;
+import com.mapbox.mapboxsdk.annotations.PolygonOptions;
+import com.mapbox.mapboxsdk.annotations.Polyline;
+import com.mapbox.mapboxsdk.annotations.PolylineOptions;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.constants.Style;
@@ -15,9 +20,13 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.List;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.matches;
import static org.mockito.Mockito.mock;
import static org.junit.Assert.assertNotNull;
@@ -46,6 +55,16 @@ public class MapboxMapTest {
assertNotNull("mMapboxMap should not be null", mMapboxMap);
}
+ @Test
+ public void testMock() {
+ assertNotNull("mMapView should be mocked", mMapView);
+ }
+
+ @Test
+ public void testGetMapView(){
+ assertNotNull("MapView should be non null", mMapboxMap.getMapView());
+ }
+
//
// UiSettings
//
@@ -60,12 +79,11 @@ public class MapboxMapTest {
//
@Test
- public void testProjection(){
- assertNotNull("Projection should not be null",mMapboxMap.getProjection());
+ public void testProjection() {
+ assertNotNull("Projection should not be null", mMapboxMap.getProjection());
}
-
//
// InfoWindow
//
@@ -369,6 +387,206 @@ public class MapboxMapTest {
}
//
+ // Annotations
+ //
+
+ @Test
+ public void testAddMarker() {
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker = mMapboxMap.addMarker(markerOptions);
+ assertTrue("Marker should be contained", mMapboxMap.getMarkers().contains(marker));
+ }
+
+ @Test
+ public void testAddMarkers() {
+ List<MarkerOptions> markerList = new ArrayList<>();
+ MarkerOptions markerOptions1 = new MarkerOptions().title("a");
+ MarkerOptions markerOptions2 = new MarkerOptions().title("b");
+ markerList.add(markerOptions1);
+ markerList.add(markerOptions2);
+ mMapboxMap.addMarkers(markerList);
+ assertEquals("Markers size should be 2", 2, mMapboxMap.getMarkers().size());
+ assertTrue(mMapboxMap.getMarkers().contains(markerOptions1.getMarker()));
+ assertTrue(mMapboxMap.getMarkers().contains(markerOptions2.getMarker()));
+ }
+
+ @Test
+ public void testAddPolygon() {
+ PolygonOptions polygonOptions = new PolygonOptions();
+ Polygon polygon = mMapboxMap.addPolygon(polygonOptions);
+ assertTrue("Polygon should be contained", mMapboxMap.getPolygons().contains(polygon));
+ }
+
+ @Test
+ public void testAddPolygons() {
+ List<PolygonOptions> polygonList = new ArrayList<>();
+ PolygonOptions polygonOptions1 = new PolygonOptions().fillColor(Color.BLACK);
+ PolygonOptions polygonOptions2 = new PolygonOptions().fillColor(Color.WHITE);
+ polygonList.add(polygonOptions1);
+ polygonList.add(polygonOptions2);
+ mMapboxMap.addPolygons(polygonList);
+ assertEquals("Polygons size should be 2", 2, mMapboxMap.getPolygons().size());
+ assertTrue(mMapboxMap.getPolygons().contains(polygonOptions1.getPolygon()));
+ assertTrue(mMapboxMap.getPolygons().contains(polygonOptions2.getPolygon()));
+ }
+
+ @Test
+ public void testAddPolyline() {
+ PolylineOptions polylineOptions = new PolylineOptions();
+ Polyline polyline = mMapboxMap.addPolyline(polylineOptions);
+ assertTrue("Polyline should be contained", mMapboxMap.getPolylines().contains(polyline));
+ }
+
+ @Test
+ public void testAddPolylines() {
+ List<PolylineOptions> polylineList = new ArrayList<>();
+ PolylineOptions polygonOptions1 = new PolylineOptions().color(Color.BLACK);
+ PolylineOptions polygonOptions2 = new PolylineOptions().color(Color.WHITE);
+ polylineList.add(polygonOptions1);
+ polylineList.add(polygonOptions2);
+ mMapboxMap.addPolylines(polylineList);
+ assertEquals("Polygons size should be 2", 2, mMapboxMap.getPolylines().size());
+ assertTrue(mMapboxMap.getPolylines().contains(polygonOptions1.getPolyline()));
+ assertTrue(mMapboxMap.getPolylines().contains(polygonOptions2.getPolyline()));
+ }
+
+ @Test
+ public void testRemoveMarker() {
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker = mMapboxMap.addMarker(markerOptions);
+ mMapboxMap.removeMarker(marker);
+ assertTrue("Markers should be empty", mMapboxMap.getMarkers().isEmpty());
+ }
+
+ @Test
+ public void testRemovePolygon() {
+ PolygonOptions polygonOptions = new PolygonOptions();
+ Polygon polygon = mMapboxMap.addPolygon(polygonOptions);
+ mMapboxMap.removePolygon(polygon);
+ assertTrue("Polygons should be empty", mMapboxMap.getPolylines().isEmpty());
+ }
+
+ @Test
+ public void testRemovePolyline() {
+ PolylineOptions polylineOptions = new PolylineOptions();
+ Polyline polyline = mMapboxMap.addPolyline(polylineOptions);
+ mMapboxMap.removePolyline(polyline);
+ assertTrue("Polylines should be empty", mMapboxMap.getPolylines().isEmpty());
+ }
+
+ @Test
+ public void testRemoveAnnotation() {
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker = mMapboxMap.addMarker(markerOptions);
+ mMapboxMap.removeAnnotation(marker);
+ assertTrue("Annotations should be empty", mMapboxMap.getAnnotations().isEmpty());
+ }
+
+ @Test
+ public void testRemoveAnnotationById() {
+ MarkerOptions markerOptions = new MarkerOptions();
+ mMapboxMap.addMarker(markerOptions);
+ // id will always be 0 in unit tests
+ mMapboxMap.removeAnnotation(0);
+ assertTrue("Annotations should be empty", mMapboxMap.getAnnotations().isEmpty());
+ }
+
+ @Test
+ public void testRemoveAnnotations() {
+ List<MarkerOptions> markerList = new ArrayList<>();
+ MarkerOptions markerOptions1 = new MarkerOptions().title("a");
+ MarkerOptions markerOptions2 = new MarkerOptions().title("b");
+ markerList.add(markerOptions1);
+ markerList.add(markerOptions2);
+ mMapboxMap.addMarkers(markerList);
+ mMapboxMap.removeAnnotations();
+ assertTrue("Annotations should be empty", mMapboxMap.getAnnotations().isEmpty());
+ }
+
+ @Test
+ public void testRemoveAnnotationsByList() {
+ List<MarkerOptions> markerList = new ArrayList<>();
+ MarkerOptions markerOptions1 = new MarkerOptions().title("a");
+ MarkerOptions markerOptions2 = new MarkerOptions().title("b");
+ markerList.add(markerOptions1);
+ markerList.add(markerOptions2);
+ List<Marker> markers = mMapboxMap.addMarkers(markerList);
+ Marker marker = mMapboxMap.addMarker(new MarkerOptions().title("c"));
+ mMapboxMap.removeAnnotations(markers);
+ assertTrue("Annotations should not be empty", mMapboxMap.getAnnotations().size() == 1);
+ assertTrue("Marker should be contained", mMapboxMap.getAnnotations().contains(marker));
+ }
+
+ @Test
+ public void testGetAnnotationById() {
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker initialMarker = mMapboxMap.addMarker(markerOptions);
+ Marker retrievedMarker = (Marker) mMapboxMap.getAnnotation(0);
+ assertEquals("Markers should match", initialMarker, retrievedMarker);
+ }
+
+ @Test
+ public void testGetAnnotations() {
+ assertNotNull("Annotations should be non null", mMapboxMap.getAnnotations());
+ }
+
+ @Test
+ public void testGetMarkers() {
+ assertNotNull("Markers should be non null", mMapboxMap.getMarkers());
+ }
+
+ @Test
+ public void testGetPolygons() {
+ assertNotNull("Polygons should be non null", mMapboxMap.getPolygons());
+ }
+
+ @Test
+ public void testGetPolylines() {
+ assertNotNull("Polylines should be non null", mMapboxMap.getPolylines());
+ }
+
+ @Test
+ public void testGetSelectedMarkers() {
+ assertNotNull("Selected markers should be non null", mMapboxMap.getSelectedMarkers());
+ }
+
+ @Test
+ public void testSelectMarker() {
+ mMapboxMap.setOnMarkerClickListener(mOnMarkerClickListener);
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker = mMapboxMap.addMarker(markerOptions);
+ when(mOnMarkerClickListener.onMarkerClick(marker)).thenReturn(true);
+ mMapboxMap.selectMarker(marker);
+ assertTrue("Marker should be contained", mMapboxMap.getSelectedMarkers().contains(marker));
+ }
+
+ @Test
+ public void testDeselectMarker() {
+ mMapboxMap.setOnMarkerClickListener(mOnMarkerClickListener);
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker = mMapboxMap.addMarker(markerOptions);
+ when(mOnMarkerClickListener.onMarkerClick(marker)).thenReturn(true);
+ mMapboxMap.selectMarker(marker);
+ mMapboxMap.deselectMarker(marker);
+ assertTrue("Selected markers should be empty", mMapboxMap.getSelectedMarkers().isEmpty());
+ }
+
+ @Test
+ public void testDeselectMarkers() {
+ mMapboxMap.setOnMarkerClickListener(mOnMarkerClickListener);
+ MarkerOptions markerOptions = new MarkerOptions();
+ Marker marker1 = mMapboxMap.addMarker(markerOptions);
+ Marker marker2 = mMapboxMap.addMarker(markerOptions);
+ when(mOnMarkerClickListener.onMarkerClick(marker1)).thenReturn(true);
+ when(mOnMarkerClickListener.onMarkerClick(marker2)).thenReturn(true);
+ mMapboxMap.selectMarker(marker1);
+ mMapboxMap.selectMarker(marker2);
+ mMapboxMap.deselectMarkers();
+ assertTrue("Selected markers should be empty", mMapboxMap.getSelectedMarkers().isEmpty());
+ }
+
+
+ //
// OnMarkerClick interface
//