Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

[android] - harden click handling of shape annotations #9585

Merged
merged 1 commit into from
Jul 24, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
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.
Expand All @@ -40,6 +42,7 @@
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;
Expand Down Expand Up @@ -369,13 +372,13 @@ void adjustTopOffsetPixels(MapboxMap mapboxMap) {
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) {
Expand Down Expand Up @@ -445,8 +448,21 @@ private static class ShapeAnnotationHitResolver {
}

public long execute(ShapeAnnotationHit shapeHit) {
long foundAnnotationId = NO_ANNOTATION_ID;
List<Feature> 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;
}
}
}

Expand All @@ -463,7 +479,7 @@ private static class MarkerHitResolver {
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();
Expand Down