summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobrun <tobrun.van.nuland@gmail.com>2018-10-19 17:00:49 +0200
committerTobrun <tobrun.van.nuland@gmail.com>2018-10-26 14:01:27 +0200
commitf451c4d60b683dc080a439e529a20406cae2cb3c (patch)
tree6281a563b0a177236ee832df613f3731904babe4
parent4592a11d99c18c5c2ef64b4f39f1af80adff17d3 (diff)
downloadqtlocation-mapboxgl-f451c4d60b683dc080a439e529a20406cae2cb3c.tar.gz
[android] - harden removed sources
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java28
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java6
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/Source.java6
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/style/StyleLoad.kt84
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java6
5 files changed, 128 insertions, 2 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 a12b5d6200..b83520b0fb 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
@@ -44,6 +44,8 @@ import com.mapbox.mapboxsdk.offline.OfflineGeometryRegionDefinition;
import com.mapbox.mapboxsdk.offline.OfflineRegionDefinition;
import com.mapbox.mapboxsdk.offline.OfflineTilePyramidRegionDefinition;
import com.mapbox.mapboxsdk.storage.FileSource;
+import com.mapbox.mapboxsdk.style.layers.Layer;
+import com.mapbox.mapboxsdk.style.sources.Source;
import com.mapbox.mapboxsdk.utils.BitmapUtils;
import java.lang.annotation.Retention;
@@ -132,6 +134,32 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
// hide surface until map is fully loaded #10990
setForeground(new ColorDrawable(options.getForegroundLoadColor()));
+ // Remove all sources from current style when going to load a new style
+ // This avoids crashing when calling updates on sources current style
+ // after underlying style has been cleared
+ addOnWillStartLoadingMapListener(new OnWillStartLoadingMapListener() {
+ @Override
+ public void onWillStartLoadingMap() {
+ if (mapboxMap == null) {
+ return;
+ }
+
+ for (Layer layer : mapboxMap.getLayers()) {
+ // avoid removing composite and annotations layer
+// if (layer.isRuntimeLayer()) {
+// mapboxMap.removeLayer(layer);
+// }
+ }
+
+ for (Source source : mapboxMap.getSources()) {
+ // avoid removing composite and annotations layer
+// if (source.isRuntimeSource()) {
+// mapboxMap.removeSource(source);
+// }
+ }
+ }
+ });
+
mapboxMapOptions = options;
// inflate view
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java
index b17c4a661a..c7dcf316f0 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java
@@ -16,6 +16,7 @@ public abstract class Layer {
private long nativePtr;
@Keep
private boolean invalidated;
+ private boolean isRuntimeLayer;
@Keep
protected Layer(long nativePtr) {
@@ -25,6 +26,7 @@ public abstract class Layer {
public Layer() {
checkThread();
+ isRuntimeLayer = true;
}
/**
@@ -133,4 +135,8 @@ public abstract class Layer {
}
return value;
}
+
+ public boolean isRuntimeLayer() {
+ return isRuntimeLayer;
+ }
} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/Source.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/Source.java
index 14d9ef1cc5..c888d57360 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/Source.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/Source.java
@@ -11,6 +11,7 @@ public abstract class Source {
@Keep
private long nativePtr;
+ private boolean runtimeSource;
/**
* Internal use
@@ -25,6 +26,7 @@ public abstract class Source {
public Source() {
checkThread();
+ runtimeSource = true;
}
/**
@@ -71,4 +73,8 @@ public abstract class Source {
@Keep
protected native String nativeGetAttribution();
+
+ public boolean isRuntimeSource() {
+ return runtimeSource;
+ }
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/style/StyleLoad.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/style/StyleLoad.kt
new file mode 100644
index 0000000000..4c01417677
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/style/StyleLoad.kt
@@ -0,0 +1,84 @@
+package com.mapbox.mapboxsdk.style
+
+import android.support.test.espresso.Espresso
+import android.support.test.espresso.Espresso.onView
+import android.support.test.espresso.UiController
+import android.support.test.espresso.matcher.ViewMatchers.isRoot
+import com.mapbox.geojson.Feature
+import com.mapbox.geojson.FeatureCollection
+import com.mapbox.geojson.Point
+import com.mapbox.mapboxsdk.constants.Style
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage
+import com.mapbox.mapboxsdk.style.layers.SymbolLayer
+import com.mapbox.mapboxsdk.style.sources.CustomGeometrySource
+import com.mapbox.mapboxsdk.style.sources.CustomGeometrySource.THREAD_POOL_LIMIT
+import com.mapbox.mapboxsdk.style.sources.CustomGeometrySource.THREAD_PREFIX
+import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
+import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction
+import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
+import com.mapbox.mapboxsdk.testapp.action.OrientationChangeAction.orientationLandscape
+import com.mapbox.mapboxsdk.testapp.action.OrientationChangeAction.orientationPortrait
+import com.mapbox.mapboxsdk.testapp.activity.BaseActivityTest
+import com.mapbox.mapboxsdk.testapp.activity.maplayout.SimpleMapActivity
+import com.mapbox.mapboxsdk.testapp.activity.style.GridSourceActivity
+import org.junit.Assert
+import org.junit.Ignore
+import org.junit.Test
+
+class CustomGeometrySourceTest : BaseActivityTest() {
+
+ override fun getActivityClass(): Class<*> = SimpleMapActivity::class.java
+
+ @Test
+ fun sourceUpdateAfterStyleChange() {
+ validateTestSetup()
+ invoke(mapboxMap) { uiController: UiController, mapboxMap: MapboxMap ->
+ val source = GeoJsonSource(
+ "source-id",
+ FeatureCollection.fromFeature(
+ Feature.fromGeometry(
+ Point.fromLngLat(0.0, 0.0)
+ )
+ )
+ )
+ mapboxMap.addSource(source)
+
+ mapboxMap.setStyle(Style.DARK)
+
+ uiController.loopMainThreadForAtLeast(300)
+
+ source.setGeoJson(
+ FeatureCollection.fromFeature(
+ Feature.fromGeometry(
+ Point.fromLngLat(1.0, 1.0)
+ )
+ )
+ )
+ }
+ }
+
+ @Test
+ fun layerUpdateAfterStyleChange() {
+ validateTestSetup()
+ invoke(mapboxMap) { uiController: UiController, mapboxMap: MapboxMap ->
+ val source = GeoJsonSource(
+ "source-id",
+ FeatureCollection.fromFeature(
+ Feature.fromGeometry(
+ Point.fromLngLat(0.0, 0.0)
+ )
+ )
+ )
+ mapboxMap.addSource(source)
+ val layer = SymbolLayer("test", "source-id")
+ mapboxMap.addLayerAbove(layer,"background")
+
+ mapboxMap.setStyle(Style.DARK)
+ layer.setProperties(iconImage("bus-15"))
+ uiController.loopMainThreadForAtLeast(300)
+ layer.setProperties(iconImage("bus-15"))
+ }
+ }
+
+} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java
index 21d843117e..d67daef54a 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java
@@ -97,7 +97,7 @@ public class DebugModeActivity extends AppCompatActivity implements OnMapReadyCa
public void onMapReady(MapboxMap map) {
mapboxMap = map;
mapboxMap.getUiSettings().setZoomControlsEnabled(true);
-
+ mapboxMap.setTransitionDuration(3000);
setupNavigationView(mapboxMap.getLayers());
setupNavigationView(mapboxMap.getLayers());
@@ -163,7 +163,9 @@ public class DebugModeActivity extends AppCompatActivity implements OnMapReadyCa
if (currentStyleIndex == STYLES.length) {
currentStyleIndex = 0;
}
- mapboxMap.setStyleUrl(STYLES[currentStyleIndex], style -> Timber.d("Style loaded %s", style));
+ mapboxMap.setStyleUrl(STYLES[currentStyleIndex], style ->
+ Timber.d("Style loaded %s", style));
+ mapboxMap.setTransitionDuration(4500);
}
});
}