summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs66
1 files changed, 59 insertions, 7 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs
index 6beb700241..3d52867ac6 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/symbol/symbolManager.java.ejs
@@ -7,9 +7,12 @@
package com.mapbox.mapboxsdk.symbol;
+import android.graphics.PointF;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.annotation.VisibleForTesting;
+import android.support.v4.util.LongSparseArray;
import com.mapbox.geojson.Feature;
import com.mapbox.geojson.FeatureCollection;
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -36,8 +39,12 @@ public class SymbolManager {
private GeoJsonSource geoJsonSource;
private SymbolLayer symbolLayer;
+ // callback listeners
+ private OnSymbolClickListener symbolClickListener;
+
// internal data set
- private List<Symbol> symbolList = new ArrayList<>();
+ private final LongSparseArray<Symbol> symbols = new LongSparseArray<>();
+ private final List<Feature> features = new ArrayList<>();
private long currentMarkerId;
/**
@@ -67,6 +74,7 @@ public class SymbolManager {
this.symbolLayer = symbolLayer;
mapboxMap.addSource(geoJsonSource);
mapboxMap.addLayer(symbolLayer);
+ mapboxMap.addOnMapClickListener(new MapClickResolver(mapboxMap));
}
/**
@@ -79,8 +87,8 @@ public class SymbolManager {
public Symbol createSymbol(@NonNull LatLng latLng) {
Symbol symbol = new Symbol(this, currentMarkerId);
symbol.setLatLng(latLng);
+ symbols.put(currentMarkerId, symbol);
currentMarkerId++;
- symbolList.add(symbol);
return symbol;
}
@@ -91,7 +99,7 @@ public class SymbolManager {
*/
@UiThread
public void deleteSymbol(@NonNull Symbol symbol) {
- symbolList.remove(symbol);
+ symbols.remove(symbol.getId());
updateSource();
}
@@ -101,8 +109,8 @@ public class SymbolManager {
* @return list of symbols
*/
@UiThread
- public List<Symbol> getSymbols() {
- return symbolList;
+ public LongSparseArray<Symbol> getSymbols() {
+ return symbols;
}
/**
@@ -110,13 +118,26 @@ public class SymbolManager {
*/
public void updateSource() {
// todo move feature creation to a background thread?
- List<Feature> features = new ArrayList<>();
- for (Symbol symbol : symbolList) {
+ features.clear();
+ Symbol symbol;
+ for (int i = 0; i < symbols.size(); i++) {
+ symbol = symbols.valueAt(i);
features.add(Feature.fromGeometry(symbol.getGeometry(), symbol.getFeature()));
}
geoJsonSource.setGeoJson(FeatureCollection.fromFeatures(features));
}
+ /**
+ * Set a callback to be invoked when a symbol has been clicked.
+ * <p>
+ * To unset, use a null argument.
+ * </p>
+ *
+ * @param symbolClickListener the callback to be invoked when a symbol is clicked, or null to unset
+ */
+ public void setOnSymbolClickListener(@Nullable OnSymbolClickListener symbolClickListener) {
+ this.symbolClickListener = symbolClickListener;
+ }
private static PropertyValue<?>[] getLayerDefinition() {
return new PropertyValue[]{
@@ -150,4 +171,35 @@ public class SymbolManager {
<% } -%>
<% } -%>
+
+
+ /**
+ * Inner class for transforming map click events into symbol clicks
+ */
+ private class MapClickResolver implements MapboxMap.OnMapClickListener {
+
+ private MapboxMap mapboxMap;
+
+ private MapClickResolver(MapboxMap mapboxMap) {
+ this.mapboxMap = mapboxMap;
+ }
+
+ @Override
+ public void onMapClick(@NonNull LatLng point) {
+ if (symbolClickListener == null) {
+ return;
+ }
+
+ PointF screenLocation = mapboxMap.getProjection().toScreenLocation(point);
+ List<Feature> features = mapboxMap.queryRenderedFeatures(screenLocation, ID_GEOJSON_LAYER);
+ if (!features.isEmpty()) {
+ long symbolId = features.get(0).getProperty(Symbol.ID_KEY).getAsLong();
+ Symbol symbol = symbols.get(symbolId);
+ if (symbol != null) {
+ symbolClickListener.onSymbolClick(symbols.get(symbolId));
+ }
+ }
+ }
+ }
+
}