Skip to content

Commit 6394564

Browse files
authored
Remove MapboxNavigation instance from ActiveGuidanceScreen (#6326)
1 parent af7d19b commit 6394564

File tree

8 files changed

+213
-136
lines changed

8 files changed

+213
-136
lines changed

libnavui-androidauto/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Mapbox welcomes participation and contributions from everyone.
88
- Remove experimental from `MapboxCarNavigationManager` and showcase java. [#6292](https://github.com/mapbox/mapbox-navigation-android/pull/6292)
99
- Removed `MapboxNavigation` from `CarNavigationInfoObserver` constructor, and rename to `CarNavigationInfoProvider`. Removed dependencies from `CarActiveGuidanceCarContext` that require `MapboxNavigation`. [#6224](https://github.com/mapbox/mapbox-navigation-android/pull/6224)
1010
- Removed `MapboxNavigation` from `CarSpeedLimitRenderer` constructor. [#6325](https://github.com/mapbox/mapbox-navigation-android/pull/6325)
11+
- Deleted `CarActiveGuidanceCarContext` because it is no longer needed after `MapboxNavigation` is removed. [#6326](https://github.com/mapbox/mapbox-navigation-android/pull/6326)
12+
- Added `CarArrivalTrigger` and `CarActiveGuidanceMarkers` for logical components that help build the `ActiveGuidanceScreen`. [#6326](https://github.com/mapbox/mapbox-navigation-android/pull/6326)
1113

1214
## androidauto-v0.10.0 - Sep 9, 2022
1315
### Changelog

libnavui-androidauto/api/current.txt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ package com.mapbox.androidauto.car.map.widgets.logo {
305305
package com.mapbox.androidauto.car.navigation {
306306

307307
public final class ActiveGuidanceScreen extends androidx.car.app.Screen {
308-
ctor public ActiveGuidanceScreen(com.mapbox.androidauto.car.navigation.CarActiveGuidanceCarContext carActiveGuidanceContext, java.util.List<? extends com.mapbox.androidauto.car.action.MapboxActionProvider> actionProviders, com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil placesLayerUtil = com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil());
308+
ctor public ActiveGuidanceScreen(com.mapbox.androidauto.car.MainCarContext mainCarContext, java.util.List<? extends com.mapbox.androidauto.car.action.MapboxActionProvider> actionProviders);
309309
method public com.mapbox.androidauto.car.location.CarLocationRenderer getCarLocationRenderer();
310310
method public com.mapbox.androidauto.car.navigation.CarNavigationCamera getCarNavigationCamera();
311311
method public com.mapbox.androidauto.car.preview.CarRouteLine getCarRouteLine();
@@ -317,18 +317,17 @@ package com.mapbox.androidauto.car.navigation {
317317
property public final com.mapbox.androidauto.car.navigation.speedlimit.CarSpeedLimitRenderer carSpeedLimitRenderer;
318318
}
319319

320-
public final class CarActiveGuidanceCarContext {
321-
ctor public CarActiveGuidanceCarContext(com.mapbox.androidauto.car.MainCarContext mainCarContext);
322-
method public androidx.car.app.CarContext getCarContext();
323-
method public com.mapbox.navigation.base.formatter.DistanceFormatter getDistanceFormatter();
324-
method public com.mapbox.androidauto.car.MainCarContext getMainCarContext();
325-
method public com.mapbox.maps.extension.androidauto.MapboxCarMap getMapboxCarMap();
326-
method public com.mapbox.navigation.core.MapboxNavigation getMapboxNavigation();
327-
property public final androidx.car.app.CarContext carContext;
328-
property public final com.mapbox.navigation.base.formatter.DistanceFormatter distanceFormatter;
329-
property public final com.mapbox.androidauto.car.MainCarContext mainCarContext;
330-
property public final com.mapbox.maps.extension.androidauto.MapboxCarMap mapboxCarMap;
331-
property public final com.mapbox.navigation.core.MapboxNavigation mapboxNavigation;
320+
public final class CarActiveGuidanceMarkers implements com.mapbox.maps.extension.androidauto.MapboxCarMapObserver {
321+
ctor public CarActiveGuidanceMarkers();
322+
method public void onAttached(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface mapboxCarMapSurface);
323+
method public void onDetached(com.mapbox.maps.extension.androidauto.MapboxCarMapSurface mapboxCarMapSurface);
324+
}
325+
326+
public final class CarArrivalTrigger implements com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver {
327+
ctor public CarArrivalTrigger();
328+
method public void onAttached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
329+
method public void onDetached(com.mapbox.navigation.core.MapboxNavigation mapboxNavigation);
330+
method public void triggerArrival();
332331
}
333332

334333
public enum CarCameraMode {

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/MainScreenManager.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.mapbox.androidauto.car.feedback.core.CarFeedbackSender
1212
import com.mapbox.androidauto.car.feedback.ui.CarFeedbackAction
1313
import com.mapbox.androidauto.car.feedback.ui.CarGridFeedbackScreen
1414
import com.mapbox.androidauto.car.navigation.ActiveGuidanceScreen
15-
import com.mapbox.androidauto.car.navigation.CarActiveGuidanceCarContext
1615
import com.mapbox.androidauto.internal.logAndroidAuto
1716
import com.mapbox.androidauto.navigation.audioguidance.CarAudioGuidanceUi
1817
import kotlinx.coroutines.flow.collect
@@ -28,7 +27,7 @@ class MainScreenManager(val mainCarContext: MainCarContext) {
2827
FreeDriveState, RoutePreviewState -> MainCarScreen(mainCarContext)
2928
ActiveGuidanceState -> {
3029
ActiveGuidanceScreen(
31-
CarActiveGuidanceCarContext(mainCarContext),
30+
mainCarContext,
3231
listOf(
3332
CarFeedbackAction(
3433
mainCarContext.mapboxCarMap,

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/navigation/ActiveGuidanceScreen.kt

Lines changed: 28 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -8,144 +8,69 @@ import androidx.car.app.model.Template
88
import androidx.car.app.navigation.model.NavigationTemplate
99
import androidx.lifecycle.DefaultLifecycleObserver
1010
import androidx.lifecycle.LifecycleOwner
11-
import com.mapbox.androidauto.ArrivalState
12-
import com.mapbox.androidauto.MapboxCarApp
1311
import com.mapbox.androidauto.R
12+
import com.mapbox.androidauto.car.MainCarContext
1413
import com.mapbox.androidauto.car.MainMapActionStrip
1514
import com.mapbox.androidauto.car.action.MapboxActionProvider
1615
import com.mapbox.androidauto.car.location.CarLocationRenderer
1716
import com.mapbox.androidauto.car.navigation.roadlabel.RoadLabelSurfaceLayer
1817
import com.mapbox.androidauto.car.navigation.speedlimit.CarSpeedLimitRenderer
19-
import com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil
2018
import com.mapbox.androidauto.car.preview.CarRouteLine
21-
import com.mapbox.androidauto.internal.car.extensions.getStyle
22-
import com.mapbox.androidauto.internal.car.extensions.handleStyleOnAttached
23-
import com.mapbox.androidauto.internal.car.extensions.handleStyleOnDetached
2419
import com.mapbox.androidauto.internal.logAndroidAuto
25-
import com.mapbox.geojson.Feature
26-
import com.mapbox.geojson.FeatureCollection
2720
import com.mapbox.maps.MapboxExperimental
28-
import com.mapbox.maps.extension.androidauto.MapboxCarMapObserver
29-
import com.mapbox.maps.extension.androidauto.MapboxCarMapSurface
30-
import com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener
31-
import com.mapbox.navigation.base.trip.model.RouteLegProgress
32-
import com.mapbox.navigation.base.trip.model.RouteProgress
33-
import com.mapbox.navigation.core.arrival.ArrivalObserver
34-
import com.mapbox.navigation.core.directions.session.RoutesObserver
21+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
3522

3623
/**
3724
* After a route has been selected. This view gives turn-by-turn instructions
3825
* for completing the route.
3926
*/
4027
@OptIn(MapboxExperimental::class)
4128
class ActiveGuidanceScreen(
42-
private val carActiveGuidanceContext: CarActiveGuidanceCarContext,
29+
private val mainCarContext: MainCarContext,
4330
private val actionProviders: List<MapboxActionProvider>,
44-
private val placesLayerUtil: PlacesListOnMapLayerUtil = PlacesListOnMapLayerUtil(),
45-
) : Screen(carActiveGuidanceContext.carContext) {
31+
) : Screen(mainCarContext.carContext) {
4632

47-
val carRouteLine = CarRouteLine(carActiveGuidanceContext.mainCarContext)
48-
val carLocationRenderer = CarLocationRenderer(carActiveGuidanceContext.mainCarContext)
49-
val carSpeedLimitRenderer = CarSpeedLimitRenderer(carActiveGuidanceContext.mainCarContext)
33+
val carRouteLine = CarRouteLine(mainCarContext)
34+
val carLocationRenderer = CarLocationRenderer(mainCarContext)
35+
val carSpeedLimitRenderer = CarSpeedLimitRenderer(mainCarContext)
5036
val carNavigationCamera = CarNavigationCamera(
5137
initialCarCameraMode = CarCameraMode.FOLLOWING,
5238
alternativeCarCameraMode = CarCameraMode.OVERVIEW,
5339
)
5440
private val roadLabelSurfaceLayer = RoadLabelSurfaceLayer(carContext)
5541
private val navigationInfoProvider = CarNavigationInfoProvider()
5642
.invalidateOnChange(this)
43+
private val carActiveGuidanceMarkers = CarActiveGuidanceMarkers()
5744
private val mapActionStripBuilder = MainMapActionStrip(this, carNavigationCamera)
58-
59-
private val arrivalObserver = object : ArrivalObserver {
60-
61-
override fun onFinalDestinationArrival(routeProgress: RouteProgress) {
62-
stopNavigation()
63-
}
64-
65-
override fun onNextRouteLegStart(routeLegProgress: RouteLegProgress) {
66-
// not implemented
67-
}
68-
69-
override fun onWaypointArrival(routeProgress: RouteProgress) {
70-
// not implemented
71-
}
72-
}
73-
74-
private var styleLoadedListener: OnStyleLoadedListener? = null
75-
76-
private val surfaceListener = object : MapboxCarMapObserver {
77-
78-
override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {
79-
super.onAttached(mapboxCarMapSurface)
80-
logAndroidAuto("ActiveGuidanceScreen loaded")
81-
styleLoadedListener = mapboxCarMapSurface.handleStyleOnAttached {
82-
placesLayerUtil.initializePlacesListOnMapLayer(it, carContext.resources)
83-
carActiveGuidanceContext.mapboxNavigation.registerRoutesObserver(routesObserver)
84-
}
85-
}
86-
87-
override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {
88-
super.onDetached(mapboxCarMapSurface)
89-
logAndroidAuto("ActiveGuidanceScreen detached")
90-
carActiveGuidanceContext.mapboxNavigation.unregisterRoutesObserver(routesObserver)
91-
mapboxCarMapSurface.handleStyleOnDetached(styleLoadedListener)?.let {
92-
placesLayerUtil.removePlacesListOnMapLayer(it)
93-
}
94-
}
95-
}
96-
97-
private val routesObserver = RoutesObserver { result ->
98-
val route = result.navigationRoutes.firstOrNull()
99-
?: return@RoutesObserver
100-
val coordinate = route.routeOptions.coordinatesList().lastOrNull()
101-
?: return@RoutesObserver
102-
val mapboxCarMapSurface = carActiveGuidanceContext.mapboxCarMap.carMapSurface
103-
?: return@RoutesObserver
104-
val featureCollection = FeatureCollection.fromFeature(Feature.fromGeometry(coordinate))
105-
mapboxCarMapSurface.getStyle()?.let {
106-
placesLayerUtil.updatePlacesListOnMapLayer(it, featureCollection)
107-
}
108-
}
45+
private val carArrivalTrigger = CarArrivalTrigger()
10946

11047
init {
11148
logAndroidAuto("ActiveGuidanceScreen constructor")
112-
11349
lifecycle.addObserver(object : DefaultLifecycleObserver {
114-
115-
override fun onCreate(owner: LifecycleOwner) {
116-
logAndroidAuto("ActiveGuidanceScreen onCreate")
117-
carActiveGuidanceContext.mapboxNavigation.registerArrivalObserver(arrivalObserver)
118-
}
119-
12050
override fun onResume(owner: LifecycleOwner) {
12151
logAndroidAuto("ActiveGuidanceScreen onResume")
122-
carActiveGuidanceContext.mapboxCarMap.registerObserver(carLocationRenderer)
123-
carActiveGuidanceContext.mapboxCarMap.registerObserver(roadLabelSurfaceLayer)
124-
carActiveGuidanceContext.mapboxCarMap.registerObserver(carSpeedLimitRenderer)
125-
carActiveGuidanceContext.mapboxCarMap.registerObserver(carNavigationCamera)
126-
carActiveGuidanceContext.mapboxCarMap.setGestureHandler(
127-
carNavigationCamera.gestureHandler
128-
)
129-
carActiveGuidanceContext.mapboxCarMap.registerObserver(carRouteLine)
130-
carActiveGuidanceContext.mapboxCarMap.registerObserver(surfaceListener)
131-
carActiveGuidanceContext.mapboxCarMap.registerObserver(navigationInfoProvider)
52+
mainCarContext.mapboxCarMap.registerObserver(carLocationRenderer)
53+
mainCarContext.mapboxCarMap.registerObserver(roadLabelSurfaceLayer)
54+
mainCarContext.mapboxCarMap.registerObserver(carSpeedLimitRenderer)
55+
mainCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
56+
mainCarContext.mapboxCarMap.setGestureHandler(carNavigationCamera.gestureHandler)
57+
mainCarContext.mapboxCarMap.registerObserver(carRouteLine)
58+
mainCarContext.mapboxCarMap.registerObserver(carActiveGuidanceMarkers)
59+
mainCarContext.mapboxCarMap.registerObserver(navigationInfoProvider)
60+
MapboxNavigationApp.registerObserver(carArrivalTrigger)
13261
}
13362

13463
override fun onPause(owner: LifecycleOwner) {
13564
logAndroidAuto("ActiveGuidanceScreen onPause")
136-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(roadLabelSurfaceLayer)
137-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(carLocationRenderer)
138-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(carSpeedLimitRenderer)
139-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
140-
carActiveGuidanceContext.mapboxCarMap.setGestureHandler(null)
141-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(carRouteLine)
142-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(surfaceListener)
143-
carActiveGuidanceContext.mapboxCarMap.unregisterObserver(navigationInfoProvider)
144-
}
145-
146-
override fun onDestroy(owner: LifecycleOwner) {
147-
logAndroidAuto("ActiveGuidanceScreen onDestroy")
148-
carActiveGuidanceContext.mapboxNavigation.unregisterArrivalObserver(arrivalObserver)
65+
mainCarContext.mapboxCarMap.unregisterObserver(roadLabelSurfaceLayer)
66+
mainCarContext.mapboxCarMap.unregisterObserver(carLocationRenderer)
67+
mainCarContext.mapboxCarMap.unregisterObserver(carSpeedLimitRenderer)
68+
mainCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
69+
mainCarContext.mapboxCarMap.setGestureHandler(null)
70+
mainCarContext.mapboxCarMap.unregisterObserver(carRouteLine)
71+
mainCarContext.mapboxCarMap.unregisterObserver(carActiveGuidanceMarkers)
72+
mainCarContext.mapboxCarMap.unregisterObserver(navigationInfoProvider)
73+
MapboxNavigationApp.unregisterObserver(carArrivalTrigger)
14974
}
15075
})
15176
}
@@ -167,7 +92,7 @@ class ActiveGuidanceScreen(
16792
Action.Builder()
16893
.setTitle(carContext.getString(R.string.car_action_navigation_stop_button))
16994
.setOnClickListener {
170-
stopNavigation()
95+
carArrivalTrigger.triggerArrival()
17196
}.build()
17297
)
17398
}.build()
@@ -179,9 +104,4 @@ class ActiveGuidanceScreen(
179104
.apply { navigationInfoProvider.setNavigationInfo(this) }
180105
.build()
181106
}
182-
183-
private fun stopNavigation() {
184-
logAndroidAuto("ActiveGuidanceScreen stopNavigation")
185-
MapboxCarApp.updateCarAppState(ArrivalState)
186-
}
187107
}

libnavui-androidauto/src/main/java/com/mapbox/androidauto/car/navigation/CarActiveGuidanceCarContext.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.mapbox.androidauto.car.navigation
2+
3+
import com.mapbox.androidauto.car.placeslistonmap.PlacesListOnMapLayerUtil
4+
import com.mapbox.androidauto.internal.car.extensions.getStyle
5+
import com.mapbox.androidauto.internal.car.extensions.handleStyleOnAttached
6+
import com.mapbox.androidauto.internal.car.extensions.handleStyleOnDetached
7+
import com.mapbox.androidauto.internal.car.extensions.mapboxNavigationForward
8+
import com.mapbox.androidauto.internal.logAndroidAuto
9+
import com.mapbox.geojson.Feature
10+
import com.mapbox.geojson.FeatureCollection
11+
import com.mapbox.maps.MapboxExperimental
12+
import com.mapbox.maps.extension.androidauto.MapboxCarMapObserver
13+
import com.mapbox.maps.extension.androidauto.MapboxCarMapSurface
14+
import com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener
15+
import com.mapbox.navigation.core.MapboxNavigation
16+
import com.mapbox.navigation.core.directions.session.RoutesObserver
17+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
18+
19+
@OptIn(MapboxExperimental::class)
20+
class CarActiveGuidanceMarkers : MapboxCarMapObserver {
21+
private var styleLoadedListener: OnStyleLoadedListener? = null
22+
private var mapboxCarMapSurface: MapboxCarMapSurface? = null
23+
private val navigationObserver = mapboxNavigationForward(this::onAttached, this::onDetached)
24+
private val routesObserver = RoutesObserver { updateMarkers() }
25+
private val placesLayerUtil = PlacesListOnMapLayerUtil()
26+
27+
private fun updateMarkers() {
28+
val route = MapboxNavigationApp.current()?.getNavigationRoutes()?.firstOrNull()
29+
?: return
30+
val coordinate = route.routeOptions.coordinatesList().lastOrNull()
31+
?: return
32+
val featureCollection = FeatureCollection.fromFeature(Feature.fromGeometry(coordinate))
33+
mapboxCarMapSurface?.getStyle()?.let {
34+
placesLayerUtil.updatePlacesListOnMapLayer(it, featureCollection)
35+
}
36+
}
37+
38+
override fun onAttached(mapboxCarMapSurface: MapboxCarMapSurface) {
39+
logAndroidAuto("ActiveGuidanceScreen loaded")
40+
this.mapboxCarMapSurface = mapboxCarMapSurface
41+
val carContext = mapboxCarMapSurface.carContext
42+
styleLoadedListener = mapboxCarMapSurface.handleStyleOnAttached {
43+
placesLayerUtil.initializePlacesListOnMapLayer(it, carContext.resources)
44+
updateMarkers()
45+
}
46+
MapboxNavigationApp.registerObserver(navigationObserver)
47+
}
48+
49+
override fun onDetached(mapboxCarMapSurface: MapboxCarMapSurface) {
50+
super.onDetached(mapboxCarMapSurface)
51+
logAndroidAuto("ActiveGuidanceScreen detached")
52+
MapboxNavigationApp.unregisterObserver(navigationObserver)
53+
mapboxCarMapSurface.handleStyleOnDetached(styleLoadedListener)?.let {
54+
placesLayerUtil.removePlacesListOnMapLayer(it)
55+
}
56+
}
57+
58+
private fun onAttached(mapboxNavigation: MapboxNavigation) {
59+
mapboxNavigation.registerRoutesObserver(routesObserver)
60+
}
61+
62+
private fun onDetached(mapboxNavigation: MapboxNavigation) {
63+
mapboxNavigation.unregisterRoutesObserver(routesObserver)
64+
}
65+
}

0 commit comments

Comments
 (0)