Skip to content

Commit fe0326d

Browse files
committed
Add ability to check configuration changing
1 parent 43cdcf5 commit fe0326d

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,25 @@ object MapboxNavigationApp {
7777
@JvmStatic
7878
fun isSetup(): Boolean = mapboxNavigationAppDelegate.isSetup
7979

80+
/**
81+
* When calling [setup] multiple times, all registered [MapboxNavigationObserver] will be
82+
* detached from the instance of [MapboxNavigation] that is being destroyed. This is needed for
83+
* maintaining state across options changes. You do not need to clear the state when
84+
* [isOptionsChanging] is true.
85+
*/
86+
@UiThread
87+
@JvmStatic
88+
fun isOptionsChanging(): Boolean = mapboxNavigationAppDelegate.isOptionsChanging()
89+
90+
/**
91+
* When observing [MapboxNavigation] from a [Lifecycle], the [Lifecycle.Event] may be triggered
92+
* because of a configuration change. This will help you know if the lifecycle events are
93+
* triggered events like mobile device orientation changes.
94+
*/
95+
@UiThread
96+
@JvmStatic
97+
fun isConfigurationChanging(): Boolean = mapboxNavigationAppDelegate.isConfigurationChanging()
98+
8099
/**
81100
* Call [MapboxNavigationApp.setup] to provide the application with [NavigationOptions].
82101
*

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,35 @@ internal class MapboxNavigationAppDelegate {
1616

1717
val lifecycleOwner: LifecycleOwner by lazy { carAppLifecycleOwner }
1818

19+
private var isOptionsChanging = false
20+
private set
21+
1922
var isSetup = false
23+
private set
2024

2125
fun setup(navigationOptionsProvider: NavigationOptionsProvider) = apply {
2226
if (carAppLifecycleOwner.isConfigurationChanging()) {
2327
return this
2428
}
2529

2630
if (isSetup) {
31+
isOptionsChanging = true
2732
disable()
2833
}
29-
3034
mapboxNavigationOwner.setup(navigationOptionsProvider)
3135
carAppLifecycleOwner.lifecycle.addObserver(mapboxNavigationOwner.carAppLifecycleObserver)
36+
isOptionsChanging = false
3237
isSetup = true
3338
}
3439

40+
fun isOptionsChanging(): Boolean {
41+
return isOptionsChanging
42+
}
43+
44+
fun isConfigurationChanging(): Boolean {
45+
return carAppLifecycleOwner.isConfigurationChanging()
46+
}
47+
3548
fun attachAllActivities(application: Application) {
3649
carAppLifecycleOwner.attachAllActivities(application)
3750
}

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.mockk.unmockkAll
2020
import io.mockk.verify
2121
import io.mockk.verifyOrder
2222
import org.junit.After
23+
import org.junit.Assert.assertArrayEquals
2324
import org.junit.Assert.assertEquals
2425
import org.junit.Assert.assertNotNull
2526
import org.junit.Assert.assertNull
@@ -476,6 +477,62 @@ class MapboxNavigationAppDelegateTest {
476477
assertEquals(retrieved, retrievedJava)
477478
}
478479

480+
@Test
481+
fun `verify isConfigurationChanging is false for setup changes`() {
482+
mockMultiMapboxNavigation()
483+
mapboxNavigationApp.setup { navigationOptions }
484+
val testLifecycleOwner = CarAppLifecycleOwnerTest.TestLifecycleOwner()
485+
testLifecycleOwner.lifecycleRegistry.currentState = Lifecycle.State.RESUMED
486+
mapboxNavigationApp.attach(testLifecycleOwner)
487+
488+
val onAttachedSlot = mutableListOf<Boolean>()
489+
val onDetachedSlot = mutableListOf<Boolean>()
490+
val observerFirst = object : MapboxNavigationObserver {
491+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
492+
onAttachedSlot.add(mapboxNavigationApp.isConfigurationChanging())
493+
}
494+
495+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
496+
onDetachedSlot.add(mapboxNavigationApp.isConfigurationChanging())
497+
}
498+
}
499+
mapboxNavigationApp.registerObserver(observerFirst)
500+
mapboxNavigationApp.setup { mockk { every { accessToken } returns "test_access_token_1" } }
501+
mapboxNavigationApp.setup { mockk { every { accessToken } returns "test_access_token_2" } }
502+
503+
assertArrayEquals(onAttachedSlot.toBooleanArray(), booleanArrayOf(false, false, false))
504+
assertArrayEquals(onDetachedSlot.toBooleanArray(), booleanArrayOf(false, false))
505+
}
506+
507+
@Test
508+
fun `verify isOptionsChanging is true while the setup changes`() {
509+
mockMultiMapboxNavigation()
510+
mapboxNavigationApp.setup { navigationOptions }
511+
val testLifecycleOwner = CarAppLifecycleOwnerTest.TestLifecycleOwner()
512+
testLifecycleOwner.lifecycleRegistry.currentState = Lifecycle.State.RESUMED
513+
mapboxNavigationApp.attach(testLifecycleOwner)
514+
515+
val onAttachedSlot = mutableListOf<Boolean>()
516+
val onDetachedSlot = mutableListOf<Boolean>()
517+
val observerFirst = object : MapboxNavigationObserver {
518+
override fun onAttached(mapboxNavigation: MapboxNavigation) {
519+
onAttachedSlot.add(mapboxNavigationApp.isOptionsChanging())
520+
}
521+
522+
override fun onDetached(mapboxNavigation: MapboxNavigation) {
523+
onDetachedSlot.add(mapboxNavigationApp.isOptionsChanging())
524+
}
525+
}
526+
mapboxNavigationApp.registerObserver(observerFirst)
527+
mapboxNavigationApp.setup { mockk { every { accessToken } returns "test_access_token_1" } }
528+
mapboxNavigationApp.setup { mockk { every { accessToken } returns "test_access_token_2" } }
529+
530+
assertEquals(3, onAttachedSlot.size)
531+
assertEquals(2, onDetachedSlot.size)
532+
assertArrayEquals(onAttachedSlot.toBooleanArray(), booleanArrayOf(false, true, true))
533+
assertArrayEquals(onDetachedSlot.toBooleanArray(), booleanArrayOf(true, true))
534+
}
535+
479536
private fun mockActivityLifecycle(): Pair<ComponentActivity, LifecycleRegistry> {
480537
val activity = mockk<ComponentActivity> {
481538
every { isChangingConfigurations } returns false
@@ -486,6 +543,14 @@ class MapboxNavigationAppDelegateTest {
486543
return Pair(activity, lifecycle)
487544
}
488545

546+
private fun mockMultiMapboxNavigation() {
547+
every { MapboxNavigationProvider.create(any()) } answers {
548+
mockk {
549+
every { navigationOptions } returns firstArg()
550+
}
551+
}
552+
}
553+
489554
/**
490555
* Used for the [MapboxNavigationApp.getObserver] tests because they require a class definition.
491556
*/

0 commit comments

Comments
 (0)