summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java519
1 files changed, 0 insertions, 519 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java
deleted file mode 100644
index 8875e7164b..0000000000
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java
+++ /dev/null
@@ -1,519 +0,0 @@
-package com.mapbox.mapboxsdk.maps;
-
-import android.graphics.Bitmap;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.util.LongSparseArray;
-import android.view.View;
-import com.mapbox.mapboxsdk.Mapbox;
-import com.mapbox.mapboxsdk.R;
-import com.mapbox.mapboxsdk.annotations.Annotation;
-import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
-import com.mapbox.mapboxsdk.annotations.Marker;
-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.log.Logger;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Responsible for managing and tracking state of Annotations linked to Map. All events related to
- * annotations that occur on {@link MapboxMap} are forwarded to this class.
- * <p>
- * Responsible for referencing {@link InfoWindowManager}.
- * </p>
- * <p>
- * Exposes convenience methods to add/remove/update all subtypes of annotations found in
- * com.mapbox.mapboxsdk.annotations.
- * </p>
- */
-class AnnotationManager {
-
- private static final String TAG = "Mbgl-AnnotationManager";
-
- private static final long NO_ANNOTATION_ID = -1;
-
- @NonNull
- private final MapView mapView;
- private final IconManager iconManager;
- private final InfoWindowManager infoWindowManager = new InfoWindowManager();
- private final LongSparseArray<Annotation> annotationsArray;
- private final List<Marker> selectedMarkers = new ArrayList<>();
-
- private MapboxMap mapboxMap;
- @Nullable
- private MapboxMap.OnMarkerClickListener onMarkerClickListener;
- @Nullable
- private MapboxMap.OnPolygonClickListener onPolygonClickListener;
- @Nullable
- private MapboxMap.OnPolylineClickListener onPolylineClickListener;
-
- private Annotations annotations;
- private ShapeAnnotations shapeAnnotations;
- private Markers markers;
- private Polygons polygons;
- private Polylines polylines;
-
- AnnotationManager(@NonNull MapView mapView, LongSparseArray<Annotation> annotationsArray,
- IconManager iconManager, Annotations annotations, Markers markers, Polygons polygons,
- Polylines polylines, ShapeAnnotations shapeAnnotations) {
- this.mapView = mapView;
- this.annotationsArray = annotationsArray;
- this.iconManager = iconManager;
- this.annotations = annotations;
- this.markers = markers;
- this.polygons = polygons;
- this.polylines = polylines;
- this.shapeAnnotations = shapeAnnotations;
- }
-
- // TODO refactor MapboxMap out for Projection and Transform
- // Requires removing MapboxMap from Annotations by using Peer model from #6912
- @NonNull
- AnnotationManager bind(MapboxMap mapboxMap) {
- this.mapboxMap = mapboxMap;
- return this;
- }
-
- void update() {
- infoWindowManager.update();
- }
-
- //
- // Annotations
- //
-
- Annotation getAnnotation(long id) {
- return annotations.obtainBy(id);
- }
-
- List<Annotation> getAnnotations() {
- return annotations.obtainAll();
- }
-
- void removeAnnotation(long id) {
- annotations.removeBy(id);
- }
-
- void removeAnnotation(@NonNull Annotation annotation) {
- if (annotation instanceof Marker) {
- Marker marker = (Marker) annotation;
- marker.hideInfoWindow();
- if (selectedMarkers.contains(marker)) {
- selectedMarkers.remove(marker);
- }
- // do icon cleanup
- iconManager.iconCleanup(marker.getIcon());
- }
- annotations.removeBy(annotation);
- }
-
- void removeAnnotations(@NonNull List<? extends Annotation> annotationList) {
- for (Annotation annotation : annotationList) {
- if (annotation instanceof Marker) {
- Marker marker = (Marker) annotation;
- marker.hideInfoWindow();
- if (selectedMarkers.contains(marker)) {
- selectedMarkers.remove(marker);
- }
- iconManager.iconCleanup(marker.getIcon());
- }
- }
- annotations.removeBy(annotationList);
- }
-
- void removeAnnotations() {
- Annotation annotation;
- int count = annotationsArray.size();
- long[] ids = new long[count];
- selectedMarkers.clear();
- for (int i = 0; i < count; i++) {
- ids[i] = annotationsArray.keyAt(i);
- annotation = annotationsArray.get(ids[i]);
- if (annotation instanceof Marker) {
- Marker marker = (Marker) annotation;
- marker.hideInfoWindow();
- iconManager.iconCleanup(marker.getIcon());
- }
- }
- annotations.removeAll();
- }
-
- //
- // Markers
- //
-
- Marker addMarker(@NonNull BaseMarkerOptions markerOptions, @NonNull MapboxMap mapboxMap) {
- return markers.addBy(markerOptions, mapboxMap);
- }
-
- List<Marker> addMarkers(@NonNull List<? extends BaseMarkerOptions> markerOptionsList, @NonNull MapboxMap mapboxMap) {
- return markers.addBy(markerOptionsList, mapboxMap);
- }
-
- void updateMarker(@NonNull Marker updatedMarker, @NonNull MapboxMap mapboxMap) {
- if (!isAddedToMap(updatedMarker)) {
- logNonAdded(updatedMarker);
- return;
- }
- markers.update(updatedMarker, mapboxMap);
- }
-
- List<Marker> getMarkers() {
- return markers.obtainAll();
- }
-
- @NonNull
- List<Marker> getMarkersInRect(@NonNull RectF rectangle) {
- return markers.obtainAllIn(rectangle);
- }
-
- void reloadMarkers() {
- markers.reload();
- }
-
- //
- // Polygons
- //
-
- Polygon addPolygon(@NonNull PolygonOptions polygonOptions, @NonNull MapboxMap mapboxMap) {
- return polygons.addBy(polygonOptions, mapboxMap);
- }
-
- List<Polygon> addPolygons(@NonNull List<PolygonOptions> polygonOptionsList, @NonNull MapboxMap mapboxMap) {
- return polygons.addBy(polygonOptionsList, mapboxMap);
- }
-
- void updatePolygon(@NonNull Polygon polygon) {
- if (!isAddedToMap(polygon)) {
- logNonAdded(polygon);
- return;
- }
- polygons.update(polygon);
- }
-
- List<Polygon> getPolygons() {
- return polygons.obtainAll();
- }
-
- //
- // Polylines
- //
-
- Polyline addPolyline(@NonNull PolylineOptions polylineOptions, @NonNull MapboxMap mapboxMap) {
- return polylines.addBy(polylineOptions, mapboxMap);
- }
-
- List<Polyline> addPolylines(@NonNull List<PolylineOptions> polylineOptionsList, @NonNull MapboxMap mapboxMap) {
- return polylines.addBy(polylineOptionsList, mapboxMap);
- }
-
- void updatePolyline(@NonNull Polyline polyline) {
- if (!isAddedToMap(polyline)) {
- logNonAdded(polyline);
- return;
- }
- polylines.update(polyline);
- }
-
- List<Polyline> getPolylines() {
- return polylines.obtainAll();
- }
-
- // TODO Refactor from here still in progress
- void setOnMarkerClickListener(@Nullable MapboxMap.OnMarkerClickListener listener) {
- onMarkerClickListener = listener;
- }
-
- void setOnPolygonClickListener(@Nullable MapboxMap.OnPolygonClickListener listener) {
- onPolygonClickListener = listener;
- }
-
- void setOnPolylineClickListener(@Nullable MapboxMap.OnPolylineClickListener listener) {
- onPolylineClickListener = listener;
- }
-
- void selectMarker(@NonNull Marker marker) {
- if (selectedMarkers.contains(marker)) {
- return;
- }
-
- // Need to deselect any currently selected annotation first
- if (!infoWindowManager.isAllowConcurrentMultipleOpenInfoWindows()) {
- deselectMarkers();
- }
-
- if (infoWindowManager.isInfoWindowValidForMarker(marker) || infoWindowManager.getInfoWindowAdapter() != null) {
- infoWindowManager.add(marker.showInfoWindow(mapboxMap, mapView));
- }
-
- // only add to selected markers if user didn't handle the click event themselves #3176
- selectedMarkers.add(marker);
- }
-
- void deselectMarkers() {
- if (selectedMarkers.isEmpty()) {
- return;
- }
-
- for (Marker marker : selectedMarkers) {
- if (marker != null) {
- if (marker.isInfoWindowShown()) {
- marker.hideInfoWindow();
- }
- }
- }
-
- // Removes all selected markers from the list
- selectedMarkers.clear();
- }
-
- void deselectMarker(@NonNull Marker marker) {
- if (!selectedMarkers.contains(marker)) {
- return;
- }
-
- if (marker.isInfoWindowShown()) {
- marker.hideInfoWindow();
- }
- selectedMarkers.remove(marker);
- }
-
- @NonNull
- List<Marker> getSelectedMarkers() {
- return selectedMarkers;
- }
-
- @NonNull
- InfoWindowManager getInfoWindowManager() {
- return infoWindowManager;
- }
-
- void adjustTopOffsetPixels(@NonNull MapboxMap mapboxMap) {
- int count = annotationsArray.size();
- for (int i = 0; i < count; i++) {
- Annotation annotation = annotationsArray.get(i);
- if (annotation instanceof Marker) {
- Marker marker = (Marker) annotation;
- marker.setTopOffsetPixels(
- iconManager.getTopOffsetPixelsForIcon(marker.getIcon()));
- }
- }
-
- for (Marker marker : selectedMarkers) {
- if (marker.isInfoWindowShown()) {
- marker.hideInfoWindow();
- marker.showInfoWindow(mapboxMap, mapView);
- }
- }
- }
-
- private boolean isAddedToMap(@Nullable Annotation annotation) {
- return annotation != null && annotation.getId() != -1 && annotationsArray.indexOfKey(annotation.getId()) > -1;
- }
-
- private void logNonAdded(@NonNull Annotation annotation) {
- Logger.w(TAG, String.format(
- "Attempting to update non-added %s with value %s", annotation.getClass().getCanonicalName(), annotation)
- );
- }
-
- //
- // Click event
- //
-
- boolean onTap(@NonNull PointF tapPoint) {
- MarkerHit markerHit = getMarkerHitFromTouchArea(tapPoint);
- long markerId = new MarkerHitResolver(mapboxMap).execute(markerHit);
- if (markerId != NO_ANNOTATION_ID) {
- if (isClickHandledForMarker(markerId)) {
- return true;
- }
- }
-
- ShapeAnnotationHit shapeAnnotationHit = getShapeAnnotationHitFromTap(tapPoint);
- Annotation annotation = new ShapeAnnotationHitResolver(shapeAnnotations).execute(shapeAnnotationHit);
- return annotation != null && handleClickForShapeAnnotation(annotation);
- }
-
- private ShapeAnnotationHit getShapeAnnotationHitFromTap(PointF tapPoint) {
- float touchTargetSide = Mapbox.getApplicationContext().getResources().getDimension(R.dimen.mapbox_eight_dp);
- RectF tapRect = new RectF(
- tapPoint.x - touchTargetSide,
- tapPoint.y - touchTargetSide,
- tapPoint.x + touchTargetSide,
- tapPoint.y + touchTargetSide
- );
- return new ShapeAnnotationHit(tapRect);
- }
-
- private boolean handleClickForShapeAnnotation(Annotation annotation) {
- if (annotation instanceof Polygon && onPolygonClickListener != null) {
- onPolygonClickListener.onPolygonClick((Polygon) annotation);
- return true;
- } else if (annotation instanceof Polyline && onPolylineClickListener != null) {
- onPolylineClickListener.onPolylineClick((Polyline) annotation);
- return true;
- }
- return false;
- }
-
- private MarkerHit getMarkerHitFromTouchArea(PointF tapPoint) {
- int touchSurfaceWidth = (int) (iconManager.getHighestIconHeight() * 1.5);
- int touchSurfaceHeight = (int) (iconManager.getHighestIconWidth() * 1.5);
- final RectF tapRect = new RectF(tapPoint.x - touchSurfaceWidth,
- tapPoint.y - touchSurfaceHeight,
- tapPoint.x + touchSurfaceWidth,
- tapPoint.y + touchSurfaceHeight
- );
- return new MarkerHit(tapRect, getMarkersInRect(tapRect));
- }
-
- private boolean isClickHandledForMarker(long markerId) {
- Marker marker = (Marker) getAnnotation(markerId);
- boolean handledDefaultClick = onClickMarker(marker);
- if (!handledDefaultClick) {
- toggleMarkerSelectionState(marker);
- }
- return true;
- }
-
- private boolean onClickMarker(@NonNull Marker marker) {
- return onMarkerClickListener != null && onMarkerClickListener.onMarkerClick(marker);
- }
-
- private void toggleMarkerSelectionState(@NonNull Marker marker) {
- if (!selectedMarkers.contains(marker)) {
- selectMarker(marker);
- } else {
- deselectMarker(marker);
- }
- }
-
- private static class ShapeAnnotationHitResolver {
-
- private ShapeAnnotations shapeAnnotations;
-
- ShapeAnnotationHitResolver(ShapeAnnotations shapeAnnotations) {
- this.shapeAnnotations = shapeAnnotations;
- }
-
- @Nullable
- public Annotation execute(@NonNull ShapeAnnotationHit shapeHit) {
- Annotation foundAnnotation = null;
- List<Annotation> annotations = shapeAnnotations.obtainAllIn(shapeHit.tapPoint);
- if (annotations.size() > 0) {
- foundAnnotation = annotations.get(0);
- }
- return foundAnnotation;
- }
- }
-
- private static class MarkerHitResolver {
-
- @NonNull
- private final Projection projection;
- private final int minimalTouchSize;
-
- @Nullable
- private View view;
-
- private Bitmap bitmap;
- private int bitmapWidth;
- private int bitmapHeight;
- private PointF markerLocation;
-
- @NonNull
- private Rect hitRectView = new Rect();
- @NonNull
- private RectF hitRectMarker = new RectF();
- @NonNull
- private RectF highestSurfaceIntersection = new RectF();
-
- private long closestMarkerId = NO_ANNOTATION_ID;
-
- MarkerHitResolver(@NonNull MapboxMap mapboxMap) {
- this.projection = mapboxMap.getProjection();
- this.minimalTouchSize = (int) (32 * Mapbox.getApplicationContext().getResources().getDisplayMetrics().density);
- }
-
- public long execute(@NonNull MarkerHit markerHit) {
- resolveForMarkers(markerHit);
- return closestMarkerId;
- }
-
- private void resolveForMarkers(MarkerHit markerHit) {
- for (Marker marker : markerHit.markers) {
- resolveForMarker(markerHit, marker);
- }
- }
-
- private void resolveForMarker(@NonNull MarkerHit markerHit, Marker marker) {
- markerLocation = projection.toScreenLocation(marker.getPosition());
- bitmap = marker.getIcon().getBitmap();
-
- bitmapHeight = bitmap.getHeight();
- if (bitmapHeight < minimalTouchSize) {
- bitmapHeight = minimalTouchSize;
- }
-
- bitmapWidth = bitmap.getWidth();
- if (bitmapWidth < minimalTouchSize) {
- bitmapWidth = minimalTouchSize;
- }
-
- hitRectMarker.set(0, 0, bitmapWidth, bitmapHeight);
- hitRectMarker.offsetTo(
- markerLocation.x - bitmapWidth / 2,
- markerLocation.y - bitmapHeight / 2
- );
- hitTestMarker(markerHit, marker, hitRectMarker);
- }
-
- private void hitTestMarker(MarkerHit markerHit, @NonNull Marker marker, RectF hitRectMarker) {
- if (hitRectMarker.contains(markerHit.getTapPointX(), markerHit.getTapPointY())) {
- hitRectMarker.intersect(markerHit.tapRect);
- if (isRectangleHighestSurfaceIntersection(hitRectMarker)) {
- highestSurfaceIntersection = new RectF(hitRectMarker);
- closestMarkerId = marker.getId();
- }
- }
- }
-
- private boolean isRectangleHighestSurfaceIntersection(RectF rectF) {
- return rectF.width() * rectF.height() > highestSurfaceIntersection.width() * highestSurfaceIntersection.height();
- }
- }
-
- private static class ShapeAnnotationHit {
- private final RectF tapPoint;
-
- ShapeAnnotationHit(RectF tapPoint) {
- this.tapPoint = tapPoint;
- }
- }
-
- private static class MarkerHit {
- private final RectF tapRect;
- private final List<Marker> markers;
-
- MarkerHit(RectF tapRect, List<Marker> markers) {
- this.tapRect = tapRect;
- this.markers = markers;
- }
-
- float getTapPointX() {
- return tapRect.centerX();
- }
-
- float getTapPointY() {
- return tapRect.centerY();
- }
- }
-}