diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java index 8b014b0e9..952da885f 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java @@ -1289,7 +1289,7 @@ public final class LocationComponent { return; } - if (!isComponentInitialized || !isComponentStarted || !isEnabled) { + if (!isComponentInitialized || !isComponentStarted || !isEnabled || !isLayerReady) { return; } diff --git a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt index 2994c29d5..648a1d214 100644 --- a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt +++ b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt @@ -386,6 +386,23 @@ class LocationComponentTest { verify(compassEngine, never()).addCompassListener(any(CompassListener::class.java)) } + @Test + fun compass_notAddListenerWhenLayerNotReady() { + locationComponent.activateLocationComponent(context, mock(Style::class.java), locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.onStart() + locationComponent.isLocationComponentEnabled = true + `when`(mapboxMap.cameraPosition).thenReturn(CameraPosition.DEFAULT) + `when`(locationLayerController.isConsumingCompass).thenReturn(true) + locationComponent.renderMode = RenderMode.COMPASS + + verify(compassEngine, times(1)).addCompassListener(any(CompassListener::class.java)) + + locationComponent.onStartLoadingMap() + // Layer should be disabled at this point + locationComponent.setCameraMode(CameraMode.TRACKING_COMPASS) + verify(compassEngine, times(1)).addCompassListener(any(CompassListener::class.java)) + } + @Test fun developerAnimationCalled() { locationComponent.activateLocationComponent(context, mock(Style::class.java), locationEngine, locationEngineRequest, locationComponentOptions) diff --git a/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java b/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java index 6ec64e1d0..0ee99a4fe 100644 --- a/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java +++ b/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java @@ -233,8 +233,10 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea return; } - String styleUrl = Style.DARK.equals(mapboxMap.getStyle().getUri()) ? Style.LIGHT : Style.DARK; - mapboxMap.setStyle(new Style.Builder().fromUri(styleUrl)); + mapboxMap.getStyle(style -> { + String styleUrl = Style.DARK.equals(style.getUri()) ? Style.LIGHT : Style.DARK; + mapboxMap.setStyle(new Style.Builder().fromUri(styleUrl)); + }); } private void disableGesturesManagement() {