Skip to content

Commit 9681960

Browse files
committed
add options to configure distance formatter at runtime
1 parent 0fbbe37 commit 9681960

16 files changed

Lines changed: 107 additions & 19 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Mapbox welcomes participation and contributions from everyone.
66
#### Features
77
- Added `ComponentInstaller` for the `NavigationCameraComponent` that offers simplified integration of the `NavigationCamera`. [#6202](https://github.com/mapbox/mapbox-navigation-android/pull/6202)
88
- Added `ComponentInstaller` for the `CameraModeButtonComponent` that offers simplified integration of the `NavigationCamera` mode button. [#6202](https://github.com/mapbox/mapbox-navigation-android/pull/6202)
9-
9+
- Added `NavigationViewOptions#distanceFormatterOptions` to allow for specifying `DistanceFormatterOptions` at runtime. [#6222](https://github.com/mapbox/mapbox-navigation-android/pull/6222)
1010
#### Bug fixes and improvements
1111

1212
## Mapbox Navigation SDK 2.8.0-alpha.3 - 17 August, 2022

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

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

33
import android.content.Context
44
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
5+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
56
import com.mapbox.navigation.dropin.ViewOptionsCustomization.Companion.defaultRouteArrowOptions
67
import com.mapbox.navigation.dropin.ViewOptionsCustomization.Companion.defaultRouteLineOptions
78
import com.mapbox.navigation.ui.maps.NavigationStyles
@@ -33,6 +34,8 @@ internal class NavigationViewOptions(context: Context) {
3334
MutableStateFlow(false)
3435
private var _infoPanelForcedState: MutableStateFlow<Int> =
3536
MutableStateFlow(0)
37+
private var _distanceFormatterOptions: MutableStateFlow<DistanceFormatterOptions> =
38+
MutableStateFlow(DistanceFormatterOptions.Builder(context).build())
3639

3740
var mapStyleUriDay: StateFlow<String> = _mapStyleUriDay.asStateFlow()
3841
var mapStyleUriNight: StateFlow<String> = _mapStyleUriNight.asStateFlow()
@@ -42,6 +45,8 @@ internal class NavigationViewOptions(context: Context) {
4245
val enableMapLongClickIntercept: StateFlow<Boolean> = _enableMapLongClickIntercept.asStateFlow()
4346
val isInfoPanelHideable: StateFlow<Boolean> = _isInfoPanelHideable.asStateFlow()
4447
val infoPanelForcedState: StateFlow<Int> = _infoPanelForcedState.asStateFlow()
48+
val distanceFormatterOptions: StateFlow<DistanceFormatterOptions> =
49+
_distanceFormatterOptions.asStateFlow()
4550

4651
fun applyCustomization(customization: ViewOptionsCustomization) {
4752
customization.mapStyleUriDay?.also { _mapStyleUriDay.tryEmit(it) }
@@ -52,5 +57,6 @@ internal class NavigationViewOptions(context: Context) {
5257
customization.enableMapLongClickIntercept?.also { _enableMapLongClickIntercept.tryEmit(it) }
5358
customization.isInfoPanelHideable?.also { _isInfoPanelHideable.tryEmit(it) }
5459
customization.infoPanelForcedState?.also { _infoPanelForcedState.tryEmit(it) }
60+
customization.distanceFormatterOptions?.also { _distanceFormatterOptions.tryEmit(it) }
5561
}
5662
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import com.google.android.material.bottomsheet.BottomSheetBehavior
55
import com.mapbox.maps.plugin.gestures.OnMapLongClickListener
66
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
7+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
78
import com.mapbox.navigation.ui.maps.NavigationStyles
89
import com.mapbox.navigation.ui.maps.route.RouteLayerConstants
910
import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions
@@ -71,6 +72,11 @@ class ViewOptionsCustomization {
7172
*/
7273
var infoPanelForcedState: Int? = null
7374

75+
/**
76+
* Set to override [DistanceFormatterOptions]
77+
*/
78+
var distanceFormatterOptions: DistanceFormatterOptions? = null
79+
7480
companion object {
7581
/**
7682
* Default route line options.

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/binder/infopanel/InfoPanelTripProgressBinder.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ internal class InfoPanelTripProgressBinder(
2727

2828
val binding = MapboxInfoPanelTripProgressLayoutBinding.bind(viewGroup)
2929
return reloadOnChange(
30-
navigationViewContext.styles.tripProgressStyle
31-
) { styles ->
30+
navigationViewContext.styles.tripProgressStyle,
31+
navigationViewContext.options.distanceFormatterOptions
32+
) { styles, formatterOptions ->
3233
TripProgressComponent(
3334
store = navigationViewContext.store,
3435
styles = styles,
36+
distanceFormatterOptions = formatterOptions,
3537
tripProgressView = binding.tripProgressView
3638
)
3739
}

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/component/maneuver/ManeuverViewBinder.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.transition.TransitionManager
55
import android.view.ViewGroup
66
import com.mapbox.maps.Style
77
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
8+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
89
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
910
import com.mapbox.navigation.dropin.R
1011
import com.mapbox.navigation.dropin.databinding.MapboxManeuverGuidanceLayoutBinding
@@ -19,6 +20,7 @@ import kotlinx.coroutines.flow.StateFlow
1920
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
2021
internal class ManeuverViewBinder(
2122
private val loadedMapStyle: StateFlow<Style?>,
23+
private val formatterOptions: StateFlow<DistanceFormatterOptions>,
2224
private val maneuverViewOptions: StateFlow<ManeuverViewOptions>,
2325
) : UIBinder {
2426
override fun bind(viewGroup: ViewGroup): MapboxNavigationObserver {
@@ -32,14 +34,16 @@ internal class ManeuverViewBinder(
3234

3335
return reloadOnChange(
3436
loadedMapStyle,
35-
maneuverViewOptions
36-
) { mapStyle, options ->
37+
maneuverViewOptions,
38+
formatterOptions
39+
) { mapStyle, options, distanceFormatterOptions ->
3740
if (mapStyle != null) {
3841
ManeuverComponent(
3942
maneuverView = binding.maneuverView,
4043
userId = mapStyle.getUserId(),
4144
styleId = mapStyle.getStyleId(),
42-
options = options
45+
options = options,
46+
formatterOptions = distanceFormatterOptions
4347
)
4448
} else {
4549
null

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/component/tripprogress/TripProgressComponent.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@ import kotlinx.coroutines.launch
2121
internal class TripProgressComponent(
2222
val store: Store,
2323
@StyleRes val styles: Int,
24-
val tripProgressView: MapboxTripProgressView
24+
val distanceFormatterOptions: DistanceFormatterOptions,
25+
private val tripProgressView: MapboxTripProgressView
2526
) : UIComponent() {
2627

2728
override fun onAttached(mapboxNavigation: MapboxNavigation) {
2829
super.onAttached(mapboxNavigation)
2930
tripProgressView.updateStyle(styles)
30-
val distanceFormatterOptions =
31-
DistanceFormatterOptions.Builder(tripProgressView.context).build()
3231
val tripProgressFormatter = TripProgressUpdateFormatter
3332
.Builder(tripProgressView.context)
3433
.distanceRemainingFormatter(

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal class ManeuverCoordinator(
3333
if (navigationState == NavigationState.ActiveNavigation) {
3434
it ?: ManeuverViewBinder(
3535
context.mapStyleLoader.loadedMapStyle,
36+
context.options.distanceFormatterOptions,
3637
context.styles.maneuverViewOptions,
3738
)
3839
} else {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import androidx.test.core.app.ApplicationProvider
66
import com.google.android.material.bottomsheet.BottomSheetBehavior
77
import com.mapbox.maps.Style
88
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
9+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
10+
import com.mapbox.navigation.base.formatter.UnitType
911
import com.mapbox.navigation.ui.maps.route.RouteLayerConstants
1012
import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions
1113
import com.mapbox.navigation.ui.maps.route.line.model.MapboxRouteLineOptions
@@ -43,6 +45,7 @@ internal class NavigationViewOptionsTest {
4345
assertEquals(c.enableMapLongClickIntercept, sut.enableMapLongClickIntercept.value)
4446
assertEquals(c.isInfoPanelHideable, sut.isInfoPanelHideable.value)
4547
assertEquals(c.infoPanelForcedState, sut.infoPanelForcedState.value)
48+
assertEquals(c.distanceFormatterOptions, sut.distanceFormatterOptions.value)
4649
}
4750

4851
private fun customization() =
@@ -63,5 +66,9 @@ internal class NavigationViewOptionsTest {
6366
enableMapLongClickIntercept = false
6467
isInfoPanelHideable = true
6568
infoPanelForcedState = BottomSheetBehavior.STATE_EXPANDED
69+
distanceFormatterOptions = DistanceFormatterOptions
70+
.Builder(ctx)
71+
.unitType(UnitType.METRIC)
72+
.build()
6673
}
6774
}

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/binder/infopanel/InfoPanelTripProgressBinderTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import android.widget.FrameLayout
55
import androidx.test.core.app.ApplicationProvider
66
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
7+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
78
import com.mapbox.navigation.dropin.NavigationViewContext
89
import com.mapbox.navigation.dropin.internal.extensions.ReloadingComponent
910
import io.mockk.MockKAnnotations
@@ -39,6 +40,9 @@ internal class InfoPanelTripProgressBinderTest {
3940
@Test
4041
fun `bind should return TripProgressComponent`() {
4142
every { mockNavContext.styles.tripProgressStyle } returns MutableStateFlow(1)
43+
every { mockNavContext.options.distanceFormatterOptions } returns MutableStateFlow(
44+
DistanceFormatterOptions.Builder(ctx).build()
45+
)
4246
val result = sut.bind(FrameLayout(ctx))
4347

4448
assertTrue(

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/component/tripprogress/TripProgressComponentTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.os.Build
44
import com.mapbox.api.directions.v5.models.DirectionsRoute
55
import com.mapbox.api.directions.v5.models.RouteLeg
66
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
7+
import com.mapbox.navigation.base.formatter.DistanceFormatterOptions
78
import com.mapbox.navigation.base.route.NavigationRoute
89
import com.mapbox.navigation.base.trip.model.RouteProgress
910
import com.mapbox.navigation.base.trip.model.RouteProgressState
@@ -78,6 +79,7 @@ class TripProgressComponentTest {
7879
TripProgressComponent(
7980
store,
8081
R.style.DropInStyleTripProgressView,
82+
DistanceFormatterOptions.Builder(mockk(relaxed = true)).build(),
8183
tripProgressView
8284
).onAttached(mapboxNavigation)
8385

@@ -108,6 +110,7 @@ class TripProgressComponentTest {
108110
TripProgressComponent(
109111
store,
110112
R.style.DropInStyleTripProgressView,
113+
DistanceFormatterOptions.Builder(mockk(relaxed = true)).build(),
111114
tripProgressView
112115
).onAttached(mapboxNavigation)
113116

0 commit comments

Comments
 (0)