diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-06-21 14:20:29 +0200 |
---|---|---|
committer | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2019-06-24 11:37:21 +0200 |
commit | fe570fb206515866906d6d0527eba7eb7bb0dbfd (patch) | |
tree | 72ff664e99263ad4e89330258ab6e7407234bb57 /platform | |
parent | e60b48eca9e752a09e54d4b1277ac1ab6aec5629 (diff) | |
download | qtlocation-mapboxgl-fe570fb206515866906d6d0527eba7eb7bb0dbfd.tar.gz |
[android] reset location layer animators when render mode changes
Diffstat (limited to 'platform')
4 files changed, 96 insertions, 4 deletions
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 50bbb7acfc..6337287770 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 @@ -347,6 +347,34 @@ final class LocationAnimatorCoordinator { createNewFloatAnimator(ANIMATOR_CAMERA_COMPASS_BEARING, previousCameraBearing, normalizedCameraBearing); } + void resetAllLayerAnimations() { + MapboxLatLngAnimator latLngAnimator = (MapboxLatLngAnimator) animatorArray.get(ANIMATOR_LAYER_LATLNG); + MapboxFloatAnimator gpsBearingAnimator = (MapboxFloatAnimator) animatorArray.get(ANIMATOR_LAYER_GPS_BEARING); + MapboxFloatAnimator compassBearingAnimator = + (MapboxFloatAnimator) animatorArray.get(ANIMATOR_LAYER_COMPASS_BEARING); + + if (latLngAnimator != null && gpsBearingAnimator != null) { + LatLng currentLatLng = (LatLng) latLngAnimator.getAnimatedValue(); + LatLng currentLatLngTarget = latLngAnimator.getTarget(); + createNewLatLngAnimator(ANIMATOR_LAYER_LATLNG, currentLatLng, currentLatLngTarget); + + float currentGpsBearing = (float) gpsBearingAnimator.getAnimatedValue(); + float currentGpsBearingTarget = gpsBearingAnimator.getTarget(); + createNewFloatAnimator(ANIMATOR_LAYER_GPS_BEARING, currentGpsBearing, currentGpsBearingTarget); + + playAnimators(getAnimationDuration(), ANIMATOR_LAYER_LATLNG, ANIMATOR_LAYER_GPS_BEARING); + } + + if (compassBearingAnimator != null) { + float currentLayerBearing = getPreviousLayerCompassBearing(); + float currentLayerBearingTarget = compassBearingAnimator.getTarget(); + createNewFloatAnimator(ANIMATOR_LAYER_COMPASS_BEARING, currentLayerBearing, currentLayerBearingTarget); + playAnimators( + compassAnimationEnabled ? COMPASS_UPDATE_RATE_MS : 0, + ANIMATOR_LAYER_COMPASS_BEARING); + } + } + void cancelZoomAnimation() { cancelAnimator(ANIMATOR_ZOOM); } 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 5d8847eab4..5b2dcd8554 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 @@ -1393,6 +1393,9 @@ public final class LocationComponent { animationsValueChangeListeners.addAll(locationLayerController.getAnimationListeners()); animationsValueChangeListeners.addAll(locationCameraController.getAnimationListeners()); locationAnimatorCoordinator.updateAnimatorListenerHolders(animationsValueChangeListeners); + locationAnimatorCoordinator.resetAllCameraAnimations(mapboxMap.getCameraPosition(), + locationCameraController.getCameraMode() == CameraMode.TRACKING_GPS_NORTH); + locationAnimatorCoordinator.resetAllLayerAnimations(); } @NonNull @@ -1517,7 +1520,8 @@ public final class LocationComponent { } @NonNull - private OnCameraTrackingChangedListener cameraTrackingChangedListener = new OnCameraTrackingChangedListener() { + @VisibleForTesting + OnCameraTrackingChangedListener cameraTrackingChangedListener = new OnCameraTrackingChangedListener() { @Override public void onCameraTrackingDismissed() { for (OnCameraTrackingChangedListener listener : onCameraTrackingChangedListeners) { @@ -1530,8 +1534,6 @@ public final class LocationComponent { locationAnimatorCoordinator.cancelZoomAnimation(); locationAnimatorCoordinator.cancelTiltAnimation(); updateAnimatorListenerHolders(); - locationAnimatorCoordinator.resetAllCameraAnimations(mapboxMap.getCameraPosition(), - locationCameraController.getCameraMode() == CameraMode.TRACKING_GPS_NORTH); for (OnCameraTrackingChangedListener listener : onCameraTrackingChangedListeners) { listener.onCameraTrackingChanged(currentMode); } @@ -1539,7 +1541,8 @@ public final class LocationComponent { }; @NonNull - private OnRenderModeChangedListener renderModeChangedListener = new OnRenderModeChangedListener() { + @VisibleForTesting + OnRenderModeChangedListener renderModeChangedListener = new OnRenderModeChangedListener() { @Override public void onRenderModeChanged(int currentMode) { updateAnimatorListenerHolders(); 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 1bc92ed7e3..0091c50b08 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 @@ -403,6 +403,12 @@ class LocationAnimatorCoordinatorTest { } @Test + fun resetAllLayerAnimations_empty() { + locationAnimatorCoordinator.resetAllLayerAnimations() + assertTrue(locationAnimatorCoordinator.animatorArray.size() == 0) + } + + @Test fun addNewListener() { val listener = Mockito.mock(AnimationsValueChangeListener::class.java) val holder = AnimatorListenerHolder(RenderMode.NORMAL, listener) 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 384a8cf65a..7fefd94a0b 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 @@ -396,4 +396,59 @@ class LocationComponentTest { } verify(locationCameraController).setCameraMode(eq(CameraMode.NONE), isNull<Location>(), eq(TRANSITION_ANIMATION_DURATION_MS), isNull<Double>(), isNull<Double>(), isNull<Double>(), any()) } + + @Test + fun internal_cameraTrackingChangedListener_onCameraTrackingDismissed() { + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.isLocationComponentEnabled = true + + val cameraChangeListener: OnCameraTrackingChangedListener = mock(OnCameraTrackingChangedListener::class.java) + locationComponent.addOnCameraTrackingChangedListener(cameraChangeListener) + + locationComponent.cameraTrackingChangedListener.onCameraTrackingDismissed() + + verify(cameraChangeListener).onCameraTrackingDismissed() + } + + @Test + fun internal_cameraTrackingChangedListener_onCameraTrackingChanged() { + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.isLocationComponentEnabled = true + + val cameraValueListener: AnimatorListenerHolder = mock(AnimatorListenerHolder::class.java) + val layerValueListener: AnimatorListenerHolder = mock(AnimatorListenerHolder::class.java) + `when`(locationCameraController.animationListeners).thenReturn(setOf(cameraValueListener)) + `when`(locationLayerController.animationListeners).thenReturn(setOf(layerValueListener)) + val cameraChangeListener: OnCameraTrackingChangedListener = mock(OnCameraTrackingChangedListener::class.java) + locationComponent.addOnCameraTrackingChangedListener(cameraChangeListener) + + locationComponent.cameraTrackingChangedListener.onCameraTrackingChanged(CameraMode.TRACKING_GPS) + + verify(locationAnimatorCoordinator).cancelZoomAnimation() + verify(locationAnimatorCoordinator).cancelTiltAnimation() + verify(locationAnimatorCoordinator).updateAnimatorListenerHolders(eq(setOf(cameraValueListener, layerValueListener))) + verify(locationAnimatorCoordinator).resetAllCameraAnimations(any(), anyBoolean()) + verify(locationAnimatorCoordinator).resetAllLayerAnimations() + verify(cameraChangeListener).onCameraTrackingChanged(CameraMode.TRACKING_GPS) + } + + @Test + fun internal_renderModeChangedListener_onRenderModeChanged() { + locationComponent.activateLocationComponent(context, mockk(), locationEngine, locationEngineRequest, locationComponentOptions) + locationComponent.isLocationComponentEnabled = true + + val cameraListener: AnimatorListenerHolder = mock(AnimatorListenerHolder::class.java) + val layerListener: AnimatorListenerHolder = mock(AnimatorListenerHolder::class.java) + `when`(locationCameraController.animationListeners).thenReturn(setOf(cameraListener)) + `when`(locationLayerController.animationListeners).thenReturn(setOf(layerListener)) + val renderChangeListener: OnRenderModeChangedListener = mock(OnRenderModeChangedListener::class.java) + locationComponent.addOnRenderModeChangedListener(renderChangeListener) + + locationComponent.renderModeChangedListener.onRenderModeChanged(RenderMode.NORMAL) + + verify(locationAnimatorCoordinator).updateAnimatorListenerHolders(eq(setOf(cameraListener, layerListener))) + verify(locationAnimatorCoordinator).resetAllCameraAnimations(any(), anyBoolean()) + verify(locationAnimatorCoordinator).resetAllLayerAnimations() + verify(renderChangeListener).onRenderModeChanged(RenderMode.NORMAL) + } }
\ No newline at end of file |