diff options
author | Tobrun <tobrun.van.nuland@gmail.com> | 2018-10-19 17:00:49 +0200 |
---|---|---|
committer | Tobrun <tobrun.van.nuland@gmail.com> | 2018-10-26 14:01:27 +0200 |
commit | f451c4d60b683dc080a439e529a20406cae2cb3c (patch) | |
tree | 6281a563b0a177236ee832df613f3731904babe4 | |
parent | 4592a11d99c18c5c2ef64b4f39f1af80adff17d3 (diff) | |
download | qtlocation-mapboxgl-f451c4d60b683dc080a439e529a20406cae2cb3c.tar.gz |
[android] - harden removed sources
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); } }); } |