Skip to content

Commit 8dbc73a

Browse files
committed
Make requireMapboxNavigation attach during initialization
1 parent b145c53 commit 8dbc73a

File tree

5 files changed

+32
-21
lines changed

5 files changed

+32
-21
lines changed

CHANGELOG.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ Mapbox welcomes participation and contributions from everyone.
55
## Unreleased
66
#### Features
77
- Improved the route refresh feature to also refresh _closures_ (`RouteLeg#closures`). [#6274](https://github.com/mapbox/mapbox-navigation-android/pull/6274)
8-
98
- Added `requireMapboxNavigation` to offer a simple way to use `MapboxNavigationApp`. [#6233](https://github.com/mapbox/mapbox-navigation-android/pull/6233)
109
#### Bug fixes and improvements
1110

libnavigation-core/api/current.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ package com.mapbox.navigation.core.lifecycle {
338338
}
339339

340340
public final class RequireMapboxNavigation {
341-
method @com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI public static kotlin.properties.ReadOnlyProperty<androidx.lifecycle.LifecycleOwner,com.mapbox.navigation.core.MapboxNavigation> requireMapboxNavigation(com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onCreatedObserver = null, com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onStartedObserver = null, com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onResumedObserver = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onInitialize = null);
341+
method @com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI public static kotlin.properties.ReadOnlyProperty<java.lang.Object,com.mapbox.navigation.core.MapboxNavigation> requireMapboxNavigation(androidx.lifecycle.LifecycleOwner, com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onCreatedObserver = null, com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onStartedObserver = null, com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver? onResumedObserver = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onInitialize = null);
342342
}
343343

344344
}

libnavigation-core/src/main/java/com/mapbox/navigation/core/lifecycle/RequireMapboxNavigation.kt

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import androidx.lifecycle.Lifecycle
77
import androidx.lifecycle.LifecycleOwner
88
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
99
import com.mapbox.navigation.core.MapboxNavigation
10+
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp.lifecycleOwner
1011
import kotlin.properties.ReadOnlyProperty
1112
import kotlin.reflect.KProperty
1213

1314
/**
14-
* Extension function to make it simple to create the [RequireMapboxNavigationDelegate]. Below are
15-
* a couple examples of how you may use the delegate.
15+
* Extension function to make it simple to create the [RequireMapboxNavigationDelegate].
16+
* Below are a couple examples of how you may use the delegate.
1617
*
1718
* Default can be used when [MapboxNavigationApp] is setup elsewhere.
1819
* ```
@@ -51,12 +52,13 @@ import kotlin.reflect.KProperty
5152
* @see [RequireMapboxNavigationDelegate] for more details.
5253
*/
5354
@ExperimentalPreviewMapboxNavigationAPI
54-
fun requireMapboxNavigation(
55+
fun LifecycleOwner.requireMapboxNavigation(
5556
onCreatedObserver: MapboxNavigationObserver? = null,
5657
onStartedObserver: MapboxNavigationObserver? = null,
5758
onResumedObserver: MapboxNavigationObserver? = null,
5859
onInitialize: (() -> Unit)? = null,
59-
): ReadOnlyProperty<LifecycleOwner, MapboxNavigation> = RequireMapboxNavigationDelegate(
60+
): ReadOnlyProperty<Any, MapboxNavigation> = RequireMapboxNavigationDelegate(
61+
lifecycleOwner = this,
6062
onCreatedObserver = onCreatedObserver,
6163
onStartedObserver = onStartedObserver,
6264
onResumedObserver = onResumedObserver,
@@ -74,22 +76,23 @@ fun requireMapboxNavigation(
7476
* [MapboxNavigation] instance can be re-created with [MapboxNavigationApp.disable], or if all
7577
* [MapboxNavigationApp.attach] lifecycles are destroyed.
7678
*
79+
* @param lifecycleOwner: LifecycleOwner
7780
* @param onCreatedObserver registered to the [Lifecycle.State.CREATED] lifecycle
7881
* @param onStartedObserver registered to the [Lifecycle.State.STARTED] lifecycle
7982
* @param onResumedObserver registered to the [Lifecycle.State.RESUMED] lifecycle
80-
* @param onInitialize called when the property is read for the first time
83+
* @param onInitialize called when the [lifecycleOwner] is [Lifecycle.State.CREATED]
8184
*/
8285
internal class RequireMapboxNavigationDelegate(
86+
lifecycleOwner: LifecycleOwner,
8387
private val onCreatedObserver: MapboxNavigationObserver? = null,
8488
private val onStartedObserver: MapboxNavigationObserver? = null,
8589
private val onResumedObserver: MapboxNavigationObserver? = null,
8690
private val onInitialize: (() -> Unit)? = null
87-
) : ReadOnlyProperty<LifecycleOwner, MapboxNavigation> {
88-
89-
private lateinit var lifecycleOwner: LifecycleOwner
91+
) : ReadOnlyProperty<Any, MapboxNavigation> {
9092

9193
private val lifecycleObserver = object : DefaultLifecycleObserver {
9294
override fun onCreate(owner: LifecycleOwner) {
95+
onInitialize?.invoke()
9396
onCreatedObserver?.let { MapboxNavigationApp.registerObserver(it) }
9497
}
9598

@@ -114,21 +117,19 @@ internal class RequireMapboxNavigationDelegate(
114117
}
115118
}
116119

120+
init {
121+
MapboxNavigationApp.attach(lifecycleOwner)
122+
lifecycleOwner.lifecycle.addObserver(lifecycleObserver)
123+
}
124+
117125
/**
118-
* Returns an instance of [MapboxNavigation], the first retrieval will attach the [thisRef]
119-
* to [MapboxNavigationApp.attach]. If [MapboxNavigationApp.isSetup] is false after all
120-
* observers and initializers, this property getter will crash.
126+
* Returns an instance of [MapboxNavigation]. If [MapboxNavigationApp.isSetup] is false after
127+
* all observers and initializers, this property getter will crash.
121128
*
122129
* @param thisRef - the [LifecycleOwner] that needs access to [MapboxNavigation].
123130
* @param property - ignored
124131
*/
125-
override fun getValue(thisRef: LifecycleOwner, property: KProperty<*>): MapboxNavigation {
126-
if (!this::lifecycleOwner.isInitialized) {
127-
onInitialize?.invoke()
128-
this.lifecycleOwner = thisRef
129-
MapboxNavigationApp.attach(lifecycleOwner)
130-
lifecycleOwner.lifecycle.addObserver(lifecycleObserver)
131-
}
132+
override fun getValue(thisRef: Any, property: KProperty<*>): MapboxNavigation {
132133
val mapboxNavigation = MapboxNavigationApp.current()
133134
checkNotNull(mapboxNavigation) {
134135
"MapboxNavigation cannot be null. Ensure that MapboxNavigationApp is setup and an" +

libnavigation-core/src/test/java/com/mapbox/navigation/core/lifecycle/RequireMapboxNavigationTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ class RequireMapboxNavigationTest {
8181
sut.mapboxNavigation
8282
}
8383

84+
@Test
85+
fun `onInitialize is called before first reference to the delegate`() {
86+
mockMapboxNavigationAppBehavior()
87+
val mockOnInitialize: (() -> Unit) = mockk(relaxed = true)
88+
val sut = SystemUnderTest(onInitialize = mockOnInitialize)
89+
90+
MapboxNavigationApp.setup(mockk<NavigationOptions>())
91+
sut.moveToState(Lifecycle.State.CREATED)
92+
93+
verify { mockOnInitialize.invoke() }
94+
}
95+
8496
@Test
8597
fun `multiple delegate references are the same instance`() {
8698
mockMapboxNavigationAppBehavior()

qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/InactiveRouteStylingActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class InactiveRouteStylingActivity : AppCompatActivity() {
9393
private val mapboxNavigation by requireMapboxNavigation(
9494
onCreatedObserver = object : MapboxNavigationObserver {
9595
override fun onAttached(mapboxNavigation: MapboxNavigation) {
96-
9796
mapboxNavigation.registerLocationObserver(locationObserver)
9897
mapboxNavigation.registerRouteProgressObserver(routeProgressObserver)
9998
mapboxNavigation.registerRouteProgressObserver(replayProgressObserver)

0 commit comments

Comments
 (0)