Skip to content

Commit e1ae50f

Browse files
tomaszrybakiewiczabhishek1508
authored andcommitted
Using regular puck for IDLE and OVERVIEW camera mode. LocationPuckOptions navigation state pucks for the FOLLOWING mode.
1 parent d598449 commit e1ae50f

File tree

6 files changed

+129
-81
lines changed

6 files changed

+129
-81
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.activity.ComponentActivity
77
import androidx.annotation.Px
88
import androidx.constraintlayout.widget.Guideline
99
import com.mapbox.maps.MapView
10+
import com.mapbox.maps.plugin.locationcomponent.location
1011
import com.mapbox.navigation.core.MapboxNavigation
1112
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
1213
import com.mapbox.navigation.dropin.EmptyBinder
@@ -35,8 +36,12 @@ import com.mapbox.navigation.dropin.roadname.RoadNameCoordinator
3536
import com.mapbox.navigation.dropin.speedlimit.SpeedLimitCoordinator
3637
import com.mapbox.navigation.dropin.tripprogress.TripProgressBinder
3738
import com.mapbox.navigation.dropin.tripsession.TripSessionComponent
39+
import com.mapbox.navigation.ui.app.internal.camera.TargetCameraMode
40+
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
3841
import com.mapbox.navigation.ui.maps.internal.ui.BuildingHighlightComponent
42+
import com.mapbox.navigation.ui.maps.internal.ui.LocationPuckComponent
3943
import kotlinx.coroutines.flow.combine
44+
import kotlinx.coroutines.flow.distinctUntilChanged
4045

4146
internal fun NavigationViewContext.poiNameComponent(
4247
viewGroup: ViewGroup
@@ -219,6 +224,32 @@ internal fun NavigationViewContext.buildingHighlightComponent(
219224
}
220225
}
221226

227+
internal fun NavigationViewContext.locationPuckComponent(
228+
mapView: MapView
229+
): MapboxNavigationObserver {
230+
val puckFlow = combine(
231+
store.select { it.navigation },
232+
store.select { it.camera.cameraMode },
233+
styles.locationPuckOptions
234+
) { navigationState, cameraMode, options ->
235+
if (cameraMode == TargetCameraMode.Following) {
236+
when (navigationState) {
237+
NavigationState.FreeDrive -> options.freeDrivePuck
238+
NavigationState.DestinationPreview -> options.destinationPreviewPuck
239+
NavigationState.RoutePreview -> options.routePreviewPuck
240+
NavigationState.ActiveNavigation -> options.activeNavigationPuck
241+
NavigationState.Arrival -> options.arrivalPuck
242+
}
243+
} else {
244+
options.idlePuck
245+
}
246+
}.distinctUntilChanged()
247+
248+
return reloadOnChange(puckFlow) { puck ->
249+
LocationPuckComponent(mapView.location, puck, locationProvider)
250+
}
251+
}
252+
222253
internal fun NavigationViewContext.analyticsComponent() =
223254
AnalyticsComponent()
224255

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

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ package com.mapbox.navigation.dropin.map
33
import android.content.Context
44
import android.view.ViewGroup
55
import com.mapbox.maps.MapView
6-
import com.mapbox.maps.plugin.locationcomponent.LocationComponentPlugin
7-
import com.mapbox.maps.plugin.locationcomponent.location
86
import com.mapbox.navigation.core.internal.extensions.navigationListOf
97
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
108
import com.mapbox.navigation.dropin.camera.CameraComponent
119
import com.mapbox.navigation.dropin.camera.CameraLayoutObserver
1210
import com.mapbox.navigation.dropin.databinding.MapboxNavigationViewLayoutBinding
1311
import com.mapbox.navigation.dropin.internal.extensions.buildingHighlightComponent
12+
import com.mapbox.navigation.dropin.internal.extensions.locationPuckComponent
1413
import com.mapbox.navigation.dropin.internal.extensions.reloadOnChange
1514
import com.mapbox.navigation.dropin.map.geocoding.GeocodingComponent
1615
import com.mapbox.navigation.dropin.map.logo.LogoAttributionComponent
@@ -22,11 +21,8 @@ import com.mapbox.navigation.dropin.navigationview.NavigationViewContext
2221
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
2322
import com.mapbox.navigation.ui.base.lifecycle.UIBinder
2423
import com.mapbox.navigation.ui.maps.internal.ui.LocationComponent
25-
import com.mapbox.navigation.ui.maps.internal.ui.LocationPuckComponent
2624
import com.mapbox.navigation.ui.maps.internal.ui.RouteArrowComponent
2725
import com.mapbox.navigation.ui.maps.internal.ui.RouteLineComponent
28-
import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
29-
import com.mapbox.navigation.ui.maps.puck.LocationPuckOptions
3026
import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions
3127
import com.mapbox.navigation.ui.maps.route.line.model.MapboxRouteLineOptions
3228

