From 9ebd23db1901f0ee8d7777b82861c569f4ee18ef Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 11 Apr 2019 12:34:26 +0200 Subject: [PATCH 1/4] [android] - reproduce downstream navigation crash with queryRendererFeatures when resuming Activity --- .../activity/maplayout/SimpleMapActivity.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java index 7d2d245f6e6..8d82dbf6cff 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java @@ -1,8 +1,10 @@ package com.mapbox.mapboxsdk.testapp.activity.maplayout; +import android.graphics.PointF; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Style; import com.mapbox.mapboxsdk.testapp.R; @@ -12,6 +14,7 @@ public class SimpleMapActivity extends AppCompatActivity { private MapView mapView; + private MapboxMap mapboxMap; @Override protected void onCreate(Bundle savedInstanceState) { @@ -19,15 +22,22 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_map_simple); mapView = findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); - mapView.getMapAsync(mapboxMap -> mapboxMap.setStyle( - new Style.Builder().fromUrl(Style.MAPBOX_STREETS) - )); + mapView.getMapAsync(map -> { + mapboxMap = map; + mapboxMap.setStyle( + new Style.Builder().fromUrl(Style.MAPBOX_STREETS) + ); + }); } @Override protected void onStart() { super.onStart(); mapView.onStart(); + if (mapboxMap != null) { + // Regression test for #14394 + mapboxMap.queryRenderedFeatures(new PointF(0,0)); + } } @Override From ae3b4d226a9a6d63772bbd04b85f2396a366f439 Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 11 Apr 2019 12:35:20 +0200 Subject: [PATCH 2/4] [android] - add javadoc indicating that query methods can return empty depending on map/surface state --- .../com/mapbox/mapboxsdk/maps/MapboxMap.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 78faef07764..b75193dc8f2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -12,7 +12,6 @@ import android.support.annotation.UiThread; import android.text.TextUtils; import android.view.View; - import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.android.gestures.MoveGestureDetector; import com.mapbox.android.gestures.RotateGestureDetector; @@ -1882,20 +1881,25 @@ public void snapshot(@NonNull SnapshotReadyCallback callback) { } /** - * Queries the map for rendered features + * Queries the map for rendered features. + *

+ * Returns an empty list if either the map or underlying render surface has been destroyed. + *

* * @param coordinates the point to query * @param layerIds optionally - only query these layers * @return the list of feature */ @NonNull - public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable String... - layerIds) { + public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable String... layerIds) { return nativeMapView.queryRenderedFeatures(coordinates, layerIds, null); } /** * Queries the map for rendered features + *

+ * Returns an empty list if either the map or underlying render surface has been destroyed. + *

* * @param coordinates the point to query * @param filter filters the returned features with an expression @@ -1911,19 +1915,24 @@ public List queryRenderedFeatures(@NonNull PointF coordinates, /** * Queries the map for rendered features + *

+ * Returns an empty list if either the map or underlying render surface has been destroyed. + *

* * @param coordinates the box to query * @param layerIds optionally - only query these layers * @return the list of feature */ @NonNull - public List queryRenderedFeatures(@NonNull RectF coordinates, - @Nullable String... layerIds) { + public List queryRenderedFeatures(@NonNull RectF coordinates, @Nullable String... layerIds) { return nativeMapView.queryRenderedFeatures(coordinates, layerIds, null); } /** * Queries the map for rendered features + *

+ * Returns an empty list if either the map or underlying render surface has been destroyed. + *

* * @param coordinates the box to query * @param filter filters the returned features with an expression From 70b929e77273dc65b143beac4c5651919e57ffaf Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 11 Apr 2019 12:49:12 +0200 Subject: [PATCH 3/4] [android] - harden query invocations, move hasSurface handling to NativeMapView --- .../com/mapbox/mapboxsdk/maps/MapView.java | 38 +++++++++++++------ .../com/mapbox/mapboxsdk/maps/NativeMap.java | 4 ++ .../mapbox/mapboxsdk/maps/NativeMapView.java | 19 ++++++++-- 3 files changed, 46 insertions(+), 15 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 5a410c247e1..b671d1e4db2 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 @@ -19,7 +19,6 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; - import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.mapboxsdk.MapStrictMode; import com.mapbox.mapboxsdk.Mapbox; @@ -36,13 +35,12 @@ 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.util.ArrayList; import java.util.Iterator; import java.util.List; -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; @@ -74,7 +72,6 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { private MapboxMapOptions mapboxMapOptions; private MapRenderer mapRenderer; private boolean destroyed; - private boolean hasSurface; private CompassView compassView; private PointF focalPoint; @@ -292,6 +289,12 @@ protected void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); super.onSurfaceCreated(gl, config); } + + @Override + protected void onSurfaceDestroyed() { + MapView.this.onSurfaceDestroyed(); + super.onSurfaceDestroyed(); + } }; addView(textureView, 0); @@ -304,6 +307,12 @@ public void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); super.onSurfaceCreated(gl, config); } + + @Override + protected void onSurfaceDestroyed() { + MapView.this.onSurfaceDestroyed(); + super.onSurfaceDestroyed(); + } }; addView(glSurfaceView, 0); @@ -316,7 +325,7 @@ public void onSurfaceCreated(GL10 gl, EGLConfig config) { } private void onSurfaceCreated() { - hasSurface = true; + nativeMapView.setHasSurface(true); post(new Runnable() { @Override public void run() { @@ -329,6 +338,12 @@ public void run() { }); } + private void onSurfaceDestroyed() { + if (nativeMapView != null) { + nativeMapView.setHasSurface(false); + } + } + /** * You must call this method from the parent's Activity#onSaveInstanceState(Bundle) * or Fragment#onSaveInstanceState(Bundle). @@ -427,7 +442,7 @@ public void onDestroy() { mapboxMap.onDestroy(); } - if (nativeMapView != null && hasSurface) { + if (nativeMapView != null && nativeMapView.hasSurface()) { // null when destroying an activity programmatically mapbox-navigation-android/issues/503 nativeMapView.destroy(); nativeMapView = null; @@ -439,10 +454,10 @@ public void onDestroy() { } /** - * The maximum frame rate at which the map view is rendered, - * but it can't excess the ability of device hardware. + * The maximum frame rate at which the map view is rendered, + * but it can't excess the ability of device hardware. * - * @param maximumFps Can be set to arbitrary integer values. + * @param maximumFps Can be set to arbitrary integer values. */ public void setMaximumFps(int maximumFps) { if (mapRenderer != null) { @@ -747,8 +762,7 @@ public void removeOnDidBecomeIdleListener(OnDidBecomeIdleListener listener) { } /** - - /** + * /** * Set a callback that's invoked when the style has finished loading. * * @param listener The callback that's invoked when the style has finished loading diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java index e49126531a2..35316379a10 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java @@ -37,6 +37,10 @@ interface NativeMap { boolean isDestroyed(); + boolean hasSurface(); + + void setHasSurface(boolean hasSurface); + // // Camera API // 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 a5f8be788c3..c2aed13dddd 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 @@ -65,9 +65,12 @@ final class NativeMapView implements NativeMap { // Device density private final float pixelRatio; - // Flag to indicating destroy was called + // Flag to indicate destroy was called private boolean destroyed = false; + // Flag to indicate surface was destroyed + private boolean hasSurface = false; + // Holds the pointer to JNI NativeMapView @Keep private long nativePtr = 0; @@ -890,7 +893,7 @@ public Bitmap getImage(String name) { public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable String[] layerIds, @Nullable Expression filter) { - if (checkState("queryRenderedFeatures")) { + if (checkState("queryRenderedFeatures") || !hasSurface) { return new ArrayList<>(); } Feature[] features = nativeQueryRenderedFeaturesForPoint(coordinates.x / pixelRatio, @@ -903,7 +906,7 @@ public List queryRenderedFeatures(@NonNull PointF coordinates, public List queryRenderedFeatures(@NonNull RectF coordinates, @Nullable String[] layerIds, @Nullable Expression filter) { - if (checkState("queryRenderedFeatures")) { + if (checkState("queryRenderedFeatures") || !hasSurface) { return new ArrayList<>(); } Feature[] features = nativeQueryRenderedFeaturesForBox( @@ -1418,6 +1421,16 @@ public boolean isDestroyed() { return destroyed; } + @Override + public boolean hasSurface() { + return hasSurface; + } + + @Override + public void setHasSurface(boolean hasSurface) { + this.hasSurface = hasSurface; + } + public interface ViewCallback { int getWidth(); From 7b7f89792d540328f8675502f6d383ef18eb6329 Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 11 Apr 2019 14:50:36 +0200 Subject: [PATCH 4/4] [android] - rework test to use query activity, fix attempt to render without surface crash --- .../com/mapbox/mapboxsdk/maps/MapView.java | 8 ++--- .../mapboxsdk/maps/renderer/MapRenderer.java | 1 - .../GLSurfaceViewMapRenderer.java | 18 ++++++++++- .../QueryRenderedFeaturesBoxCountTest.kt | 30 +++++++++++++++++++ .../src/main/AndroidManifest.xml | 3 +- ...QueryRenderedFeaturesBoxCountActivity.java | 6 ++++ .../activity/maplayout/SimpleMapActivity.java | 16 ++-------- 7 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/integration/QueryRenderedFeaturesBoxCountTest.kt 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 b671d1e4db2..102c221e0a3 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 @@ -292,8 +292,8 @@ protected void onSurfaceCreated(GL10 gl, EGLConfig config) { @Override protected void onSurfaceDestroyed() { - MapView.this.onSurfaceDestroyed(); super.onSurfaceDestroyed(); + MapView.this.onSurfaceDestroyed(); } }; @@ -310,8 +310,8 @@ public void onSurfaceCreated(GL10 gl, EGLConfig config) { @Override protected void onSurfaceDestroyed() { - MapView.this.onSurfaceDestroyed(); super.onSurfaceDestroyed(); + MapView.this.onSurfaceDestroyed(); } }; @@ -442,7 +442,7 @@ public void onDestroy() { mapboxMap.onDestroy(); } - if (nativeMapView != null && nativeMapView.hasSurface()) { + if (nativeMapView != null) { // null when destroying an activity programmatically mapbox-navigation-android/issues/503 nativeMapView.destroy(); nativeMapView = null; @@ -762,7 +762,7 @@ public void removeOnDidBecomeIdleListener(OnDidBecomeIdleListener listener) { } /** - * /** + * * Set a callback that's invoked when the style has finished loading. * * @param listener The callback that's invoked when the style has finished loading diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java index e1f929c0f16..094129ed5c6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java @@ -4,7 +4,6 @@ import android.support.annotation.CallSuper; import android.support.annotation.Keep; import android.support.annotation.NonNull; - import com.mapbox.mapboxsdk.LibraryLoader; import com.mapbox.mapboxsdk.log.Logger; import com.mapbox.mapboxsdk.maps.MapboxMap; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java index 524c1a62eef..47cb35edbcf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java @@ -22,6 +22,7 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi @NonNull private final GLSurfaceView glSurfaceView; + private boolean hasSurface; public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView, @@ -33,11 +34,18 @@ public GLSurfaceViewMapRenderer(Context context, glSurfaceView.setRenderer(this); glSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY); glSurfaceView.setPreserveEGLContextOnPause(true); - glSurfaceView.getHolder().addCallback(new SurfaceHolderCallbackAdapter() { + @Override + public void surfaceCreated(SurfaceHolder holder) { + super.surfaceCreated(holder); + hasSurface = true; + } + @Override public void surfaceDestroyed(SurfaceHolder holder) { + super.surfaceDestroyed(holder); + hasSurface = false; onSurfaceDestroyed(); } }); @@ -73,6 +81,11 @@ public void onSurfaceCreated(GL10 gl, EGLConfig config) { super.onSurfaceCreated(gl, config); } + @Override + protected void onSurfaceDestroyed() { + super.onSurfaceDestroyed(); + } + @Override public void onSurfaceChanged(GL10 gl, int width, int height) { super.onSurfaceChanged(gl, width, height); @@ -90,6 +103,9 @@ public void onDrawFrame(GL10 gl) { */ @Override public void requestRender() { + if (!hasSurface) { + return; + } glSurfaceView.requestRender(); } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/integration/QueryRenderedFeaturesBoxCountTest.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/integration/QueryRenderedFeaturesBoxCountTest.kt new file mode 100644 index 00000000000..076bcba7e60 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/integration/QueryRenderedFeaturesBoxCountTest.kt @@ -0,0 +1,30 @@ +package com.mapbox.mapboxsdk.integration + +import android.support.test.filters.LargeTest +import android.support.test.rule.ActivityTestRule +import android.support.test.runner.AndroidJUnit4 +import com.mapbox.mapboxsdk.testapp.activity.feature.QueryRenderedFeaturesBoxCountActivity +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Regression test that validates reopening an Activity and querying the map before surface recreation #14394 + */ +@RunWith(AndroidJUnit4::class) +class QueryRenderedFeaturesBoxCountTest : BaseIntegrationTest() { + + @get:Rule + var activityRule: ActivityTestRule = + ActivityTestRule(QueryRenderedFeaturesBoxCountActivity::class.java) + + @Test + @LargeTest + fun reopenQueryRendererFeaturesActivity() { + device.waitForIdle() + device.pressHome() + device.waitForIdle() + device.launchActivity(activityRule.activity, QueryRenderedFeaturesBoxCountActivity::class.java) + device.waitForIdle() + } +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 017fe3ddcaf..0c5aa1551ec 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -608,7 +608,8 @@ + android:label="@string/activity_query_rendered_features_box_count" + android:launchMode="singleInstance"> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/feature/QueryRenderedFeaturesBoxCountActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/feature/QueryRenderedFeaturesBoxCountActivity.java index 35ed45442c2..90312404430 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/feature/QueryRenderedFeaturesBoxCountActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/feature/QueryRenderedFeaturesBoxCountActivity.java @@ -1,5 +1,6 @@ package com.mapbox.mapboxsdk.testapp.activity.feature; +import android.graphics.PointF; import android.graphics.RectF; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; @@ -89,6 +90,11 @@ public MapboxMap getMapboxMap() { protected void onStart() { super.onStart(); mapView.onStart(); + + if (mapboxMap != null) { + // Regression test for #14394 + mapboxMap.queryRenderedFeatures(new PointF(0,0)); + } } @Override diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java index 8d82dbf6cff..7d2d245f6e6 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/SimpleMapActivity.java @@ -1,10 +1,8 @@ package com.mapbox.mapboxsdk.testapp.activity.maplayout; -import android.graphics.PointF; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.mapbox.mapboxsdk.maps.MapView; -import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Style; import com.mapbox.mapboxsdk.testapp.R; @@ -14,7 +12,6 @@ public class SimpleMapActivity extends AppCompatActivity { private MapView mapView; - private MapboxMap mapboxMap; @Override protected void onCreate(Bundle savedInstanceState) { @@ -22,22 +19,15 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_map_simple); mapView = findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); - mapView.getMapAsync(map -> { - mapboxMap = map; - mapboxMap.setStyle( - new Style.Builder().fromUrl(Style.MAPBOX_STREETS) - ); - }); + mapView.getMapAsync(mapboxMap -> mapboxMap.setStyle( + new Style.Builder().fromUrl(Style.MAPBOX_STREETS) + )); } @Override protected void onStart() { super.onStart(); mapView.onStart(); - if (mapboxMap != null) { - // Regression test for #14394 - mapboxMap.queryRenderedFeatures(new PointF(0,0)); - } } @Override