summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorŁukasz Paczos <lukas.paczos@gmail.com>2018-01-02 16:24:53 +0100
committerŁukasz Paczos <lukas.paczos@gmail.com>2018-01-02 16:24:53 +0100
commit66c900d8f53fe0c9fab8263bacc173f47381ef2f (patch)
treecb1b68462e7915297ca08fe8ca0605948e6cb94a
parent2c60af6bafc4c401bcba73b5248bca3d700a097d (diff)
downloadqtlocation-mapboxgl-upstream/lp-info-window-on-layer.tar.gz
[WIP] showing InfoWindow on Marker clickupstream/lp-info-window-on-layer
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java2
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java48
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java85
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<Marker> 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<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() {