@@ -73,17 +69,7 @@ abstract class MapViewBinder : UIBinder {
7369
return navigationListOf(
7470
CameraLayoutObserver(store, mapView, navigationViewBinding),
7571
LocationComponent(context.locationProvider),
76-
reloadOnChange(
77-
navigationState,
78-
context.styles.locationPuckOptions
79-
) { navState, _ ->
80-
locationPuckComponent(
81-
navState,
82-
mapView.location,
83-
context.locationProvider,
84-
context.styles.locationPuckOptions.value
85-
)
86-
},
72+
context.locationPuckComponent(mapView),
8773
LogoAttributionComponent(mapView, context.systemBarsInsets),
8874
reloadOnChange(
8975
context.mapStyleLoader.loadedMapStyle,
@@ -125,51 +111,6 @@ abstract class MapViewBinder : UIBinder {
125111
RouteLineComponentContractImpl(context.store, context.mapClickBehavior)
126112
})
127113

128-
private fun locationPuckComponent(
129-
navigationState: NavigationState,
130-
location: LocationComponentPlugin,
131-
provider: NavigationLocationProvider,
132-
options: LocationPuckOptions
133-
): LocationPuckComponent {
134-
return when (navigationState) {
135-
NavigationState.FreeDrive -> {
136-
LocationPuckComponent(
137-
location,
138-
options.freeDrivePuck,
139-
provider,
140-
)
141-
}
142-
NavigationState.DestinationPreview -> {
143-
LocationPuckComponent(
144-
location,
145-
options.destinationPreviewPuck,
146-
provider,
147-
)
148-
}
149-
NavigationState.RoutePreview -> {
150-
LocationPuckComponent(
151-
location,
152-
options.routePreviewPuck,
153-
provider,
154-
)
155-
}
156-
NavigationState.ActiveNavigation -> {
157-
LocationPuckComponent(
158-
location,
159-
options.activeNavigationPuck,
160-
provider,
161-
)
162-
}
163-
NavigationState.Arrival -> {
164-
LocationPuckComponent(
165-
location,
166-
options.arrivalPuck,
167-
provider,
168-
)
169-
}
170-
}
171-
}
172-
173114
private fun longPressMapComponent(navigationState: NavigationState, mapView: MapView) =
174115
when (navigationState) {
175116
NavigationState.FreeDrive,

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.mapbox.navigation.dropin.util.TestStore
3636
import com.mapbox.navigation.dropin.util.TestingUtil.findComponent
3737
import com.mapbox.navigation.testing.LoggingFrontendTestRule
3838
import com.mapbox.navigation.testing.MainCoroutineRule
39+
import com.mapbox.navigation.ui.app.internal.camera.TargetCameraMode
3940
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
4041
import com.mapbox.navigation.ui.maps.building.model.MapboxBuildingHighlightOptions
4142
import com.mapbox.navigation.ui.maps.internal.ui.BuildingHighlightComponent
@@ -165,7 +166,7 @@ class MapViewBinderTest {
165166
navContext.applyStyleCustomization {
166167
locationPuckOptions = LocationPuckOptions
167168
.Builder(ctx)
168-
.freeDrivePuck(
169+
.defaultPuck(
169170
LocationPuck2D(
170171
bearingImage = ctx.getDrawable(android.R.drawable.arrow_down_float)
171172
)
@@ -180,7 +181,24 @@ class MapViewBinderTest {
180181
}
181182

182183
@Test
183-
fun `bind should reload LocationPuckComponent on navigation state change`() {
184+
@Suppress("MaxLineLength")
185+
fun `bind should reload LocationPuckComponent on navigation state change when camera mode is Following`() {
186+
store.updateState {
187+
it.copy(
188+
navigation = NavigationState.DestinationPreview,
189+
camera = it.camera.copy(cameraMode = TargetCameraMode.Following)
190+
)
191+
}
192+
navContext.applyStyleCustomization {
193+
locationPuckOptions = LocationPuckOptions
194+
.Builder(ctx)
195+
.routePreviewPuck(
196+
LocationPuck2D(
197+
bearingImage = ctx.getDrawable(android.R.drawable.arrow_down_float)
198+
)
199+
)
200+
.build()
201+
}
184202
val components = sut.bind(FrameLayout(ctx))
185203
components.onAttached(mapboxNavigation)
186204

@@ -193,6 +211,23 @@ class MapViewBinderTest {
193211
assertNotEquals(secondComponent, firstComponent)
194212
}
195213

214+
@Test
215+
fun `bind should reload LocationPuckComponent on camera mode change`() {
216+
store.updateState { it.copy(camera = it.camera.copy(cameraMode = TargetCameraMode.Idle)) }
217+
val components = sut.bind(FrameLayout(ctx))
218+
components.onAttached(mapboxNavigation)
219+
220+
val firstComponent = components.findComponent { it is LocationPuckComponent }
221+
store.updateState {
222+
it.copy(camera = it.camera.copy(cameraMode = TargetCameraMode.Following))
223+
}
224+
val secondComponent = components.findComponent { it is LocationPuckComponent }
225+
226+
assertNotNull(firstComponent)
227+
assertNotNull(secondComponent)
228+
assertNotEquals(secondComponent, firstComponent)
229+
}
230+
196231
@Test
197232
fun `bind should return and bind LogoAttributionComponent`() {
198233
val components = sut.bind(FrameLayout(ctx))

libnavui-maps/api/current.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,13 +747,15 @@ package com.mapbox.navigation.ui.maps.puck {
747747
method public android.content.Context getContext();
748748
method public com.mapbox.maps.plugin.LocationPuck getDestinationPreviewPuck();
749749
method public com.mapbox.maps.plugin.LocationPuck getFreeDrivePuck();
750+
method public com.mapbox.maps.plugin.LocationPuck getIdlePuck();
750751
method public com.mapbox.maps.plugin.LocationPuck getRoutePreviewPuck();
751752
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder toBuilder();
752753
property public final com.mapbox.maps.plugin.LocationPuck activeNavigationPuck;
753754
property public final com.mapbox.maps.plugin.LocationPuck arrivalPuck;
754755
property public final android.content.Context context;
755756
property public final com.mapbox.maps.plugin.LocationPuck destinationPreviewPuck;
756757
property public final com.mapbox.maps.plugin.LocationPuck freeDrivePuck;
758+
property public final com.mapbox.maps.plugin.LocationPuck idlePuck;
757759
property public final com.mapbox.maps.plugin.LocationPuck routePreviewPuck;
758760
}
759761

@@ -765,6 +767,7 @@ package com.mapbox.navigation.ui.maps.puck {
765767
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder defaultPuck(com.mapbox.maps.plugin.LocationPuck defaultPuck);
766768
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder destinationPreviewPuck(com.mapbox.maps.plugin.LocationPuck destinationPreviewPuck);
767769
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder freeDrivePuck(com.mapbox.maps.plugin.LocationPuck freeDrivePuck);
770+
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder idlePuck(com.mapbox.maps.plugin.LocationPuck idlePuck);
768771
method public com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder routePreviewPuck(com.mapbox.maps.plugin.LocationPuck routePreviewPuck);
769772
field public static final com.mapbox.navigation.ui.maps.puck.LocationPuckOptions.Builder.Companion Companion;
770773
}

0 commit comments

Comments
 (0)