diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java | 85 |
1 files changed, 60 insertions, 25 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java index 1fae772875..65b3c53ea2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java @@ -1,6 +1,5 @@ package com.mapbox.mapboxsdk.maps; -import android.content.Context; import android.graphics.Bitmap; import android.support.annotation.Nullable; import android.text.TextUtils; @@ -10,10 +9,13 @@ import android.view.View; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.geometry.LatLngBounds; +import com.mapbox.mapboxsdk.style.expressions.Expression; import com.mapbox.mapboxsdk.style.layers.Filter; import com.mapbox.mapboxsdk.style.layers.Property; import com.mapbox.mapboxsdk.style.layers.SymbolLayer; import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; +import com.mapbox.mapboxsdk.style.sources.GeometryTileProvider; import com.mapbox.mapboxsdk.utils.BitmapUtils; import com.mapbox.services.commons.geojson.Feature; import com.mapbox.services.commons.geojson.FeatureCollection; @@ -21,11 +23,15 @@ import com.mapbox.services.commons.geojson.Point; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconAllowOverlap; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconAnchor; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconIgnorePlacement; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconOffset; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textAllowOverlap; /** * Responsible for managing InfoWindows shown on the Map. @@ -49,7 +55,8 @@ class InfoWindowManager { private MapboxMap mapboxMap; private final List<InfoWindow> infoWindows = new ArrayList<>(); - private final HashMap<Long, Marker> markerHashMap = new HashMap<>(); + private final HashMap<Marker, Feature> markerFeatureHashMap = new HashMap<>(); + private final HashMap<Marker, View> markerViewHashMap = new HashMap<>(); private final FeatureCollection featureCollection = FeatureCollection.fromFeatures(new ArrayList<Feature>()); private MapboxMap.InfoWindowAdapter infoWindowAdapter; @@ -72,7 +79,10 @@ class InfoWindowManager { iconAnchor(Property.ICON_ANCHOR_BOTTOM_LEFT), /* offset icon slightly to match bubble layout */ - iconOffset(new Float[] {-20.0f, -10.0f}) + iconOffset(new Float[] {-20.0f, -10.0f}), + iconIgnorePlacement(true), + textAllowOverlap(true), + iconAllowOverlap(true) ) .withFilter(Filter.eq(PROPERTY_SELECTED, true)); mapboxMap.addLayer(infoWindowsLayer); @@ -130,18 +140,6 @@ class InfoWindowManager { return onInfoWindowCloseListener; } - void addMarker(MapView mapView, Marker marker) { - invalidateWindow(mapView, marker); - addNewFeature(marker); - refreshSource(); - } - - void invalidateWindows(MapView mapView) { - for (Marker marker : markerHashMap.values()) { - invalidateWindow(mapView, marker); - } - } - private void invalidateWindow(MapView mapView, Marker marker) { LayoutInflater layoutInflater = LayoutInflater.from(mapView.getContext()); View view; @@ -150,7 +148,7 @@ class InfoWindowManager { } else { view = infoWindowAdapter.getInfoWindow(marker); } - markerHashMap.put(marker.getId(), marker); + markerViewHashMap.put(marker, view); if (view != null) { Bitmap bitmap = BitmapUtils.generate(view); @@ -158,6 +156,12 @@ class InfoWindowManager { } } + void addMarker(MapView mapView, Marker marker) { + invalidateWindow(mapView, marker); + addNewFeature(marker); + refreshSource(); + } + void addMarkers(MapView mapView, List<Marker> markers) { for (Marker marker : markers) { invalidateWindow(mapView, marker); @@ -166,14 +170,6 @@ class InfoWindowManager { refreshSource(); } - void removeMarker(Context context, Marker marker) { - - } - - public void add(InfoWindow infoWindow) { - infoWindows.add(infoWindow); - } - private void addNewFeature(Marker marker) { Feature feature = Feature.fromGeometry( Point.fromCoordinates( @@ -181,8 +177,47 @@ class InfoWindowManager { ) ); feature.addNumberProperty(PROPERTY_ID, marker.getId()); - feature.addBooleanProperty(PROPERTY_SELECTED, true); + feature.addBooleanProperty(PROPERTY_SELECTED, false); featureCollection.getFeatures().add(feature); + markerFeatureHashMap.put(marker, feature); + } + + void removeMarker(Marker marker) { + Feature feature = markerFeatureHashMap.get(marker); + featureCollection.getFeatures().remove(feature); + markerFeatureHashMap.remove(marker); + markerViewHashMap.remove(marker); + refreshSource(); + } + + void removeAll() { + featureCollection.getFeatures().clear(); + markerFeatureHashMap.clear(); + markerViewHashMap.clear(); + refreshSource(); + } + + public void show(Marker marker) { + Feature feature = markerFeatureHashMap.get(marker); + boolean isSelected = feature.getBooleanProperty(PROPERTY_SELECTED); + if (!isSelected) { + feature.addBooleanProperty(PROPERTY_SELECTED, true); + refreshSource(); + } + } + + void hide(Marker marker) { + Feature feature = markerFeatureHashMap.get(marker); + boolean isSelected = feature.getBooleanProperty(PROPERTY_SELECTED); + if (isSelected) { + feature.addBooleanProperty(PROPERTY_SELECTED, false); + refreshSource(); + + MapboxMap.OnInfoWindowCloseListener listener = mapboxMap.getOnInfoWindowCloseListener(); + if (listener != null) { + listener.onInfoWindowClose(marker); + } + } } private void refreshSource() { |