Skip to content

Commit 06ce220

Browse files
committed
use point annotation options instead of map marker factory
1 parent 59ea17a commit 06ce220

File tree

10 files changed

+79
-81
lines changed

10 files changed

+79
-81
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Mapbox welcomes participation and contributions from everyone.
77
#### Bug fixes and improvements
88
- Optimized calls to modify route arrow layer visibility. [#6308](https://github.com/mapbox/mapbox-navigation-android/pull/6308)
99
- Provide better java support for `MapboxNavigationApp`. [#6292](https://github.com/mapbox/mapbox-navigation-android/pull/6292)
10+
- Expose `PointAnnotationOptions` in Drop-In UI to allow users to define the destination marker icon and it's positioning. [#6314](https://github.com/mapbox/mapbox-navigation-android/pull/6314)
1011

1112
## Mapbox Navigation SDK 2.8.0-beta.3 - 09 September, 2022
1213
### Changelog

libnavui-dropin/api/current.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ package com.mapbox.navigation.dropin {
180180
ctor public ViewStyleCustomization();
181181
method public Integer? getAudioGuidanceButtonStyle();
182182
method public Integer? getCameraModeButtonStyle();
183-
method public Integer? getDestinationMarker();
183+
method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions? getDestinationMarkerAnnotationOptions();
184184
method public Integer? getEndNavigationButtonStyle();
185185
method public Integer? getInfoPanelBackground();
186186
method public Integer? getInfoPanelMarginEnd();
@@ -197,7 +197,7 @@ package com.mapbox.navigation.dropin {
197197
method public Integer? getTripProgressStyle();
198198
method public void setAudioGuidanceButtonStyle(Integer?);
199199
method public void setCameraModeButtonStyle(Integer?);
200-
method public void setDestinationMarker(Integer?);
200+
method public void setDestinationMarkerAnnotationOptions(com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions?);
201201
method public void setEndNavigationButtonStyle(Integer?);
202202
method public void setInfoPanelBackground(Integer?);
203203
method public void setInfoPanelMarginEnd(Integer?);
@@ -214,7 +214,7 @@ package com.mapbox.navigation.dropin {
214214
method public void setTripProgressStyle(Integer?);
215215
property public final Integer? audioGuidanceButtonStyle;
216216
property public final Integer? cameraModeButtonStyle;
217-
property public final Integer? destinationMarker;
217+
property public final com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions? destinationMarkerAnnotationOptions;
218218
property public final Integer? endNavigationButtonStyle;
219219
property public final Integer? infoPanelBackground;
220220
property public final Integer? infoPanelMarginEnd;
@@ -235,13 +235,13 @@ package com.mapbox.navigation.dropin {
235235
public static final class ViewStyleCustomization.Companion {
236236
method @StyleRes public int defaultAudioGuidanceButtonStyle();
237237
method @StyleRes public int defaultCameraModeButtonStyle();
238-
method @DrawableRes public int defaultDestinationMarker();
239238
method @StyleRes public int defaultEndNavigationButtonStyle();
240239
method @DrawableRes public int defaultInfoPanelBackground();
241240
method @Px public int defaultInfoPanelMarginEnd();
242241
method @Px public int defaultInfoPanelMarginStart();
243242
method @Px public int defaultInfoPanelPeekHeight(android.content.Context context);
244243
method public com.mapbox.navigation.ui.maneuver.model.ManeuverViewOptions defaultManeuverViewOptions();
244+
method public com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions defaultMarkerAnnotationOptions(android.content.Context context);
245245
method @StyleRes public int defaultRecenterButtonStyle();
246246
method @DrawableRes public int defaultRoadNameBackground();
247247
method @StyleRes public int defaultRoadNameTextAppearance();

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/NavigationViewStyles.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mapbox.navigation.dropin
22

33
import android.content.Context
4+
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions
45
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
56
import com.mapbox.navigation.ui.maneuver.model.ManeuverViewOptions
67
import kotlinx.coroutines.flow.MutableStateFlow
@@ -36,14 +37,14 @@ internal class NavigationViewStyles(context: Context) {
3637
MutableStateFlow(ViewStyleCustomization.defaultSpeedLimitStyle())
3738
private var _speedLimitTextAppearance: MutableStateFlow<Int> =
3839
MutableStateFlow(ViewStyleCustomization.defaultSpeedLimitTextAppearance())
39-
private var _destinationMarker: MutableStateFlow<Int> =
40-
MutableStateFlow(ViewStyleCustomization.defaultDestinationMarker())
4140
private var _roadNameBackground: MutableStateFlow<Int> =
4241
MutableStateFlow(ViewStyleCustomization.defaultRoadNameBackground())
4342
private var _roadNameTextAppearance: MutableStateFlow<Int> =
4443
MutableStateFlow(ViewStyleCustomization.defaultRoadNameTextAppearance())
4544
private var _maneuverViewOptions: MutableStateFlow<ManeuverViewOptions> =
4645
MutableStateFlow(ViewStyleCustomization.defaultManeuverViewOptions())
46+
private var _destinationMarkerAnnotationOptions: MutableStateFlow<PointAnnotationOptions> =
47+
MutableStateFlow(ViewStyleCustomization.defaultMarkerAnnotationOptions(context))
4748

4849
val infoPanelPeekHeight: StateFlow<Int> = _infoPanelPeekHeight.asStateFlow()
4950
val infoPanelMarginStart: StateFlow<Int> = _infoPanelMarginStart.asStateFlow()
@@ -58,7 +59,8 @@ internal class NavigationViewStyles(context: Context) {
5859
val startNavigationButtonStyle: StateFlow<Int> = _startNavigationButtonStyle.asStateFlow()
5960
val speedLimitStyle: StateFlow<Int> = _speedLimitStyle.asStateFlow()
6061
val speedLimitTextAppearance: StateFlow<Int> = _speedLimitTextAppearance.asStateFlow()
61-
val destinationMarker: StateFlow<Int> = _destinationMarker.asStateFlow()
62+
val destinationMarkerAnnotationOptions: StateFlow<PointAnnotationOptions> =
63+
_destinationMarkerAnnotationOptions.asStateFlow()
6264
val roadNameBackground: StateFlow<Int> = _roadNameBackground.asStateFlow()
6365
val roadNameTextAppearance: StateFlow<Int> = _roadNameTextAppearance.asStateFlow()
6466
val maneuverViewOptions: StateFlow<ManeuverViewOptions> = _maneuverViewOptions.asStateFlow()
@@ -78,7 +80,9 @@ internal class NavigationViewStyles(context: Context) {
7880
customization.speedLimitStyle?.also { _speedLimitStyle.tryEmit(it) }
7981
customization.maneuverViewOptions?.also { _maneuverViewOptions.tryEmit(it) }
8082
customization.speedLimitTextAppearance?.also { _speedLimitTextAppearance.tryEmit(it) }
81-
customization.destinationMarker?.also { _destinationMarker.tryEmit(it) }
83+
customization.destinationMarkerAnnotationOptions?.also {
84+
_destinationMarkerAnnotationOptions.tryEmit(it)
85+
}
8286
customization.roadNameBackground?.also { _roadNameBackground.tryEmit(it) }
8387
customization.roadNameTextAppearance?.also { _roadNameTextAppearance.tryEmit(it) }
8488
}

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/ViewStyleCustomization.kt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import android.content.Context
44
import androidx.annotation.DrawableRes
55
import androidx.annotation.Px
66
import androidx.annotation.StyleRes
7+
import androidx.core.content.ContextCompat
8+
import androidx.core.graphics.drawable.toBitmap
79
import com.google.android.material.resources.TextAppearance
10+
import com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor
11+
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions
812
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
913
import com.mapbox.navigation.ui.base.view.MapboxExtendableButton
1014
import com.mapbox.navigation.ui.maneuver.model.ManeuverExitOptions
@@ -55,11 +59,10 @@ class ViewStyleCustomization {
5559
var infoPanelBackground: Int? = null
5660

5761
/**
58-
* Provide custom destination marker icon.
59-
* Use [defaultDestinationMarker] to reset to default.
62+
* Provide [PointAnnotationOptions] for destination marker.
63+
* Use [defaultMarkerAnnotationOptions] to reset to default.
6064
*/
61-
@DrawableRes
62-
var destinationMarker: Int? = null
65+
var destinationMarkerAnnotationOptions: PointAnnotationOptions? = null
6366

6467
/**
6568
* Provide custom [MapboxRoadNameView] background.
@@ -171,10 +174,18 @@ class ViewStyleCustomization {
171174
fun defaultInfoPanelBackground(): Int = R.drawable.mapbox_bg_info_panel
172175

173176
/**
174-
* Default destination marker icon.
177+
* Default [PointAnnotationOptions] for showing destination marker.
175178
*/
176-
@DrawableRes
177-
fun defaultDestinationMarker(): Int = R.drawable.mapbox_ic_destination_marker
179+
fun defaultMarkerAnnotationOptions(context: Context): PointAnnotationOptions =
180+
PointAnnotationOptions().apply {
181+
withIconImage(
182+
ContextCompat.getDrawable(
183+
context,
184+
R.drawable.mapbox_ic_destination_marker
185+
)!!.toBitmap()
186+
)
187+
withIconAnchor(IconAnchor.BOTTOM)
188+
}
178189

179190
/**
180191
* Default [MapboxRoadNameView] background.

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/binder/map/MapBinder.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ internal class MapBinder(
6565
},
6666
CameraComponent(store, mapView),
6767
reloadOnChange(
68-
context.styles.destinationMarker
69-
) { marker ->
70-
MapMarkersComponent(store, mapView, marker)
68+
context.styles.destinationMarkerAnnotationOptions
69+
) { markerAnnotationOptions ->
70+
MapMarkersComponent(store, mapView, markerAnnotationOptions)
7171
},
7272
reloadOnChange(navigationState) {
7373
longPressMapComponent(it)

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/component/marker/MapMarkersComponent.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.mapbox.navigation.dropin.component.marker
22

3-
import androidx.annotation.DrawableRes
43
import com.mapbox.maps.MapView
54
import com.mapbox.maps.plugin.annotation.annotations
5+
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions
66
import com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager
77
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
88
import com.mapbox.navigation.core.MapboxNavigation
@@ -16,12 +16,9 @@ import com.mapbox.navigation.ui.base.lifecycle.UIComponent
1616
internal open class MapMarkersComponent(
1717
private val store: Store,
1818
protected val mapView: MapView,
19-
@DrawableRes val iconImage: Int,
19+
private val markerAnnotationOptions: PointAnnotationOptions,
2020
) : UIComponent() {
2121

22-
private val mapMarkerFactory by lazy {
23-
MapMarkerFactory.create(mapView.context)
24-
}
2522
private var annotationManager = mapView.annotations.createPointAnnotationManager()
2623

2724
override fun onAttached(mapboxNavigation: MapboxNavigation) {
@@ -31,8 +28,11 @@ internal open class MapMarkersComponent(
3128
.observe { point ->
3229
annotationManager.deleteAll()
3330
if (point != null) {
34-
val annotation = mapMarkerFactory.createPin(point, iconImage)
35-
annotationManager.create(annotation)
31+
annotationManager.create(
32+
markerAnnotationOptions.apply {
33+
withPoint(point)
34+
}
35+
)
3636
}
3737
}
3838
}

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/internal/MapboxNavigationViewApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ internal class MapboxNavigationViewApi(
148148
}
149149

150150
private fun NavigationRoute.getDestination(): Point? {
151-
return directionsResponse.waypoints()?.lastOrNull()?.location()
151+
return routeOptions.coordinatesList().lastOrNull()
152152
}
153153
}
154154

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/component/marker/MapMarkersComponentTest.kt

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,15 @@ import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager
77
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions
88
import com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager
99
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
10-
import com.mapbox.navigation.dropin.R
1110
import com.mapbox.navigation.dropin.util.TestStore
1211
import com.mapbox.navigation.testing.MainCoroutineRule
1312
import com.mapbox.navigation.ui.app.internal.State
1413
import com.mapbox.navigation.ui.app.internal.destination.Destination
15-
import io.mockk.MockKAnnotations
1614
import io.mockk.every
17-
import io.mockk.impl.annotations.MockK
1815
import io.mockk.mockk
19-
import io.mockk.mockkObject
20-
import io.mockk.unmockkObject
2116
import io.mockk.verify
2217
import io.mockk.verifyOrder
2318
import kotlinx.coroutines.ExperimentalCoroutinesApi
24-
import org.junit.After
2519
import org.junit.Before
2620
import org.junit.Rule
2721
import org.junit.Test
@@ -33,21 +27,12 @@ internal class MapMarkersComponentTest {
3327
var coroutineRule = MainCoroutineRule()
3428

3529
private lateinit var sut: MapMarkersComponent
36-
37-
@MockK
38-
lateinit var mockAnnotationFactory: MapMarkerFactory
39-
40-
@MockK
41-
lateinit var mockAnnotationManager: PointAnnotationManager
42-
4330
private lateinit var testStore: TestStore
31+
private var mockAnnotationManager: PointAnnotationManager = mockk(relaxed = true)
32+
private var annotation: PointAnnotationOptions = mockk(relaxed = true)
4433

4534
@Before
4635
fun setUp() {
47-
mockkObject(MapMarkerFactory)
48-
MockKAnnotations.init(this, relaxUnitFun = true)
49-
every { MapMarkerFactory.create(any()) } returns mockAnnotationFactory
50-
5136
testStore = TestStore()
5237
val mapView = mockk<MapView> {
5338
every { context } returns mockk(relaxed = true)
@@ -56,23 +41,14 @@ internal class MapMarkersComponentTest {
5641
}
5742
}
5843

59-
sut = MapMarkersComponent(testStore, mapView, R.drawable.mapbox_ic_destination_marker)
60-
}
61-
62-
@After
63-
fun tearDown() {
64-
unmockkObject(MapMarkerFactory)
44+
sut = MapMarkersComponent(testStore, mapView, annotation)
6545
}
6646

6747
@Test
6848
fun `should re-create point annotation on destination change`() =
6949
coroutineRule.runBlockingTest {
70-
val annotation = mockk<PointAnnotationOptions>()
7150
val point = Point.fromLngLat(10.0, 11.0)
7251
testStore.setState(State(destination = Destination(point)))
73-
every {
74-
mockAnnotationFactory.createPin(point, R.drawable.mapbox_ic_destination_marker)
75-
} returns annotation
7652

7753
sut.onAttached(mockk())
7854

@@ -83,12 +59,11 @@ internal class MapMarkersComponentTest {
8359
}
8460

8561
@Test
86-
fun `onDetached should delete all annotations`() =
87-
coroutineRule.runBlockingTest {
88-
sut.onAttached(mockk())
62+
fun `onDetached should delete all annotations`() = coroutineRule.runBlockingTest {
63+
sut.onAttached(mockk())
8964

90-
sut.onDetached(mockk())
65+
sut.onDetached(mockk())
9166

92-
verify { mockAnnotationManager.deleteAll() }
93-
}
67+
verify { mockAnnotationManager.deleteAll() }
68+
}
9469
}

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/internal/MapboxNavigationViewApiTest.kt

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.mapbox.navigation.dropin.internal
22

3-
import com.mapbox.api.directions.v5.models.DirectionsWaypoint
43
import com.mapbox.geojson.Point
54
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
65
import com.mapbox.navigation.base.route.NavigationRoute
@@ -126,9 +125,9 @@ class MapboxNavigationViewApiTest {
126125
val point = Point.fromLngLat(11.0, 22.0)
127126
val routes = listOf(
128127
navigationRoute(
129-
waypoint(Point.fromLngLat(1.0, 2.0)),
130-
waypoint(Point.fromLngLat(2.0, 3.0)),
131-
waypoint(point),
128+
Point.fromLngLat(1.0, 2.0),
129+
Point.fromLngLat(2.0, 3.0),
130+
point,
132131
)
133132
)
134133

@@ -211,9 +210,9 @@ class MapboxNavigationViewApiTest {
211210
val point = Point.fromLngLat(11.0, 22.0)
212211
val routes = listOf(
213212
navigationRoute(
214-
waypoint(Point.fromLngLat(1.0, 2.0)),
215-
waypoint(Point.fromLngLat(2.0, 3.0)),
216-
waypoint(point),
213+
Point.fromLngLat(1.0, 2.0),
214+
Point.fromLngLat(2.0, 3.0),
215+
point,
217216
)
218217
)
219218

@@ -286,9 +285,9 @@ class MapboxNavigationViewApiTest {
286285
val point = Point.fromLngLat(11.0, 22.0)
287286
val routes = listOf(
288287
navigationRoute(
289-
waypoint(Point.fromLngLat(1.0, 2.0)),
290-
waypoint(Point.fromLngLat(2.0, 3.0)),
291-
waypoint(point),
288+
Point.fromLngLat(1.0, 2.0),
289+
Point.fromLngLat(2.0, 3.0),
290+
point,
292291
)
293292
)
294293

@@ -334,17 +333,11 @@ class MapboxNavigationViewApiTest {
334333
verify { testStore.dispatch(TripSessionStarterAction.EnableTripSession) }
335334
}
336335

337-
private fun navigationRoute(vararg waypoints: DirectionsWaypoint): NavigationRoute {
336+
private fun navigationRoute(vararg waypoints: Point): NavigationRoute {
338337
return mockk {
339-
every { directionsResponse } returns mockk {
340-
every { waypoints() } returns waypoints.toList()
338+
every { routeOptions } returns mockk(relaxed = true) {
339+
every { coordinatesList() } returns waypoints.toList()
341340
}
342341
}
343342
}
344-
345-
private fun waypoint(point: Point): DirectionsWaypoint {
346-
return mockk {
347-
every { location() } returns point
348-
}
349-
}
350343
}

0 commit comments

Comments
 (0)