diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java index f4fec06b9..2672d64f4 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java @@ -482,6 +482,11 @@ final class LocationAnimatorCoordinator { cancelAnimator(ANIMATOR_TILT); } + void cancelAndRemoveGpsBearingAnimation() { + cancelAnimator(ANIMATOR_LAYER_GPS_BEARING); + animatorArray.remove(ANIMATOR_LAYER_GPS_BEARING); + } + /** * Cancel the pulsing circle location animator. */ 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 90727acd0..d786ee009 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 @@ -48,6 +48,7 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_I import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_TILT_ANIM_DURATION; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_ZOOM_ANIM_DURATION; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.TRANSITION_ANIMATION_DURATION_MS; +import static com.mapbox.mapboxsdk.location.modes.RenderMode.GPS; /** * The Location Component provides location awareness to your mobile application. Enabling this @@ -674,6 +675,10 @@ public final class LocationComponent { */ public void setRenderMode(@RenderMode.Mode int renderMode) { checkActivationState(); + if (lastLocation != null && renderMode == GPS) { + locationAnimatorCoordinator.cancelAndRemoveGpsBearingAnimation(); + locationLayerController.setGpsBearing(lastLocation.getBearing()); + } locationLayerController.setRenderMode(renderMode); updateLayerOffsets(true); updateCompassListenerState(true); 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 d2f3c478e..7f52a3ed9 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 @@ -106,6 +106,10 @@ final class LocationLayerController { } } + void setGpsBearing(float gpsBearing) { + locationLayerRenderer.setGpsBearing(gpsBearing); + } + void setRenderMode(@RenderMode.Mode int renderMode) { if (this.renderMode == renderMode) { return; diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt index 9da535b54..616f364aa 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt @@ -705,6 +705,15 @@ class LocationAnimatorCoordinatorTest { verify { animatorProvider.floatAnimator(any(), any(), 5) } } + @Test + fun remove_gps_animator() { + val animator = mockk(relaxed = true) + locationAnimatorCoordinator.animatorArray.put(ANIMATOR_LAYER_GPS_BEARING, animator) + + locationAnimatorCoordinator.cancelAndRemoveGpsBearingAnimation() + assertTrue(locationAnimatorCoordinator.animatorArray.get(ANIMATOR_LAYER_GPS_BEARING) == null) + } + private fun getListenerHoldersSet(vararg animatorTypes: Int): Set { return HashSet().also { for (type in animatorTypes) { 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 f81d7614f..03c66327b 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 @@ -469,6 +469,34 @@ class LocationComponentTest { verify(renderChangeListener).onRenderModeChanged(RenderMode.NORMAL) } + @Test + fun change_to_gps_mode_symbolLayerBearingValue() { + val location = Location("test") + location.bearing = 50f + val projection: Projection = mock(Projection::class.java) + `when`(projection.getMetersPerPixelAtLatitude(location.latitude)).thenReturn(10.0) + `when`(mapboxMap.projection).thenReturn(projection) + `when`(style.isFullyLoaded).thenReturn(true) + `when`(mapboxMap.cameraPosition).thenReturn(CameraPosition.DEFAULT) + + locationComponent.activateLocationComponent( + LocationComponentActivationOptions.builder(context, style) + .locationComponentOptions(locationComponentOptions) + .useDefaultLocationEngine(false) + .build() + ) + locationComponent.isLocationComponentEnabled = true + locationComponent.onStart() + locationComponent.renderMode = RenderMode.NORMAL + locationComponent.forceLocationUpdate(location) + + verify(locationLayerController, times(0)).setGpsBearing(50f) + + locationComponent.renderMode = RenderMode.GPS + verify(locationLayerController, times(1)).setGpsBearing(50f) + verify(locationAnimatorCoordinator).cancelAndRemoveGpsBearingAnimation() + } + @Test fun tiltWhileTracking_notReady() { `when`(mapboxMap.cameraPosition).thenReturn(CameraPosition.DEFAULT)