@@ -10,7 +10,6 @@ import androidx.car.app.model.Template
1010import androidx.car.app.navigation.model.PlaceListNavigationTemplate
1111import androidx.lifecycle.DefaultLifecycleObserver
1212import androidx.lifecycle.LifecycleOwner
13- import com.mapbox.androidauto.MapboxCarApp
1413import com.mapbox.androidauto.R
1514import com.mapbox.androidauto.car.MainCarContext
1615import com.mapbox.androidauto.car.action.MapboxActionProvider
@@ -21,76 +20,24 @@ import com.mapbox.androidauto.car.preview.CarRouteRequestCallback
2120import com.mapbox.androidauto.car.preview.RoutePreviewCarContext
2221import com.mapbox.androidauto.car.search.PlaceRecord
2322import com.mapbox.androidauto.car.search.SearchCarContext
24- import com.mapbox.androidauto.internal.car.extensions.getStyle
25- import com.mapbox.androidauto.internal.car.extensions.handleStyleOnAttached
26- import com.mapbox.androidauto.internal.car.extensions.handleStyleOnDetached
2723import com.mapbox.androidauto.internal.logAndroidAuto
28- import com.mapbox.geojson.Feature
29- import com.mapbox.geojson.FeatureCollection
30- import com.mapbox.geojson.Point
3124import com.mapbox.maps.MapboxExperimental
32- import com.mapbox.maps.extension.androidauto.MapboxCarMapObserver
33- import com.mapbox.maps.extension.androidauto.MapboxCarMapSurface
34- import com.mapbox.maps.plugin.delegates.listeners.OnStyleLoadedListener
3525import com.mapbox.navigation.base.route.NavigationRoute
36- import kotlinx.coroutines.Dispatchers
37- import kotlinx.coroutines.cancelChildren
38- import kotlinx.coroutines.launch
39- import kotlinx.coroutines.withContext
40- import java.util.concurrent.CopyOnWriteArrayList
4126
4227@MapboxExperimental
43- class PlacesListOnMapScreen (
28+ class PlacesListOnMapScreen constructor (
4429 private val mainCarContext : MainCarContext ,
4530 private val placesProvider : PlacesListOnMapProvider ,
46- private val placesListItemMapper : PlacesListItemMapper ,
4731 private val actionProviders : List <MapboxActionProvider >,
4832 private val searchCarContext : SearchCarContext = SearchCarContext (mainCarContext),
49- private val placesLayerUtil : PlacesListOnMapLayerUtil = PlacesListOnMapLayerUtil ()
5033) : Screen(mainCarContext.carContext) {
5134
5235 @VisibleForTesting
5336 var itemList = buildErrorItemList(R .string.car_search_no_results)
5437
55- private val placeRecords by lazy { CopyOnWriteArrayList <PlaceRecord >() }
56- private val jobControl by lazy { mainCarContext.getJobControl() }
5738 private val carNavigationCamera = CarLocationsOverviewCamera ()
5839 private val locationRenderer = CarLocationRenderer (mainCarContext)
59- private var styleLoadedListener: OnStyleLoadedListener ? = null
60-
61- private val surfaceListener = object : MapboxCarMapObserver {
62-
63- override fun onAttached (mapboxCarMapSurface : MapboxCarMapSurface ) {
64- super .onAttached(mapboxCarMapSurface)
65- logAndroidAuto(" PlacesListOnMapScreen loaded" )
66- styleLoadedListener = mapboxCarMapSurface.handleStyleOnAttached {
67- placesLayerUtil.initializePlacesListOnMapLayer(
68- it,
69- carContext.resources
70- )
71- loadPlaceRecords()
72- }
73- }
74-
75- override fun onDetached (mapboxCarMapSurface : MapboxCarMapSurface ) {
76- super .onDetached(mapboxCarMapSurface)
77- logAndroidAuto(" PlacesListOnMapScreen detached" )
78- mapboxCarMapSurface.handleStyleOnDetached(styleLoadedListener)?.let {
79- placesLayerUtil.removePlacesListOnMapLayer(it)
80- }
81- }
82- }
83-
84- private val placeClickListener = object : PlacesListItemClickListener {
85-
86- override fun onItemClick (placeRecord : PlaceRecord ) {
87- logAndroidAuto(" PlacesListOnMapScreen request $placeRecord " )
88- searchCarContext.carRouteRequest.request(placeRecord, carRouteRequestCallback)
89- }
90- }
91-
9240 private val carRouteRequestCallback = object : CarRouteRequestCallback {
93-
9441 override fun onRoutesReady (placeRecord : PlaceRecord , routes : List <NavigationRoute >) {
9542 val routePreviewCarContext = RoutePreviewCarContext (searchCarContext.mainCarContext)
9643 logAndroidAuto(" PlacesListOnMapScreen go to CarRoutePreviewScreen ${routes.size} " )
@@ -109,49 +56,37 @@ class PlacesListOnMapScreen(
10956 onErrorItemList(R .string.car_search_no_results)
11057 }
11158 }
59+ private val placesListOnMapManager = PlacesListOnMapManager (
60+ mainCarContext,
61+ placesProvider,
62+ carRouteRequestCallback
63+ )
11264
11365 init {
11466 lifecycle.addObserver(object : DefaultLifecycleObserver {
115- override fun onCreate (owner : LifecycleOwner ) {
116- logAndroidAuto(" PlacesListOnMapScreen onCreate" )
117- }
118-
119- override fun onStart (owner : LifecycleOwner ) {
120- logAndroidAuto(" PlacesListOnMapScreen onStart" )
121- }
122-
12367 override fun onResume (owner : LifecycleOwner ) {
12468 logAndroidAuto(" PlacesListOnMapScreen onResume" )
125- mainCarContext.mapboxCarMap.registerObserver(surfaceListener )
69+ mainCarContext.mapboxCarMap.registerObserver(placesListOnMapManager )
12670 mainCarContext.mapboxCarMap.registerObserver(carNavigationCamera)
12771 mainCarContext.mapboxCarMap.registerObserver(locationRenderer)
12872 }
12973
13074 override fun onPause (owner : LifecycleOwner ) {
13175 logAndroidAuto(" PlacesListOnMapScreen onPause" )
13276 placesProvider.cancel()
133- jobControl.job.cancelChildren()
13477 mainCarContext.mapboxCarMap.unregisterObserver(locationRenderer)
13578 mainCarContext.mapboxCarMap.unregisterObserver(carNavigationCamera)
136- mainCarContext.mapboxCarMap.unregisterObserver(surfaceListener)
137- }
138-
139- override fun onStop (owner : LifecycleOwner ) {
140- logAndroidAuto(" PlacesListOnMapScreen onStop" )
141- }
142-
143- override fun onDestroy (owner : LifecycleOwner ) {
144- logAndroidAuto(" PlacesListOnMapScreen onDestroy" )
79+ mainCarContext.mapboxCarMap.unregisterObserver(placesListOnMapManager)
14580 }
14681 })
14782 }
14883
14984 override fun onGetTemplate (): Template {
150- addPlaceIconsToMap( placeRecords)
151- val locationProvider = MapboxCarApp .carAppLocationService().navigationLocationProvider
152- val placesItemList = locationProvider.lastLocation?. run {
153- placesListItemMapper.mapToItemList( this , placeRecords, placeClickListener )
154- } ? : ItemList . Builder ().build()
85+ val coordinates = placesListOnMapManager. placeRecords.value.mapNotNull { it.coordinate }
86+ carNavigationCamera.updateWithLocations(coordinates)
87+ val placesItemList = placesListOnMapManager.currentItemList()
88+ ? : ItemList . Builder ().build( )
89+
15590 val actionStrip = ActionStrip .Builder ().apply {
15691 actionProviders.forEach {
15792 when (it) {
@@ -172,43 +107,6 @@ class PlacesListOnMapScreen(
172107 .build()
173108 }
174109
175- private fun addPlaceIconsToMap (places : List <PlaceRecord >) {
176- logAndroidAuto(" PlacesListOnMapScreen addPlaceIconsToMap with ${places.size} places." )
177- mainCarContext.mapboxCarMap.carMapSurface?.let { carMapSurface ->
178- val features = places.filter { it.coordinate != null }.map {
179- Feature .fromGeometry(
180- Point .fromLngLat(it.coordinate!! .longitude(), it.coordinate.latitude())
181- )
182- }
183- val featureCollection = FeatureCollection .fromFeatures(features)
184- carMapSurface.getStyle()?.let {
185- placesLayerUtil.updatePlacesListOnMapLayer(it, featureCollection)
186- }
187- }
188- val placesWithCoordinates = places.mapNotNull { it.coordinate }
189- carNavigationCamera.updateWithLocations(placesWithCoordinates)
190- }
191-
192- private fun loadPlaceRecords () {
193- jobControl.scope.launch {
194- val expectedPlaceRecords = withContext(Dispatchers .IO ) {
195- placesProvider.getPlaces()
196- }
197- placeRecords.clear()
198- expectedPlaceRecords.fold(
199- {
200- logAndroidAuto(
201- " PlacesListOnMapScreen ${it.errorMessage} , ${it.throwable?.stackTrace} "
202- )
203- },
204- {
205- placeRecords.addAll(it)
206- invalidate()
207- }
208- )
209- }
210- }
211-
212110 private fun onErrorItemList (@StringRes stringRes : Int ) {
213111 itemList = buildErrorItemList(stringRes)
214112 invalidate()
0 commit comments