@@ -5,6 +5,8 @@ import android.location.Location
5
5
import android.os.Bundle
6
6
import android.view.View.GONE
7
7
import androidx.appcompat.app.AppCompatActivity
8
+ import androidx.lifecycle.DefaultLifecycleObserver
9
+ import androidx.lifecycle.LifecycleOwner
8
10
import androidx.lifecycle.lifecycleScope
9
11
import com.mapbox.api.directions.v5.models.DirectionsRoute
10
12
import com.mapbox.bindgen.Expected
@@ -21,15 +23,18 @@ import com.mapbox.navigation.base.options.NavigationOptions
21
23
import com.mapbox.navigation.base.route.NavigationRoute
22
24
import com.mapbox.navigation.base.route.toNavigationRoute
23
25
import com.mapbox.navigation.core.MapboxNavigation
24
- import com.mapbox.navigation.core.MapboxNavigationProvider
25
26
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
26
30
import com.mapbox.navigation.core.replay.MapboxReplayer
27
31
import com.mapbox.navigation.core.replay.ReplayLocationEngine
28
32
import com.mapbox.navigation.core.replay.route.ReplayProgressObserver
29
33
import com.mapbox.navigation.core.replay.route.ReplayRouteMapper
30
34
import com.mapbox.navigation.core.trip.session.BannerInstructionsObserver
31
35
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
32
36
import com.mapbox.navigation.core.trip.session.LocationObserver
37
+ import com.mapbox.navigation.core.trip.session.RouteProgressObserver
33
38
import com.mapbox.navigation.examples.R
34
39
import com.mapbox.navigation.examples.databinding.MapboxActivityShowJunctionsBinding
35
40
import com.mapbox.navigation.ui.base.util.MapboxNavigationConsumer
@@ -59,7 +64,6 @@ import kotlinx.coroutines.launch
59
64
class ShowJunctionsActivity : AppCompatActivity () {
60
65
61
66
private lateinit var mapboxMap: MapboxMap
62
- private lateinit var mapboxNavigation: MapboxNavigation
63
67
private lateinit var binding: MapboxActivityShowJunctionsBinding
64
68
private lateinit var locationComponent: LocationComponentPlugin
65
69
@@ -139,28 +143,39 @@ class ShowJunctionsActivity : AppCompatActivity() {
139
143
junctionApi.generateJunction(bannerInstructions, junctionCallback)
140
144
}
141
145
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
+ }
145
155
}
146
156
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
+ }
156
172
}
157
173
158
- @SuppressLint(" MissingPermission" )
159
- private fun initStyle () {
174
+ private fun init () {
160
175
mapboxMap.loadStyleUri(Style .MAPBOX_STREETS ) { style ->
161
176
routeLineView.initializeLayers(style)
162
177
binding.actionButton.setOnClickListener {
163
- mapboxNavigation .setNavigationRoutes(listOf (route))
178
+ MapboxNavigationApp .current()? .setNavigationRoutes(listOf (route))
164
179
binding.actionButton.visibility = GONE
165
180
}
166
181
}
@@ -204,28 +219,114 @@ class ShowJunctionsActivity : AppCompatActivity() {
204
219
init ()
205
220
}
206
221
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
-
223
222
override fun onDestroy () {
224
223
super .onDestroy()
225
224
routeLineApi.cancel()
226
225
routeLineView.cancel()
227
226
junctionApi.cancelAll()
228
227
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
+ })
230
331
}
231
332
}
0 commit comments