Skip to content

Commit 0863b04

Browse files
committed
Explore extenstion ideas
1 parent 551f9b1 commit 0863b04

File tree

5 files changed

+227
-94
lines changed

5 files changed

+227
-94
lines changed

app/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ android {
6969

7070
dependencies {
7171
// Mapbox Navigation SDK
72-
implementation "com.mapbox.navigation:android:2.8.0-alpha.2"
72+
implementation "com.mapbox.navigation:android:2.8.0-alpha.3"
7373
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31"
7474
implementation "androidx.core:core-ktx:1.7.0"
7575
implementation "com.google.android.material:material:1.5.0"

app/src/main/java/com/mapbox/navigation/examples/MainActivity.kt

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
1313
import com.mapbox.android.core.permissions.PermissionsListener
1414
import com.mapbox.android.core.permissions.PermissionsManager
1515
import com.mapbox.android.core.permissions.PermissionsManager.areLocationPermissionsGranted
16+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
1617
import com.mapbox.navigation.examples.databinding.ActivityMainBinding
1718

1819
class MainActivity : AppCompatActivity(), PermissionsListener {
@@ -28,6 +29,9 @@ class MainActivity : AppCompatActivity(), PermissionsListener {
2829
return
2930
}
3031

32+
// Each example needs to call MapboxNavigationApp.setup.
33+
MapboxNavigationApp.disable()
34+
3135
binding = ActivityMainBinding.inflate(layoutInflater)
3236
setContentView(binding.root)
3337

app/src/main/java/com/mapbox/navigation/examples/alternative/ShowAlternativeRoutesActivity.kt

+15-21
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class ShowAlternativeRoutesActivity : AppCompatActivity() {
254254
}
255255
}
256256

257-
val navigationResumedObserver = object : MapboxNavigationObserver {
257+
private val navigationResumedObserver = object : MapboxNavigationObserver {
258258
override fun onAttached(mapboxNavigation: MapboxNavigation) {
259259
mapboxNavigation.registerLocationObserver(locationObserver)
260260
mapboxNavigation.registerRouteProgressObserver(replayProgressObserver)
@@ -274,7 +274,7 @@ class ShowAlternativeRoutesActivity : AppCompatActivity() {
274274

275275
init {
276276
// You can setup MapboxNavigation at any part of the app lifecycle.
277-
MapboxNavigationApp.setup(
277+
MapboxNavigationApp.setup {
278278
NavigationOptions.Builder(this)
279279
.accessToken(getString(R.string.mapbox_access_token))
280280
.locationEngine(ReplayLocationEngine(mapboxReplayer))
@@ -284,25 +284,7 @@ class ShowAlternativeRoutesActivity : AppCompatActivity() {
284284
.build()
285285
)
286286
.build()
287-
).attach(this)
288-
289-
lifecycle.addObserver(object : DefaultLifecycleObserver {
290-
override fun onCreate(owner: LifecycleOwner) {
291-
MapboxNavigationApp.registerObserver(navigationCreatedObserver)
292-
}
293-
294-
override fun onResume(owner: LifecycleOwner) {
295-
MapboxNavigationApp.registerObserver(navigationResumedObserver)
296-
}
297-
298-
override fun onPause(owner: LifecycleOwner) {
299-
MapboxNavigationApp.unregisterObserver(navigationResumedObserver)
300-
}
301-
302-
override fun onDestroy(owner: LifecycleOwner) {
303-
MapboxNavigationApp.unregisterObserver(navigationCreatedObserver)
304-
}
305-
})
287+
}.attach(this)
306288
}
307289

308290
override fun onCreate(savedInstanceState: Bundle?) {
@@ -322,11 +304,23 @@ class ShowAlternativeRoutesActivity : AppCompatActivity() {
322304
findRoute(originPoint, destinationPoint)
323305
}
324306

307+
MapboxNavigationApp.registerObserver(navigationCreatedObserver)
325308
replayOriginLocation()
326309
}
327310

311+
override fun onResume() {
312+
super.onResume()
313+
MapboxNavigationApp.registerObserver(navigationResumedObserver)
314+
}
315+
316+
override fun onPause() {
317+
super.onPause()
318+
MapboxNavigationApp.unregisterObserver(navigationResumedObserver)
319+
}
320+
328321
override fun onDestroy() {
329322
super.onDestroy()
323+
MapboxNavigationApp.unregisterObserver(navigationCreatedObserver)
330324
routeLineApi.cancel()
331325
routeLineView.cancel()
332326
mapboxReplayer.finish()

app/src/main/java/com/mapbox/navigation/examples/junctions/ShowJunctionsActivity.kt

+135-34
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import android.location.Location
55
import android.os.Bundle
66
import android.view.View.GONE
77
import androidx.appcompat.app.AppCompatActivity
8+
import androidx.lifecycle.DefaultLifecycleObserver
9+
import androidx.lifecycle.LifecycleOwner
810
import androidx.lifecycle.lifecycleScope
911
import com.mapbox.api.directions.v5.models.DirectionsRoute
1012
import com.mapbox.bindgen.Expected
@@ -21,15 +23,18 @@ import com.mapbox.navigation.base.options.NavigationOptions
2123
import com.mapbox.navigation.base.route.NavigationRoute
2224
import com.mapbox.navigation.base.route.toNavigationRoute
2325
import com.mapbox.navigation.core.MapboxNavigation
24-
import com.mapbox.navigation.core.MapboxNavigationProvider
2526
import com.mapbox.navigation.core.directions.session.RoutesObserver
27+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
28+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
29+
import com.mapbox.navigation.core.lifecycle.NavigationOptionsProvider
2630
import com.mapbox.navigation.core.replay.MapboxReplayer
2731
import com.mapbox.navigation.core.replay.ReplayLocationEngine
2832
import com.mapbox.navigation.core.replay.route.ReplayProgressObserver
2933
import com.mapbox.navigation.core.replay.route.ReplayRouteMapper
3034
import com.mapbox.navigation.core.trip.session.BannerInstructionsObserver
3135
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
3236
import com.mapbox.navigation.core.trip.session.LocationObserver
37+
import com.mapbox.navigation.core.trip.session.RouteProgressObserver
3338
import com.mapbox.navigation.examples.R
3439
import com.mapbox.navigation.examples.databinding.MapboxActivityShowJunctionsBinding
3540
import com.mapbox.navigation.ui.base.util.MapboxNavigationConsumer
@@ -59,7 +64,6 @@ import kotlinx.coroutines.launch
5964
class ShowJunctionsActivity : AppCompatActivity() {
6065

6166
private lateinit var mapboxMap: MapboxMap
62-
private lateinit var mapboxNavigation: MapboxNavigation
6367
private lateinit var binding: MapboxActivityShowJunctionsBinding
6468
private lateinit var locationComponent: LocationComponentPlugin
6569

@@ -139,28 +143,39 @@ class ShowJunctionsActivity : AppCompatActivity() {
139143
junctionApi.generateJunction(bannerInstructions, junctionCallback)
140144
}
141145

142-
private fun init() {
143-
initNavigation()
144-
initStyle()
146+
@SuppressLint("MissingPermission")
147+
private val sessionStarter = object : MapboxNavigationObserver {
148+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
149+
mapboxNavigation.startTripSession()
150+
}
151+
152+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
153+
mapboxNavigation.stopTripSession()
154+
}
145155
}
146156

147-
@SuppressLint("MissingPermission")
148-
private fun initNavigation() {
149-
mapboxNavigation = MapboxNavigationProvider.create(
150-
NavigationOptions.Builder(this)
151-
.accessToken(getString(R.string.mapbox_access_token))
152-
.locationEngine(ReplayLocationEngine(mapboxReplayer))
153-
.build()
154-
)
155-
mapboxNavigation.startTripSession()
157+
init {
158+
mapboxNavigationInstaller()
159+
.onCreated(sessionStarter)
160+
.onStarted(
161+
mapboxLocationObserver(locationObserver),
162+
mapboxRoutesObserver(routesObserver),
163+
mapboxRouteProgressObserver(replayProgressObserver),
164+
mapboxBannerInstructionsObserver(bannerInstructionsObserver),
165+
)
166+
.install {
167+
NavigationOptions.Builder(this)
168+
.accessToken(getString(R.string.mapbox_access_token))
169+
.locationEngine(ReplayLocationEngine(mapboxReplayer))
170+
.build()
171+
}
156172
}
157173

158-
@SuppressLint("MissingPermission")
159-
private fun initStyle() {
174+
private fun init() {
160175
mapboxMap.loadStyleUri(Style.MAPBOX_STREETS) { style ->
161176
routeLineView.initializeLayers(style)
162177
binding.actionButton.setOnClickListener {
163-
mapboxNavigation.setNavigationRoutes(listOf(route))
178+
MapboxNavigationApp.current()?.setNavigationRoutes(listOf(route))
164179
binding.actionButton.visibility = GONE
165180
}
166181
}
@@ -204,28 +219,114 @@ class ShowJunctionsActivity : AppCompatActivity() {
204219
init()
205220
}
206221

207-
override fun onStart() {
208-
super.onStart()
209-
mapboxNavigation.registerRoutesObserver(routesObserver)
210-
mapboxNavigation.registerLocationObserver(locationObserver)
211-
mapboxNavigation.registerRouteProgressObserver(replayProgressObserver)
212-
mapboxNavigation.registerBannerInstructionsObserver(bannerInstructionsObserver)
213-
}
214-
215-
override fun onStop() {
216-
super.onStop()
217-
mapboxNavigation.unregisterRoutesObserver(routesObserver)
218-
mapboxNavigation.unregisterLocationObserver(locationObserver)
219-
mapboxNavigation.unregisterRouteProgressObserver(replayProgressObserver)
220-
mapboxNavigation.unregisterBannerInstructionsObserver(bannerInstructionsObserver)
221-
}
222-
223222
override fun onDestroy() {
224223
super.onDestroy()
225224
routeLineApi.cancel()
226225
routeLineView.cancel()
227226
junctionApi.cancelAll()
228227
mapboxReplayer.finish()
229-
mapboxNavigation.onDestroy()
228+
}
229+
}
230+
231+
fun AppCompatActivity.mapboxNavigationInstaller() = MapboxNavigationActivityInstaller(this)
232+
233+
fun mapboxLocationObserver(locationObserver: LocationObserver) : MapboxNavigationObserver {
234+
return object : MapboxNavigationObserver {
235+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
236+
mapboxNavigation.registerLocationObserver(locationObserver)
237+
}
238+
239+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
240+
mapboxNavigation.unregisterLocationObserver(locationObserver)
241+
}
242+
}
243+
}
244+
245+
fun mapboxRoutesObserver(routesObserver: RoutesObserver) : MapboxNavigationObserver {
246+
return object : MapboxNavigationObserver {
247+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
248+
mapboxNavigation.registerRoutesObserver(routesObserver)
249+
}
250+
251+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
252+
mapboxNavigation.unregisterRoutesObserver(routesObserver)
253+
}
254+
}
255+
}
256+
257+
fun mapboxBannerInstructionsObserver(bannerInstructionsObserver: BannerInstructionsObserver) : MapboxNavigationObserver {
258+
return object : MapboxNavigationObserver {
259+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
260+
mapboxNavigation.registerBannerInstructionsObserver(bannerInstructionsObserver)
261+
}
262+
263+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
264+
mapboxNavigation.unregisterBannerInstructionsObserver(bannerInstructionsObserver)
265+
}
266+
}
267+
}
268+
269+
fun mapboxRouteProgressObserver(routeProgressObserver: RouteProgressObserver) : MapboxNavigationObserver {
270+
return object : MapboxNavigationObserver {
271+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
272+
mapboxNavigation.registerRouteProgressObserver(routeProgressObserver)
273+
}
274+
275+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
276+
mapboxNavigation.unregisterRouteProgressObserver(routeProgressObserver)
277+
}
278+
}
279+
}
280+
281+
class MapboxNavigationActivityInstaller(
282+
val activity: AppCompatActivity
283+
) {
284+
private val onCreated = mutableSetOf<MapboxNavigationObserver>()
285+
private val onStarted = mutableSetOf<MapboxNavigationObserver>()
286+
private val onResumed = mutableSetOf<MapboxNavigationObserver>()
287+
288+
fun onCreated(vararg observers: MapboxNavigationObserver) = apply {
289+
onCreated.addAll(observers)
290+
}
291+
292+
fun onStarted(vararg observers: MapboxNavigationObserver) = apply {
293+
onStarted.addAll(observers)
294+
}
295+
296+
fun onResumed(vararg observers: MapboxNavigationObserver) = apply {
297+
onResumed.addAll(observers)
298+
}
299+
300+
fun install(
301+
navigationOptionsProvider: NavigationOptionsProvider
302+
) {
303+
MapboxNavigationApp.attach(activity)
304+
activity.lifecycle.addObserver(object : DefaultLifecycleObserver {
305+
override fun onCreate(owner: LifecycleOwner) {
306+
val navigationOptions = navigationOptionsProvider.createNavigationOptions()
307+
MapboxNavigationApp.setup(navigationOptions)
308+
onCreated.forEach { MapboxNavigationApp.registerObserver(it) }
309+
}
310+
311+
override fun onStart(owner: LifecycleOwner) {
312+
onStarted.forEach { MapboxNavigationApp.registerObserver(it) }
313+
}
314+
315+
override fun onResume(owner: LifecycleOwner) {
316+
onResumed.forEach { MapboxNavigationApp.registerObserver(it) }
317+
}
318+
319+
override fun onPause(owner: LifecycleOwner) {
320+
onResumed.reversed().forEach { MapboxNavigationApp.unregisterObserver(it) }
321+
}
322+
323+
override fun onStop(owner: LifecycleOwner) {
324+
onStarted.reversed().forEach { MapboxNavigationApp.unregisterObserver(it) }
325+
}
326+
327+
override fun onDestroy(owner: LifecycleOwner) {
328+
onCreated.reversed().forEach { MapboxNavigationApp.unregisterObserver(it) }
329+
}
330+
})
230331
}
231332
}

0 commit comments

Comments
 (0)