diff options
author | Tobrun <tobrun@mapbox.com> | 2016-02-05 09:05:35 +0100 |
---|---|---|
committer | Tobrun <tobrun@mapbox.com> | 2016-02-15 17:05:15 +0100 |
commit | fb9021f929ffd25fbe56b9ffe6ccc005666c640a (patch) | |
tree | d0e66dc5aa0a8bba35fc8ec703845a6201c2902f /platform | |
parent | ef865f04f6942e43796a70aaf7e92c899b803ac2 (diff) | |
download | qtlocation-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')
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 // |