From 43239b670d8037a995bb976fcb3ed4e9814b0057 Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Wed, 3 Mar 2021 18:16:17 +0100 Subject: [PATCH 1/3] Cherry pick from https://github.com/mapbox/mapbox-gl-native-android/pull/470/files --- .../location/LocationAnimatorCoordinator.java | 5 ++++ .../mapboxsdk/location/LocationComponent.java | 5 ++++ .../location/LocationLayerController.java | 4 +++ .../LocationAnimatorCoordinatorTest.kt | 9 ++++++ .../location/LocationComponentTest.kt | 28 +++++++++++++++++++ 5 files changed, 51 insertions(+) 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) From 17c64131330b55c422e68211e65690dfe87c57a2 Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Wed, 3 Mar 2021 18:18:35 +0100 Subject: [PATCH 2/3] Change log update --- platform/android/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index 051dda106..a427a1ff1 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -9,6 +9,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [`Con ### Bug Fixes * Fixed an issue where symbols flickered when zooming out. [#16](https://github.com/maplibre/maplibre-gl-native/issues/16) +* Fixed an issue where GPS puck keeps previous value when enabled. [#462]https://github.com/mapbox/mapbox-gl-native-android/issues/462, cherry picked from [#470](https://github.com/mapbox/mapbox-gl-native-android/pull/470) ### Other From 623f113bbbb7383eb76b1f4a5bb6dea7dbba1c09 Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Wed, 3 Mar 2021 19:01:18 +0100 Subject: [PATCH 3/3] Lint issues --- .../mapbox/mapboxsdk/location/LocationComponentTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 03c66327b..e0accd3ec 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 @@ -480,10 +480,10 @@ class LocationComponentTest { `when`(mapboxMap.cameraPosition).thenReturn(CameraPosition.DEFAULT) locationComponent.activateLocationComponent( - LocationComponentActivationOptions.builder(context, style) - .locationComponentOptions(locationComponentOptions) - .useDefaultLocationEngine(false) - .build() + LocationComponentActivationOptions.builder(context, style) + .locationComponentOptions(locationComponentOptions) + .useDefaultLocationEngine(false) + .build() ) locationComponent.isLocationComponentEnabled = true locationComponent.onStart()