Skip to content

Commit 8b4df59

Browse files
dzinadgithub-actions[bot]
authored andcommitted
NAVAND-5992: fix camera jump when transitioning to following
GitOrigin-RevId: a8b7d3c47437392b05bcba598339146514c0280e
1 parent 7582b5e commit 8b4df59

7 files changed

Lines changed: 165 additions & 12 deletions

File tree

ui-maps/api/current.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ package com.mapbox.navigation.ui.maps.camera {
154154
@UiThread public final class NavigationCamera {
155155
ctor public NavigationCamera(com.mapbox.maps.MapboxMap mapboxMap, com.mapbox.maps.plugin.animation.CameraAnimationsPlugin cameraPlugin, com.mapbox.navigation.ui.maps.camera.data.ViewportDataSource viewportDataSource, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransition stateTransition = com.mapbox.navigation.ui.maps.camera.transition.MapboxNavigationCameraStateTransition(mapboxMap, cameraPlugin));
156156
ctor @com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI public NavigationCamera(com.mapbox.maps.MapboxMap mapboxMap, com.mapbox.maps.plugin.animation.CameraAnimationsPlugin cameraPlugin, com.mapbox.navigation.ui.maps.camera.data.ViewportDataSource viewportDataSource, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransition stateTransition = com.mapbox.navigation.ui.maps.camera.transition.MapboxNavigationCameraStateTransition(mapboxMap, cameraPlugin), com.mapbox.navigation.ui.maps.camera.transition.UpdateFrameAnimatorsOptions updateFrameAnimatorsOptions);
157-
ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public NavigationCamera(com.mapbox.maps.MapboxMap mapboxMap, com.mapbox.maps.plugin.animation.CameraAnimationsPlugin cameraPlugin, com.mapbox.navigation.ui.maps.camera.data.ViewportDataSource viewportDataSource, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransition stateTransition, com.mapbox.navigation.ui.maps.internal.camera.SimplifiedUpdateFrameTransitionProvider simplifiedUpdateFrameTransitionProvider = com.mapbox.navigation.ui.maps.camera.transition.DefaultSimplifiedUpdateFrameTransitionProvider(mapboxMap, cameraPlugin));
157+
ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public NavigationCamera(com.mapbox.maps.MapboxMap mapboxMap, com.mapbox.maps.plugin.animation.CameraAnimationsPlugin cameraPlugin, com.mapbox.navigation.ui.maps.camera.data.ViewportDataSource viewportDataSource, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransitionProvider transitionProvider, com.mapbox.navigation.ui.maps.internal.camera.SimplifiedUpdateFrameTransitionProvider simplifiedUpdateFrameTransitionProvider = com.mapbox.navigation.ui.maps.camera.transition.DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin));
158158
method public com.mapbox.navigation.ui.maps.camera.data.debugger.MapboxNavigationViewportDataSourceDebugger? getDebugger();
159159
method public com.mapbox.navigation.ui.maps.camera.state.NavigationCameraState getState();
160160
method public void registerNavigationCameraStateChangeObserver(com.mapbox.navigation.ui.maps.camera.state.NavigationCameraStateChangedObserver navigationCameraStateChangedObserver);
@@ -510,6 +510,11 @@ package com.mapbox.navigation.ui.maps.camera.transition {
510510
method public android.animation.AnimatorSet updateFrameForOverview(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions transitionOptions);
511511
}
512512

513+
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NavigationCameraStateTransitionProvider {
514+
method public android.animation.AnimatorSet transitionToFollowing(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions transitionOptions);
515+
method public android.animation.AnimatorSet transitionToOverview(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions transitionOptions);
516+
}
517+
513518
@UiThread public interface NavigationCameraTransition {
514519
method public android.animation.AnimatorSet transitionFromHighZoomToLowZoom(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions transitionOptions);
515520
method public android.animation.AnimatorSet transitionFromLowZoomToHighZoom(com.mapbox.maps.CameraOptions cameraOptions, com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions transitionOptions);
@@ -707,7 +712,7 @@ package com.mapbox.navigation.ui.maps.guidance.signboard.api {
707712
ctor public MapboxSignboardApi(com.mapbox.navigation.ui.maps.guidance.signboard.api.SvgToBitmapParser parser);
708713
ctor public MapboxSignboardApi(android.content.Context applicationContext, com.mapbox.navigation.ui.maps.guidance.signboard.model.MapboxSignboardOptions options = MapboxSignboardOptions.<init>().build());
709714
method public void cancelAll();
710-
method public void generateSignboard(com.mapbox.api.directions.v5.models.BannerInstructions instructions, com.mapbox.navigation.ui.base.util.MapboxNavigationConsumer<com.mapbox.bindgen.Expected<com.mapbox.navigation.ui.maps.guidance.signboard.model.SignboardError,com.mapbox.navigation.ui.maps.guidance.signboard.model.SignboardValue>> consumer);
715+
method @AnyThread public void generateSignboard(com.mapbox.api.directions.v5.models.BannerInstructions instructions, com.mapbox.navigation.ui.base.util.MapboxNavigationConsumer<com.mapbox.bindgen.Expected<com.mapbox.navigation.ui.maps.guidance.signboard.model.SignboardError,com.mapbox.navigation.ui.maps.guidance.signboard.model.SignboardValue>> consumer);
711716
}
712717

713718
public final class MapboxSvgToBitmapParser implements com.mapbox.navigation.ui.maps.guidance.signboard.api.SvgToBitmapParser {

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/camera/NavigationCamera.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import com.mapbox.navigation.ui.maps.camera.transition.MapboxAnimatorSet
3333
import com.mapbox.navigation.ui.maps.camera.transition.MapboxAnimatorSetListener
3434
import com.mapbox.navigation.ui.maps.camera.transition.MapboxNavigationCameraStateTransition
3535
import com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransition
36+
import com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransitionProvider
37+
import com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraStateTransitionWrapper
3638
import com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions
3739
import com.mapbox.navigation.ui.maps.camera.transition.SimplifiedFrameAnimatorsCreator
3840
import com.mapbox.navigation.ui.maps.camera.transition.TransitionEndListener
@@ -175,7 +177,7 @@ internal constructor(
175177
mapboxMap: MapboxMap,
176178
cameraPlugin: CameraAnimationsPlugin,
177179
viewportDataSource: ViewportDataSource,
178-
stateTransition: NavigationCameraStateTransition,
180+
transitionProvider: NavigationCameraStateTransitionProvider,
179181
simplifiedUpdateFrameTransitionProvider: SimplifiedUpdateFrameTransitionProvider =
180182
DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin),
181183
) : this(
@@ -185,7 +187,7 @@ internal constructor(
185187
SimplifiedFrameAnimatorsCreator(
186188
cameraPlugin,
187189
mapboxMap,
188-
stateTransition,
190+
transitionProvider,
189191
simplifiedUpdateFrameTransitionProvider,
190192
),
191193
)
@@ -220,7 +222,7 @@ internal constructor(
220222
SimplifiedFrameAnimatorsCreator(
221223
cameraPlugin,
222224
mapboxMap,
223-
stateTransition,
225+
NavigationCameraStateTransitionWrapper(stateTransition),
224226
DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin),
225227
)
226228
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.mapbox.navigation.ui.maps.camera.transition
2+
3+
import android.animation.AnimatorSet
4+
import androidx.annotation.RestrictTo
5+
import com.mapbox.maps.CameraOptions
6+
7+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
8+
interface NavigationCameraStateTransitionProvider {
9+
10+
fun transitionToFollowing(
11+
cameraOptions: CameraOptions,
12+
transitionOptions: NavigationCameraTransitionOptions,
13+
): AnimatorSet
14+
15+
fun transitionToOverview(
16+
cameraOptions: CameraOptions,
17+
transitionOptions: NavigationCameraTransitionOptions,
18+
): AnimatorSet
19+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.mapbox.navigation.ui.maps.camera.transition
2+
3+
import android.animation.AnimatorSet
4+
import com.mapbox.maps.CameraOptions
5+
6+
internal class NavigationCameraStateTransitionWrapper(
7+
private val stateTransition: NavigationCameraStateTransition,
8+
) : NavigationCameraStateTransitionProvider {
9+
10+
override fun transitionToFollowing(
11+
cameraOptions: CameraOptions,
12+
transitionOptions: NavigationCameraTransitionOptions,
13+
): AnimatorSet {
14+
return stateTransition.transitionToFollowing(cameraOptions, transitionOptions)
15+
}
16+
17+
override fun transitionToOverview(
18+
cameraOptions: CameraOptions,
19+
transitionOptions: NavigationCameraTransitionOptions,
20+
): AnimatorSet {
21+
return stateTransition.transitionToOverview(cameraOptions, transitionOptions)
22+
}
23+
}

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/camera/transition/SimplifiedFrameAnimatorsCreator.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.mapbox.navigation.ui.maps.internal.camera.SimplifiedUpdateFrameTransi
88
internal class SimplifiedFrameAnimatorsCreator(
99
private val cameraAnimationsPlugin: CameraAnimationsPlugin,
1010
private val mapboxMap: MapboxMap,
11-
private val stateTransition: NavigationCameraStateTransition,
11+
private val stateTransitionProvider: NavigationCameraStateTransitionProvider,
1212
private val simplifiedUpdateFrameTransition: SimplifiedUpdateFrameTransitionProvider,
1313
) : AnimatorsCreator {
1414

@@ -19,7 +19,7 @@ internal class SimplifiedFrameAnimatorsCreator(
1919
return FullAnimatorSet(
2020
cameraAnimationsPlugin,
2121
mapboxMap,
22-
stateTransition.transitionToFollowing(cameraOptions, transitionOptions),
22+
stateTransitionProvider.transitionToFollowing(cameraOptions, transitionOptions),
2323
)
2424
}
2525

@@ -30,7 +30,7 @@ internal class SimplifiedFrameAnimatorsCreator(
3030
return FullAnimatorSet(
3131
cameraAnimationsPlugin,
3232
mapboxMap,
33-
stateTransition.transitionToOverview(cameraOptions, transitionOptions),
33+
stateTransitionProvider.transitionToOverview(cameraOptions, transitionOptions),
3434
)
3535
}
3636

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.mapbox.navigation.ui.maps.camera.transition
2+
3+
import android.animation.AnimatorSet
4+
import com.mapbox.maps.CameraOptions
5+
import io.mockk.every
6+
import io.mockk.mockk
7+
import io.mockk.verify
8+
import org.junit.Assert.assertEquals
9+
import org.junit.Before
10+
import org.junit.Test
11+
12+
class NavigationCameraStateTransitionWrapperTest {
13+
14+
private val mockStateTransition = mockk<NavigationCameraStateTransition>()
15+
private val mockCameraOptions = mockk<CameraOptions>()
16+
private val mockTransitionOptions = mockk<NavigationCameraTransitionOptions>()
17+
private val mockAnimatorSet = mockk<AnimatorSet>()
18+
19+
private lateinit var wrapper: NavigationCameraStateTransitionWrapper
20+
21+
@Before
22+
fun setup() {
23+
wrapper = NavigationCameraStateTransitionWrapper(mockStateTransition)
24+
}
25+
26+
@Test
27+
fun `transitionToFollowing delegates to underlying state transition`() {
28+
every {
29+
mockStateTransition.transitionToFollowing(mockCameraOptions, mockTransitionOptions)
30+
} returns mockAnimatorSet
31+
32+
val result = wrapper.transitionToFollowing(mockCameraOptions, mockTransitionOptions)
33+
34+
verify {
35+
mockStateTransition.transitionToFollowing(mockCameraOptions, mockTransitionOptions)
36+
}
37+
assertEquals(mockAnimatorSet, result)
38+
}
39+
40+
@Test
41+
fun `transitionToOverview delegates to underlying state transition`() {
42+
every {
43+
mockStateTransition.transitionToOverview(mockCameraOptions, mockTransitionOptions)
44+
} returns mockAnimatorSet
45+
46+
val result = wrapper.transitionToOverview(mockCameraOptions, mockTransitionOptions)
47+
48+
verify {
49+
mockStateTransition.transitionToOverview(mockCameraOptions, mockTransitionOptions)
50+
}
51+
assertEquals(mockAnimatorSet, result)
52+
}
53+
54+
@Test
55+
fun `multiple calls to transitionToFollowing work correctly`() {
56+
val animatorSet1 = mockk<AnimatorSet>()
57+
val animatorSet2 = mockk<AnimatorSet>()
58+
val cameraOptions1 = mockk<CameraOptions>()
59+
val cameraOptions2 = mockk<CameraOptions>()
60+
val transitionOptions1 = mockk<NavigationCameraTransitionOptions>()
61+
val transitionOptions2 = mockk<NavigationCameraTransitionOptions>()
62+
63+
every {
64+
mockStateTransition.transitionToFollowing(cameraOptions1, transitionOptions1)
65+
} returns animatorSet1
66+
every {
67+
mockStateTransition.transitionToFollowing(cameraOptions2, transitionOptions2)
68+
} returns animatorSet2
69+
70+
val result1 = wrapper.transitionToFollowing(cameraOptions1, transitionOptions1)
71+
val result2 = wrapper.transitionToFollowing(cameraOptions2, transitionOptions2)
72+
73+
verify { mockStateTransition.transitionToFollowing(cameraOptions1, transitionOptions1) }
74+
verify { mockStateTransition.transitionToFollowing(cameraOptions2, transitionOptions2) }
75+
assertEquals(animatorSet1, result1)
76+
assertEquals(animatorSet2, result2)
77+
}
78+
79+
@Test
80+
fun `multiple calls to transitionToOverview work correctly`() {
81+
val animatorSet1 = mockk<AnimatorSet>()
82+
val animatorSet2 = mockk<AnimatorSet>()
83+
val cameraOptions1 = mockk<CameraOptions>()
84+
val cameraOptions2 = mockk<CameraOptions>()
85+
val transitionOptions1 = mockk<NavigationCameraTransitionOptions>()
86+
val transitionOptions2 = mockk<NavigationCameraTransitionOptions>()
87+
88+
every {
89+
mockStateTransition.transitionToOverview(cameraOptions1, transitionOptions1)
90+
} returns animatorSet1
91+
every {
92+
mockStateTransition.transitionToOverview(cameraOptions2, transitionOptions2)
93+
} returns animatorSet2
94+
95+
val result1 = wrapper.transitionToOverview(cameraOptions1, transitionOptions1)
96+
val result2 = wrapper.transitionToOverview(cameraOptions2, transitionOptions2)
97+
98+
verify { mockStateTransition.transitionToOverview(cameraOptions1, transitionOptions1) }
99+
verify { mockStateTransition.transitionToOverview(cameraOptions2, transitionOptions2) }
100+
assertEquals(animatorSet1, result1)
101+
assertEquals(animatorSet2, result2)
102+
}
103+
}

ui-maps/src/test/java/com/mapbox/navigation/ui/maps/camera/transition/SimplifiedFrameAnimatorsCreatorTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,23 @@ internal class SimplifiedFrameAnimatorsCreatorTest {
2323
}
2424
private val cameraOptions = mockk<CameraOptions>()
2525
private val transitionOptions = mockk<NavigationCameraTransitionOptions>()
26-
private val stateTransition = mockk<NavigationCameraStateTransition>(relaxed = true)
26+
private val stateTransitionProvider =
27+
mockk<NavigationCameraStateTransitionProvider>(relaxed = true)
2728
private val cameraAnimationsPlugin = mockk<CameraAnimationsPlugin>(relaxed = true)
2829
private val simplifiedUpdateFrameTransition =
2930
mockk<DefaultSimplifiedUpdateFrameTransitionProvider>(relaxed = true)
3031

3132
private val animatorsCreator = SimplifiedFrameAnimatorsCreator(
3233
cameraAnimationsPlugin,
3334
mockk(relaxed = true),
34-
stateTransition,
35+
stateTransitionProvider,
3536
simplifiedUpdateFrameTransition,
3637
)
3738

3839
@Test
3940
fun transitionToFollowing() {
4041
every {
41-
stateTransition.transitionToFollowing(cameraOptions, transitionOptions)
42+
stateTransitionProvider.transitionToFollowing(cameraOptions, transitionOptions)
4243
} returns animatorSet
4344

4445
val actual = animatorsCreator.transitionToFollowing(cameraOptions, transitionOptions)
@@ -50,7 +51,7 @@ internal class SimplifiedFrameAnimatorsCreatorTest {
5051
@Test
5152
fun transitionToOverview() {
5253
every {
53-
stateTransition.transitionToOverview(cameraOptions, transitionOptions)
54+
stateTransitionProvider.transitionToOverview(cameraOptions, transitionOptions)
5455
} returns animatorSet
5556

5657
val actual = animatorsCreator.transitionToOverview(cameraOptions, transitionOptions)

0 commit comments

Comments
 (0)