Skip to content

Commit 5de37ff

Browse files
jushgithub-actions[bot]
authored andcommitted
Use CameraChangedCoalesced instead of CameraChanged event (#9061) (#9080)
GitOrigin-RevId: ab8581c210edf6c14b8bbfcd7b0d8296b41068dd
1 parent 73c108b commit 5de37ff

File tree

6 files changed

+62
-40
lines changed

6 files changed

+62
-40
lines changed
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package com.mapbox.navigation.ui.androidauto.map.compass
22

3-
import com.mapbox.maps.CameraChangedCallback
3+
import com.mapbox.common.Cancelable
4+
import com.mapbox.maps.CameraChangedCoalescedCallback
45
import com.mapbox.maps.MapboxExperimental
56
import com.mapbox.maps.MapboxMap
67
import com.mapbox.maps.extension.androidauto.MapboxCarMapObserver
78
import com.mapbox.maps.extension.androidauto.MapboxCarMapSurface
89
import com.mapbox.maps.extension.androidauto.widgets.CompassWidget
910

10-
@OptIn(MapboxExperimental::class)
11+
@OptIn(MapboxExperimental::class, com.mapbox.annotation.MapboxExperimental::class)
1112
class CarCompassRenderer : MapboxCarMapObserver {
1213

14+
private var cameraChangedCancelable: Cancelable? = null
1315
private var mapboxMap: MapboxMap? = null
1416
private var compassWidget: CompassWidget? = null
15-
private val onCameraChangeListener = CameraChangedCallback { _ ->
16-
mapboxMap?.cameraState?.bearing?.toFloat()?.let { compassWidget?.setRotation(-it) }
17+
private val onCameraChangeListener = CameraChangedCoalescedCallback { cameraEvent ->
18+
cameraEvent.cameraState.bearing.toFloat().let { compassWidget?.setRotation(-it) }
1719
}
1820

1921
override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {
@@ -22,12 +24,14 @@ class CarCompassRenderer : MapboxCarMapObserver {
2224
val mapboxMap = mapboxCarMapSurface.mapSurface.getMapboxMap().also { mapboxMap = it }
2325
this.compassWidget = compassWidget
2426
mapboxCarMapSurface.mapSurface.addWidget(compassWidget)
25-
mapboxMap.subscribeCameraChanged(onCameraChangeListener)
27+
cameraChangedCancelable = mapboxMap.subscribeCameraChangedCoalesced(onCameraChangeListener)
2628
}
2729

2830
override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {
2931
compassWidget?.let { mapboxCarMapSurface.mapSurface.removeWidget(it) }
3032
compassWidget = null
33+
cameraChangedCancelable?.cancel()
34+
cameraChangedCancelable = null
3135
mapboxMap = null
3236
}
3337
}

ui-components/src/main/java/com/mapbox/navigation/ui/components/maps/internal/ui/CompassButtonComponent.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.mapbox.navigation.ui.components.maps.internal.ui
22

3+
import com.mapbox.annotation.MapboxExperimental
34
import com.mapbox.common.Cancelable
4-
import com.mapbox.maps.CameraChangedCallback
5+
import com.mapbox.maps.CameraChangedCoalescedCallback
56
import com.mapbox.maps.CameraOptions
67
import com.mapbox.maps.MapView
78
import com.mapbox.maps.MapboxMap
@@ -16,24 +17,26 @@ class CompassButtonComponent(
1617
) : UIComponent() {
1718

1819
private val mapboxMap: MapboxMap? = mapView?.getMapboxMap()
19-
private var onCameraChangeCallback: CameraChangedCallback? = null
20+
private var onCameraChangeCallback: CameraChangedCoalescedCallback? = null
2021
private var cameraChangedSubscription: Cancelable? = null
2122

23+
@OptIn(MapboxExperimental::class)
2224
override fun onAttached(mapboxNavigation: MapboxNavigation) {
2325
super.onAttached(mapboxNavigation)
2426

2527
if (mapboxMap != null) {
2628
compassButton.setOnClickListener {
2729
mapboxMap.flyTo(CameraOptions.Builder().bearing(.0).build())
2830
}
29-
onCameraChangeCallback = CameraChangedCallback {
30-
compassButton.iconImage.rotation = -mapboxMap.cameraState.bearing.toFloat()
31+
onCameraChangeCallback = CameraChangedCoalescedCallback {
32+
compassButton.iconImage.rotation = -it.cameraState.bearing.toFloat()
3133
}.also {
32-
cameraChangedSubscription = mapboxMap.subscribeCameraChanged(it)
34+
cameraChangedSubscription = mapboxMap.subscribeCameraChangedCoalesced(it)
3335
}
3436
}
3537
}
3638

39+
@OptIn(MapboxExperimental::class)
3740
override fun onDetached(mapboxNavigation: MapboxNavigation) {
3841
super.onDetached(mapboxNavigation)
3942
compassButton.setOnClickListener(null)

ui-components/src/test/java/com/mapbox/navigation/ui/components/maps/internal/ui/CompassButtonComponentTest.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package com.mapbox.navigation.ui.components.maps.internal.ui
22

33
import android.view.View
44
import androidx.appcompat.widget.AppCompatImageView
5+
import com.mapbox.annotation.MapboxExperimental
56
import com.mapbox.common.Cancelable
6-
import com.mapbox.maps.CameraChangedCallback
7+
import com.mapbox.maps.CameraChangedCoalesced
8+
import com.mapbox.maps.CameraChangedCoalescedCallback
79
import com.mapbox.maps.CameraOptions
10+
import com.mapbox.maps.CameraState
811
import com.mapbox.maps.MapView
912
import com.mapbox.maps.MapboxMap
1013
import com.mapbox.maps.plugin.animation.flyTo
@@ -21,6 +24,7 @@ import org.junit.Assert.assertEquals
2124
import org.junit.Before
2225
import org.junit.Test
2326

27+
@OptIn(MapboxExperimental::class)
2428
class CompassButtonComponentTest {
2529

2630
private val mapboxMap = mockk<MapboxMap>(relaxed = true)
@@ -61,17 +65,17 @@ class CompassButtonComponentTest {
6165
component.onAttached(mapboxNavigation)
6266

6367
verify(exactly = 1) { compassButton.setOnClickListener(any()) }
64-
verify(exactly = 1) { mapboxMap.subscribeCameraChanged(any()) }
68+
verify(exactly = 1) { mapboxMap.subscribeCameraChangedCoalesced(any()) }
6569
}
6670

6771
@Test
6872
fun `onDetached`() {
6973
val cameraChangedTask = mockk<Cancelable>(relaxed = true)
70-
every { mapboxMap.subscribeCameraChanged(any()) } returns cameraChangedTask
71-
val cameraCallbacks = mutableListOf<CameraChangedCallback>()
74+
every { mapboxMap.subscribeCameraChangedCoalesced(any()) } returns cameraChangedTask
75+
val cameraCallbacks = mutableListOf<CameraChangedCoalescedCallback>()
7276
component = CompassButtonComponent(compassButton, mapView)
7377
component.onAttached(mapboxNavigation)
74-
verify(exactly = 1) { mapboxMap.subscribeCameraChanged(capture(cameraCallbacks)) }
78+
verify(exactly = 1) { mapboxMap.subscribeCameraChangedCoalesced(capture(cameraCallbacks)) }
7579

7680
component.onDetached(mapboxNavigation)
7781

@@ -96,17 +100,16 @@ class CompassButtonComponentTest {
96100
@Test
97101
fun `camera state change rotates the image accordingly`() {
98102
val cameraChangedTask = mockk<Cancelable>()
99-
every { mapboxMap.subscribeCameraChanged(any()) } returns cameraChangedTask
100-
val cameraCallbacks = mutableListOf<CameraChangedCallback>()
103+
every { mapboxMap.subscribeCameraChangedCoalesced(any()) } returns cameraChangedTask
104+
val cameraCallbacks = mutableListOf<CameraChangedCoalescedCallback>()
101105
component = CompassButtonComponent(compassButton, mapView)
102106

103107
component.onAttached(mapboxNavigation)
104108

105-
verify(exactly = 1) { mapboxMap.subscribeCameraChanged(capture(cameraCallbacks)) }
106-
every { mapboxMap.cameraState } returns mockk {
107-
every { bearing } returns 78.12
108-
}
109-
cameraCallbacks.first().run(mockk())
109+
verify(exactly = 1) { mapboxMap.subscribeCameraChangedCoalesced(capture(cameraCallbacks)) }
110+
val cameraState = mockk<CameraState>()
111+
every { cameraState.bearing } returns 78.12
112+
cameraCallbacks.first().run(CameraChangedCoalesced(cameraState, mockk()))
110113
verify { iconImage.rotation = -78.12f }
111114
}
112115
}

ui-maps/src/main/java/com/mapbox/navigation/ui/maps/camera/data/debugger/MapboxNavigationViewportDataSourceDebugger.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import android.graphics.Color
55
import android.view.View
66
import android.widget.FrameLayout
77
import androidx.core.content.ContextCompat
8+
import com.mapbox.annotation.MapboxExperimental
89
import com.mapbox.common.Cancelable
910
import com.mapbox.geojson.Feature
1011
import com.mapbox.geojson.FeatureCollection
1112
import com.mapbox.geojson.LineString
1213
import com.mapbox.geojson.Point
13-
import com.mapbox.maps.CameraChangedCallback
14+
import com.mapbox.maps.CameraChangedCoalescedCallback
1415
import com.mapbox.maps.EdgeInsets
1516
import com.mapbox.maps.MapView
1617
import com.mapbox.maps.extension.style.layers.addLayer
@@ -83,7 +84,9 @@ class MapboxNavigationViewportDataSourceDebugger @JvmOverloads constructor(
8384
mapView.addView(mapPaddingBorder)
8485
mapView.addView(userPaddingBorder)
8586
mapView.addView(cameraCenter)
86-
cameraChangedSubscription = mapboxMap.subscribeCameraChanged(cameraChangeCallback)
87+
cameraChangedSubscription = mapboxMap.subscribeCameraChangedCoalesced(
88+
cameraChangeCallback,
89+
)
8790
} else {
8891
mapView.removeView(cameraCenter)
8992
mapView.removeView(userPaddingBorder)
@@ -92,8 +95,9 @@ class MapboxNavigationViewportDataSourceDebugger @JvmOverloads constructor(
9295
mapboxMap.getStyle()?.removeStyleLayer(pointsLayerId)
9396
mapboxMap.getStyle()?.removeStyleSource(pointsSourceId)
9497
}
95-
updateMapCameraCenter()
96-
updateMapPadding()
98+
val initialCameraState = mapboxMap.cameraState
99+
updateMapCameraCenter(initialCameraState.center)
100+
updateMapPadding(initialCameraState.padding)
97101
updateUserPadding()
98102
updatePoints()
99103
}
@@ -143,23 +147,22 @@ class MapboxNavigationViewportDataSourceDebugger @JvmOverloads constructor(
143147
setBackgroundColor(Color.RED)
144148
}
145149

146-
private val cameraChangeCallback = CameraChangedCallback {
150+
@OptIn(MapboxExperimental::class)
151+
private val cameraChangeCallback = CameraChangedCoalescedCallback {
147152
mapView.post {
148-
updateMapCameraCenter()
149-
updateMapPadding()
153+
updateMapCameraCenter(it.cameraState.center)
154+
updateMapPadding(it.cameraState.padding)
150155
}
151156
}
152157
private var cameraChangedSubscription: Cancelable? = null
153158

154-
private fun updateMapCameraCenter() {
155-
val center = mapboxMap.pixelForCoordinate(mapboxMap.cameraState.center)
159+
private fun updateMapCameraCenter(cameraStateCenter: Point) {
160+
val center = mapboxMap.pixelForCoordinate(cameraStateCenter)
156161
cameraCenter.x = center.x.toFloat() - cameraCenter.width / 2
157162
cameraCenter.y = center.y.toFloat() - cameraCenter.height / 2
158163
}
159164

160-
private fun updateMapPadding() {
161-
val padding = mapboxMap.cameraState.padding
162-
165+
private fun updateMapPadding(padding: EdgeInsets) {
163166
val width = (mapView.width - padding.left - padding.right).toInt()
164167
val height = (mapView.height - padding.top - padding.bottom).toInt()
165168
val params = mapPaddingBorder.layoutParams

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import androidx.annotation.UiThread
66
import com.mapbox.android.gestures.AndroidGesturesManager
77
import com.mapbox.android.gestures.MoveGestureDetector
88
import com.mapbox.android.gestures.RotateGestureDetector
9+
import com.mapbox.annotation.MapboxExperimental
910
import com.mapbox.common.Cancelable
1011
import com.mapbox.geojson.Point
11-
import com.mapbox.maps.CameraChangedCallback
12+
import com.mapbox.maps.CameraChangedCoalescedCallback
1213
import com.mapbox.maps.MapboxMap
1314
import com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener
1415
import com.mapbox.maps.plugin.animation.CameraAnimationsPlugin
@@ -263,7 +264,8 @@ class NavigationScaleGestureHandler(
263264
puckScreenPosition = point.also { adjustFocalPoint(it) }
264265
}
265266

266-
private val onCameraChangedCallback = CameraChangedCallback {
267+
@OptIn(MapboxExperimental::class)
268+
private val onCameraChangedCallback = CameraChangedCoalescedCallback {
267269
puckScreenPosition?.let { adjustFocalPoint(it) }
268270
}
269271
private var cameraChangedSubscription: Cancelable? = null
@@ -318,7 +320,10 @@ class NavigationScaleGestureHandler(
318320

319321
userLocationIndicatorPositionProvider.addObserver(onIndicatorPositionChangedListener)
320322

321-
cameraChangedSubscription = mapboxMap.subscribeCameraChanged(onCameraChangedCallback)
323+
@OptIn(MapboxExperimental::class)
324+
cameraChangedSubscription = mapboxMap.subscribeCameraChangedCoalesced(
325+
onCameraChangedCallback,
326+
)
322327

323328
navigationCamera.registerNavigationCameraStateChangeObserver(
324329
navigationCameraStateChangedObserver,

ui-maps/src/test/java/com/mapbox/navigation/ui/maps/camera/lifecycle/NavigationScaleGestureHandlerTest.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import android.content.Context
44
import com.mapbox.android.gestures.AndroidGesturesManager
55
import com.mapbox.android.gestures.MoveGestureDetector
66
import com.mapbox.android.gestures.RotateGestureDetector
7+
import com.mapbox.annotation.MapboxExperimental
78
import com.mapbox.common.Cancelable
89
import com.mapbox.geojson.Point
9-
import com.mapbox.maps.CameraChangedCallback
10+
import com.mapbox.maps.CameraChangedCoalescedCallback
1011
import com.mapbox.maps.MapboxMap
1112
import com.mapbox.maps.ScreenCoordinate
1213
import com.mapbox.maps.plugin.animation.CameraAnimatorType
@@ -70,7 +71,9 @@ class NavigationScaleGestureHandlerTest {
7071
private val customGesturesInteractorSlot = slot<(AndroidGesturesManager) -> Unit>()
7172
private val onMoveListenerSlot = slot<OnMoveListener>()
7273
private val onIndicatorPositionChangedListenerSlot = slot<OnIndicatorPositionChangedListener>()
73-
private val cameraChangedCallbackSlot = slot<CameraChangedCallback>()
74+
75+
@OptIn(MapboxExperimental::class)
76+
private val cameraChangedCallbackSlot = slot<CameraChangedCoalescedCallback>()
7477
private val cameraChangedTask = mockk<Cancelable>(relaxed = true)
7578
private val navigationCameraStateChangedObserverSlot =
7679
slot<NavigationCameraStateChangedObserver>()
@@ -107,7 +110,8 @@ class NavigationScaleGestureHandlerTest {
107110
)
108111
} just Runs
109112
every {
110-
mapboxMap.subscribeCameraChanged(capture(cameraChangedCallbackSlot))
113+
@OptIn(MapboxExperimental::class)
114+
mapboxMap.subscribeCameraChangedCoalesced(capture(cameraChangedCallbackSlot))
111115
} returns cameraChangedTask
112116
every {
113117
navigationCamera.registerNavigationCameraStateChangeObserver(

0 commit comments

Comments
 (0)