Skip to content

Commit 696d607

Browse files
committed
show action buttons in all navigation state
1 parent ca886f5 commit 696d607

File tree

8 files changed

+14
-76
lines changed

8 files changed

+14
-76
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Mapbox welcomes participation and contributions from everyone.
55
## Unreleased
66
#### Features
77
#### Bug fixes and improvements
8+
- Updated `RecenterButtonComponent` and `CameraModeButtonComponent` to show in `RoutePreview` state. [#6465](https://github.com/mapbox/mapbox-navigation-android/pull/6465)
89
- Fixed an issue where restrictions were drawn only on the first leg of the route, if independent leg styling was not used (default behavior). [#6440](https://github.com/mapbox/mapbox-navigation-android/pull/6440)
910
- Fixed a crash in `MapboxJunctionApi` that happens when a junction contains an invalid bitmap. [#6459](https://github.com/mapbox/mapbox-navigation-android/pull/6459)
1011
- Updated `MapboxJunctionApi` to ignore banner components with subtype `signboard`. `MapboxSignboardApi` should be used to handle such components. [#6459](https://github.com/mapbox/mapbox-navigation-android/pull/6459)

libnavui-app/src/main/java/com/mapbox/navigation/ui/app/internal/Store.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.mapbox.navigation.utils.internal.logW
55
import kotlinx.coroutines.CoroutineScope
66
import kotlinx.coroutines.flow.Flow
77
import kotlinx.coroutines.flow.MutableStateFlow
8+
import kotlinx.coroutines.flow.SharingStarted
89
import kotlinx.coroutines.flow.StateFlow
910
import kotlinx.coroutines.flow.asStateFlow
1011
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -63,8 +64,12 @@ open class Store {
6364
return state.map { selector(it) }.distinctUntilChanged()
6465
}
6566

66-
fun <T> slice(scope: CoroutineScope, selector: (State) -> T): StateFlow<T> {
67-
return state.slice(scope, selector = selector)
67+
fun <T> slice(
68+
scope: CoroutineScope,
69+
started: SharingStarted = SharingStarted.WhileSubscribed(),
70+
selector: (State) -> T
71+
): StateFlow<T> {
72+
return state.slice(scope, started = started, selector = selector)
6873
}
6974

7075
fun dispatch(action: Action) {

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/camera/CameraModeButtonComponentContractImpl.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.mapbox.navigation.ui.app.internal.Store
66
import com.mapbox.navigation.ui.app.internal.camera.CameraAction
77
import com.mapbox.navigation.ui.app.internal.camera.TargetCameraMode
88
import com.mapbox.navigation.ui.app.internal.camera.toNavigationCameraState
9-
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
109
import com.mapbox.navigation.ui.maps.camera.state.NavigationCameraState
1110
import com.mapbox.navigation.ui.maps.internal.ui.CameraModeButtonComponentContract
1211
import kotlinx.coroutines.CoroutineScope
@@ -28,9 +27,6 @@ internal class CameraModeButtonComponentContractImpl(
2827
}
2928
}
3029

31-
override val isVisible: StateFlow<Boolean> =
32-
store.slice(coroutineScope) { it.navigation != NavigationState.RoutePreview }
33-
3430
override fun onClick(view: View) {
3531
val cameraMode = store.state.value.camera.cameraMode.let {
3632
if (it != TargetCameraMode.Idle) {

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/camera/RecenterButtonComponentContractImpl.kt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,23 @@ import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
55
import com.mapbox.navigation.ui.app.internal.Store
66
import com.mapbox.navigation.ui.app.internal.camera.CameraAction
77
import com.mapbox.navigation.ui.app.internal.camera.TargetCameraMode
8-
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
98
import com.mapbox.navigation.ui.maps.internal.ui.RecenterButtonComponentContract
109
import kotlinx.coroutines.CoroutineScope
1110
import kotlinx.coroutines.flow.SharingStarted
1211
import kotlinx.coroutines.flow.StateFlow
13-
import kotlinx.coroutines.flow.combine
14-
import kotlinx.coroutines.flow.stateIn
1512

1613
@ExperimentalPreviewMapboxNavigationAPI
1714
internal class RecenterButtonComponentContractImpl(
1815
scope: CoroutineScope,
1916
private val store: Store
2017
) : RecenterButtonComponentContract {
2118

22-
override val isVisible: StateFlow<Boolean> = combine(
23-
store.select { it.camera.cameraMode },
24-
store.select { it.navigation },
25-
transform = ::isVisible
26-
).stateIn(
27-
scope,
28-
SharingStarted.Eagerly,
29-
isVisible(store.state.value.camera.cameraMode, store.state.value.navigation)
30-
)
19+
override val isVisible: StateFlow<Boolean> =
20+
store.slice(scope = scope, started = SharingStarted.Eagerly) { state ->
21+
state.camera.cameraMode == TargetCameraMode.Idle
22+
}
3123

3224
override fun onClick(view: View) {
3325
store.dispatch(CameraAction.SetCameraMode(TargetCameraMode.Following))
3426
}
35-
36-
private fun isVisible(cameraMode: TargetCameraMode, navigationState: NavigationState) =
37-
cameraMode == TargetCameraMode.Idle && navigationState != NavigationState.RoutePreview
3827
}

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/camera/CameraModeButtonComponentContractImplTest.kt

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.mapbox.navigation.dropin.util.TestStore
66
import com.mapbox.navigation.testing.MainCoroutineRule
77
import com.mapbox.navigation.ui.app.internal.camera.CameraAction
88
import com.mapbox.navigation.ui.app.internal.camera.TargetCameraMode
9-
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
109
import com.mapbox.navigation.ui.maps.camera.state.NavigationCameraState
1110
import com.mapbox.navigation.ui.maps.internal.ui.CameraModeButtonComponentContract
1211
import io.mockk.mockk
@@ -81,24 +80,6 @@ class CameraModeButtonComponentContractImplTest {
8180
assertEquals(NavigationCameraState.FOLLOWING, navCamState)
8281
}
8382

84-
@Test
85-
fun `isVisible use NavigationState to determine visibility`() = runBlockingTest {
86-
testStore.updateState {
87-
it.copy(navigation = NavigationState.RoutePreview)
88-
}
89-
val visibility = mutableListOf<Boolean>()
90-
val job = launch {
91-
sut.isVisible.take(2).toList(visibility)
92-
yield()
93-
}
94-
testStore.updateState {
95-
it.copy(navigation = NavigationState.ActiveNavigation)
96-
}
97-
98-
job.join()
99-
assertEquals(listOf(false, true), visibility)
100-
}
101-
10283
@Test
10384
fun `onClick should request Overview mode current is Following`() = runBlockingTest {
10485
testStore.updateState {

libnavui-dropin/src/test/java/com/mapbox/navigation/dropin/camera/RecenterButtonComponentContractImplTest.kt

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class RecenterButtonComponentContractImplTest {
3232
}
3333

3434
@Test
35-
fun `isVisible - should return TRUE when camera is Idle and not in RoutePreview`() =
35+
fun `isVisible - should return TRUE when camera is Idle`() =
3636
coroutineRule.runBlockingTest {
3737
store.updateState {
3838
it.copy(
@@ -42,7 +42,7 @@ class RecenterButtonComponentContractImplTest {
4242
}
4343
coroutineRule.testDispatcher.advanceUntilIdle()
4444
assertTrue(
45-
"expected TRUE when camera is Idle and not in RoutePreview",
45+
"expected TRUE when camera is Idle",
4646
sut.isVisible.value
4747
)
4848
}
@@ -60,19 +60,6 @@ class RecenterButtonComponentContractImplTest {
6060
assertFalse("expected FALSE when camera not Idle", sut.isVisible.value)
6161
}
6262

63-
@Test
64-
fun `isVisible - should return FALSE when camera in RoutePreview`() =
65-
coroutineRule.runBlockingTest {
66-
store.updateState {
67-
it.copy(
68-
camera = it.camera.copy(cameraMode = TargetCameraMode.Idle),
69-
navigation = NavigationState.RoutePreview
70-
)
71-
}
72-
coroutineRule.testDispatcher.advanceUntilIdle()
73-
assertFalse("expected FALSE when NavigationState not RoutePreview", sut.isVisible.value)
74-
}
75-
7663
@Test
7764
fun `onClick should dispatch SetCameraMode action`() {
7865
sut.onClick(mockk())

libnavui-maps/src/main/java/com/mapbox/navigation/ui/maps/internal/ui/CameraModeButtonComponent.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.mapbox.navigation.ui.maps.internal.ui
22

33
import android.view.View
4-
import androidx.core.view.isVisible
54
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
65
import com.mapbox.navigation.core.MapboxNavigation
76
import com.mapbox.navigation.ui.base.lifecycle.UIComponent
@@ -17,8 +16,6 @@ import kotlinx.coroutines.flow.asStateFlow
1716
@ExperimentalPreviewMapboxNavigationAPI
1817
interface CameraModeButtonComponentContract {
1918

20-
val isVisible: StateFlow<Boolean>
21-
2219
val buttonState: StateFlow<NavigationCameraState>
2320

2421
fun onClick(view: View)
@@ -33,7 +30,6 @@ class CameraModeButtonComponent(
3330
override fun onAttached(mapboxNavigation: MapboxNavigation) {
3431
super.onAttached(mapboxNavigation)
3532
val contract = contractProvider.get()
36-
contract.isVisible.observe { cameraModeButton.isVisible = it }
3733
contract.buttonState.observe { cameraModeButton.setState(it) }
3834
cameraModeButton.setOnClickListener(contract::onClick)
3935
}
@@ -50,8 +46,6 @@ internal class MapboxCameraModeButtonComponentContract(
5046
) : UIComponent(),
5147
CameraModeButtonComponentContract {
5248

53-
override val isVisible: StateFlow<Boolean> = MutableStateFlow(true)
54-
5549
private val _buttonState = MutableStateFlow(NavigationCameraState.OVERVIEW)
5650
override val buttonState: StateFlow<NavigationCameraState> = _buttonState.asStateFlow()
5751

libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/ui/CameraModeButtonComponentTest.kt

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.mapbox.navigation.ui.maps.internal.ui
22

33
import android.content.Context
44
import android.view.View
5-
import androidx.core.view.isVisible
65
import androidx.test.core.app.ApplicationProvider
76
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
87
import com.mapbox.navigation.core.MapboxNavigation
@@ -15,8 +14,6 @@ import io.mockk.verify
1514
import kotlinx.coroutines.ExperimentalCoroutinesApi
1615
import kotlinx.coroutines.flow.MutableStateFlow
1716
import kotlinx.coroutines.test.runBlockingTest
18-
import org.junit.Assert.assertFalse
19-
import org.junit.Assert.assertTrue
2017
import org.junit.Before
2118
import org.junit.Rule
2219
import org.junit.Test
@@ -44,17 +41,6 @@ class CameraModeButtonComponentTest {
4441
sut = CameraModeButtonComponent(cameraModeButton) { contract }
4542
}
4643

47-
@Test
48-
fun `should update button visibility`() = runBlockingTest {
49-
sut.onAttached(mapboxNavigation)
50-
51-
contract.isVisible.value = false
52-
assertFalse(cameraModeButton.isVisible)
53-
54-
contract.isVisible.value = true
55-
assertTrue(cameraModeButton.isVisible)
56-
}
57-
5844
@Test
5945
fun `should update button state`() = runBlockingTest {
6046
sut.onAttached(mapboxNavigation)
@@ -76,7 +62,6 @@ class CameraModeButtonComponentTest {
7662
}
7763

7864
private class StubContract : CameraModeButtonComponentContract {
79-
override var isVisible = MutableStateFlow(false)
8065
override var buttonState = MutableStateFlow(NavigationCameraState.IDLE)
8166
override fun onClick(view: View) = Unit
8267
}

0 commit comments

Comments
 (0)