From 66c900d8f53fe0c9fab8263bacc173f47381ef2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Tue, 2 Jan 2018 16:24:53 +0100 Subject: [WIP] showing InfoWindow on Marker click --- .../mapbox/mapboxsdk/annotations/InfoWindow.java | 2 +- .../mapbox/mapboxsdk/maps/AnnotationManager.java | 48 +++--------- .../mapbox/mapboxsdk/maps/InfoWindowManager.java | 85 +++++++++++++++------- 3 files changed, 71 insertions(+), 64 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java index cf42bfe738..88e0015158 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java @@ -274,7 +274,7 @@ public class InfoWindow { } /** - * Will result in getting this {@link InfoWindow} and updating the view being displayed. + * Will result in updating the view being displayed by this {@link InfoWindow}. */ public void update() { MapboxMap mapboxMap = this.mapboxMap.get(); 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 65ac3f094a..a2e85a30ba 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 @@ -110,10 +110,7 @@ class AnnotationManager { void removeAnnotation(@NonNull Annotation annotation) { if (annotation instanceof Marker) { Marker marker = (Marker) annotation; - marker.hideInfoWindow(); - if (selectedMarkers.contains(marker)) { - selectedMarkers.remove(marker); - } + infoWindowManager.removeMarker(marker); if (marker instanceof MarkerView) { markerViewManager.removeMarkerView((MarkerView) marker); @@ -129,10 +126,7 @@ class AnnotationManager { for (Annotation annotation : annotationList) { if (annotation instanceof Marker) { Marker marker = (Marker) annotation; - marker.hideInfoWindow(); - if (selectedMarkers.contains(marker)) { - selectedMarkers.remove(marker); - } + infoWindowManager.removeMarker(marker); if (marker instanceof MarkerView) { markerViewManager.removeMarkerView((MarkerView) marker); @@ -148,13 +142,12 @@ class AnnotationManager { Annotation annotation; int count = annotationsArray.size(); long[] ids = new long[count]; - selectedMarkers.clear(); + infoWindowManager.removeAll(); 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(); if (marker instanceof MarkerView) { markerViewManager.removeMarkerView((MarkerView) marker); } else { @@ -278,12 +271,13 @@ class AnnotationManager { } void selectMarker(@NonNull Marker marker) { + // If marker is already selected do nothing if (selectedMarkers.contains(marker)) { return; } - // Need to deselect any currently selected annotation first if (!infoWindowManager.isAllowConcurrentMultipleOpenInfoWindows()) { + // Need to deselect any currently selected annotation first deselectMarkers(); } @@ -293,7 +287,7 @@ class AnnotationManager { } if (infoWindowManager.isInfoWindowValidForMarker(marker) || infoWindowManager.getInfoWindowAdapter() != null) { - infoWindowManager.add(marker.showInfoWindow(mapboxMap, mapView)); + infoWindowManager.show(marker); } // only add to selected markers if user didn't handle the click event themselves #3176 @@ -301,37 +295,15 @@ class AnnotationManager { } void deselectMarkers() { - if (selectedMarkers.isEmpty()) { - return; + List markers = mapboxMap.getMarkers(); + for (Marker marker : markers) { + infoWindowManager.hide(marker); } - - for (Marker marker : selectedMarkers) { - if (marker.isInfoWindowShown()) { - marker.hideInfoWindow(); - } - - if (marker instanceof MarkerView) { - markerViewManager.deselect((MarkerView) marker, false); - } - } - - // Removes all selected markers from the list selectedMarkers.clear(); } void deselectMarker(@NonNull Marker marker) { - if (!selectedMarkers.contains(marker)) { - return; - } - - if (marker.isInfoWindowShown()) { - marker.hideInfoWindow(); - } - - if (marker instanceof MarkerView) { - markerViewManager.deselect((MarkerView) marker, false); - } - + infoWindowManager.hide(marker); selectedMarkers.remove(marker); } 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 infoWindows = new ArrayList<>(); - private final HashMap markerHashMap = new HashMap<>(); + private final HashMap markerFeatureHashMap = new HashMap<>(); + private final HashMap markerViewHashMap = new HashMap<>(); private final FeatureCollection featureCollection = FeatureCollection.fromFeatures(new ArrayList()); 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 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() { -- cgit v1.2.1