From b1f2f925e058eef0fbe3e6929f442b857352b444 Mon Sep 17 00:00:00 2001 From: tobrun Date: Tue, 11 Sep 2018 22:11:09 +0200 Subject: [android] - add binding integration for cross source collision --- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 9 +++--- .../mapbox/mapboxsdk/maps/MapboxMapOptions.java | 35 ++++++++++++++++++++++ .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 13 ++++---- .../src/main/res-public/values/public.xml | 1 + .../src/main/res/values/attrs.xml | 1 + .../mapboxsdk/maps/MapboxMapOptionsTest.java | 12 ++++++-- platform/android/src/native_map_view.cpp | 7 +++-- platform/android/src/native_map_view.hpp | 3 +- 8 files changed, 64 insertions(+), 17 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 6fcc2c199a..3ad594cc3b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -24,7 +24,6 @@ import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ZoomButtonsController; - import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.mapboxsdk.MapStrictMode; import com.mapbox.mapboxsdk.Mapbox; @@ -47,6 +46,8 @@ import com.mapbox.mapboxsdk.offline.OfflineTilePyramidRegionDefinition; import com.mapbox.mapboxsdk.storage.FileSource; import com.mapbox.mapboxsdk.utils.BitmapUtils; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; @@ -55,9 +56,6 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_MAP_NORTH_ANIMATION; import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_WAIT_IDLE; @@ -316,7 +314,8 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { addView(glSurfaceView, 0); } - nativeMapView = new NativeMapView(getContext(), getPixelRatio(), this, mapRenderer); + boolean crossSourceCollisions = mapboxMapOptions.getCrossSourceCollisions(); + nativeMapView = new NativeMapView(getContext(), getPixelRatio(), crossSourceCollisions, this, mapRenderer); nativeMapView.addOnMapChangedListener(change -> { // dispatch events to external listeners if (!onMapChangedListeners.isEmpty()) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java index f48bd92327..3fac981fe5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java @@ -82,6 +82,8 @@ public class MapboxMapOptions implements Parcelable { private float pixelRatio; + private boolean crossSourceCollisions = true; + /** * Creates a new MapboxMapOptions object. */ @@ -131,6 +133,7 @@ public class MapboxMapOptions implements Parcelable { localIdeographFontFamily = in.readString(); pixelRatio = in.readFloat(); foregroundLoadColor = in.readInt(); + crossSourceCollisions = in.readByte() != 0; } /** @@ -232,6 +235,9 @@ public class MapboxMapOptions implements Parcelable { mapboxMapOptions.foregroundLoadColor( typedArray.getInt(R.styleable.mapbox_MapView_mapbox_foregroundLoadColor, LIGHT_GRAY) ); + mapboxMapOptions.crossSourceCollisions( + typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_cross_source_collisions, true) + ); } finally { typedArray.recycle(); } @@ -566,6 +572,21 @@ public class MapboxMapOptions implements Parcelable { return this; } + /** + * Enable cross-source symbol collision detection, defaults to true. + *

+ * If set to false, symbol layers will only run collision detection against + * other symbol layers that are part of the same source. + *

+ * + * @param crossSourceCollisions true to enable, false to disable + * @return This + */ + public MapboxMapOptions crossSourceCollisions(boolean crossSourceCollisions) { + this.crossSourceCollisions = crossSourceCollisions; + return this; + } + /** * Set the font family for generating glyphs locally for ideographs in the 'CJK Unified Ideographs' * and 'Hangul Syllables' ranges. @@ -602,6 +623,14 @@ public class MapboxMapOptions implements Parcelable { return prefetchesTiles; } + /** + * Check whether cross-source symbol collision detection is enabled. + * + * @return true if enabled + */ + public boolean getCrossSourceCollisions() { + return crossSourceCollisions; + } /** * Set the flag to render the map surface on top of another surface. @@ -945,6 +974,7 @@ public class MapboxMapOptions implements Parcelable { dest.writeString(localIdeographFontFamily); dest.writeFloat(pixelRatio); dest.writeInt(foregroundLoadColor); + dest.writeByte((byte) (crossSourceCollisions ? 1 : 0)); } @Override @@ -1050,6 +1080,10 @@ public class MapboxMapOptions implements Parcelable { return false; } + if (crossSourceCollisions != options.crossSourceCollisions) { + return false; + } + return false; } @@ -1090,6 +1124,7 @@ public class MapboxMapOptions implements Parcelable { result = 31 * result + (zMediaOverlay ? 1 : 0); result = 31 * result + (localIdeographFontFamily != null ? localIdeographFontFamily.hashCode() : 0); result = 31 * result + (int) pixelRatio; + result = 31 * result + (crossSourceCollisions ? 1 : 0); return result; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 75359f7f44..bf8c675cfa 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -12,7 +12,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.DisplayMetrics; - import com.mapbox.geojson.Feature; import com.mapbox.geojson.Geometry; import com.mapbox.mapboxsdk.LibraryLoader; @@ -85,18 +84,19 @@ final class NativeMapView { // Constructors // - public NativeMapView(final Context context, final ViewCallback viewCallback, final MapRenderer mapRenderer) { - this(context, context.getResources().getDisplayMetrics().density, viewCallback, mapRenderer); + public NativeMapView(final Context context, final boolean crossSourceCollisions, final ViewCallback viewCallback, + final MapRenderer mapRenderer) { + this(context, context.getResources().getDisplayMetrics().density, crossSourceCollisions, viewCallback, mapRenderer); } - public NativeMapView(final Context context, float pixelRatio, + public NativeMapView(final Context context, final float pixelRatio, final boolean crossSourceCollisions, final ViewCallback viewCallback, final MapRenderer mapRenderer) { this.mapRenderer = mapRenderer; this.viewCallback = viewCallback; this.fileSource = FileSource.getInstance(context); this.pixelRatio = pixelRatio; this.thread = Thread.currentThread(); - nativeInitialize(this, fileSource, mapRenderer, pixelRatio); + nativeInitialize(this, fileSource, mapRenderer, pixelRatio, crossSourceCollisions); } // @@ -936,7 +936,8 @@ final class NativeMapView { private native void nativeInitialize(NativeMapView nativeMapView, FileSource fileSource, MapRenderer mapRenderer, - float pixelRatio); + float pixelRatio, + boolean crossSourceCollisions); @Keep private native void nativeDestroy(); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml b/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml index 1c3653479a..a6f08bfa6f 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml @@ -13,6 +13,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index 053da80ade..1ac3a8bb6b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -7,6 +7,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java index b8a377604f..2d2b9d8a7e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java @@ -2,12 +2,10 @@ package com.mapbox.mapboxsdk.maps; import android.graphics.Color; import android.view.Gravity; - import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; - import org.junit.Test; import java.util.Arrays; @@ -177,5 +175,15 @@ public class MapboxMapOptionsTest { assertTrue(new MapboxMapOptions().setPrefetchesTiles(true).getPrefetchesTiles()); assertFalse(new MapboxMapOptions().setPrefetchesTiles(false).getPrefetchesTiles()); } + + @Test + public void testCrossSourceCollisions() { + // Default value + assertTrue(new MapboxMapOptions().getCrossSourceCollisions()); + + // check mutations + assertTrue(new MapboxMapOptions().crossSourceCollisions(true).getCrossSourceCollisions()); + assertFalse(new MapboxMapOptions().crossSourceCollisions(false).getCrossSourceCollisions()); + } } diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 25605e09e4..adcc54ea4f 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -60,7 +60,8 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, const jni::Object& _obj, const jni::Object& jFileSource, const jni::Object& jMapRenderer, - jni::jfloat _pixelRatio) + jni::jfloat _pixelRatio, + jni::jboolean _crossSourceCollisions) : javaPeer(_env, _obj) , mapRenderer(MapRenderer::getNativePeer(_env, jMapRenderer)) , pixelRatio(_pixelRatio) @@ -83,7 +84,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, mbgl::Size{ static_cast(width), static_cast(height) }, pixelRatio, fileSource, *threadPool, MapMode::Continuous, - ConstrainMode::HeightOnly, ViewportMode::Default); + ConstrainMode::HeightOnly, ViewportMode::Default, _crossSourceCollisions); } /** @@ -942,7 +943,7 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { // Register the peer jni::RegisterNativePeer(env, javaClass, "nativePtr", - jni::MakePeer&, const jni::Object&, const jni::Object&, jni::jfloat>, + jni::MakePeer&, const jni::Object&, const jni::Object&, jni::jfloat, jni::jboolean>, "nativeInitialize", "nativeDestroy", METHOD(&NativeMapView::resizeView, "nativeResizeView"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 969833a25b..3e1a698ed6 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -51,7 +51,8 @@ public: const jni::Object&, const jni::Object&, const jni::Object&, - jni::jfloat pixelRatio); + jni::jfloat, + jni::jboolean); virtual ~NativeMapView(); -- cgit v1.2.1