Skip to content

Commit 8cfbe6c

Browse files
yuryybkgithub-actions[bot]
authored andcommitted
NAVAND-5941 Let Map SDK to normalize bearing (#9900)
* NAVAND-5941 Rely on Map SDK to normalize bearing inside for Animators GitOrigin-RevId: e6383acd8f6f1761d01425837e77c5665c30b10e
1 parent 6c65596 commit 8cfbe6c

File tree

5 files changed

+30
-63
lines changed

5 files changed

+30
-63
lines changed

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mapbox.navigation.ui.maps.camera
22

3+
import android.os.SystemClock
34
import androidx.annotation.RestrictTo
45
import androidx.annotation.UiThread
56
import androidx.annotation.VisibleForTesting
@@ -37,6 +38,7 @@ import com.mapbox.navigation.ui.maps.camera.transition.SimplifiedFrameAnimatorsC
3738
import com.mapbox.navigation.ui.maps.camera.transition.TransitionEndListener
3839
import com.mapbox.navigation.ui.maps.camera.transition.UpdateFrameAnimatorsOptions
3940
import com.mapbox.navigation.ui.maps.internal.camera.SimplifiedUpdateFrameTransitionProvider
41+
import com.mapbox.navigation.utils.internal.logI
4042
import java.util.concurrent.CopyOnWriteArraySet
4143

4244
/**
@@ -175,7 +177,7 @@ internal constructor(
175177
viewportDataSource: ViewportDataSource,
176178
stateTransition: NavigationCameraStateTransition,
177179
simplifiedUpdateFrameTransitionProvider: SimplifiedUpdateFrameTransitionProvider =
178-
DefaultSimplifiedUpdateFrameTransitionProvider(mapboxMap, cameraPlugin),
180+
DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin),
179181
) : this(
180182
mapboxMap,
181183
cameraPlugin,
@@ -189,6 +191,10 @@ internal constructor(
189191
)
190192

191193
companion object {
194+
195+
private const val LOG_CATEGORY = "NavigationCamera"
196+
private const val LOG_CAMERA_STATE_SAMPLING_PERIOD_MILLIS = 1000L
197+
192198
/**
193199
* Constant used to recognize the owner of transitions initiated by the [NavigationCamera].
194200
*
@@ -215,7 +221,7 @@ internal constructor(
215221
cameraPlugin,
216222
mapboxMap,
217223
stateTransition,
218-
DefaultSimplifiedUpdateFrameTransitionProvider(mapboxMap, cameraPlugin),
224+
DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin),
219225
)
220226
}
221227
false -> {
@@ -257,9 +263,18 @@ internal constructor(
257263
updateDebugger()
258264
}
259265

266+
private var lastCameraStateLogTime = 0L
260267
private val sourceUpdateObserver =
261-
ViewportDataSourceUpdateObserver {
262-
viewportData ->
268+
ViewportDataSourceUpdateObserver { viewportData ->
269+
val currentTime = SystemClock.elapsedRealtime()
270+
if (currentTime - lastCameraStateLogTime >= LOG_CAMERA_STATE_SAMPLING_PERIOD_MILLIS) {
271+
logI(
272+
"Current camera state = ${mapboxMap.cameraState}, " +
273+
"viewport update = $viewportData",
274+
LOG_CATEGORY,
275+
)
276+
lastCameraStateLogTime = currentTime
277+
}
263278
updateFrame(viewportData, instant = false)
264279
}
265280

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@ package com.mapbox.navigation.ui.maps.camera.transition
33
import android.animation.ValueAnimator
44
import androidx.core.view.animation.PathInterpolatorCompat
55
import com.mapbox.maps.CameraOptions
6-
import com.mapbox.maps.MapboxMap
76
import com.mapbox.maps.plugin.animation.CameraAnimationsPlugin
87
import com.mapbox.maps.plugin.animation.CameraAnimatorOptions
98
import com.mapbox.navigation.ui.maps.camera.NavigationCamera.Companion.NAVIGATION_CAMERA_OWNER
109
import com.mapbox.navigation.ui.maps.internal.camera.SimplifiedUpdateFrameTransitionProvider
11-
import com.mapbox.navigation.ui.maps.internal.camera.normalizeBearing
1210

1311
internal class DefaultSimplifiedUpdateFrameTransitionProvider(
14-
private val mapboxMap: MapboxMap,
1512
private val cameraPlugin: CameraAnimationsPlugin,
1613
) : SimplifiedUpdateFrameTransitionProvider {
1714

@@ -43,6 +40,7 @@ internal class DefaultSimplifiedUpdateFrameTransitionProvider(
4340
CameraAnimatorOptions.cameraAnimatorOptions(center) {
4441
owner(NAVIGATION_CAMERA_OWNER)
4542
},
43+
false,
4644
) {
4745
duration = animationDuration
4846
interpolator = LINEAR_INTERPOLATOR
@@ -63,9 +61,8 @@ internal class DefaultSimplifiedUpdateFrameTransitionProvider(
6361
}
6462

6563
cameraOptions.bearing?.let { bearing ->
66-
val bearingShortestRotation = normalizeBearing(mapboxMap.cameraState.bearing, bearing)
6764
val bearingAnimator = cameraPlugin.createBearingAnimator(
68-
CameraAnimatorOptions.cameraAnimatorOptions(bearingShortestRotation) {
65+
CameraAnimatorOptions.cameraAnimatorOptions(bearing) {
6966
owner(NAVIGATION_CAMERA_OWNER)
7067
},
7168
) {

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import com.mapbox.navigation.ui.maps.camera.utils.getAnimatorsFactory
1616
import com.mapbox.navigation.ui.maps.camera.utils.normalizeProjection
1717
import com.mapbox.navigation.ui.maps.camera.utils.projectedDistance
1818
import com.mapbox.navigation.ui.maps.internal.camera.constraintDurationTo
19-
import com.mapbox.navigation.ui.maps.internal.camera.normalizeBearing
2019
import com.mapbox.navigation.utils.internal.ifNonNull
2120
import kotlin.math.abs
2221
import kotlin.math.min
@@ -38,7 +37,7 @@ class MapboxNavigationCameraTransition @VisibleForTesting internal constructor(
3837
) : this(
3938
mapboxMap,
4039
cameraPlugin,
41-
DefaultSimplifiedUpdateFrameTransitionProvider(mapboxMap, cameraPlugin),
40+
DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin),
4241
)
4342

4443
override fun transitionFromLowZoomToHighZoom(
@@ -62,6 +61,7 @@ class MapboxNavigationCameraTransition @VisibleForTesting internal constructor(
6261
CameraAnimatorOptions.cameraAnimatorOptions(center) {
6362
owner(NAVIGATION_CAMERA_OWNER)
6463
},
64+
useShortestPath = false,
6565
) {
6666
startDelay = 800
6767
duration = 1000
@@ -84,9 +84,8 @@ class MapboxNavigationCameraTransition @VisibleForTesting internal constructor(
8484
}
8585

8686
cameraOptions.bearing?.let { bearing ->
87-
val bearingShortestRotation = normalizeBearing(currentMapCameraState.bearing, bearing)
8887
val bearingAnimator = cameraPlugin.createBearingAnimator(
89-
CameraAnimatorOptions.cameraAnimatorOptions(bearingShortestRotation) {
88+
CameraAnimatorOptions.cameraAnimatorOptions(bearing) {
9089
owner(NAVIGATION_CAMERA_OWNER)
9190
},
9291
) {

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

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,18 @@ import android.animation.ValueAnimator
44
import com.mapbox.maps.CameraOptions
55
import com.mapbox.maps.MapboxMap
66
import com.mapbox.maps.plugin.animation.CameraAnimationsPlugin
7-
import com.mapbox.maps.plugin.animation.CameraAnimatorOptions
8-
import com.mapbox.navigation.ui.maps.camera.NavigationCamera.Companion.DEFAULT_FRAME_TRANSITION_OPT
9-
import com.mapbox.navigation.ui.maps.internal.camera.normalizeBearing
107
import io.mockk.every
118
import io.mockk.mockk
12-
import io.mockk.mockkStatic
139
import io.mockk.slot
14-
import io.mockk.unmockkStatic
1510
import io.mockk.verify
16-
import org.junit.After
1711
import org.junit.Assert.assertEquals
18-
import org.junit.Before
1912
import org.junit.Test
2013

2114
class DefaultSimplifiedUpdateFrameTransitionProviderTest {
2215

2316
private val mapboxMap: MapboxMap = mockk(relaxed = true)
2417
private val cameraPlugin: CameraAnimationsPlugin = mockk(relaxed = true)
25-
private val updateFrame = DefaultSimplifiedUpdateFrameTransitionProvider(
26-
mapboxMap,
27-
cameraPlugin,
28-
)
29-
30-
@Before
31-
fun setUp() {
32-
mockkStatic(::normalizeBearing)
33-
}
34-
35-
@After
36-
fun tearDown() {
37-
unmockkStatic(::normalizeBearing)
38-
}
39-
40-
@Test
41-
fun `transitionLinear - bearing is normalized`() {
42-
every { mapboxMap.cameraState } returns mockk {
43-
every { bearing } returns 10.0
44-
}
45-
val cameraOptions = CameraOptions.Builder()
46-
.bearing(350.0)
47-
.build()
48-
49-
val valueSlot = slot<CameraAnimatorOptions<Double>>()
50-
every {
51-
cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())
52-
} returns mockk()
53-
updateFrame.updateFrame(cameraOptions, DEFAULT_FRAME_TRANSITION_OPT)
54-
55-
assertEquals(-10.0, valueSlot.captured.targets.last(), 0.0000000001)
56-
verify { normalizeBearing(10.0, 350.0) }
57-
}
18+
private val updateFrame = DefaultSimplifiedUpdateFrameTransitionProvider(cameraPlugin)
5819

5920
@Test
6021
fun updateFrame() {
@@ -93,7 +54,7 @@ class DefaultSimplifiedUpdateFrameTransitionProviderTest {
9354
val zoomAnimator = mockk<ValueAnimator>(relaxed = true)
9455
val paddingAnimator = mockk<ValueAnimator>(relaxed = true)
9556
every {
96-
cameraPlugin.createCenterAnimator(any(), any<(ValueAnimator.() -> Unit)>())
57+
cameraPlugin.createCenterAnimator(any(), any(), any<(ValueAnimator.() -> Unit)>())
9758
} returns centerAnimator
9859
every { cameraPlugin.createBearingAnimator(any(), any(), any()) } returns bearingAnimator
9960
every { cameraPlugin.createPitchAnimator(any(), any()) } returns pitchAnimator
@@ -111,6 +72,7 @@ class DefaultSimplifiedUpdateFrameTransitionProviderTest {
11172
verify {
11273
cameraPlugin.createCenterAnimator(
11374
any(),
75+
useShortestPath = any(),
11476
capture(centerBlockSlot),
11577
)
11678
}

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import com.mapbox.navigation.ui.maps.camera.utils.normalizeProjection
1818
import com.mapbox.navigation.ui.maps.camera.utils.projectedDistance
1919
import com.mapbox.navigation.ui.maps.camera.utils.screenDistanceFromMapCenterToTarget
2020
import com.mapbox.navigation.ui.maps.internal.camera.constraintDurationTo
21-
import com.mapbox.navigation.ui.maps.internal.camera.normalizeBearing
2221
import io.mockk.every
2322
import io.mockk.mockk
2423
import io.mockk.mockkStatic
@@ -51,7 +50,7 @@ class MapboxNavigationCameraTransitionTest {
5150
every { projectedDistance(any(), any(), any(), any()) } returns 1300.0
5251
every { screenDistanceFromMapCenterToTarget(mapboxMap, any(), any()) } returns 1000.0
5352
every {
54-
cameraPlugin.createCenterAnimator(any(), any<(ValueAnimator.() -> Unit)>())
53+
cameraPlugin.createCenterAnimator(any(), any(), any<(ValueAnimator.() -> Unit)>())
5554
} returns mockk()
5655
every { cameraPlugin.createBearingAnimator(any(), any(), any()) } returns mockk()
5756
every { cameraPlugin.createPitchAnimator(any(), any()) } returns mockk()
@@ -84,7 +83,7 @@ class MapboxNavigationCameraTransitionTest {
8483
}
8584

8685
@Test
87-
fun `transitionFromHighZoomToLowZoom - bearing is normalized`() {
86+
fun `test transitionFromHighZoomToLowZoom - bearing is normalized`() {
8887
every { mapboxMap.cameraState } returns mockk {
8988
every { bearing } returns 10.0
9089
}
@@ -98,9 +97,6 @@ class MapboxNavigationCameraTransitionTest {
9897
cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())
9998
} returns mockk()
10099
transitions.transitionFromHighZoomToLowZoom(cameraOptions, DEFAULT_STATE_TRANSITION_OPT)
101-
102-
assertEquals(-10.0, valueSlot.captured.targets.last(), 0.0000000001)
103-
verify { normalizeBearing(10.0, 350.0) }
104100
}
105101

106102
@Test
@@ -117,9 +113,6 @@ class MapboxNavigationCameraTransitionTest {
117113
cameraPlugin.createBearingAnimator(capture(valueSlot), any(), any())
118114
} returns mockk()
119115
transitions.transitionLinear(cameraOptions, DEFAULT_FRAME_TRANSITION_OPT)
120-
121-
assertEquals(-10.0, valueSlot.captured.targets.last(), 0.0000000001)
122-
verify { normalizeBearing(10.0, 350.0) }
123116
}
124117

125118
@Test
@@ -157,6 +150,7 @@ class MapboxNavigationCameraTransitionTest {
157150
val centerBlockSlot = slot<(ValueAnimator.() -> Unit)>()
158151
verify {
159152
cameraPlugin.createCenterAnimator(
153+
any(),
160154
any(),
161155
capture(centerBlockSlot),
162156
)

0 commit comments

Comments
 (0)