diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK')
8 files changed, 205 insertions, 121 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java index 37433076b0..2391d6a86e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java @@ -56,7 +56,7 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_T * <p> * <strong> * To get the component object use {@link MapboxMap#getLocationComponent()} and activate it with - * {@link #activateLocationComponent(Context)} or one of the overloads. + * {@link #activateLocationComponent(Context, Style)} or one of the overloads. * Then, manage its visibility with {@link #setLocationComponentEnabled(boolean)}. * </strong> * <p> @@ -77,7 +77,7 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_T * When using any engine, requesting/removing the location updates is going to be managed internally. * <p> * You can also push location updates to the component without any internal engine management. - * To achieve that, use {@link #activateLocationComponent(Context, boolean)} with false. + * To achieve that, use {@link #activateLocationComponent(Context, Style, boolean)} with false. * No engine is going to be initialized and you can push location updates with {@link #forceLocationUpdate(Location)}. * <p> * For location puck animation purposes, like navigation, @@ -90,6 +90,7 @@ public final class LocationComponent { @NonNull private final MapboxMap mapboxMap; + private Style style; private LocationComponentOptions options; @NonNull private InternalLocationEngineProvider internalLocationEngineProvider = new InternalLocationEngineProvider(); @@ -201,8 +202,8 @@ public final class LocationComponent { * @param context the context */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context) { - activateLocationComponent(context, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style) { + activateLocationComponent(context, style, LocationComponentOptions.createFromAttributes(context, R.style.mapbox_LocationComponent)); } @@ -215,11 +216,12 @@ public final class LocationComponent { * there should be no location engine initialized */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, boolean useDefaultLocationEngine) { + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + boolean useDefaultLocationEngine) { if (useDefaultLocationEngine) { - activateLocationComponent(context, R.style.mapbox_LocationComponent); + activateLocationComponent(context, style, R.style.mapbox_LocationComponent); } else { - activateLocationComponent(context, null, R.style.mapbox_LocationComponent); + activateLocationComponent(context, style, null, R.style.mapbox_LocationComponent); } } @@ -233,13 +235,14 @@ public final class LocationComponent { * @param locationEngineRequest the location request */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, boolean useDefaultLocationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + boolean useDefaultLocationEngine, @NonNull LocationEngineRequest locationEngineRequest) { setLocationEngineRequest(locationEngineRequest); if (useDefaultLocationEngine) { - activateLocationComponent(context, R.style.mapbox_LocationComponent); + activateLocationComponent(context, style, R.style.mapbox_LocationComponent); } else { - activateLocationComponent(context, null, R.style.mapbox_LocationComponent); + activateLocationComponent(context, style, null, R.style.mapbox_LocationComponent); } } @@ -253,8 +256,8 @@ public final class LocationComponent { * @param styleRes the LocationComponent style res */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @StyleRes int styleRes) { - activateLocationComponent(context, LocationComponentOptions.createFromAttributes(context, styleRes)); + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, @StyleRes int styleRes) { + activateLocationComponent(context, style, LocationComponentOptions.createFromAttributes(context, styleRes)); } /** @@ -268,8 +271,9 @@ public final class LocationComponent { * @param options the options */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @NonNull LocationComponentOptions options) { - initialize(context, options); + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @NonNull LocationComponentOptions options) { + initialize(context, style, options); initializeLocationEngine(context); applyStyle(options); } @@ -283,9 +287,9 @@ public final class LocationComponent { * @param styleRes the LocationComponent style res */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @Nullable LocationEngine locationEngine, - @StyleRes int styleRes) { - activateLocationComponent(context, locationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @Nullable LocationEngine locationEngine, @StyleRes int styleRes) { + activateLocationComponent(context, style, locationEngine, LocationComponentOptions.createFromAttributes(context, styleRes)); } @@ -299,9 +303,10 @@ public final class LocationComponent { * @param styleRes the LocationComponent style res */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @Nullable LocationEngine locationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @Nullable LocationEngine locationEngine, @NonNull LocationEngineRequest locationEngineRequest, @StyleRes int styleRes) { - activateLocationComponent(context, locationEngine, locationEngineRequest, + activateLocationComponent(context, style, locationEngine, locationEngineRequest, LocationComponentOptions.createFromAttributes(context, styleRes)); } @@ -312,8 +317,9 @@ public final class LocationComponent { * @param locationEngine the engine */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @NonNull LocationEngine locationEngine) { - activateLocationComponent(context, locationEngine, R.style.mapbox_LocationComponent); + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @NonNull LocationEngine locationEngine) { + activateLocationComponent(context, style, locationEngine, R.style.mapbox_LocationComponent); } /** @@ -324,9 +330,10 @@ public final class LocationComponent { * @param locationEngineRequest the location request */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @NonNull LocationEngine locationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @NonNull LocationEngine locationEngine, @NonNull LocationEngineRequest locationEngineRequest) { - activateLocationComponent(context, locationEngine, locationEngineRequest, R.style.mapbox_LocationComponent); + activateLocationComponent(context, style, locationEngine, locationEngineRequest, R.style.mapbox_LocationComponent); } /** @@ -337,9 +344,10 @@ public final class LocationComponent { * @param options the options */ @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) - public void activateLocationComponent(@NonNull Context context, @Nullable LocationEngine locationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @Nullable LocationEngine locationEngine, @NonNull LocationComponentOptions options) { - initialize(context, options); + initialize(context, style, options); setLocationEngine(locationEngine); applyStyle(options); } @@ -353,10 +361,11 @@ public final class LocationComponent { * @param locationEngineRequest the location request * @param options the options */ - public void activateLocationComponent(@NonNull Context context, @Nullable LocationEngine locationEngine, + public void activateLocationComponent(@NonNull Context context, @NonNull Style style, + @Nullable LocationEngine locationEngine, @NonNull LocationEngineRequest locationEngineRequest, @NonNull LocationComponentOptions options) { - initialize(context, options); + initialize(context, style, options); setLocationEngineRequest(locationEngineRequest); setLocationEngine(locationEngine); applyStyle(options); @@ -899,57 +908,45 @@ public final class LocationComponent { mapboxMap.removeOnCameraIdleListener(onCameraIdleListener); } - private void initialize(@NonNull final Context context, @NonNull final LocationComponentOptions options) { - LocationComponent.this.options = options; - mapboxMap.getStyle(new InitializationCallback(context)); - } - - class InitializationCallback implements Style.OnStyleLoaded { - - private final Context context; - - private InitializationCallback(Context context) { - this.context = context; + private void initialize(@NonNull final Context context, @NonNull Style style, + @NonNull final LocationComponentOptions options) { + if (isComponentInitialized) { + return; } + isComponentInitialized = true; - @Override - public void onStyleLoaded(@NonNull Style style) { - if (isComponentInitialized) { - return; - } - isComponentInitialized = true; - - mapboxMap.addOnMapClickListener(onMapClickListener); - mapboxMap.addOnMapLongClickListener(onMapLongClickListener); - - LayerSourceProvider sourceProvider = new LayerSourceProvider(); - LayerFeatureProvider featureProvider = new LayerFeatureProvider(); - LayerBitmapProvider bitmapProvider = new LayerBitmapProvider(context); - locationLayerController = new LocationLayerController(mapboxMap, sourceProvider, featureProvider, - bitmapProvider, - options); - locationCameraController = new LocationCameraController( - context, mapboxMap, cameraTrackingChangedListener, options, onCameraMoveInvalidateListener); - - locationAnimatorCoordinator = new LocationAnimatorCoordinator(); - locationAnimatorCoordinator.addLayerListener(locationLayerController); - locationAnimatorCoordinator.addCameraListener(locationCameraController); - locationAnimatorCoordinator.setTrackingAnimationDurationMultiplier(options - .trackingAnimationDurationMultiplier()); - - WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); - compassEngine = new LocationComponentCompassEngine(windowManager, sensorManager); - compassEngine.addCompassListener(compassListener); - staleStateManager = new StaleStateManager(onLocationStaleListener, options); + this.style = style; + this.options = options; + + mapboxMap.addOnMapClickListener(onMapClickListener); + mapboxMap.addOnMapLongClickListener(onMapLongClickListener); + + LayerSourceProvider sourceProvider = new LayerSourceProvider(); + LayerFeatureProvider featureProvider = new LayerFeatureProvider(); + LayerBitmapProvider bitmapProvider = new LayerBitmapProvider(context); + locationLayerController = new LocationLayerController(mapboxMap, style, sourceProvider, featureProvider, + bitmapProvider, options); + locationCameraController = new LocationCameraController( + context, mapboxMap, cameraTrackingChangedListener, options, onCameraMoveInvalidateListener); + + locationAnimatorCoordinator = new LocationAnimatorCoordinator(); + locationAnimatorCoordinator.addLayerListener(locationLayerController); + locationAnimatorCoordinator.addCameraListener(locationCameraController); + locationAnimatorCoordinator.setTrackingAnimationDurationMultiplier(options + .trackingAnimationDurationMultiplier()); + + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + compassEngine = new LocationComponentCompassEngine(windowManager, sensorManager); + compassEngine.addCompassListener(compassListener); + staleStateManager = new StaleStateManager(onLocationStaleListener, options); - updateMapWithOptions(options); + updateMapWithOptions(options); - setRenderMode(RenderMode.NORMAL); - setCameraMode(CameraMode.NONE); + setRenderMode(RenderMode.NORMAL); + setCameraMode(CameraMode.NONE); - onLocationLayerStart(); - } + onLocationLayerStart(); } private void initializeLocationEngine(@NonNull Context context) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java index 0e7508ab74..ed15e52a08 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java @@ -13,6 +13,7 @@ import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.location.modes.RenderMode; +import com.mapbox.mapboxsdk.maps.Style; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.layers.SymbolLayer; import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; @@ -61,6 +62,7 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV private int renderMode; private final MapboxMap mapboxMap; + private final Style style; private final LayerSourceProvider layerSourceProvider; private final LayerBitmapProvider bitmapProvider; private LocationComponentOptions options; @@ -71,10 +73,11 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV private boolean isHidden = true; - LocationLayerController(MapboxMap mapboxMap, LayerSourceProvider layerSourceProvider, + LocationLayerController(MapboxMap mapboxMap, Style style, LayerSourceProvider layerSourceProvider, LayerFeatureProvider featureProvider, LayerBitmapProvider bitmapProvider, @NonNull LocationComponentOptions options) { this.mapboxMap = mapboxMap; + this.style = style; this.layerSourceProvider = layerSourceProvider; this.bitmapProvider = bitmapProvider; this.locationFeature = featureProvider.generateLocationFeature(locationFeature, options); @@ -193,7 +196,7 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV } private void setLayerVisibility(@NonNull String layerId, boolean visible) { - Layer layer = mapboxMap.getStyle().getLayer(layerId); + Layer layer = style.getLayer(layerId); if (layer != null) { String targetVisibility = visible ? VISIBLE : NONE; if (!layer.getVisibility().value.equals(targetVisibility)) { @@ -221,7 +224,7 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV } private void addLayerToMap(Layer layer, @NonNull String idBelowLayer) { - mapboxMap.getStyle().addLayerBelow(layer, idBelowLayer); + style.addLayerBelow(layer, idBelowLayer); layerMap.add(layer.getId()); } @@ -243,11 +246,11 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV private void addLocationSource() { locationSource = layerSourceProvider.generateSource(locationFeature); - mapboxMap.getStyle().addSource(locationSource); + style.addSource(locationSource); } private void refreshSource() { - GeoJsonSource source = mapboxMap.getStyle().getSourceAs(LOCATION_SOURCE); + GeoJsonSource source = style.getSourceAs(LOCATION_SOURCE); if (source != null) { locationSource.setGeoJson(locationFeature); } @@ -272,17 +275,17 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV Bitmap backgroundStaleBitmap = bitmapProvider.generateBitmap( options.backgroundDrawableStale(), options.backgroundStaleTintColor() ); - mapboxMap.getStyle().addImage(BACKGROUND_ICON, backgroundBitmap); - mapboxMap.getStyle().addImage(BACKGROUND_STALE_ICON, backgroundStaleBitmap); + style.addImage(BACKGROUND_ICON, backgroundBitmap); + style.addImage(BACKGROUND_STALE_ICON, backgroundStaleBitmap); } private void styleShadow(@NonNull LocationComponentOptions options) { - mapboxMap.getStyle().addImage(SHADOW_ICON, bitmapProvider.generateShadowBitmap(options)); + style.addImage(SHADOW_ICON, bitmapProvider.generateShadowBitmap(options)); } private void styleBearing(LocationComponentOptions options) { Bitmap bearingBitmap = bitmapProvider.generateBitmap(options.bearingDrawable(), options.bearingTintColor()); - mapboxMap.getStyle().addImage(BEARING_ICON, bearingBitmap); + style.addImage(BEARING_ICON, bearingBitmap); } private void styleAccuracy(float accuracyAlpha, @ColorInt int accuracyColor) { @@ -306,13 +309,13 @@ final class LocationLayerController implements MapboxAnimator.OnLayerAnimationsV options.gpsDrawable(), options.foregroundStaleTintColor() ); } - mapboxMap.getStyle().addImage(FOREGROUND_ICON, foregroundBitmap); - mapboxMap.getStyle().addImage(FOREGROUND_STALE_ICON, foregroundBitmapStale); + style.addImage(FOREGROUND_ICON, foregroundBitmap); + style.addImage(FOREGROUND_STALE_ICON, foregroundBitmapStale); } private void styleScaling(@NonNull LocationComponentOptions options) { for (String layerId : layerMap) { - Layer layer = mapboxMap.getStyle().getLayer(layerId); + Layer layer = style.getLayer(layerId); if (layer instanceof SymbolLayer) { layer.setProperties( iconSize( 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 558ea56a0d..b4c977cf15 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 @@ -1061,7 +1061,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { private class MapCallback implements OnDidFinishLoadingStyleListener, OnDidFinishRenderingFrameListener, OnDidFinishLoadingMapListener, - OnCameraIsChangingListener, OnCameraDidChangeListener { + OnCameraIsChangingListener, OnCameraDidChangeListener, OnDidFailLoadingMapListener { private final List<OnMapReadyCallback> onMapReadyCallbackList = new ArrayList<>(); @@ -1071,6 +1071,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { addOnDidFinishLoadingMapListener(this); addOnCameraIsChangingListener(this); addOnCameraDidChangeListener(this); + addOnDidFailLoadingMapListener(this); } void initialised() { @@ -1107,6 +1108,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { removeOnDidFinishLoadingMapListener(this); removeOnCameraIsChangingListener(this); removeOnCameraDidChangeListener(this); + removeOnDidFailLoadingMapListener(this); } @Override @@ -1117,6 +1119,13 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { } @Override + public void onDidFailLoadingMap(String errorMessage) { + if (mapboxMap != null) { + mapboxMap.onFailLoadingStyle(); + } + } + + @Override public void onDidFinishRenderingFrame(boolean fully) { if (mapboxMap != null) { mapboxMap.onUpdateFullyRendered(); 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 bcc7037657..03fbdab3bd 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 @@ -5,6 +5,7 @@ import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.RectF; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -197,13 +198,20 @@ public final class MapboxMap { } /** - * Called the map finished loading style. + * Called when the map finished loading a style. */ void onFinishLoadingStyle() { notifyStyleLoaded(); } /** + * Called when the map failed loading a style. + */ + void onFailLoadingStyle() { + styleLoadedCallbacks.clear(); + } + + /** * Called when the region is changing or has changed. */ void onUpdateRegionChange() { @@ -663,6 +671,7 @@ public final class MapboxMap { * Loads a new style from the specified offline region definition and moves the map camera to that region. * * @param definition the offline region definition + * @param callback the callback to be invoked when the style has loaded * @see OfflineRegionDefinition */ public void setOfflineRegionDefinition(@NonNull OfflineRegionDefinition definition, @@ -812,7 +821,7 @@ public final class MapboxMap { // user didn't provide a `from` component, // flag the style as loaded, // add components defined added using the `with` prefix. - notifyStyleLoaded(); + notifyStyleLoadedDelayed(); } } @@ -833,6 +842,15 @@ public final class MapboxMap { styleLoadedCallbacks.clear(); } + private void notifyStyleLoadedDelayed() { + new Handler().post(new Runnable() { + @Override + public void run() { + notifyStyleLoaded(); + } + }); + } + /** * Loads a new map style from MapboxMapOptions if available. * diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java index 5e2439cba3..72de0b24c5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java @@ -123,7 +123,7 @@ public class Style { } /** - * Removes the source. Any references to the source become invalid and should not be used anymore + * Removes the source from the style. * * @param sourceId the source to remove * @return the source handle or null if the source was not present @@ -261,7 +261,6 @@ public class Style { * @return the removed layer or null if not found */ public boolean removeLayerAt(@IntRange(from = 0) int index) { - // TODO what about runtime added sources? return nativeMapView.removeLayerAt(index); } @@ -366,6 +365,7 @@ public class Style { * by setting the java sources and layers in a detached state and removing them from core. */ void onWillStartLoadingMap() { + styleLoaded = false; for (Source source : sources.values()) { if (source != null) { source.setDetached(); @@ -451,7 +451,7 @@ public class Style { * </p> * {@code url} can take the following forms: * <ul> - * <li>{@code Style.*}: load one of the bundled styles in {@link Style}.</li> + * <li>{@code Style#StyleUrl}: load one of the bundled styles in {@link Style}.</li> * <li>{@code mapbox://styles/<user>/<style>}: * loads the style from a <a href="https://www.mapbox.com/account/">Mapbox account.</a> * {@code user} is your username. {@code style} is the ID of your custom @@ -461,12 +461,16 @@ public class Style { * <li>{@code asset://...}: * loads the style from the APK {@code assets/} directory. * This is used to load a style bundled with your app.</li> + * <li>{@code file://...}: + * loads the style from a file path. This is used to load a style from disk. + * </li> + * </li> * <li>{@code null}: loads the default {@link Style#MAPBOX_STREETS} style.</li> * </ul> * <p> * This method is asynchronous and will return before the style finishes loading. * If you wish to wait for the map to finish loading, listen to the {@link MapView.OnDidFinishLoadingStyleListener} - * callback. + * callback or use {@link MapboxMap#setStyle(String, OnStyleLoaded)} instead. * </p> * If the style fails to load or an invalid style URL is set, the map view will become blank. * An error message will be logged in the Android logcat and {@link MapView.OnDidFailLoadingMapListener} callback diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt index 853760f6df..b0bea5aa0e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt @@ -9,6 +9,7 @@ import com.mapbox.android.core.location.LocationEngineRequest import com.mapbox.mapboxsdk.R import com.mapbox.mapboxsdk.maps.MapboxMap import com.mapbox.mapboxsdk.maps.Style +import io.mockk.mockk import org.junit.Assert import org.junit.Before import org.junit.Test @@ -75,8 +76,7 @@ class LocationComponentTest { @Test fun activateWithRequestTest() { - locationComponent.activateLocationComponent(context, locationEngine, locationEngineRequest, locationComponentOptions) - verify(mapboxMap).getStyle(ArgumentMatchers.any(Style.OnStyleLoaded::class.java)) + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) Assert.assertEquals(locationEngineRequest, locationComponent.locationEngineRequest) @@ -90,13 +90,13 @@ class LocationComponentTest { .getDimension(R.dimen.mapbox_locationComponentTrackingMultiFingerMoveThreshold) doReturn(0f).`when`(resources) .getDimension(R.dimen.mapbox_locationComponentTrackingMultiFingerMoveThreshold) - locationComponent.activateLocationComponent(context, true, locationEngineRequest) + locationComponent.activateLocationComponent(context, mockk(),true, locationEngineRequest) Assert.assertEquals(locationEngineRequest, locationComponent.locationEngineRequest) } @Test fun locationUpdatesWhenEnabledDisableTest() { - locationComponent.activateLocationComponent(context, locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) verify(locationEngine, times(0)).removeLocationUpdates(currentListener) verify(locationEngine, times(0)).requestLocationUpdates(eq(locationEngineRequest), eq(currentListener), any(Looper::class.java)) @@ -114,7 +114,7 @@ class LocationComponentTest { @Test fun locationUpdatesWhenStartedStoppedTest() { - locationComponent.activateLocationComponent(context, locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) locationComponent.onStart() locationComponent.isLocationComponentEnabled = true @@ -127,7 +127,7 @@ class LocationComponentTest { @Test fun locationUpdatesWhenNewRequestTest() { - locationComponent.activateLocationComponent(context, locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) locationComponent.onStart() locationComponent.isLocationComponentEnabled = true @@ -139,7 +139,7 @@ class LocationComponentTest { @Test fun lastLocationUpdateOnStartTest() { - locationComponent.activateLocationComponent(context, locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) locationComponent.onStart() locationComponent.isLocationComponentEnabled = true diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationLayerControllerTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationLayerControllerTest.java index 475fb81684..68e31275f1 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationLayerControllerTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationLayerControllerTest.java @@ -56,7 +56,8 @@ public class LocationLayerControllerTest { LayerBitmapProvider bitmapProvider = mock(LayerBitmapProvider.class); LocationComponentOptions options = mock(LocationComponentOptions.class); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addSource(locationSource); } @@ -71,7 +72,8 @@ public class LocationLayerControllerTest { LayerBitmapProvider bitmapProvider = mock(LayerBitmapProvider.class); LocationComponentOptions options = mock(LocationComponentOptions.class); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addLayerBelow(shadowLayer, BACKGROUND_LAYER); } @@ -86,7 +88,8 @@ public class LocationLayerControllerTest { LayerBitmapProvider bitmapProvider = mock(LayerBitmapProvider.class); LocationComponentOptions options = mock(LocationComponentOptions.class); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addLayerBelow(backgroundLayer, FOREGROUND_LAYER); } @@ -101,7 +104,8 @@ public class LocationLayerControllerTest { LayerBitmapProvider bitmapProvider = mock(LayerBitmapProvider.class); LocationComponentOptions options = mock(LocationComponentOptions.class); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addLayerBelow(foregroundLayer, BEARING_LAYER); } @@ -118,7 +122,8 @@ public class LocationLayerControllerTest { String layerBelow = "layer-below"; when(options.layerBelow()).thenReturn(layerBelow); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addLayerBelow(bearingLayer, layerBelow); } @@ -133,7 +138,8 @@ public class LocationLayerControllerTest { LayerBitmapProvider bitmapProvider = mock(LayerBitmapProvider.class); LocationComponentOptions options = mock(LocationComponentOptions.class); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addLayerBelow(accuracyLayer, BACKGROUND_LAYER); } @@ -149,7 +155,8 @@ public class LocationLayerControllerTest { when(options.elevation()).thenReturn(2f); // Style is applied on initialization - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(SHADOW_ICON, bitmap); } @@ -164,7 +171,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); when(options.elevation()).thenReturn(0f); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style, times(0)).addImage(SHADOW_ICON, bitmap); } @@ -182,7 +190,8 @@ public class LocationLayerControllerTest { Bitmap bitmap = mock(Bitmap.class); when(bitmapProvider.generateBitmap(drawableResId, tintColor)).thenReturn(bitmap); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(FOREGROUND_ICON, bitmap); } @@ -200,7 +209,8 @@ public class LocationLayerControllerTest { Bitmap bitmap = mock(Bitmap.class); when(bitmapProvider.generateBitmap(drawableResId, tintColor)).thenReturn(bitmap); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(FOREGROUND_STALE_ICON, bitmap); } @@ -218,7 +228,8 @@ public class LocationLayerControllerTest { Bitmap bitmap = mock(Bitmap.class); when(bitmapProvider.generateBitmap(drawableResId, tintColor)).thenReturn(bitmap); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(BACKGROUND_ICON, bitmap); } @@ -236,7 +247,8 @@ public class LocationLayerControllerTest { Bitmap bitmap = mock(Bitmap.class); when(bitmapProvider.generateBitmap(drawableResId, tintColor)).thenReturn(bitmap); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(BACKGROUND_STALE_ICON, bitmap); } @@ -254,7 +266,8 @@ public class LocationLayerControllerTest { Bitmap bitmap = mock(Bitmap.class); when(bitmapProvider.generateBitmap(drawableResId, tintColor)).thenReturn(bitmap); - new LocationLayerController(mapboxMap, sourceProvider, buildFeatureProvider(options), bitmapProvider, options); + new LocationLayerController(mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(options), + bitmapProvider, options); verify(style).addImage(BEARING_ICON, bitmap); } @@ -268,7 +281,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.updateForegroundOffset(2d); @@ -285,7 +299,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.updateForegroundOffset(2d); @@ -302,7 +317,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.onNewLatLngValue(new LatLng()); @@ -320,7 +336,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.setRenderMode(RenderMode.GPS); float gpsBearing = 2f; @@ -340,7 +357,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.setRenderMode(RenderMode.COMPASS); float gpsBearing = 2f; @@ -360,7 +378,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.setRenderMode(RenderMode.COMPASS); float compassBearing = 2f; @@ -380,7 +399,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.setRenderMode(RenderMode.GPS); float compassBearing = 2f; @@ -400,7 +420,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); float accuracyRadiusValue = 2f; @@ -419,7 +440,8 @@ public class LocationLayerControllerTest { LocationComponentOptions options = mock(LocationComponentOptions.class); Feature locationFeature = mock(Feature.class); LocationLayerController layer = new LocationLayerController( - mapboxMap, sourceProvider, buildFeatureProvider(locationFeature, options), bitmapProvider, options + mapboxMap, mapboxMap.getStyle(), sourceProvider, buildFeatureProvider(locationFeature, options), + bitmapProvider, options ); layer.setRenderMode(RenderMode.GPS); float accuracyRadiusValue = 2f; diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/StyleTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/StyleTest.kt index 0c9abc82ba..4b2f3e287e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/StyleTest.kt +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/StyleTest.kt @@ -9,6 +9,7 @@ import io.mockk.every import io.mockk.mockk import io.mockk.spyk import io.mockk.verify +import org.junit.Assert import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -273,4 +274,34 @@ class StyleTest { verify(exactly = 1) { nativeMapView.addSource(source) } verify(exactly = 1) { callback.onStyleLoaded(any()) } } + + @Test + fun testGetNullStyle() { + Assert.assertNull(mapboxMap.style) + } + + @Test + fun testGetNullWhileLoading() { + val transitionOptions = TransitionOptions(100, 200) + val builder = Style.Builder().fromUrl(Style.MAPBOX_STREETS).withTransition(transitionOptions) + mapboxMap.setStyle(builder) + Assert.assertNull(mapboxMap.style) + mapboxMap.notifyStyleLoaded() + Assert.assertNotNull(mapboxMap.style) + } + + @Test + fun testNotReinvokeSameListener() { + val callback = mockk<Style.OnStyleLoaded>() + every { callback.onStyleLoaded(any()) } answers {} + mapboxMap.getStyle(callback) + val source = mockk<GeoJsonSource>() + every { source.id } returns "1" + val builder = Style.Builder().fromJson("{}") + mapboxMap.setStyle(builder) + verify(exactly = 1) { nativeMapView.styleJson = "{}" } + mapboxMap.notifyStyleLoaded() + mapboxMap.setStyle(Style.MAPBOX_STREETS) + verify(exactly = 1) { callback.onStyleLoaded(any()) } + } }
\ No newline at end of file |