Skip to content

Commit c0f348a

Browse files
committed
Update audio guidance for AA compatibility
1 parent 1f4e7d5 commit c0f348a

File tree

24 files changed

+243
-596
lines changed

24 files changed

+243
-596
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Mapbox welcomes participation and contributions from everyone.
44

55
## Unreleased
66
#### Features
7+
- Moved `MapboxAudioGuidance` and `MapboxAudioGuidanceState` into public api. [#6336](https://github.com/mapbox/mapbox-navigation-android/pull/6336)
78
#### Bug fixes and improvements
89

910
## Mapbox Navigation SDK 2.9.0-alpha.1 - 15 September, 2022

LICENSE.md

Lines changed: 1 addition & 345 deletions
Large diffs are not rendered by default.

libnavui-androidauto/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+
- Use `MapboxAudioGuidance` from public api. [#6336](https://github.com/mapbox/mapbox-navigation-android/pull/6336)
89

910
## androidauto-v0.11.0 - Sep 16, 2022
1011
### Changelog

libnavui-androidauto/api/current.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ package com.mapbox.androidauto {
1717
}
1818

1919
public final class MapboxCarApp {
20-
method public com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance carAppAudioGuidanceService();
20+
method public com.mapbox.navigation.ui.voice.api.MapboxAudioGuidance carAppAudioGuidanceService();
2121
method public com.mapbox.androidauto.navigation.location.CarAppLocation carAppLocationService();
2222
method public kotlinx.coroutines.flow.StateFlow<com.mapbox.androidauto.CarAppState> getCarAppState();
23-
method public void setup(android.app.Application application);
23+
method public void setup();
2424
method public void updateCarAppState(com.mapbox.androidauto.CarAppState carAppState);
2525
property public final kotlinx.coroutines.flow.StateFlow<com.mapbox.androidauto.CarAppState> carAppState;
2626
field public static final com.mapbox.androidauto.MapboxCarApp INSTANCE;

libnavui-androidauto/build.gradle

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ dependencies {
4545
def carSearchVersion = "1.0.0-beta.36"
4646
api("com.mapbox.search:mapbox-search-android:${carSearchVersion}")
4747

48-
debugApi project(":libnavigation-android")
49-
releaseApi("com.mapbox.navigation:android:${carNavVersion}")
50-
debugImplementation project(":libnavui-app")
51-
releaseImplementation("com.mapbox.navigation:ui-app:${carNavVersion}")
48+
// TODO use the carNavVersion when 2.9.0-alpha.2 is available
49+
api(project(":libnavigation-android"))
50+
// api("com.mapbox.navigation:android:${carNavVersion}")
5251

5352
implementation(dependenciesList.androidXAppCompat)
5453
implementation(dependenciesList.coroutinesCore)

libnavui-androidauto/src/main/java/com/mapbox/androidauto/MapboxCarApp.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
package com.mapbox.androidauto
22

3-
import android.app.Application
43
import com.mapbox.androidauto.navigation.location.CarAppLocation
54
import com.mapbox.androidauto.navigation.location.impl.CarAppLocationImpl
65
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
76
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
8-
import com.mapbox.navigation.ui.app.internal.SharedApp
9-
import com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance
7+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidance
108
import kotlinx.coroutines.flow.MutableStateFlow
119
import kotlinx.coroutines.flow.StateFlow
1210

1311
/**
1412
* The entry point for your Mapbox Android Auto app.
1513
*/
16-
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
1714
object MapboxCarApp {
1815

1916
private val carAppStateFlow = MutableStateFlow<CarAppState>(FreeDriveState)
@@ -43,12 +40,15 @@ object MapboxCarApp {
4340
}
4441

4542
/**
46-
* Setup android auto from your [Application.onCreate]
47-
*
48-
* @param application used to detect when activities are foregrounded
43+
* Setup android auto with defaults
4944
*/
50-
fun setup(application: Application) {
51-
SharedApp.setup(application)
52-
MapboxNavigationApp.registerObserver(CarAppLocationImpl())
45+
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
46+
fun setup() {
47+
if (MapboxNavigationApp.getObservers(MapboxAudioGuidance::class).isEmpty()) {
48+
MapboxNavigationApp.registerObserver(MapboxAudioGuidance())
49+
}
50+
if (MapboxNavigationApp.getObservers(CarAppLocation::class).isEmpty()) {
51+
MapboxNavigationApp.registerObserver(CarAppLocationImpl())
52+
}
5353
}
5454
}

libnavui-androidauto/src/main/java/com/mapbox/androidauto/navigation/audioguidance/AppAudioGuidanceUi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import androidx.lifecycle.LifecycleOwner
88
import androidx.lifecycle.lifecycleScope
99
import androidx.lifecycle.repeatOnLifecycle
1010
import com.mapbox.androidauto.MapboxCarApp
11-
import com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance
11+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidanceState
1212
import com.mapbox.navigation.ui.voice.view.MapboxSoundButton
1313
import kotlinx.coroutines.flow.collect
1414
import kotlinx.coroutines.launch
@@ -40,7 +40,7 @@ fun Fragment.attachAudioGuidance(
4040
*/
4141
fun Lifecycle.muteAudioGuidance() {
4242
addObserver(object : DefaultLifecycleObserver {
43-
lateinit var initialState: MapboxAudioGuidance.State
43+
lateinit var initialState: MapboxAudioGuidanceState
4444
override fun onResume(owner: LifecycleOwner) {
4545
with(MapboxCarApp.carAppAudioGuidanceService()) {
4646
initialState = stateFlow().value

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

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

3-
import android.content.Context
43
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
54
import com.mapbox.navigation.core.internal.extensions.attachCreated
65
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
@@ -17,9 +16,7 @@ import com.mapbox.navigation.ui.app.internal.controller.StateResetController
1716
import com.mapbox.navigation.ui.app.internal.controller.TripSessionStarterStateController
1817
import com.mapbox.navigation.ui.maps.internal.ui.RouteAlternativeComponent
1918
import com.mapbox.navigation.ui.maps.internal.ui.RouteAlternativeContract
20-
import com.mapbox.navigation.ui.utils.internal.datastore.NavigationDataStoreOwner
21-
import com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance
22-
import com.mapbox.navigation.ui.voice.internal.impl.MapboxAudioGuidanceImpl
19+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidance
2320
import java.util.concurrent.atomic.AtomicBoolean
2421

2522
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
@@ -55,8 +52,6 @@ object SharedApp {
5552

5653
@JvmOverloads
5754
fun setup(
58-
context: Context,
59-
audioGuidance: MapboxAudioGuidance? = null,
6055
routeAlternativeContract: RouteAlternativeContract? = null
6156
) {
6257
if (isSetup) return
@@ -69,7 +64,12 @@ object SharedApp {
6964
}
7065
)
7166
MapboxNavigationApp.lifecycleOwner.attachCreated(*navigationObservers)
72-
MapboxNavigationApp.registerObserver(audioGuidance ?: defaultAudioGuidance(context))
67+
68+
// TODO Remove this from SharedApp. The components that use `MapboxAudioGuidance`
69+
// will "ensureAudioGuidanceRegistered". See the `ComponentInstaller.audioGuidanceButton`
70+
if (MapboxNavigationApp.getObservers(MapboxAudioGuidance::class).isEmpty()) {
71+
MapboxNavigationApp.registerObserver(MapboxAudioGuidance())
72+
}
7373
}
7474

7575
fun tripSessionTransaction(updateSession: () -> Unit) {
@@ -80,12 +80,4 @@ object SharedApp {
8080
updateSession()
8181
ignoreTripSessionUpdates.set(false)
8282
}
83-
84-
private fun defaultAudioGuidance(context: Context): MapboxAudioGuidance {
85-
return MapboxAudioGuidanceImpl.create(context).also {
86-
it.dataStoreOwner = NavigationDataStoreOwner(context, DEFAULT_DATA_STORE_NAME)
87-
}
88-
}
89-
90-
private const val DEFAULT_DATA_STORE_NAME = "mapbox_navigation_preferences"
9183
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.mapbox.navigation.ui.app.internal.State
88
import com.mapbox.navigation.ui.app.internal.Store
99
import com.mapbox.navigation.ui.app.internal.audioguidance.AudioAction
1010
import com.mapbox.navigation.ui.app.internal.audioguidance.AudioGuidanceState
11-
import com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance
11+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidance
1212

1313
/**
1414
* This class is responsible for playing voice instructions. Use the [AudioAction] to turning the

libnavui-app/src/test/java/com/mapbox/navigation/ui/app/internal/controller/AudioGuidanceStateControllerTest.kt

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.mapbox.navigation.ui.app.internal.controller
22

3-
import com.mapbox.api.directions.v5.models.VoiceInstructions
4-
import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
53
import com.mapbox.navigation.core.MapboxNavigation
64
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
75
import com.mapbox.navigation.testing.MainCoroutineRule
@@ -10,8 +8,8 @@ import com.mapbox.navigation.ui.app.internal.audioguidance.AudioAction
108
import com.mapbox.navigation.ui.app.internal.audioguidance.AudioGuidanceState
119
import com.mapbox.navigation.ui.app.internal.navigation.NavigationState
1210
import com.mapbox.navigation.ui.app.testing.TestStore
13-
import com.mapbox.navigation.ui.voice.internal.MapboxAudioGuidance
14-
import com.mapbox.navigation.ui.voice.model.SpeechAnnouncement
11+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidance
12+
import com.mapbox.navigation.ui.voice.api.MapboxAudioGuidanceState
1513
import io.mockk.every
1614
import io.mockk.mockk
1715
import io.mockk.mockkObject
@@ -27,13 +25,13 @@ import org.junit.Before
2725
import org.junit.Rule
2826
import org.junit.Test
2927

30-
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class, ExperimentalCoroutinesApi::class)
28+
@OptIn(ExperimentalCoroutinesApi::class)
3129
class AudioGuidanceStateControllerTest {
3230

3331
@get:Rule
3432
var coroutineRule = MainCoroutineRule()
3533

36-
private lateinit var audioGuidanceState: MutableStateFlow<MapboxAudioGuidance.State>
34+
private lateinit var audioGuidanceState: MutableStateFlow<MapboxAudioGuidanceState>
3735
private lateinit var mockAudioGuidance: MapboxAudioGuidance
3836
private lateinit var testStore: TestStore
3937

@@ -42,7 +40,7 @@ class AudioGuidanceStateControllerTest {
4240
mockkObject(MapboxNavigationApp)
4341

4442
audioGuidanceState = MutableStateFlow(
45-
TestAudioGuidanceState(isMuted = false)
43+
mockk { every { isMuted } returns false }
4644
)
4745
mockAudioGuidance = mockk(relaxed = true) {
4846
every { stateFlow() } returns audioGuidanceState
@@ -68,7 +66,7 @@ class AudioGuidanceStateControllerTest {
6866
audio = AudioGuidanceState(isMuted = false)
6967
)
7068
)
71-
audioGuidanceState.value = TestAudioGuidanceState(isMuted = true)
69+
audioGuidanceState.value = mockk { every { isMuted } returns true }
7270

7371
sut.onAttached(mockMapboxNavigation())
7472
assertTrue(testStore.state.value.audio.isMuted)
@@ -83,7 +81,7 @@ class AudioGuidanceStateControllerTest {
8381
audio = AudioGuidanceState(isMuted = false)
8482
)
8583
)
86-
audioGuidanceState.value = TestAudioGuidanceState(isMuted = false)
84+
audioGuidanceState.value = mockk { every { isMuted } returns false }
8785

8886
sut.onAttached(mockMapboxNavigation())
8987
testStore.setState(
@@ -118,11 +116,4 @@ class AudioGuidanceStateControllerTest {
118116
every { MapboxNavigationApp.current() } returns mapboxNavigation
119117
return mapboxNavigation
120118
}
121-
122-
private data class TestAudioGuidanceState(
123-
override val isMuted: Boolean,
124-
override val isPlayable: Boolean = false,
125-
override val voiceInstructions: VoiceInstructions? = null,
126-
override val speechAnnouncement: SpeechAnnouncement? = null
127-
) : MapboxAudioGuidance.State
128119
}

0 commit comments

Comments
 (0)