summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorŁukasz Paczos <lukas.paczos@gmail.com>2017-12-21 14:26:53 +0100
committerŁukasz Paczos <lukas.paczos@gmail.com>2017-12-21 14:26:53 +0100
commit2e7145c1bdb98761208dda05254e081f7ae6ce26 (patch)
tree354cf1c455724bb2f61eacd6c7a95f59c5bda0b7
parentc2250e6e53fcd7eda06250394bbda72c580e0c09 (diff)
downloadqtlocation-mapboxgl-2e7145c1bdb98761208dda05254e081f7ae6ce26.tar.gz
[android] [WIP] testing symbol layer for InfoWindow
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java9
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java95
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java22
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java9
4 files changed, 133 insertions, 2 deletions
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 9f256c341b..77f27a4fb1 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
@@ -83,6 +83,7 @@ class AnnotationManager {
AnnotationManager bind(MapboxMap mapboxMap) {
this.mapboxMap = mapboxMap;
this.markerViewManager.bind(mapboxMap);
+ this.infoWindowManager.bind(mapboxMap);
return this;
}
@@ -170,11 +171,15 @@ class AnnotationManager {
//
Marker addMarker(@NonNull BaseMarkerOptions markerOptions, @NonNull MapboxMap mapboxMap) {
- return markers.addBy(markerOptions, mapboxMap);
+ Marker marker = markers.addBy(markerOptions, mapboxMap);
+ infoWindowManager.addMarker(mapView, marker);
+ return marker;
}
List<Marker> addMarkers(@NonNull List<? extends BaseMarkerOptions> markerOptionsList, @NonNull MapboxMap mapboxMap) {
- return markers.addBy(markerOptionsList, mapboxMap);
+ List<Marker> markerList = markers.addBy(markerOptionsList, mapboxMap);
+ infoWindowManager.addMarkers(mapView, markerList);
+ return markerList;
}
void updateMarker(@NonNull Marker updatedMarker, @NonNull MapboxMap mapboxMap) {
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 af207204d9..c2b2c3e54f 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,12 +1,26 @@
package com.mapbox.mapboxsdk.maps;
+import android.content.Context;
+import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.text.TextUtils;
+import android.view.LayoutInflater;
+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.style.layers.Filter;
+import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
+import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
+import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
+import com.mapbox.mapboxsdk.utils.BitmapUtils;
+import com.mapbox.services.commons.geojson.Feature;
+import com.mapbox.services.commons.geojson.FeatureCollection;
+import com.mapbox.services.commons.geojson.Point;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
/**
@@ -20,8 +34,19 @@ import java.util.List;
* </p>
*/
class InfoWindowManager {
+ private static final String SOURCE_ID = "info.window.source";
+ private static final String LAYER_ID = "info.window.layer";
+ private static final String PROPERTY_SELECTED = "info.window.property.selected";
+ private static final String PROPERTY_ID = "info.window.property.ID";
+
+ private GeoJsonSource infoWindowsSource;
+ private SymbolLayer infoWindowsLayer;
+
+ private MapboxMap mapboxMap;
private final List<InfoWindow> infoWindows = new ArrayList<>();
+ private final HashMap<Long, Marker> markerHashMap = new HashMap<>();
+ private final FeatureCollection featureCollection = FeatureCollection.fromFeatures(new ArrayList<Feature>());
private MapboxMap.InfoWindowAdapter infoWindowAdapter;
private boolean allowConcurrentMultipleInfoWindows;
@@ -30,6 +55,21 @@ class InfoWindowManager {
private MapboxMap.OnInfoWindowLongClickListener onInfoWindowLongClickListener;
private MapboxMap.OnInfoWindowCloseListener onInfoWindowCloseListener;
+ void bind(MapboxMap mapboxMap) {
+ this.mapboxMap = mapboxMap;
+ initialise();
+ }
+
+ private void initialise() {
+ infoWindowsSource = new GeoJsonSource(SOURCE_ID);
+ mapboxMap.addSource(infoWindowsSource);
+
+ infoWindowsLayer = new SymbolLayer(LAYER_ID, SOURCE_ID)
+ .withProperties(PropertyFactory.iconImage("{" + PROPERTY_ID + "}"))
+ .withFilter(Filter.eq(PROPERTY_SELECTED, true));
+ mapboxMap.addLayer(infoWindowsLayer);
+ }
+
void update() {
if (!infoWindows.isEmpty()) {
for (InfoWindow infoWindow : infoWindows) {
@@ -82,7 +122,62 @@ 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;
+ if (infoWindowAdapter == null) {
+ view = layoutInflater.inflate(R.layout.mapbox_infowindow_content, mapView, false);
+ } else {
+ view = infoWindowAdapter.getInfoWindow(marker);
+ }
+ markerHashMap.put(marker.getId(), marker);
+
+ if (view != null) {
+ Bitmap bitmap = BitmapUtils.generate(view);
+ mapboxMap.addImage(String.valueOf(marker.getId()), bitmap);
+ }
+ }
+
+ void addMarkers(MapView mapView, List<Marker> markers) {
+ for (Marker marker : markers) {
+ invalidateWindow(mapView, marker);
+ addNewFeature(marker);
+ }
+ 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(
+ new double[] {marker.getPosition().getLongitude(), marker.getPosition().getLatitude()}
+ )
+ );
+ feature.addNumberProperty(PROPERTY_ID, marker.getId());
+ feature.addBooleanProperty(PROPERTY_SELECTED, true);
+ featureCollection.getFeatures().add(feature);
+ }
+
+ private void refreshSource() {
+ infoWindowsSource.setGeoJson(featureCollection);
+ }
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java
index 78503f9dfe..f329e48eac 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
@@ -117,4 +118,25 @@ public class BitmapUtils {
return new BitmapDrawable(context.getResources(), compass);
}
+ /**
+ * Generate a Bitmap from an Android SDK View.
+ *
+ * @param view the View to be drawn to a Bitmap
+ * @return the generated bitmap
+ */
+ public static Bitmap generate(@NonNull View view) {
+ int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+ view.measure(measureSpec, measureSpec);
+
+ int measuredWidth = view.getMeasuredWidth();
+ int measuredHeight = view.getMeasuredHeight();
+
+ view.layout(0, 0, measuredWidth, measuredHeight);
+ Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888);
+ bitmap.eraseColor(Color.TRANSPARENT);
+ Canvas canvas = new Canvas(bitmap);
+ view.draw(canvas);
+ return bitmap;
+ }
+
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java
index d8dea0e3b5..18a98ad4c3 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java
@@ -34,6 +34,15 @@ public class InfoWindowAdapterActivity extends AppCompatActivity {
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(map -> {
mapboxMap = map;
+ mapboxMap.setAllowConcurrentMultipleOpenInfoWindows(true);
+ mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() {
+ @Override
+ public void onMapClick(@NonNull LatLng point) {
+ for (Marker marker : mapboxMap.getMarkers()) {
+ marker.setTitle("bladslfbladb");
+ }
+ }
+ });
addMarkers();
addCustomInfoWindowAdapter();
});