From cd695d605712d80704efdcf9c6e19351435adf5a Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Mon, 24 Jul 2017 10:45:35 +0200 Subject: [android] - harden click handling of shape annotations --- .../mapbox/mapboxsdk/maps/AnnotationManager.java | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 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 index 73e90206f8..22e5cf4322 100644 --- 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 @@ -26,6 +26,8 @@ import com.mapbox.services.commons.geojson.Feature; import java.util.ArrayList; import java.util.List; +import timber.log.Timber; + /** * 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. @@ -40,6 +42,7 @@ import java.util.List; class AnnotationManager { private static final String LAYER_ID_SHAPE_ANNOTATIONS = "com.mapbox.annotations.shape."; + private static final long NO_ANNOTATION_ID = -1; private final MapView mapView; private final IconManager iconManager; @@ -369,13 +372,13 @@ class AnnotationManager { boolean onTap(PointF tapPoint) { ShapeAnnotationHit shapeAnnotationHit = getShapeAnnotationHitFromTap(tapPoint); long shapeAnnotationId = new ShapeAnnotationHitResolver(mapboxMap).execute(shapeAnnotationHit); - if (shapeAnnotationId >= 0) { + if (shapeAnnotationId != NO_ANNOTATION_ID) { handleClickForShapeAnnotation(shapeAnnotationId); } MarkerHit markerHit = getMarkerHitFromTouchArea(tapPoint); long markerId = new MarkerHitResolver(mapboxMap).execute(markerHit); - return markerId >= 0 && isClickHandledForMarker(markerId); + return markerId != NO_ANNOTATION_ID && isClickHandledForMarker(markerId); } private ShapeAnnotationHit getShapeAnnotationHitFromTap(PointF tapPoint) { @@ -445,8 +448,21 @@ class AnnotationManager { } public long execute(ShapeAnnotationHit shapeHit) { + long foundAnnotationId = NO_ANNOTATION_ID; List features = mapboxMap.queryRenderedFeatures(shapeHit.tapPoint, shapeHit.layerIds); - return features.isEmpty() ? -1 : Long.valueOf(features.get(0).getId()); + if (!features.isEmpty()) { + foundAnnotationId = getIdFromFeature(features.get(0)); + } + return foundAnnotationId; + } + + private long getIdFromFeature(Feature feature) { + try { + return Long.valueOf(feature.getId()); + } catch (NumberFormatException exception) { + Timber.e(exception, "Couldn't parse feature id to a long, with id: %s", feature.getId()); + return NO_ANNOTATION_ID; + } } } @@ -463,7 +479,7 @@ class AnnotationManager { private RectF hitRectMarker = new RectF(); private RectF highestSurfaceIntersection = new RectF(); - private long closestMarkerId = -1; + private long closestMarkerId = NO_ANNOTATION_ID; MarkerHitResolver(@NonNull MapboxMap mapboxMap) { this.markerViewManager = mapboxMap.getMarkerViewManager(); -- cgit v1.2.1